diff --git a/src/apps/haiku-depot/MainWindow.cpp b/src/apps/haiku-depot/MainWindow.cpp index 8a36fd06fc..82ee4a95ac 100644 --- a/src/apps/haiku-depot/MainWindow.cpp +++ b/src/apps/haiku-depot/MainWindow.cpp @@ -8,8 +8,6 @@ #include -#include - #include #include #include @@ -30,6 +28,7 @@ #include "package/RepositoryCache.h" #include +#include "AutoDeleter.h" #include "DecisionProvider.h" #include "FilterView.h" #include "JobStateListener.h" @@ -58,6 +57,19 @@ typedef std::map > PackageLocationMap; typedef std::map DepotInfoMap; +struct RefreshWorkerParameters { + MainWindow* window; + bool forceRefresh; + + RefreshWorkerParameters(MainWindow* window, bool forceRefresh) + : + window(window), + forceRefresh(forceRefresh) + { + } +}; + + MainWindow::MainWindow(BRect frame) : BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"), @@ -135,7 +147,7 @@ MainWindow::MessageReceived(BMessage* message) case MSG_REFRESH_DEPOTS: { - _StartRefreshWorker(); + _StartRefreshWorker(true); break; } case MSG_PACKAGE_SELECTED: @@ -264,12 +276,16 @@ MainWindow::_RefreshRepositories(bool force) result = refreshRequest.Process(); } catch (BFatalErrorException ex) { - fprintf(stderr, "Fatal error occurred while refreshing " - "repository: %s (%s)\n", ex.Message().String(), - ex.Details().String()); + BString message(B_TRANSLATE("An error occurred while " + "refreshing the repository: %error% (%details%)")); + message.ReplaceFirst("%error%", ex.Message()); + message.ReplaceFirst("%details%", ex.Details()); + _NotifyUser("Error", message.String()); } catch (BException ex) { - fprintf(stderr, "Exception occurred while refreshing " - "repository: %s\n", ex.Message().String()); + BString message(B_TRANSLATE("An error occurred while " + "refreshing the repository: %error%")); + message.ReplaceFirst("%error%", ex.Message()); + _NotifyUser("Error", message.String()); } } } @@ -296,8 +312,10 @@ MainWindow::_RefreshPackageList() fPackageManager.Init(PackageManager::B_ADD_INSTALLED_REPOSITORIES | PackageManager::B_ADD_REMOTE_REPOSITORIES); } catch (BException ex) { - fprintf(stderr, "Exception occurred while initializing PackageManager:" - "%s\n", ex.Message().String()); + BString message(B_TRANSLATE("An error occurred while " + "initializing the package manager: %message%")); + message.ReplaceFirst("%message%", ex.Message()); + _NotifyUser("Error", message.String()); return; } @@ -395,27 +413,38 @@ MainWindow::_RefreshPackageList() void -MainWindow::_StartRefreshWorker() +MainWindow::_StartRefreshWorker(bool force) { if (fModelWorker != B_BAD_THREAD_ID) return; - fModelWorker = spawn_thread(&_RefreshModelThreadWorker, "model loader", - B_LOW_PRIORITY, this); + RefreshWorkerParameters* parameters = new(std::nothrow) + RefreshWorkerParameters(this, force); + if (parameters == NULL) + return; - if (fModelWorker > 0) + ObjectDeleter deleter(parameters); + fModelWorker = spawn_thread(&_RefreshModelThreadWorker, "model loader", + B_LOW_PRIORITY, parameters); + + if (fModelWorker > 0) { + deleter.Detach(); resume_thread(fModelWorker); + } } status_t MainWindow::_RefreshModelThreadWorker(void* arg) { - MainWindow* mainWindow = reinterpret_cast(arg); + RefreshWorkerParameters* parameters + = reinterpret_cast(arg); + MainWindow* mainWindow = parameters->window; + ObjectDeleter deleter(parameters); BMessenger messenger(mainWindow); - mainWindow->_RefreshRepositories(); + mainWindow->_RefreshRepositories(parameters->forceRefresh); if (mainWindow->fTerminating) return B_OK; @@ -428,3 +457,13 @@ MainWindow::_RefreshModelThreadWorker(void* arg) } +void +MainWindow::_NotifyUser(const char* title, const char* message) +{ + BAlert *alert = new(std::nothrow) BAlert(title, message, + B_TRANSLATE("Close")); + + if (alert != NULL) + alert->Go(); +} + diff --git a/src/apps/haiku-depot/MainWindow.h b/src/apps/haiku-depot/MainWindow.h index 19a020fb63..da6aedfcec 100644 --- a/src/apps/haiku-depot/MainWindow.h +++ b/src/apps/haiku-depot/MainWindow.h @@ -38,13 +38,16 @@ private: void _AdoptPackage(const PackageInfoRef& package); void _ClearPackage(); - void _RefreshRepositories(bool force = false); + void _RefreshRepositories(bool force); void _RefreshPackageList(); - void _StartRefreshWorker(); + void _StartRefreshWorker(bool force = false); static status_t _RefreshModelThreadWorker(void* arg); + void _NotifyUser(const char* title, + const char* message); + private: FilterView* fFilterView; PackageListView* fPackageListView;