qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
settingsserializer.h
Go to the documentation of this file.
1 /*
2  Copyright © 2015-2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #pragma once
21 
22 #include "src/core/toxencrypt.h"
23 
24 #include <QDataStream>
25 #include <QSettings>
26 #include <QString>
27 #include <QVector>
28 
30 {
31 public:
32  SettingsSerializer(QString filePath, const ToxEncrypt* passKey = nullptr);
33 
34  static bool isSerializedFormat(QString filePath);
35 
36  void load();
37  void save();
38 
39  void beginGroup(const QString& prefix);
40  void endGroup();
41 
42  int beginReadArray(const QString& prefix);
43  void beginWriteArray(const QString& prefix, int size = -1);
44  void endArray();
45  void setArrayIndex(int i);
46 
47  void setValue(const QString& key, const QVariant& value);
48  QVariant value(const QString& key, const QVariant& defaultValue = QVariant()) const;
49 
50 private:
51  enum class RecordTag : uint8_t
52  {
53  Value = 0,
54  GroupStart = 1,
55  ArrayStart = 2,
56  ArrayValue = 3,
57  ArrayEnd = 4,
58  };
59  friend QDataStream& writeStream(QDataStream& dataStream, const SettingsSerializer::RecordTag& tag);
60  friend QDataStream& readStream(QDataStream& dataStream, SettingsSerializer::RecordTag& tag);
61 
62  struct Value
63  {
65  : group{-2}
66  , array{-2}
67  , arrayIndex{-2}
68  , key{QString()}
69  , value{}
70  {
71  }
72  Value(qint64 group, qint64 array, int arrayIndex, QString key, QVariant value)
73  : group{group}
74  , array{array}
76  , key{key}
77  , value{value}
78  {
79  }
80  qint64 group;
81  qint64 array;
83  QString key;
84  QVariant value;
85  };
86 
87  struct Array
88  {
89  qint64 group;
90  int size;
91  QString name;
92  QVector<int> values;
93  };
94 
95 private:
96  const Value* findValue(const QString& key) const;
97  Value* findValue(const QString& key);
98  void readSerialized();
99  void readIni();
100  void removeValue(const QString& key);
101  void removeGroup(int group);
102  void writePackedVariant(QDataStream& dataStream, const QVariant& v);
103 
104 private:
105  QString path;
108  QStringList groups;
109  QVector<Array> arrays;
110  QVector<Value> values;
111  static const char magic[];
112 };
SettingsSerializer::beginWriteArray
void beginWriteArray(const QString &prefix, int size=-1)
Definition: settingsserializer.cpp:146
SettingsSerializer::Array::size
int size
Definition: settingsserializer.h:90
SettingsSerializer::Array::values
QVector< int > values
Definition: settingsserializer.h:92
SettingsSerializer::setArrayIndex
void setArrayIndex(int i)
Definition: settingsserializer.cpp:170
SettingsSerializer::values
QVector< Value > values
Definition: settingsserializer.h:110
SettingsSerializer::load
void load()
Loads the settings from file.
Definition: settingsserializer.cpp:242
SettingsSerializer::isSerializedFormat
static bool isSerializedFormat(QString filePath)
Checks if the file is serialized settings.
Definition: settingsserializer.cpp:228
SettingsSerializer::setValue
void setValue(const QString &key, const QVariant &value)
Definition: settingsserializer.cpp:175
SettingsSerializer::Value::group
qint64 group
Definition: settingsserializer.h:80
SettingsSerializer::writePackedVariant
void writePackedVariant(QDataStream &dataStream, const QVariant &v)
Definition: settingsserializer.cpp:552
SettingsSerializer::RecordTag::ArrayEnd
@ ArrayEnd
SettingsSerializer::passKey
const ToxEncrypt * passKey
Definition: settingsserializer.h:106
SettingsSerializer::Value::Value
Value(qint64 group, qint64 array, int arrayIndex, QString key, QVariant value)
Definition: settingsserializer.h:72
SettingsSerializer::group
int group
Definition: settingsserializer.h:107
SettingsSerializer::magic
static const char magic[]
Definition: settingsserializer.h:111
SettingsSerializer::endGroup
void endGroup()
Definition: settingsserializer.cpp:124
SettingsSerializer::SettingsSerializer
SettingsSerializer(QString filePath, const ToxEncrypt *passKey=nullptr)
Definition: settingsserializer.cpp:102
SettingsSerializer::readSerialized
void readSerialized()
Definition: settingsserializer.cpp:320
SettingsSerializer::findValue
const Value * findValue(const QString &key) const
Definition: settingsserializer.cpp:197
SettingsSerializer::beginGroup
void beginGroup(const QString &prefix)
Definition: settingsserializer.cpp:111
SettingsSerializer::writeStream
friend QDataStream & writeStream(QDataStream &dataStream, const SettingsSerializer::RecordTag &tag)
Definition: settingsserializer.cpp:63
SettingsSerializer::arrays
QVector< Array > arrays
Definition: settingsserializer.h:109
SettingsSerializer::RecordTag::ArrayValue
@ ArrayValue
SettingsSerializer::RecordTag
RecordTag
Definition: settingsserializer.h:51
SettingsSerializer::endArray
void endArray()
Definition: settingsserializer.cpp:165
ToxEncrypt
Encapsulates the toxencrypsave API. Since key derivation is work intensive and to avoid storing plain...
Definition: toxencrypt.h:29
SettingsSerializer::RecordTag::GroupStart
@ GroupStart
SettingsSerializer::readStream
friend QDataStream & readStream(QDataStream &dataStream, SettingsSerializer::RecordTag &tag)
Definition: settingsserializer.cpp:81
SettingsSerializer::array
int array
Definition: settingsserializer.h:107
SettingsSerializer::RecordTag::ArrayStart
@ ArrayStart
SettingsSerializer::removeGroup
void removeGroup(int group)
Remove group.
Definition: settingsserializer.cpp:536
SettingsSerializer::groups
QStringList groups
Definition: settingsserializer.h:108
SettingsSerializer::Array
Definition: settingsserializer.h:87
SettingsSerializer::Value::array
qint64 array
Definition: settingsserializer.h:81
SettingsSerializer
Serializes a QSettings's data in an (optionally) encrypted binary format. SettingsSerializer can dete...
Definition: settingsserializer.h:29
SettingsSerializer::save
void save()
Saves the current settings back to file.
Definition: settingsserializer.cpp:253
SettingsSerializer::value
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Definition: settingsserializer.cpp:188
SettingsSerializer::Array::group
qint64 group
Definition: settingsserializer.h:89
toxencrypt.h
SettingsSerializer::Value::arrayIndex
int arrayIndex
Definition: settingsserializer.h:82
SettingsSerializer::beginReadArray
int beginReadArray(const QString &prefix)
Definition: settingsserializer.cpp:129
SettingsSerializer::arrayIndex
int arrayIndex
Definition: settingsserializer.h:107
SettingsSerializer::Value::key
QString key
Definition: settingsserializer.h:83
SettingsSerializer::removeValue
void removeValue(const QString &key)
SettingsSerializer::readIni
void readIni()
Definition: settingsserializer.cpp:402
SettingsSerializer::Array::name
QString name
Definition: settingsserializer.h:91
SettingsSerializer::Value::Value
Value()
Definition: settingsserializer.h:64
SettingsSerializer::path
QString path
Definition: settingsserializer.h:105
SettingsSerializer::Value::value
QVariant value
Definition: settingsserializer.h:84
SettingsSerializer::Value
Definition: settingsserializer.h:62