AirMapSharedState.h 2.67 KB
Newer Older
1 2
/****************************************************************************
 *
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8 9 10 11 12
 *
 * 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
#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; }

40 41 42
    QString             pilotID             () { return _pilotID; }
    void                setPilotID          (const QString& pilotID) { _pilotID = pilotID; }

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    /**
     * 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:
63 64
    void    error       (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
    void    authStatus  (AirspaceManager::AuthStatus status);
65 66 67 68 69 70 71

private:
    void _processPendingRequests            ();

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