Follow up of T156, improved setup loading dialog

* allow to load the delivered setup file if there are no other data
* display setup cache information
This commit is contained in:
Klaus Basan
2017-09-23 02:40:33 +02:00
committed by Mathew Sutcliffe
parent bdbf2e75b4
commit 071f327fca
5 changed files with 158 additions and 39 deletions

View File

@@ -526,6 +526,18 @@ namespace BlackCore
return m_setup.get();
}
bool CSetupReader::hasCachedSetup() const
{
const CGlobalSetup cachedSetup = m_setup.get();
const bool cacheAvailable = cachedSetup.wasLoaded();
return cacheAvailable;
}
QDateTime CSetupReader::getSetupCacheTimestamp() const
{
return m_setup.getTimestamp();
}
bool CSetupReader::prefillCacheWithLocalResourceBootstrapFile()
{
if (m_shutdown) { return false; }
@@ -554,6 +566,17 @@ namespace BlackCore
return m_distributions.get();
}
bool CSetupReader::hasCachedDistributionInfo() const
{
const CDistributionList distributions = m_distributions.get();
return !distributions.isEmpty();
}
QDateTime CSetupReader::getDistributionCacheTimestamp() const
{
return m_distributions.getTimestamp();
}
QString CSetupReader::getLastSuccessfulDistributionUrl() const
{
QReadLocker l(&m_lockDistribution);

View File

@@ -74,6 +74,14 @@ namespace BlackCore
//! \threadsafe
BlackCore::Data::CGlobalSetup getSetup() const;
//! Has cached setup ("bootstrap") data?
//! \threadsafe
bool hasCachedSetup() const;
//! Get setup cache timestamp
//! \threadsafe
QDateTime getSetupCacheTimestamp() const;
//! Load the cache file local bootstrap file
//! \remark can be used during installation as failover
//! \threadsafe
@@ -87,6 +95,14 @@ namespace BlackCore
//! \threadsafe
BlackMisc::Db::CDistributionList getDistributionInfo() const;
//! Has cached distribution info?
//! \threadsafe
bool hasCachedDistributionInfo() const;
//! Distribution cache timestamp
//! \threadsafe
QDateTime getDistributionCacheTimestamp() const;
//! Last distribution URL successfully read
//! \threadsafe
QString getLastSuccessfulDistributionUrl() const;
@@ -176,8 +192,8 @@ namespace BlackCore
QString m_lastSuccessfulSetupUrl; //!< last successful read setup URL
QString m_lastSuccessfulDistributionUrl; //!< last successful read distribution URL
BlackMisc::CStatusMessageList m_setupReadErrorMsgs; //!< last parsing error messages
BlackMisc::CData<BlackCore::Data::TGlobalSetup> m_setup {this, &CSetupReader::ps_setupChanged}; //!< data cache setup
BlackMisc::CData<BlackMisc::Db::TDistributionsInfo> m_distributions {this}; //!< data cache distributions
BlackMisc::CData<BlackCore::Data::TGlobalSetup> m_setup { this, &CSetupReader::ps_setupChanged }; //!< data cache setup
BlackMisc::CData<BlackMisc::Db::TDistributionsInfo> m_distributions { this }; //!< data cache distributions
//! Read by local individual file and update cache from that
BlackMisc::CStatusMessageList readLocalBootstrapFile(const QString &fileName);

View File

@@ -27,22 +27,25 @@ namespace BlackGui
ui(new Ui::CSetupLoadingDialog)
{
Q_ASSERT_X(sApp, Q_FUNC_INFO, "Need sApp");
if (sApp->hasSetupReader())
if (this->hasSetupReader())
{
// reset if it was temp.ignored
// reset if it was temporarily ignored
sApp->getSetupReader()->setIgnoreCmdLineBootstrapUrl(false);
connect(sApp, &CGuiApplication::setupHandlingCompleted, this, &CSetupLoadingDialog::onSetupHandlingCompleted);
}
ui->setupUi(this);
connect(ui->pb_IgnoreExplicitBootstrapUrl, &QPushButton::clicked, this, &CSetupLoadingDialog::tryAgainWithoutBootstrapUrl);
connect(ui->pb_LoadFromDisk, &QPushButton::clicked, this, &CSetupLoadingDialog::prefillSetupCache);
QPushButton *retry = ui->bb_Dialog->button(QDialogButtonBox::Retry);
retry->setDefault(true);
this->displaySetupCacheInfo();
this->displayCmdBoostrapUrl();
this->displayBootstrapUrls();
this->displayGlobalSetup();
}
CSetupLoadingDialog::CSetupLoadingDialog(const BlackMisc::CStatusMessageList &msgs, QWidget *parent) : CSetupLoadingDialog(parent)
{
ui->comp_Messages->appendStatusMessagesToList(msgs);
@@ -51,20 +54,24 @@ namespace BlackGui
CSetupLoadingDialog::~CSetupLoadingDialog()
{ }
bool CSetupLoadingDialog::hasCachedSetup() const
{
return this->hasSetupReader() && sApp->getSetupReader()->hasCachedSetup();
}
bool CSetupLoadingDialog::hasSetupReader() const
{
return sApp && sApp->hasSetupReader();
}
void CSetupLoadingDialog::displayBootstrapUrls()
{
const CUrlList bootstrapUrls = sApp->getGlobalSetup().getSwiftBootstrapFileUrls();
for (const CUrl &url : bootstrapUrls)
{
CStatusMessage msg;
if (CNetworkUtils::canConnect(url))
{
msg = CStatusMessage(this).info("Can connect to '%1'") << url.getFullUrl();
}
else
{
msg = CStatusMessage(this).warning("Cannot connect to '%1'") << url.getFullUrl();
}
CStatusMessage msg = CNetworkUtils::canConnect(url) ?
CStatusMessage(this).info("Can connect to '%1'") << url.getFullUrl() :
CStatusMessage(this).warning("Cannot connect to '%1'") << url.getFullUrl();
ui->comp_Messages->appendStatusMessageToList(msg);
}
}
@@ -92,5 +99,39 @@ namespace BlackGui
sApp->getSetupReader()->setIgnoreCmdLineBootstrapUrl(true);
this->accept();
}
void CSetupLoadingDialog::prefillSetupCache()
{
if (!sApp || sApp->isShuttingDown()) { return; }
if (!this->hasSetupReader()) { return; }
sApp->getSetupReader()->prefillCacheWithLocalResourceBootstrapFile();
}
void CSetupLoadingDialog::displaySetupCacheInfo()
{
if (this->hasSetupReader())
{
// reset if it was temporarily ignored
const CSetupReader *sr = sApp->getSetupReader();
const QDateTime setupTs = sr->getSetupCacheTimestamp();
ui->le_SetupCache->setText(setupTs.isValid() ?
setupTs.toString(Qt::ISODateWithMs) :
"No cache timestamp");
}
else
{
ui->le_SetupCache->setText("No setup reader");
}
const bool hasCachedSetup = this->hasCachedSetup();
ui->pb_LoadFromDisk->setEnabled(!hasCachedSetup);
ui->pb_LoadFromDisk->setVisible(!hasCachedSetup);
}
void CSetupLoadingDialog::onSetupHandlingCompleted(bool success)
{
Q_UNUSED(success);
this->displaySetupCacheInfo();
}
} // ns
} // ns

View File

@@ -40,6 +40,12 @@ namespace BlackGui
private:
QScopedPointer<Ui::CSetupLoadingDialog> ui;
//! Cached setup available?
bool hasCachedSetup() const;
//! Setup reader?
bool hasSetupReader() const;
//! Set info fields
void displayBootstrapUrls();
@@ -51,6 +57,15 @@ namespace BlackGui
//! Try again without explicit bootstrap URL
void tryAgainWithoutBootstrapUrl();
//! Prefill setup cache
void prefillSetupCache();
//! Display the setup cache info
void displaySetupCacheInfo();
//! Setup loading has been completed
void onSetupHandlingCompleted(bool success);
};
} // ns
} // ns

View File

@@ -37,42 +37,52 @@
</property>
<item>
<widget class="QFrame" name="fr_Details">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QLabel" name="lbl_CmdLine">
<property name="text">
<string>Cmd:</string>
<layout class="QGridLayout" name="gl_Details" columnstretch="0,3,0,0,0">
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item row="3" column="1">
<widget class="QLineEdit" name="le_SetupCache">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="5">
<item row="3" column="2">
<widget class="QPushButton" name="pb_LoadFromDisk">
<property name="text">
<string> load from disk </string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lbl_CmdLine">
<property name="text">
<string>Command:</string>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="QLineEdit" name="le_BootstrapMode">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QLabel" name="lbl_BootstrapMode">
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="2" column="2" colspan="4">
<item row="1" column="1" colspan="4">
<widget class="QLineEdit" name="le_CmdLine">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="2" column="0">
<widget class="QLabel" name="lbl_BootstrapUrl">
<property name="toolTip">
<string>Where the bootstrap file is located</string>
@@ -82,24 +92,31 @@
</property>
</widget>
</item>
<item row="3" column="2">
<item row="2" column="3">
<widget class="QLabel" name="lbl_BootstrapMode">
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="le_BootstrapUrl">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="3">
<item row="2" column="2">
<widget class="QPushButton" name="pb_IgnoreExplicitBootstrapUrl">
<property name="text">
<string>Ignore</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="6">
<item row="0" column="0" colspan="5">
<widget class="QLabel" name="lbl_Info">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:9pt; font-weight:600;&quot;&gt;Loading the setup (aka &amp;quot;bootstrap file&amp;quot;) has failed!&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; This file is required for &lt;/span&gt;&lt;span style=&quot; font-size:9pt; font-style:italic;&quot;&gt;swift&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; to work properly. You can try to load the file again (&amp;quot;Retry&amp;quot;) or give up (&amp;quot;Cancel&amp;quot;). If you have set an explicit bootstrap URL, you can also ignore this URL and use cached setup data (if there are any).&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:9pt; font-weight:600;&quot;&gt;Loading the setup (aka &amp;quot;bootstrap file&amp;quot;) has failed!&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; This file is required for &lt;/span&gt;&lt;span style=&quot; font-size:9pt; font-style:italic;&quot;&gt;swift&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; to work properly. You can try to load the file again (&amp;quot;Retry&amp;quot;) or give up (&amp;quot;Cancel&amp;quot;). If you have set an explicit bootstrap URL, you can also ignore this URL and use cached setup data (if there are any). If all goes wrong, you can try to load the setup cache from disk.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
@@ -109,6 +126,13 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lbl_SetupCache">
<property name="text">
<string>Setup cache:</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>