AirMapSharedState.h 2.36 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
/****************************************************************************
 *
 *   (c) 2017 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#pragma once

#include <QObject>
#include <airmap/qt/client.h>

/**
 * @class AirMapSharedState
 * Contains state & settings that need to be shared (such as login)
 */

class AirMapSharedState : public QObject
{
    Q_OBJECT
public:
    struct Settings {
        QString apiKey;
        // login credentials
        QString clientID;
        QString userName; ///< use anonymous login if empty
        QString password;
    };

    void                setSettings         (const Settings& settings);
    const Settings&     settings            () const { return _settings; }
    void                setClient           (airmap::qt::Client* client) { _client = client; }

    /**
     * Get the current client instance. It can be NULL. If not NULL, it implies
     * there's an API key set.
     */
    airmap::qt::Client* client              () const { return _client; }
    bool                hasAPIKey           () const { return _settings.apiKey != ""; }
    bool                isLoggedIn          () const { return _loginToken != ""; }

    using Callback = std::function<void(const QString& /* login_token */)>;

    /**
     * Do a request that requires user login: if not yet logged in, the request is queued and
     * processed after successful login, otherwise it's executed directly.
     */
    void                doRequestWithLogin  (const Callback& callback);
    void                login               ();
    void                logout              ();
    const QString&      loginToken          () const { return _loginToken; }

signals:
    void error  (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);

private:
    void _processPendingRequests            ();

private:
    bool                _isLoginInProgress = false;
    QString             _loginToken;        ///< login token: empty when not logged in
    airmap::qt::Client* _client = nullptr;
    Settings            _settings;
    QQueue<Callback>    _pendingRequests;   ///< pending requests that are processed after a successful login
};