From 51a7232c73b1f6c04103716cae88b3781fd8ab33 Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Mon, 4 Jul 2016 13:05:15 +0600 Subject: GUI: Fix RemoteBrowser Request handling Init with NULL, ignore callbacks, and such. --- gui/remotebrowser.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'gui/remotebrowser.cpp') diff --git a/gui/remotebrowser.cpp b/gui/remotebrowser.cpp index fac0b02e35..995e6a654c 100644 --- a/gui/remotebrowser.cpp +++ b/gui/remotebrowser.cpp @@ -40,7 +40,7 @@ enum { }; RemoteBrowserDialog::RemoteBrowserDialog(const char *title) - : Dialog("Browser"), _navigationLocked(false), _updateList(false) { + : Dialog("Browser"), _navigationLocked(false), _updateList(false), _workingRequest(nullptr), _ignoreCallback(false) { _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; new StaticTextWidget(this, "Browser.Headline", title); @@ -58,11 +58,27 @@ RemoteBrowserDialog::RemoteBrowserDialog(const char *title) new ButtonWidget(this, "Browser.Choose", _("Choose"), 0, kChooseCmd); } +RemoteBrowserDialog::~RemoteBrowserDialog() { + if (_workingRequest) { + _ignoreCallback = true; + _workingRequest->finish(); + } +} + void RemoteBrowserDialog::open() { Dialog::open(); listDirectory(Cloud::StorageFile()); } +void RemoteBrowserDialog::close() { + Dialog::close(); + if (_workingRequest) { + _ignoreCallback = true; + _workingRequest->finish(); + _ignoreCallback = false; + } +} + void RemoteBrowserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kChooseCmd: { @@ -154,7 +170,7 @@ void RemoteBrowserDialog::goUp() { } void RemoteBrowserDialog::listDirectory(Cloud::StorageFile node) { - if (_navigationLocked) return; + if (_navigationLocked || _workingRequest) return; _navigationLocked = true; _workingRequest = CloudMan.listDirectory( @@ -170,12 +186,18 @@ void RemoteBrowserDialog::listDirectory(Cloud::StorageFile node) { } void RemoteBrowserDialog::directoryListedCallback(Cloud::Storage::ListDirectoryResponse response) { + _workingRequest = nullptr; + if (_ignoreCallback) return; + _navigationLocked = false; _nodeContent = response.value; _updateList = true; } void RemoteBrowserDialog::directoryListedErrorCallback(Networking::ErrorResponse error) { + _workingRequest = nullptr; + if (_ignoreCallback) return; + _navigationLocked = false; _node = _backupNode; _updateList = true; -- cgit v1.2.3