mirror of
https://github.com/nextcloud/desktop.git
synced 2024-12-20 12:52:06 +03:00
e58739de00
Since the statuses are cached and that we can't invalidate the cache, sending NOP would need to be overwritten by the default OK status once the client successfully connected. But instead of remembering which files we NOPed, rather wait until we are ready to sync before sending the REGISTER_PATH message to the socket API client. It will also prevent the client from sending unnecessary RETRIEVE_FILE_STATUS requests. Also remove AccountState::canSync, since it does the same as isConnected and syncing is not an account responsibility.
153 lines
4.5 KiB
C++
153 lines
4.5 KiB
C++
/*
|
|
* Copyright (C) by Daniel Molkentin <danimo@owncloud.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*/
|
|
|
|
|
|
#ifndef ACCOUNTINFO_H
|
|
#define ACCOUNTINFO_H
|
|
|
|
#include <QByteArray>
|
|
#include <QPointer>
|
|
#include "utility.h"
|
|
#include "connectionvalidator.h"
|
|
#include "creds/abstractcredentials.h"
|
|
#include <memory>
|
|
|
|
class QSettings;
|
|
|
|
namespace OCC {
|
|
|
|
class AccountState;
|
|
class Account;
|
|
|
|
typedef QExplicitlySharedDataPointer<AccountState> AccountStatePtr;
|
|
|
|
/**
|
|
* @brief Extra info about an ownCloud server account.
|
|
* @ingroup gui
|
|
*/
|
|
class AccountState : public QObject, public QSharedData {
|
|
Q_OBJECT
|
|
public:
|
|
enum State {
|
|
/// Not even attempting to connect, most likely because the
|
|
/// user explicitly signed out or cancelled a credential dialog.
|
|
SignedOut,
|
|
|
|
/// Account would like to be connected but hasn't heard back yet.
|
|
Disconnected,
|
|
|
|
/// The account is successfully talking to the server.
|
|
Connected,
|
|
|
|
/// There's a temporary problem with talking to the server,
|
|
/// don't bother the user too much and try again.
|
|
ServiceUnavailable,
|
|
|
|
/// Could not communicate with the server for some reason.
|
|
/// We assume this may resolve itself over time and will try
|
|
/// again automatically.
|
|
NetworkError,
|
|
|
|
/// An error like invalid credentials where retrying won't help.
|
|
ConfigurationError
|
|
};
|
|
|
|
/// The actual current connectivity status.
|
|
typedef ConnectionValidator::Status ConnectionStatus;
|
|
|
|
/// Use the account as parent
|
|
explicit AccountState(AccountPtr account);
|
|
~AccountState();
|
|
|
|
/** Creates an account state from settings and an Account object.
|
|
*
|
|
* Use from AccountManager with a prepared QSettings object only.
|
|
*/
|
|
static AccountState* loadFromSettings(AccountPtr account, QSettings& settings);
|
|
|
|
/** Writes account state information to settings.
|
|
*
|
|
* It does not write the Account data.
|
|
*/
|
|
void writeToSettings(QSettings& settings);
|
|
|
|
AccountPtr account() const;
|
|
|
|
ConnectionStatus connectionStatus() const;
|
|
QStringList connectionErrors() const;
|
|
static QString connectionStatusString(ConnectionStatus status);
|
|
|
|
State state() const;
|
|
static QString stateString(State state);
|
|
|
|
bool isSignedOut() const;
|
|
|
|
/** A user-triggered sign out which disconnects, stops syncs
|
|
* for the account and forgets the password. */
|
|
void signOutByUi();
|
|
|
|
/// Move from SignedOut state to Disconnected (attempting to connect)
|
|
void signIn();
|
|
|
|
bool isConnected() const;
|
|
bool isConnectedOrTemporarilyUnavailable() const;
|
|
|
|
/// Triggers a ping to the server to update state and
|
|
/// connection status and errors.
|
|
void checkConnectivity();
|
|
|
|
/** Returns a new settings object for this account, already in the right groups. */
|
|
std::unique_ptr<QSettings> settings();
|
|
|
|
/** display name with two lines that is displayed in the settings
|
|
* If width is bigger than 0, the string will be ellided so it does not exceed that width
|
|
*/
|
|
QString shortDisplayNameForSettings(int width = 0) const;
|
|
|
|
/** Mark the timestamp when the last successful ETag check happened for
|
|
* this account.
|
|
* The checkConnectivity() method uses the timestamp to save a call to
|
|
* the server to validate the connection if the last successful etag job
|
|
* was not so long ago.
|
|
*/
|
|
void tagLastSuccessfullETagRequest();
|
|
|
|
private:
|
|
void setState(State state);
|
|
|
|
signals:
|
|
void stateChanged(int state);
|
|
void isConnectedChanged();
|
|
|
|
protected Q_SLOTS:
|
|
void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList& errors);
|
|
void slotInvalidCredentials();
|
|
void slotCredentialsFetched(AbstractCredentials* creds);
|
|
void slotCredentialsAsked(AbstractCredentials* creds);
|
|
|
|
private:
|
|
AccountPtr _account;
|
|
State _state;
|
|
ConnectionStatus _connectionStatus;
|
|
QStringList _connectionErrors;
|
|
bool _waitingForNewCredentials;
|
|
QElapsedTimer _timeSinceLastETagCheck;
|
|
QPointer<ConnectionValidator> _connectionValidator;
|
|
};
|
|
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(OCC::AccountState*)
|
|
Q_DECLARE_METATYPE(OCC::AccountStatePtr)
|
|
|
|
#endif //ACCOUNTINFO_H
|