HaikuDepot: Cleanups.
- Fix passing the force parameter to the refresh worker. This makes the refresh depots menu item actually work. - Make failure messages regarding depot initialization/refresh visible to the user.
This commit is contained in:
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <Alert.h>
|
#include <Alert.h>
|
||||||
#include <Autolock.h>
|
#include <Autolock.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
@@ -30,6 +28,7 @@
|
|||||||
#include "package/RepositoryCache.h"
|
#include "package/RepositoryCache.h"
|
||||||
#include <package/solver/SolverPackage.h>
|
#include <package/solver/SolverPackage.h>
|
||||||
|
|
||||||
|
#include "AutoDeleter.h"
|
||||||
#include "DecisionProvider.h"
|
#include "DecisionProvider.h"
|
||||||
#include "FilterView.h"
|
#include "FilterView.h"
|
||||||
#include "JobStateListener.h"
|
#include "JobStateListener.h"
|
||||||
@@ -58,6 +57,19 @@ typedef std::map<BString, BObjectList<PackageInfo> > PackageLocationMap;
|
|||||||
typedef std::map<BString, DepotInfo> DepotInfoMap;
|
typedef std::map<BString, DepotInfo> DepotInfoMap;
|
||||||
|
|
||||||
|
|
||||||
|
struct RefreshWorkerParameters {
|
||||||
|
MainWindow* window;
|
||||||
|
bool forceRefresh;
|
||||||
|
|
||||||
|
RefreshWorkerParameters(MainWindow* window, bool forceRefresh)
|
||||||
|
:
|
||||||
|
window(window),
|
||||||
|
forceRefresh(forceRefresh)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
MainWindow::MainWindow(BRect frame)
|
MainWindow::MainWindow(BRect frame)
|
||||||
:
|
:
|
||||||
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
||||||
@@ -135,7 +147,7 @@ MainWindow::MessageReceived(BMessage* message)
|
|||||||
|
|
||||||
case MSG_REFRESH_DEPOTS:
|
case MSG_REFRESH_DEPOTS:
|
||||||
{
|
{
|
||||||
_StartRefreshWorker();
|
_StartRefreshWorker(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MSG_PACKAGE_SELECTED:
|
case MSG_PACKAGE_SELECTED:
|
||||||
@@ -264,12 +276,16 @@ MainWindow::_RefreshRepositories(bool force)
|
|||||||
|
|
||||||
result = refreshRequest.Process();
|
result = refreshRequest.Process();
|
||||||
} catch (BFatalErrorException ex) {
|
} catch (BFatalErrorException ex) {
|
||||||
fprintf(stderr, "Fatal error occurred while refreshing "
|
BString message(B_TRANSLATE("An error occurred while "
|
||||||
"repository: %s (%s)\n", ex.Message().String(),
|
"refreshing the repository: %error% (%details%)"));
|
||||||
ex.Details().String());
|
message.ReplaceFirst("%error%", ex.Message());
|
||||||
|
message.ReplaceFirst("%details%", ex.Details());
|
||||||
|
_NotifyUser("Error", message.String());
|
||||||
} catch (BException ex) {
|
} catch (BException ex) {
|
||||||
fprintf(stderr, "Exception occurred while refreshing "
|
BString message(B_TRANSLATE("An error occurred while "
|
||||||
"repository: %s\n", ex.Message().String());
|
"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
|
fPackageManager.Init(PackageManager::B_ADD_INSTALLED_REPOSITORIES
|
||||||
| PackageManager::B_ADD_REMOTE_REPOSITORIES);
|
| PackageManager::B_ADD_REMOTE_REPOSITORIES);
|
||||||
} catch (BException ex) {
|
} catch (BException ex) {
|
||||||
fprintf(stderr, "Exception occurred while initializing PackageManager:"
|
BString message(B_TRANSLATE("An error occurred while "
|
||||||
"%s\n", ex.Message().String());
|
"initializing the package manager: %message%"));
|
||||||
|
message.ReplaceFirst("%message%", ex.Message());
|
||||||
|
_NotifyUser("Error", message.String());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,27 +413,38 @@ MainWindow::_RefreshPackageList()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWindow::_StartRefreshWorker()
|
MainWindow::_StartRefreshWorker(bool force)
|
||||||
{
|
{
|
||||||
if (fModelWorker != B_BAD_THREAD_ID)
|
if (fModelWorker != B_BAD_THREAD_ID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fModelWorker = spawn_thread(&_RefreshModelThreadWorker, "model loader",
|
RefreshWorkerParameters* parameters = new(std::nothrow)
|
||||||
B_LOW_PRIORITY, this);
|
RefreshWorkerParameters(this, force);
|
||||||
|
if (parameters == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (fModelWorker > 0)
|
ObjectDeleter<RefreshWorkerParameters> deleter(parameters);
|
||||||
|
fModelWorker = spawn_thread(&_RefreshModelThreadWorker, "model loader",
|
||||||
|
B_LOW_PRIORITY, parameters);
|
||||||
|
|
||||||
|
if (fModelWorker > 0) {
|
||||||
|
deleter.Detach();
|
||||||
resume_thread(fModelWorker);
|
resume_thread(fModelWorker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
MainWindow::_RefreshModelThreadWorker(void* arg)
|
MainWindow::_RefreshModelThreadWorker(void* arg)
|
||||||
{
|
{
|
||||||
MainWindow* mainWindow = reinterpret_cast<MainWindow*>(arg);
|
RefreshWorkerParameters* parameters
|
||||||
|
= reinterpret_cast<RefreshWorkerParameters*>(arg);
|
||||||
|
MainWindow* mainWindow = parameters->window;
|
||||||
|
ObjectDeleter<RefreshWorkerParameters> deleter(parameters);
|
||||||
|
|
||||||
BMessenger messenger(mainWindow);
|
BMessenger messenger(mainWindow);
|
||||||
|
|
||||||
mainWindow->_RefreshRepositories();
|
mainWindow->_RefreshRepositories(parameters->forceRefresh);
|
||||||
|
|
||||||
if (mainWindow->fTerminating)
|
if (mainWindow->fTerminating)
|
||||||
return B_OK;
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,16 @@ private:
|
|||||||
void _AdoptPackage(const PackageInfoRef& package);
|
void _AdoptPackage(const PackageInfoRef& package);
|
||||||
void _ClearPackage();
|
void _ClearPackage();
|
||||||
|
|
||||||
void _RefreshRepositories(bool force = false);
|
void _RefreshRepositories(bool force);
|
||||||
void _RefreshPackageList();
|
void _RefreshPackageList();
|
||||||
|
|
||||||
void _StartRefreshWorker();
|
void _StartRefreshWorker(bool force = false);
|
||||||
|
|
||||||
static status_t _RefreshModelThreadWorker(void* arg);
|
static status_t _RefreshModelThreadWorker(void* arg);
|
||||||
|
|
||||||
|
void _NotifyUser(const char* title,
|
||||||
|
const char* message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FilterView* fFilterView;
|
FilterView* fFilterView;
|
||||||
PackageListView* fPackageListView;
|
PackageListView* fPackageListView;
|
||||||
|
|||||||
Reference in New Issue
Block a user