CR changes

This commit is contained in:
Clement 2019-09-20 13:11:05 -07:00
parent 282aa70db3
commit 1924dad51b
4 changed files with 56 additions and 86 deletions

View file

@ -47,6 +47,9 @@ Q_DECLARE_METATYPE(JSONCallbackParameters)
const QString ACCOUNTS_GROUP = "accounts"; const QString ACCOUNTS_GROUP = "accounts";
const int POST_SETTINGS_INTERVAL = 10 * MSECS_PER_SECOND;
const int PULL_SETTINGS_RETRY_INTERVAL = 1 * MSECS_PER_SECOND;
JSONCallbackParameters::JSONCallbackParameters(QObject* callbackReceiver, JSONCallbackParameters::JSONCallbackParameters(QObject* callbackReceiver,
const QString& jsonCallbackMethod, const QString& jsonCallbackMethod,
const QString& errorCallbackMethod) : const QString& errorCallbackMethod) :
@ -89,7 +92,6 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) :
connect(this, &AccountManager::loginComplete, this, &AccountManager::uploadPublicKey); connect(this, &AccountManager::loginComplete, this, &AccountManager::uploadPublicKey);
connect(this, &AccountManager::loginComplete, this, &AccountManager::requestAccountSettings); connect(this, &AccountManager::loginComplete, this, &AccountManager::requestAccountSettings);
static int POST_SETTINGS_INTERVAL = 10 * MSECS_PER_SECOND;
_postSettingsTimer = new QTimer(this); _postSettingsTimer = new QTimer(this);
_postSettingsTimer->setInterval(POST_SETTINGS_INTERVAL); _postSettingsTimer->setInterval(POST_SETTINGS_INTERVAL);
connect(this, SIGNAL(loginComplete(QUrl)), _postSettingsTimer, SLOT(start())); connect(this, SIGNAL(loginComplete(QUrl)), _postSettingsTimer, SLOT(start()));
@ -98,7 +100,6 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) :
connect(qApp, &QCoreApplication::aboutToQuit, this, &AccountManager::postAccountSettings); connect(qApp, &QCoreApplication::aboutToQuit, this, &AccountManager::postAccountSettings);
} }
const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash";
const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner"; const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner";
void AccountManager::logout() { void AccountManager::logout() {
@ -114,6 +115,8 @@ void AccountManager::logout() {
emit logoutComplete(); emit logoutComplete();
// the username has changed to blank // the username has changed to blank
emit usernameChanged(QString()); emit usernameChanged(QString());
_settings.loggedOut();
} }
QString accountFileDir() { QString accountFileDir() {
@ -806,6 +809,8 @@ void AccountManager::requestAccountSettings() {
QNetworkReply* lockerReply = networkAccessManager.get(lockerRequest); QNetworkReply* lockerReply = networkAccessManager.get(lockerRequest);
connect(lockerReply, &QNetworkReply::finished, this, &AccountManager::requestAccountSettingsFinished); connect(lockerReply, &QNetworkReply::finished, this, &AccountManager::requestAccountSettingsFinished);
connect(lockerReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccountSettingsError(QNetworkReply::NetworkError))); connect(lockerReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccountSettingsError(QNetworkReply::NetworkError)));
_settings.startedLoading();
} }
void AccountManager::requestAccountSettingsFinished() { void AccountManager::requestAccountSettingsFinished() {
@ -821,25 +826,27 @@ void AccountManager::requestAccountSettingsFinished() {
emit accountSettingsLoaded(); emit accountSettingsLoaded();
} else { } else {
qCDebug(networking) << "Error in response for account settings: no data object"; qCDebug(networking) << "Error in response for account settings: no data object";
QTimer::singleShot(PULL_SETTINGS_RETRY_INTERVAL, this, &AccountManager::requestAccountSettings);
} }
} else { } else {
// TODO: error handling
qCDebug(networking) << "Error in response for account settings" << lockerReply->errorString(); qCDebug(networking) << "Error in response for account settings" << lockerReply->errorString();
QTimer::singleShot(PULL_SETTINGS_RETRY_INTERVAL, this, &AccountManager::requestAccountSettings);
} }
} }
void AccountManager::requestAccountSettingsError(QNetworkReply::NetworkError error) { void AccountManager::requestAccountSettingsError(QNetworkReply::NetworkError error) {
// TODO: error handling
qCWarning(networking) << "Account settings request encountered an error" << error; qCWarning(networking) << "Account settings request encountered an error" << error;
QTimer::singleShot(PULL_SETTINGS_RETRY_INTERVAL, this, &AccountManager::requestAccountSettings);
} }
void AccountManager::postAccountSettings() { void AccountManager::postAccountSettings() {
if (!_settings.somethingChanged()) { if (_settings.lastChangeTimestamp() <= _lastSuccessfulSyncTimestamp && _lastSuccessfulSyncTimestamp != 0) {
// Nothing changed, skipping settings post // Nothing changed, skipping settings post
return; return;
} }
if (!isLoggedIn()) { if (!isLoggedIn()) {
qCWarning(networking) << "Can't post account settings: Not logged in"; qCWarning(networking) << "Can't post account settings: Not logged in";
return;
} }
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
@ -853,6 +860,7 @@ void AccountManager::postAccountSettings() {
lockerRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); lockerRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
lockerRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); lockerRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue());
_currentSyncTimestamp = _settings.lastChangeTimestamp();
QJsonObject dataObj; QJsonObject dataObj;
dataObj.insert("locker", _settings.pack()); dataObj.insert("locker", _settings.pack());
@ -869,14 +877,14 @@ void AccountManager::postAccountSettingsFinished() {
QJsonDocument jsonResponse = QJsonDocument::fromJson(lockerReply->readAll()); QJsonDocument jsonResponse = QJsonDocument::fromJson(lockerReply->readAll());
const QJsonObject& rootObject = jsonResponse.object(); const QJsonObject& rootObject = jsonResponse.object();
if (!rootObject.contains("status") || rootObject["status"].toString() != "success") { if (rootObject.contains("status") && rootObject["status"].toString() == "success") {
// TODO: error handling _lastSuccessfulSyncTimestamp = _currentSyncTimestamp;
} else {
qCDebug(networking) << "Error in response for account settings post" << lockerReply->errorString(); qCDebug(networking) << "Error in response for account settings post" << lockerReply->errorString();
} }
} }
void AccountManager::postAccountSettingsError(QNetworkReply::NetworkError error) { void AccountManager::postAccountSettingsError(QNetworkReply::NetworkError error) {
// TODO: error handling
qCWarning(networking) << "Post encountered an error" << error; qCWarning(networking) << "Post encountered an error" << error;
} }

View file

@ -183,7 +183,9 @@ private:
QString _configFileURL; QString _configFileURL;
AccountSettings _settings; AccountSettings _settings;
QTimer* _postSettingsTimer; quint64 _currentSyncTimestamp { 0 };
quint64 _lastSuccessfulSyncTimestamp { 0 };
QTimer* _postSettingsTimer { nullptr };
}; };
#endif // hifi_AccountManager_h #endif // hifi_AccountManager_h

View file

@ -15,25 +15,15 @@
#include <QJsonObject> #include <QJsonObject>
#include "NetworkLogging.h" #include "NetworkLogging.h"
#include "SharedUtil.h"
// Examples: static QString HOME_LOCATION_KEY { "home_location" };
//static QString SOME_STRING_KEY { "some_string" };
//static QString SOME_INT_KEY { "some_int" };
//static QString SOME_BOOL_KEY { "some_bool" };
// Examples:
//QString AccountSettings::DEFAULT_SOME_STRING { "" };
//int AccountSettings::DEFAULT_SOME_INT { 17 };
//bool AccountSettings::DEFAULT_SOME_BOOL { true };
QJsonObject AccountSettings::pack() { QJsonObject AccountSettings::pack() {
QJsonObject data; QJsonObject data;
QReadLocker lock(&_settingsLock); QReadLocker lock(&_settingsLock);
// Examples: data.insert(HOME_LOCATION_KEY, _homeLocation);
// data.insert(SOME_STRING_KEY, _someString);
// data.insert(SOME_INT_KEY, _someInt);
// data.insert(SOME_BOOL_KEY, _someBool);
return data; return data;
} }
@ -41,43 +31,25 @@ QJsonObject AccountSettings::pack() {
void AccountSettings::unpack(QJsonObject data) { void AccountSettings::unpack(QJsonObject data) {
QWriteLocker lock(&_settingsLock); QWriteLocker lock(&_settingsLock);
// Examples: _lastChangeTimestamp = usecTimestampNow();
// auto it = data.find(SOME_STRING_KEY);
// _hasSomeString = it != data.end() && it->isString();
// _someString = _hasSomeString ? it->toString() : DEFAULT_SOME_STRING;
//
// it = data.find(SOME_INT_KEY);
// _hasSomeInt = it != data.end() && it->isDouble();
// _someInt = _hasSomeInt ? it->toInt() : DEFAULT_SOME_INT;
//
// it = data.find(SOME_BOOL_KEY);
// _hasSomeBool = it != data.end() && it->isBool();
// _someBool = _hasSomeBool ? it->toBool() : DEFAULT_SOME_BOOL;
_somethingChanged = false; auto it = data.find(HOME_LOCATION_KEY);
_homeLocationState = it != data.end() && it->isString() ? Loaded : NotPresent;
_homeLocation = _homeLocationState == Loaded ? it->toString() : "";
} }
// Examples: void AccountSettings::setHomeLocation(QString homeLocation) {
//void AccountSettings::setSomeString(QString someString) { QWriteLocker lock(&_settingsLock);
// QWriteLocker lock(&_settingsLock); if (homeLocation != _homeLocation) {
// if (someString != _someString) { _lastChangeTimestamp = usecTimestampNow();
// _somethingChanged = true; }
// } _homeLocation = homeLocation;
// _someString = someString; }
//}
// void AccountSettings::startedLoading() {
//void AccountSettings::setSomeInt(int someInt) { _homeLocationState = Loading;
// QWriteLocker lock(&_settingsLock); }
// if (someInt != _someInt) {
// _somethingChanged = true; void AccountSettings::loggedOut() {
// } _homeLocationState = LoggedOut;
// _someInt = someInt; }
//}
//
//void AccountSettings::setSomeBool(bool someBool) {
// QWriteLocker lock(&_settingsLock);
// if (someBool != _someBool) {
// _somethingChanged = true;
// }
// _someBool = someBool;
//}

View file

@ -18,42 +18,30 @@
class AccountSettings { class AccountSettings {
public: public:
// Examples: enum State {
// static QString DEFAULT_SOME_STRING; LoggedOut,
// static int DEFAULT_SOME_INT; Loading,
// static bool DEFAULT_SOME_BOOL; Loaded,
NotPresent
};
bool somethingChanged() const { return _somethingChanged; } void loggedOut();
void startedLoading();
quint64 lastChangeTimestamp() const { return _lastChangeTimestamp; }
QJsonObject pack(); QJsonObject pack();
void unpack(QJsonObject data); void unpack(QJsonObject data);
// Examples: State homeLocationState() const { QReadLocker lock(&_settingsLock); return _homeLocationState; }
// bool hasSomeString() const { QReadLocker lock(&_settingsLock); return _hasSomeString; } QString getHomeLocation() const { QReadLocker lock(&_settingsLock); return _homeLocation; }
// QString getSomeString() const { QReadLocker lock(&_settingsLock); return _someString; } void setHomeLocation(QString homeLocation);
// void setSomeString(QString someString);
//
// bool hasSomeInt() const { QReadLocker lock(&_settingsLock); return _hasSomeInt; }
// int getSomeInt() const { QReadLocker lock(&_settingsLock); return _someInt; }
// void setSomeInt(int someInt);
//
// bool hasSomeBool() const { QReadLocker lock(&_settingsLock); return _hasSomeBool; }
// bool getSomeBool() const { QReadLocker lock(&_settingsLock); return _someBool; }
// void setSomeBool(bool someBool);
private: private:
mutable QReadWriteLock _settingsLock; mutable QReadWriteLock _settingsLock;
bool _somethingChanged { false }; quint64 _lastChangeTimestamp { 0 };
// Examples: State _homeLocationState { LoggedOut };
// bool _hasSomeString { false }; QString _homeLocation;
// bool _hasSomeInt { false };
// bool _hasSomeBool { false };
// Examples:
// QString _someString { DEFAULT_SOME_STRING };
// int _someInt { DEFAULT_SOME_INT };
// bool _someBool { DEFAULT_SOME_BOOL };
}; };
#endif /* hifi_AccountSettings_h */ #endif /* hifi_AccountSettings_h */