mirror of
https://github.com/moonlight-stream/moonlight-qt
synced 2025-01-09 17:58:43 +00:00
Fix loss of all paired computers if Moonlight is terminated while writing the computer list
This commit is contained in:
parent
83f5f6cefc
commit
a1d592bb87
1 changed files with 36 additions and 9 deletions
|
@ -13,6 +13,7 @@
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
#define SER_HOSTS "hosts"
|
#define SER_HOSTS "hosts"
|
||||||
|
#define SER_HOSTS_BACKUP "hostsbackup"
|
||||||
|
|
||||||
class PcMonitorThread : public QThread
|
class PcMonitorThread : public QThread
|
||||||
{
|
{
|
||||||
|
@ -152,8 +153,16 @@ ComputerManager::ComputerManager(QObject *parent)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
|
||||||
|
// If there's a hosts backup copy, we must have failed to commit
|
||||||
|
// a previous update before exiting. Restore the backup now.
|
||||||
|
int hosts = settings.beginReadArray(SER_HOSTS_BACKUP);
|
||||||
|
if (hosts == 0) {
|
||||||
|
// If there's no host backup, read from the primary location.
|
||||||
|
settings.endArray();
|
||||||
|
hosts = settings.beginReadArray(SER_HOSTS);
|
||||||
|
}
|
||||||
|
|
||||||
// Inflate our hosts from QSettings
|
// Inflate our hosts from QSettings
|
||||||
int hosts = settings.beginReadArray(SER_HOSTS);
|
|
||||||
for (int i = 0; i < hosts; i++) {
|
for (int i = 0; i < hosts; i++) {
|
||||||
settings.setArrayIndex(i);
|
settings.setArrayIndex(i);
|
||||||
NvComputer* computer = new NvComputer(settings);
|
NvComputer* computer = new NvComputer(settings);
|
||||||
|
@ -245,17 +254,35 @@ void DelayedFlushThread::run() {
|
||||||
|
|
||||||
// Perform the flush
|
// Perform the flush
|
||||||
{
|
{
|
||||||
QReadLocker lock(&m_ComputerManager->m_Lock);
|
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
settings.remove(SER_HOSTS);
|
|
||||||
settings.beginWriteArray(SER_HOSTS);
|
// First, write to the backup location
|
||||||
|
settings.beginWriteArray(SER_HOSTS_BACKUP);
|
||||||
|
{
|
||||||
|
QReadLocker lock(&m_ComputerManager->m_Lock);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (const NvComputer* computer : m_ComputerManager->m_KnownHosts) {
|
for (const NvComputer* computer : m_ComputerManager->m_KnownHosts) {
|
||||||
settings.setArrayIndex(i++);
|
settings.setArrayIndex(i++);
|
||||||
computer->serialize(settings);
|
computer->serialize(settings);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
settings.endArray();
|
settings.endArray();
|
||||||
|
|
||||||
|
// Next, write to the primary location
|
||||||
|
settings.remove(SER_HOSTS);
|
||||||
|
settings.beginWriteArray(SER_HOSTS);
|
||||||
|
{
|
||||||
|
QReadLocker lock(&m_ComputerManager->m_Lock);
|
||||||
|
int i = 0;
|
||||||
|
for (const NvComputer* computer : m_ComputerManager->m_KnownHosts) {
|
||||||
|
settings.setArrayIndex(i++);
|
||||||
|
computer->serialize(settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.endArray();
|
||||||
|
|
||||||
|
// Finally, delete the backup copy
|
||||||
|
settings.remove(SER_HOSTS_BACKUP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue