File: userdatabase.hh

package info (click to toggle)
qdmr 0.13.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,420 kB
  • sloc: cpp: 95,929; xml: 10,749; python: 1,108; makefile: 78; sh: 9
file content (127 lines) | stat: -rw-r--r-- 4,254 bytes parent folder | download
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef USERDATABASE_HH
#define USERDATABASE_HH

#include <QObject>
#include <QVector>
#include <QHash>
#include <QJsonObject>
#include <QNetworkAccessManager>
#include <QAbstractTableModel>
#include <QSortFilterProxyModel>
#include <QGeoPositionInfoSource>
#include <QFuture>

/** Auto-updating DMR user database.
 *
 * This class represents the complete DMR user database. The user database gets downloaded from
 * https://www.radioid.net/static/users.json and kept up-to-date by re-downloading it
 * periodically (by default every 30 days). This user database gets used in the GUI application
 * to help assemble private call contacts and to assemble so-called CSV callsign databases, that
 * are programmable to some DMR radios to resolve the DMR ID to callsigns and names.
 *
 * @ingroup util */
class UserDatabase : public QAbstractTableModel
{
  Q_OBJECT

  /** Get notification, once the database has been loaded. */
  Q_PROPERTY(bool ready READ ready NOTIFY readyChanged FINAL)

public:
  /** Represents the user information within the @c UserDatabase. */
  class User {
  public:
    /** Empty constructor. */
    User();
    /** Constructs entry from JSON object. */
    User(const QJsonObject &obj);

    /** Returns @c true if the entry is valid. */
    inline bool isValid() const { return 0 != id; }

    /** Returns the "distance" between this user and the given ID. */
    unsigned distance(unsigned id) const;

    /** The DMR ID of the user. */
    unsigned id;
    /** The callsign of the user. */
    QString call;
    /** The name of the user. */
    QString name;
    /** The surname of the user. */
    QString surname;
    /** The city of the user. */
    QString city;
    /** The state of the user. */
    QString state;
    /** The country of the user. */
    QString country;
    /** Some arbitrary comment or text. */
    QString comment;
  };

public:
  /** Constructs the user-database.
   * The constructor will download the current user database if it was not downloaded yet or
   * if the downloaded version is older than @c updatePeriodDays days. */
  explicit UserDatabase(bool parallel, unsigned updatePeriodDays=30, QObject *parent=nullptr);

  /** Returns the number of users. */
  qint64 count() const;

  /** Retruns @c true, if the user database file exists. */
  bool exists() const;

  /** Loads all entries from the downloaded user database. */
  bool load();
  /** Loads all entries from the downloaded user database at the specified location. */
  bool load(const QString &filename);

  /** Returns @c true, if the database has been loaded. */
  bool ready() const;

  /** Sorts users with respect to the distance to the given ID. */
  void sortUsers(unsigned id);
  /** Sorts users with respect to the minimum distance to the given IDs. */
  void sortUsers(const QSet<unsigned> &ids);

  /** Returns the user with index @c idx. */
  const User &user(int idx) const;

  /** Returns the age of the database in days. */
  unsigned dbAge() const;

  /** Implements the QAbstractTableModel interface, returns the number of rows (number of entries). */
  int rowCount(const QModelIndex &parent=QModelIndex()) const;
  /** Implements the QAbstractTableModel interface, returns the number of columns. */
  int columnCount(const QModelIndex &parent=QModelIndex()) const;
  /** Implements the QAbstractTableModel interface, return the entry data. */
  QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;

signals:
  /** Gets emitted once the call-sign database has been loaded. */
  void loaded();
  /** Gets emitted if the loading of the call-sign database fails. */
  void error(const QString &msg);
  /** Gets emitted, once the database has been loaded or cleard. */
  void readyChanged(bool ready);

public slots:
  /** Starts the download of the user database. */
  void download();

private slots:
  /** Gets called whenever the download is complete. */
  void downloadFinished(QNetworkReply *reply);

private:
  /** Holds all users sorted by their ID. */
  QVector<User>         _user;
  /** The network access used for downloading. */
  QNetworkAccessManager _network;
  /** The current parallel task of parsing the database. */
  QFuture<bool> _parsing;
};


#endif // USERDATABASE_HH