1
0
Fork 0

Fix crash with adding catalogs in the launcher

Change how we get notified about catalog changes, so we can remove
our hook and hence not leave a dangling pointer.

Fixes https://sourceforge.net/p/flightgear/codetickets/1994/
This commit is contained in:
James Turner 2017-11-15 21:46:57 +00:00
parent 7305b20483
commit 2d663f2509
2 changed files with 35 additions and 4 deletions

View file

@ -30,6 +30,23 @@
using namespace simgear::pkg; using namespace simgear::pkg;
class AddCatalogDialog::AddCatalogDelegate : public simgear::pkg::Delegate
{
public:
AddCatalogDelegate(AddCatalogDialog* outer) : p(outer) {}
void catalogRefreshed(CatalogRef catalog, StatusCode) override
{
p->onCatalogStatusChanged(catalog);
}
void startInstall(InstallRef) override {}
void installProgress(InstallRef, unsigned int, unsigned int) override {}
void finishInstall(InstallRef, StatusCode ) override {}
private:
AddCatalogDialog* p = nullptr;
};
AddCatalogDialog::AddCatalogDialog(QWidget *parent, RootRef root) : AddCatalogDialog::AddCatalogDialog(QWidget *parent, RootRef root) :
QDialog(parent, Qt::Dialog QDialog(parent, Qt::Dialog
| Qt::CustomizeWindowHint | Qt::CustomizeWindowHint
@ -37,7 +54,6 @@ AddCatalogDialog::AddCatalogDialog(QWidget *parent, RootRef root) :
| Qt::WindowSystemMenuHint | Qt::WindowSystemMenuHint
| Qt::WindowContextHelpButtonHint | Qt::WindowContextHelpButtonHint
| Qt::MSWindowsFixedSizeDialogHint), | Qt::MSWindowsFixedSizeDialogHint),
m_state(STATE_START),
ui(new Ui::AddCatalogDialog), ui(new Ui::AddCatalogDialog),
m_packageRoot(root) m_packageRoot(root)
{ {
@ -51,6 +67,9 @@ AddCatalogDialog::AddCatalogDialog(QWidget *parent, RootRef root) :
AddCatalogDialog::~AddCatalogDialog() AddCatalogDialog::~AddCatalogDialog()
{ {
if (m_delegate) {
m_packageRoot->removeDelegate(m_delegate.get());
}
delete ui; delete ui;
} }
@ -137,8 +156,9 @@ void AddCatalogDialog::startDownload()
{ {
Q_ASSERT(m_catalogUrl.isValid()); Q_ASSERT(m_catalogUrl.isValid());
m_delegate.reset(new AddCatalogDelegate{this});
m_packageRoot->addDelegate(m_delegate.get());
m_result = Catalog::createFromUrl(m_packageRoot, m_catalogUrl.toString().toStdString()); m_result = Catalog::createFromUrl(m_packageRoot, m_catalogUrl.toString().toStdString());
m_result->addStatusCallback(this, &AddCatalogDialog::onCatalogStatusChanged);
m_state = STATE_DOWNLOADING; m_state = STATE_DOWNLOADING;
updateUi(); updateUi();
ui->stack->setCurrentIndex(STATE_DOWNLOADING); ui->stack->setCurrentIndex(STATE_DOWNLOADING);
@ -175,6 +195,10 @@ void AddCatalogDialog::reject()
void AddCatalogDialog::onCatalogStatusChanged(Catalog* cat) void AddCatalogDialog::onCatalogStatusChanged(Catalog* cat)
{ {
if (cat != m_result) {
return;
}
Delegate::StatusCode s = cat->status(); Delegate::StatusCode s = cat->status();
switch (s) { switch (s) {
case Delegate::STATUS_REFRESHED: case Delegate::STATUS_REFRESHED:

View file

@ -21,6 +21,8 @@
#ifndef FG_GUI_ADDCATALOGDIALOG_HXX #ifndef FG_GUI_ADDCATALOGDIALOG_HXX
#define FG_GUI_ADDCATALOGDIALOG_HXX #define FG_GUI_ADDCATALOGDIALOG_HXX
#include <memory>
#include <QDialog> #include <QDialog>
#include <QUrl> #include <QUrl>
@ -31,6 +33,7 @@ namespace Ui {
class AddCatalogDialog; class AddCatalogDialog;
} }
class AddCatalogDialog : public QDialog class AddCatalogDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
@ -56,10 +59,12 @@ private slots:
void onUrlTextChanged(); void onUrlTextChanged();
private: private:
class AddCatalogDelegate;
friend class AddCatalogDelegate;
void startDownload(); void startDownload();
void updateUi(); void updateUi();
// callback from the catalog
void onCatalogStatusChanged(simgear::pkg::Catalog* cat); void onCatalogStatusChanged(simgear::pkg::Catalog* cat);
enum State { enum State {
@ -70,13 +75,15 @@ private:
}; };
State m_state; State m_state = STATE_START;
Ui::AddCatalogDialog *ui; Ui::AddCatalogDialog *ui;
simgear::pkg::RootRef m_packageRoot; simgear::pkg::RootRef m_packageRoot;
QUrl m_catalogUrl; QUrl m_catalogUrl;
simgear::pkg::CatalogRef m_result; simgear::pkg::CatalogRef m_result;
bool m_nonInteractiveMode = false; bool m_nonInteractiveMode = false;
std::unique_ptr<AddCatalogDelegate> m_delegate;
}; };
#endif // FG_GUI_ADDCATALOGDIALOG_HXX #endif // FG_GUI_ADDCATALOGDIALOG_HXX