MIDI2LR 6.3.0.1
MIDI2LR is an application that interfaces MIDI controllers with Lightroom 6+/CC Classic. It processes MIDI input into develop parameter updates and photo actions, and sends MIDI output when parameters are changed for motorized feedback (on controllers that have motorized faders). A listing of available LightRoom commands is in the Wiki. Assistance on the code and design is welcome.
Loading...
Searching...
No Matches
VersionChecker Class Referencefinal

#include <VersionChecker.h>

Inheritance diagram for VersionChecker:

Public Member Functions

 VersionChecker (const VersionChecker &other)=delete
 VersionChecker (SettingsManager &settings_manager) noexcept
 VersionChecker (VersionChecker &&other)=delete
 ~VersionChecker () noexcept
VersionCheckeroperator= (const VersionChecker &other)=delete
VersionCheckeroperator= (VersionChecker &&other)=delete
void Start ()
void Stop () noexcept

Private Member Functions

void handleAsyncUpdate () override
void Run () noexcept

Private Attributes

int new_version_ {0}
std::future< void > run_future_
SettingsManagersettings_manager_
std::atomic< bool > thread_should_exit_ {false}

Constructor & Destructor Documentation

◆ VersionChecker() [1/3]

VersionChecker::VersionChecker ( SettingsManager & settings_manager)
explicitnoexcept
46 : settings_manager_ {settings_manager}
47{
48}
SettingsManager & settings_manager_
Definition VersionChecker.h:42

References settings_manager_.

◆ ~VersionChecker()

VersionChecker::~VersionChecker ( )
noexcept
51{
52 try {
53 // signal background task to exit
54 Stop();
55 // prevent a queued AsyncUpdater callback from running after destruction
56 cancelPendingUpdate();
57 // wait for the background task to finish if it was started
58 if (run_future_.valid()) { run_future_.wait(); }
59 }
60 catch (const std::exception& e) {
61 rsj::ExceptionResponse(e, std::source_location::current());
62 }
63 catch (...) {
64 }
65}
std::future< void > run_future_
Definition VersionChecker.h:44
void Stop() noexcept
Definition VersionChecker.h:35
void ExceptionResponse(gsl::czstring id, gsl::czstring fu, const std::exception &e) noexcept

References run_future_, and Stop().

◆ VersionChecker() [2/3]

VersionChecker::VersionChecker ( const VersionChecker & other)
delete

◆ VersionChecker() [3/3]

VersionChecker::VersionChecker ( VersionChecker && other)
delete

Member Function Documentation

◆ handleAsyncUpdate()

void VersionChecker::handleAsyncUpdate ( )
overrideprivate
77{
78 // copy minimal state for the callback so it doesn't capture `this`
79 const int reported_version {new_version_};
80 SettingsManager* sm = &settings_manager_;
81 const auto response {[sm, reported_version](const int result) {
82#ifndef MIDI2LR_BETA
83 if (result) {
84 if (juce::URL("https://github.com/rsjaffe/MIDI2LR/releases").launchInDefaultBrowser()) {
85 sm->SetLastVersionFound(reported_version);
86 }
87 }
88 else {
89 sm->SetLastVersionFound(reported_version);
90 }
91#else
92 if (result) {
93 std::ignore =
94 juce::URL("https://github.com/rsjaffe/MIDI2LR/releases").launchInDefaultBrowser();
95 }
96#endif
97 }};
98 /* */
99 try {
100 if (thread_should_exit_.load(std::memory_order_acquire)) { return; }
101 juce::NativeMessageBox::showYesNoBox(juce::AlertWindow::AlertIconType::QuestionIcon,
102 fmt::format(
103 fmt::runtime(juce::translate("A new version of {} is available.").toStdString()),
104 "MIDI2LR"),
105 juce::translate("Do you want to download the latest version?") + ' '
106 + IntToVersion(static_cast<unsigned int>(reported_version)),
107 nullptr, juce::ModalCallbackFunction::create(response));
108 }
109 catch (const std::exception& e) {
110 rsj::ExceptionResponse(e, std::source_location::current());
111 }
112}
void SetLastVersionFound(int version_number)
Definition SettingsManager.h:70
int new_version_
Definition VersionChecker.h:41
std::atomic< bool > thread_should_exit_
Definition VersionChecker.h:43

References new_version_, SettingsManager::SetLastVersionFound(), and settings_manager_.

◆ operator=() [1/2]

VersionChecker & VersionChecker::operator= ( const VersionChecker & other)
delete

◆ operator=() [2/2]

VersionChecker & VersionChecker::operator= ( VersionChecker && other)
delete

◆ Run()

void VersionChecker::Run ( )
privatenoexcept
134{
135 try {
136 const juce::URL version_url {"https://rsjaffe.github.io/MIDI2LR/version.xml"};
137 const auto version_xml_element {version_url.readEntireXmlStream()};
138 if (version_xml_element && !thread_should_exit_.load(std::memory_order_acquire)) {
139 auto last_checked {settings_manager_.GetLastVersionFound()};
140 if (version_xml_element) { new_version_ = CheckVersion(version_xml_element.get()); }
141 if (last_checked == 0) {
142 last_checked = std::min(new_version_, ProjectInfo::versionNumber);
143 settings_manager_.SetLastVersionFound(last_checked);
144 }
145 LogVersion(new_version_, last_checked);
146 if (new_version_ > ProjectInfo::versionNumber && new_version_ != last_checked
147 && !thread_should_exit_.load(std::memory_order_acquire)) {
148 triggerAsyncUpdate();
149 }
150 }
151 else {
152 rsj::Log("Unable to download MIDI2LR/version.xml and parse into valid XML document.",
153 std::source_location::current());
154 }
155 }
156 catch (const std::exception& e) {
157 rsj::ExceptionResponse(e, std::source_location::current());
158 }
159}
void Log(const juce::String &info, const std::source_location &location=std::source_location::current()) noexcept
Definition Misc.cpp:112

References SettingsManager::GetLastVersionFound(), new_version_, SettingsManager::SetLastVersionFound(), and settings_manager_.

Referenced by Start().

◆ Start()

void VersionChecker::Start ( )
68{
69 run_future_ = std::async(std::launch::async, [this] {
70 rsj::LabelThread(MIDI2LR_UC_LITERAL("VersionChecker run thread"));
71 MIDI2LR_FAST_FLOATS;
72 Run();
73 });
74}
void Run() noexcept
Definition VersionChecker.cpp:133
void LabelThread(gsl::czstring threadname)
Definition Misc.cpp:48

References Run(), and run_future_.

◆ Stop()

void VersionChecker::Stop ( )
inlinenoexcept
35{ thread_should_exit_.store(true, std::memory_order_release); }

Referenced by ~VersionChecker().

Member Data Documentation

◆ new_version_

int VersionChecker::new_version_ {0}
private
41{0};

Referenced by handleAsyncUpdate(), and Run().

◆ run_future_

std::future<void> VersionChecker::run_future_
private

Referenced by ~VersionChecker(), and Start().

◆ settings_manager_

SettingsManager& VersionChecker::settings_manager_
private

◆ thread_should_exit_

std::atomic<bool> VersionChecker::thread_should_exit_ {false}
private
43{false};

The documentation for this class was generated from the following files:
  • C:/Users/rsjaf/source/repos/MIDI2LR/src/application/VersionChecker.h
  • C:/Users/rsjaf/source/repos/MIDI2LR/src/application/VersionChecker.cpp