AirMapSharedState.h 2.48 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/****************************************************************************
 *
 *   (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>
Gus Grubba's avatar
Gus Grubba committed
13 14
#include <QQueue>

15 16
#include "AirspaceManager.h"

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
#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:
60 61
    void    error       (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
    void    authStatus  (AirspaceManager::AuthStatus status);
62 63 64 65 66 67 68 69 70 71 72 73

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
};