Merge lp:~xavi-garcia-mena/keeper/sf-errors-dbus-interface into lp:keeper/devel
- sf-errors-dbus-interface
- Merge into devel
Status: | Merged |
---|---|
Merged at revision: | 127 |
Proposed branch: | lp:~xavi-garcia-mena/keeper/sf-errors-dbus-interface |
Merge into: | lp:keeper/devel |
Diff against target: |
2685 lines (+930/-444) 40 files modified
include/client/client.h (+5/-4) include/client/keeper-errors.h (+18/-11) include/client/keeper-items.h (+78/-0) include/helper/helper.h (+1/-1) src/cli/command-line-client-view.cpp (+34/-16) src/cli/command-line-client-view.h (+3/-3) src/cli/command-line-client.cpp (+69/-82) src/cli/command-line-client.h (+5/-3) src/client/CMakeLists.txt (+3/-0) src/client/client.cpp (+65/-46) src/client/keeper-errors.cpp (+9/-9) src/client/keeper-items.cpp (+212/-0) src/helper/backup-helper.cpp (+6/-6) src/helper/helper.cpp (+1/-1) src/helper/restore-helper.cpp (+5/-5) src/qdbus-stubs/CMakeLists.txt (+5/-4) src/qdbus-stubs/com.canonical.keeper.User.xml (+3/-3) src/qdbus-stubs/dbus-types.h (+5/-2) src/service/backup-choices.cpp (+1/-1) src/service/keeper-task-backup.cpp (+11/-5) src/service/keeper-task-restore.cpp (+9/-3) src/service/keeper-task.cpp (+6/-6) src/service/keeper-task.h (+3/-2) src/service/keeper-user.cpp (+3/-3) src/service/keeper-user.h (+4/-4) src/service/keeper.cpp (+103/-58) src/service/keeper.h (+3/-3) src/service/metadata-provider.h (+2/-1) src/service/private/keeper-task_p.h (+2/-2) src/service/restore-choices.cpp (+3/-3) src/service/task-manager.cpp (+34/-6) src/service/task-manager.h (+3/-2) src/storage-framework/storage_framework_client.cpp (+57/-1) src/storage-framework/storage_framework_client.h (+5/-0) tests/dbusmock/keeper-template-test.cpp (+111/-102) tests/integration/helpers/helpers-test-failure.cpp (+10/-10) tests/integration/helpers/helpers-test.cc (+5/-5) tests/integration/helpers/restore-test.cpp (+1/-1) tests/integration/helpers/test-helpers-base.cpp (+22/-25) tests/integration/helpers/test-helpers-base.h (+5/-5) |
To merge this branch: | bzr merge lp:~xavi-garcia-mena/keeper/sf-errors-dbus-interface |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
unity-api-1-bot | continuous-integration | Needs Fixing | |
Xavi Garcia | Pending | ||
Review via email: mp+313721@code.launchpad.net |
This proposal supersedes a proposal from 2016-12-21.
Commit message
Just for testing build
Description of the change
Just for testing build
unity-api-1-bot (unity-api-1-bot) wrote : Posted in a previous version of this proposal | # |
unity-api-1-bot (unity-api-1-bot) wrote : | # |
FAILED: Continuous integration, rev:134
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 127. By Xavi Garcia
-
conflicts resolved
unity-api-1-bot (unity-api-1-bot) wrote : | # |
FAILED: Continuous integration, rev:127
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 128. By Xavi Garcia
-
Removed metadata_error signal, signature of dbus is internally again QVariantDictMap, returning error as additional dbus argument
- 129. By Xavi Garcia
-
KeeperError as Error and error codes changed
- 130. By Xavi Garcia
-
Fixed CMakeLists.txt
unity-api-1-bot (unity-api-1-bot) wrote : | # |
FAILED: Continuous integration, rev:130
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Preview Diff
1 | === modified file 'include/client/client.h' | |||
2 | --- include/client/client.h 2016-12-14 11:00:21 +0000 | |||
3 | +++ include/client/client.h 2016-12-22 14:35:27 +0000 | |||
4 | @@ -25,6 +25,7 @@ | |||
5 | 25 | #include <QScopedPointer> | 25 | #include <QScopedPointer> |
6 | 26 | #include <QStringList> | 26 | #include <QStringList> |
7 | 27 | #include <QVariant> | 27 | #include <QVariant> |
8 | 28 | #include "keeper-items.h" | ||
9 | 28 | 29 | ||
10 | 29 | struct KeeperClientPrivate; | 30 | struct KeeperClientPrivate; |
11 | 30 | 31 | ||
12 | @@ -62,12 +63,12 @@ | |||
13 | 62 | 63 | ||
14 | 63 | // C++ | 64 | // C++ |
15 | 64 | public: | 65 | public: |
18 | 65 | QMap<QString, QVariantMap> getBackupChoices() const; | 66 | keeper::KeeperItemsMap getBackupChoices(keeper::Error & error) const; |
19 | 66 | QMap<QString, QVariantMap> getRestoreChoices() const; | 67 | keeper::KeeperItemsMap getRestoreChoices(keeper::Error & error) const; |
20 | 67 | void startBackup(QStringList const& uuids) const; | 68 | void startBackup(QStringList const& uuids) const; |
21 | 68 | void startRestore(QStringList const& uuids) const; | 69 | void startRestore(QStringList const& uuids) const; |
22 | 69 | 70 | ||
24 | 70 | QMap<QString, QVariantMap> getState() const; | 71 | keeper::KeeperItemsMap getState() const; |
25 | 71 | 72 | ||
26 | 72 | Q_SIGNALS: | 73 | Q_SIGNALS: |
27 | 73 | void statusChanged(); | 74 | void statusChanged(); |
28 | @@ -75,7 +76,7 @@ | |||
29 | 75 | void readyToBackupChanged(); | 76 | void readyToBackupChanged(); |
30 | 76 | void backupBusyChanged(); | 77 | void backupBusyChanged(); |
31 | 77 | 78 | ||
33 | 78 | void taskStatusChanged(QString const & displayName, QString const & status, double percentage, keeper::KeeperError error); | 79 | void taskStatusChanged(QString const & displayName, QString const & status, double percentage, keeper::Error error); |
34 | 79 | void finished(); | 80 | void finished(); |
35 | 80 | 81 | ||
36 | 81 | private Q_SLOTS: | 82 | private Q_SLOTS: |
37 | 82 | 83 | ||
38 | === modified file 'include/client/keeper-errors.h' | |||
39 | --- include/client/keeper-errors.h 2016-12-21 08:36:57 +0000 | |||
40 | +++ include/client/keeper-errors.h 2016-12-22 14:35:27 +0000 | |||
41 | @@ -25,25 +25,32 @@ | |||
42 | 25 | namespace keeper | 25 | namespace keeper |
43 | 26 | { | 26 | { |
44 | 27 | 27 | ||
46 | 28 | enum class KeeperError | 28 | enum class Error |
47 | 29 | { | 29 | { |
48 | 30 | OK, | 30 | OK, |
52 | 31 | ERROR_UNKNOWN, | 31 | UNKNOWN, |
53 | 32 | HELPER_READ_ERROR, | 32 | HELPER_READ, |
54 | 33 | HELPER_WRITE_ERROR, | 33 | HELPER_WRITE, |
55 | 34 | HELPER_INACTIVITY_DETECTED, | 34 | HELPER_INACTIVITY_DETECTED, |
57 | 35 | HELPER_SOCKET_ERROR, | 35 | HELPER_SOCKET, |
58 | 36 | HELPER_START_TIMEOUT, | 36 | HELPER_START_TIMEOUT, |
59 | 37 | NO_HELPER_INFORMATION_IN_REGISTRY, | 37 | NO_HELPER_INFORMATION_IN_REGISTRY, |
60 | 38 | HELPER_BAD_URL, | 38 | HELPER_BAD_URL, |
63 | 39 | MANIFEST_STORAGE_ERROR, | 39 | MANIFEST_STORAGE, |
64 | 40 | COMMITTING_DATA_ERROR | 40 | COMMITTING_DATA, |
65 | 41 | |||
66 | 42 | CREATING_REMOTE_DIR, | ||
67 | 43 | CREATING_REMOTE_FILE, | ||
68 | 44 | READING_REMOTE_FILE, | ||
69 | 45 | REMOTE_DIR_NOT_EXISTS, | ||
70 | 46 | NO_REMOTE_ACCOUNTS, | ||
71 | 47 | NO_REMOTE_ROOTS | ||
72 | 41 | }; | 48 | }; |
73 | 42 | 49 | ||
75 | 43 | KeeperError convertFromDBusVariant(const QVariant & value, bool *conversion_ok = nullptr); | 50 | Error convert_from_dbus_variant(const QVariant & value, bool *conversion_ok = nullptr); |
76 | 44 | } // namespace keeper | 51 | } // namespace keeper |
77 | 45 | 52 | ||
80 | 46 | QDBusArgument &operator<<(QDBusArgument &argument, keeper::KeeperError value); | 53 | QDBusArgument &operator<<(QDBusArgument &argument, keeper::Error value); |
81 | 47 | const QDBusArgument &operator>>(const QDBusArgument &argument, keeper::KeeperError &val); | 54 | const QDBusArgument &operator>>(const QDBusArgument &argument, keeper::Error &val); |
82 | 48 | 55 | ||
84 | 49 | Q_DECLARE_METATYPE(keeper::KeeperError) | 56 | Q_DECLARE_METATYPE(keeper::Error) |
85 | 50 | 57 | ||
86 | === added file 'include/client/keeper-items.h' | |||
87 | --- include/client/keeper-items.h 1970-01-01 00:00:00 +0000 | |||
88 | +++ include/client/keeper-items.h 2016-12-22 14:35:27 +0000 | |||
89 | @@ -0,0 +1,78 @@ | |||
90 | 1 | /* | ||
91 | 2 | * Copyright (C) 2016 Canonical, Ltd. | ||
92 | 3 | * | ||
93 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
94 | 5 | * under the terms of the GNU General Public License version 3, as published | ||
95 | 6 | * by the Free Software Foundation. | ||
96 | 7 | * | ||
97 | 8 | * This program is distributed in the hope that it will be useful, but | ||
98 | 9 | * WITHOUT ANY WARRANTY; without even the implied warranties of | ||
99 | 10 | * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
100 | 11 | * PURPOSE. See the GNU General Public License for more details. | ||
101 | 12 | * | ||
102 | 13 | * You should have received a copy of the GNU General Public License along | ||
103 | 14 | * with this program. If not, see <http://www.gnu.org/licenses/>. | ||
104 | 15 | * | ||
105 | 16 | * Authors: | ||
106 | 17 | * Xavi Garcia Mena <xavi.garcia.mena@canonical.com> | ||
107 | 18 | */ | ||
108 | 19 | |||
109 | 20 | #pragma once | ||
110 | 21 | |||
111 | 22 | #include "client/keeper-errors.h" | ||
112 | 23 | |||
113 | 24 | #include <QDBusArgument> | ||
114 | 25 | #include <QObject> | ||
115 | 26 | #include <QScopedPointer> | ||
116 | 27 | |||
117 | 28 | typedef QMap<QString, QVariantMap> QVariantDictMap; | ||
118 | 29 | |||
119 | 30 | namespace keeper | ||
120 | 31 | { | ||
121 | 32 | |||
122 | 33 | class KeeperItem : public QVariantMap | ||
123 | 34 | { | ||
124 | 35 | public: | ||
125 | 36 | KeeperItem(); | ||
126 | 37 | ~KeeperItem(); | ||
127 | 38 | explicit KeeperItem(QVariantMap const & values); | ||
128 | 39 | |||
129 | 40 | // methods created for convenience | ||
130 | 41 | bool has_property(QString const & property) const; | ||
131 | 42 | QVariant get_property_value(QString const & property) const; | ||
132 | 43 | |||
133 | 44 | // checks that the item is valid | ||
134 | 45 | bool is_valid() const; | ||
135 | 46 | |||
136 | 47 | // predefined properties | ||
137 | 48 | QString get_type(bool *valid = nullptr) const; | ||
138 | 49 | QString get_display_name(bool *valid = nullptr) const; | ||
139 | 50 | QString get_dir_name(bool *valid = nullptr) const; | ||
140 | 51 | QString get_status(bool *valid = nullptr) const; | ||
141 | 52 | double get_percent_done(bool *valid = nullptr) const; | ||
142 | 53 | keeper::Error get_error(bool *valid = nullptr) const; | ||
143 | 54 | |||
144 | 55 | // d-bus | ||
145 | 56 | static void registerMetaType(); | ||
146 | 57 | }; | ||
147 | 58 | |||
148 | 59 | class KeeperItemsMap : public QMap<QString, KeeperItem> | ||
149 | 60 | { | ||
150 | 61 | public: | ||
151 | 62 | KeeperItemsMap(); | ||
152 | 63 | ~KeeperItemsMap(); | ||
153 | 64 | explicit KeeperItemsMap(Error error); | ||
154 | 65 | |||
155 | 66 | QStringList get_uuids() const; | ||
156 | 67 | |||
157 | 68 | // d-bus | ||
158 | 69 | static void registerMetaType(); | ||
159 | 70 | |||
160 | 71 | private: | ||
161 | 72 | Error error_ = Error::OK; | ||
162 | 73 | }; | ||
163 | 74 | |||
164 | 75 | } // namespace keeper | ||
165 | 76 | |||
166 | 77 | Q_DECLARE_METATYPE(keeper::KeeperItem) | ||
167 | 78 | Q_DECLARE_METATYPE(keeper::KeeperItemsMap) | ||
168 | 0 | 79 | ||
169 | === modified file 'include/helper/helper.h' | |||
170 | --- include/helper/helper.h 2016-12-14 11:00:21 +0000 | |||
171 | +++ include/helper/helper.h 2016-12-22 14:35:27 +0000 | |||
172 | @@ -70,7 +70,7 @@ | |||
173 | 70 | Q_SIGNALS: | 70 | Q_SIGNALS: |
174 | 71 | void state_changed(Helper::State); | 71 | void state_changed(Helper::State); |
175 | 72 | void percent_done_changed(float); | 72 | void percent_done_changed(float); |
177 | 73 | void error(keeper::KeeperError error); | 73 | void error(keeper::Error error); |
178 | 74 | 74 | ||
179 | 75 | protected: | 75 | protected: |
180 | 76 | Helper(QString const & appid, const clock_func& clock=default_clock, QObject *parent=nullptr); | 76 | Helper(QString const & appid, const clock_func& clock=default_clock, QObject *parent=nullptr); |
181 | 77 | 77 | ||
182 | === modified file 'src/cli/command-line-client-view.cpp' | |||
183 | --- src/cli/command-line-client-view.cpp 2016-12-21 08:36:57 +0000 | |||
184 | +++ src/cli/command-line-client-view.cpp 2016-12-22 14:35:27 +0000 | |||
185 | @@ -48,7 +48,7 @@ | |||
186 | 48 | 48 | ||
187 | 49 | void CommandLineClientView::add_task(QString const & display_name, QString const & initial_status, double initial_percentage) | 49 | void CommandLineClientView::add_task(QString const & display_name, QString const & initial_status, double initial_percentage) |
188 | 50 | { | 50 | { |
190 | 51 | tasks_strings_[display_name] = get_task_string(display_name, initial_status, initial_percentage, keeper::KeeperError::OK); | 51 | tasks_strings_[display_name] = get_task_string(display_name, initial_status, initial_percentage, keeper::Error::OK); |
191 | 52 | // TODO see if we can do this in a better way | 52 | // TODO see if we can do this in a better way |
192 | 53 | // We add a line per each backup task | 53 | // We add a line per each backup task |
193 | 54 | std::cout << std::endl; | 54 | std::cout << std::endl; |
194 | @@ -112,58 +112,76 @@ | |||
195 | 112 | return ret; | 112 | return ret; |
196 | 113 | } | 113 | } |
197 | 114 | 114 | ||
199 | 115 | QString CommandLineClientView::get_task_string(QString const & displayName, QString const & status, double percentage, keeper::KeeperError error) | 115 | QString CommandLineClientView::get_task_string(QString const & displayName, QString const & status, double percentage, keeper::Error error) |
200 | 116 | { | 116 | { |
201 | 117 | 117 | ||
203 | 118 | if (error == keeper::KeeperError::OK) | 118 | if (error == keeper::Error::OK) |
204 | 119 | return QStringLiteral("%1 %2 % %3").arg(displayName, 15).arg((percentage * 100), 10, 'f', 2, ' ').arg(status, -15); | 119 | return QStringLiteral("%1 %2 % %3").arg(displayName, 15).arg((percentage * 100), 10, 'f', 2, ' ').arg(status, -15); |
205 | 120 | else | 120 | else |
206 | 121 | return QStringLiteral("%1 %2 % %3 %4").arg(displayName, 15).arg((percentage * 100), 10, 'f', 2, ' ').arg(status, -15).arg(get_error_string(error)); | 121 | return QStringLiteral("%1 %2 % %3 %4").arg(displayName, 15).arg((percentage * 100), 10, 'f', 2, ' ').arg(status, -15).arg(get_error_string(error)); |
207 | 122 | } | 122 | } |
208 | 123 | 123 | ||
210 | 124 | QString CommandLineClientView::get_error_string(keeper::KeeperError error) | 124 | QString CommandLineClientView::get_error_string(keeper::Error error) |
211 | 125 | { | 125 | { |
212 | 126 | QString ret; | 126 | QString ret; |
213 | 127 | switch(error) | 127 | switch(error) |
214 | 128 | { | 128 | { |
216 | 129 | case keeper::KeeperError::ERROR_UNKNOWN: | 129 | case keeper::Error::UNKNOWN: |
217 | 130 | ret = QStringLiteral("Unknown error"); | 130 | ret = QStringLiteral("Unknown error"); |
218 | 131 | break; | 131 | break; |
220 | 132 | case keeper::KeeperError::HELPER_BAD_URL: | 132 | case keeper::Error::HELPER_BAD_URL: |
221 | 133 | ret = QStringLiteral("Bad URL for keeper helper"); | 133 | ret = QStringLiteral("Bad URL for keeper helper"); |
222 | 134 | break; | 134 | break; |
224 | 135 | case keeper::KeeperError::HELPER_INACTIVITY_DETECTED: | 135 | case keeper::Error::HELPER_INACTIVITY_DETECTED: |
225 | 136 | ret = QStringLiteral("Inactivity detected in task"); | 136 | ret = QStringLiteral("Inactivity detected in task"); |
226 | 137 | break; | 137 | break; |
228 | 138 | case keeper::KeeperError::HELPER_START_TIMEOUT: | 138 | case keeper::Error::HELPER_START_TIMEOUT: |
229 | 139 | ret = QStringLiteral("Task failed to start"); | 139 | ret = QStringLiteral("Task failed to start"); |
230 | 140 | break; | 140 | break; |
232 | 141 | case keeper::KeeperError::HELPER_READ_ERROR: | 141 | case keeper::Error::HELPER_READ: |
233 | 142 | ret = QStringLiteral("Read error"); | 142 | ret = QStringLiteral("Read error"); |
234 | 143 | break; | 143 | break; |
236 | 144 | case keeper::KeeperError::HELPER_SOCKET_ERROR: | 144 | case keeper::Error::HELPER_SOCKET: |
237 | 145 | ret = QStringLiteral("Error creating internal socket"); | 145 | ret = QStringLiteral("Error creating internal socket"); |
238 | 146 | break; | 146 | break; |
240 | 147 | case keeper::KeeperError::HELPER_WRITE_ERROR: | 147 | case keeper::Error::HELPER_WRITE: |
241 | 148 | ret = QStringLiteral("Write error"); | 148 | ret = QStringLiteral("Write error"); |
242 | 149 | break; | 149 | break; |
244 | 150 | case keeper::KeeperError::MANIFEST_STORAGE_ERROR: | 150 | case keeper::Error::MANIFEST_STORAGE: |
245 | 151 | ret = QStringLiteral("Error storing manifest file"); | 151 | ret = QStringLiteral("Error storing manifest file"); |
246 | 152 | break; | 152 | break; |
248 | 153 | case keeper::KeeperError::NO_HELPER_INFORMATION_IN_REGISTRY: | 153 | case keeper::Error::NO_HELPER_INFORMATION_IN_REGISTRY: |
249 | 154 | ret = QStringLiteral("No helper information in registry"); | 154 | ret = QStringLiteral("No helper information in registry"); |
250 | 155 | break; | 155 | break; |
252 | 156 | case keeper::KeeperError::OK: | 156 | case keeper::Error::OK: |
253 | 157 | ret = QStringLiteral("Success"); | 157 | ret = QStringLiteral("Success"); |
254 | 158 | break; | 158 | break; |
256 | 159 | case keeper::KeeperError::COMMITTING_DATA_ERROR: | 159 | case keeper::Error::COMMITTING_DATA: |
257 | 160 | ret = QStringLiteral("Error uploading data"); | 160 | ret = QStringLiteral("Error uploading data"); |
258 | 161 | break; | 161 | break; |
259 | 162 | case keeper::Error::CREATING_REMOTE_DIR: | ||
260 | 163 | ret = QStringLiteral("Error creating remote directory"); | ||
261 | 164 | break; | ||
262 | 165 | case keeper::Error::CREATING_REMOTE_FILE: | ||
263 | 166 | ret = QStringLiteral("Error creating remote file"); | ||
264 | 167 | break; | ||
265 | 168 | case keeper::Error::READING_REMOTE_FILE: | ||
266 | 169 | ret = QStringLiteral("Error reading remote file"); | ||
267 | 170 | break; | ||
268 | 171 | case keeper::Error::REMOTE_DIR_NOT_EXISTS: | ||
269 | 172 | ret = QStringLiteral("Remote directory does not exist"); | ||
270 | 173 | break; | ||
271 | 174 | case keeper::Error::NO_REMOTE_ACCOUNTS: | ||
272 | 175 | ret = QStringLiteral("No remote accounts were found"); | ||
273 | 176 | break; | ||
274 | 177 | case keeper::Error::NO_REMOTE_ROOTS: | ||
275 | 178 | ret = QStringLiteral("No remote root accounts were found"); | ||
276 | 179 | break; | ||
277 | 162 | } | 180 | } |
278 | 163 | return ret; | 181 | return ret; |
279 | 164 | } | 182 | } |
280 | 165 | 183 | ||
282 | 166 | void CommandLineClientView::on_task_state_changed(QString const & displayName, QString const & status, double percentage, keeper::KeeperError error) | 184 | void CommandLineClientView::on_task_state_changed(QString const & displayName, QString const & status, double percentage, keeper::Error error) |
283 | 167 | { | 185 | { |
284 | 168 | auto iter = tasks_strings_.find(displayName); | 186 | auto iter = tasks_strings_.find(displayName); |
285 | 169 | if (iter != tasks_strings_.end()) | 187 | if (iter != tasks_strings_.end()) |
286 | 170 | 188 | ||
287 | === modified file 'src/cli/command-line-client-view.h' | |||
288 | --- src/cli/command-line-client-view.h 2016-12-14 11:00:21 +0000 | |||
289 | +++ src/cli/command-line-client-view.h 2016-12-22 14:35:27 +0000 | |||
290 | @@ -42,15 +42,15 @@ | |||
291 | 42 | void clear_all(); | 42 | void clear_all(); |
292 | 43 | void print_sections(QStringList const & sections); | 43 | void print_sections(QStringList const & sections); |
293 | 44 | void print_error_message(QString const & error_message); | 44 | void print_error_message(QString const & error_message); |
294 | 45 | QString get_error_string(keeper::Error error); | ||
295 | 45 | 46 | ||
296 | 46 | public Q_SLOTS: | 47 | public Q_SLOTS: |
297 | 47 | void show_info(); | 48 | void show_info(); |
299 | 48 | void on_task_state_changed(QString const & displayName, QString const & status, double percentage, keeper::KeeperError error); | 49 | void on_task_state_changed(QString const & displayName, QString const & status, double percentage, keeper::Error error); |
300 | 49 | 50 | ||
301 | 50 | private: | 51 | private: |
302 | 51 | char get_next_spin_char(); | 52 | char get_next_spin_char(); |
305 | 52 | QString get_task_string(QString const & displayName, QString const & status, double percentage, keeper::KeeperError error); | 53 | QString get_task_string(QString const & displayName, QString const & status, double percentage, keeper::Error error); |
304 | 53 | QString get_error_string(keeper::KeeperError error); | ||
306 | 54 | 54 | ||
307 | 55 | QString status_; | 55 | QString status_; |
308 | 56 | QTimer timer_status_; | 56 | QTimer timer_status_; |
309 | 57 | 57 | ||
310 | === modified file 'src/cli/command-line-client.cpp' | |||
311 | --- src/cli/command-line-client.cpp 2016-12-16 09:34:05 +0000 | |||
312 | +++ src/cli/command-line-client.cpp 2016-12-22 14:35:27 +0000 | |||
313 | @@ -42,15 +42,18 @@ | |||
314 | 42 | 42 | ||
315 | 43 | void CommandLineClient::run_list_sections(bool remote) | 43 | void CommandLineClient::run_list_sections(bool remote) |
316 | 44 | { | 44 | { |
318 | 45 | QMap<QString, QVariantMap> choices_values; | 45 | keeper::KeeperItemsMap choices_values; |
319 | 46 | keeper::Error error; | ||
320 | 46 | if(!remote) | 47 | if(!remote) |
321 | 47 | { | 48 | { |
323 | 48 | choices_values = keeper_client_->getBackupChoices(); | 49 | choices_values = keeper_client_->getBackupChoices(error); |
324 | 50 | check_for_choices_error(error); | ||
325 | 49 | list_backup_sections(choices_values); | 51 | list_backup_sections(choices_values); |
326 | 50 | } | 52 | } |
327 | 51 | else | 53 | else |
328 | 52 | { | 54 | { |
330 | 53 | choices_values = keeper_client_->getRestoreChoices(); | 55 | choices_values = keeper_client_->getRestoreChoices(error); |
331 | 56 | check_for_choices_error(error); | ||
332 | 54 | list_restore_sections(choices_values); | 57 | list_restore_sections(choices_values); |
333 | 55 | } | 58 | } |
334 | 56 | } | 59 | } |
335 | @@ -58,28 +61,27 @@ | |||
336 | 58 | void CommandLineClient::run_backup(QStringList & sections) | 61 | void CommandLineClient::run_backup(QStringList & sections) |
337 | 59 | { | 62 | { |
338 | 60 | auto unhandled_sections = sections; | 63 | auto unhandled_sections = sections; |
340 | 61 | auto choices_values = keeper_client_->getBackupChoices(); | 64 | keeper::Error error; |
341 | 65 | auto choices_values = keeper_client_->getBackupChoices(error); | ||
342 | 66 | check_for_choices_error(error); | ||
343 | 62 | QStringList uuids; | 67 | QStringList uuids; |
345 | 63 | for(auto iter = choices_values.begin(); iter != choices_values.end() && unhandled_sections.size(); ++iter) | 68 | |
346 | 69 | auto uuids_choices = choices_values.get_uuids(); | ||
347 | 70 | for(auto iter = uuids_choices.begin(); iter != uuids_choices.end() && unhandled_sections.size(); ++iter) | ||
348 | 64 | { | 71 | { |
352 | 65 | const auto& values = iter.value(); | 72 | const auto& values = choices_values[(*iter)]; |
353 | 66 | auto iter_values = values.find("type"); | 73 | |
354 | 67 | if (iter_values != values.end()) | 74 | if (values.is_valid() && values.get_type() == "folder") |
355 | 68 | { | 75 | { |
357 | 69 | if (iter_values.value() == "folder") | 76 | |
358 | 77 | auto display_name = values.get_display_name(); | ||
359 | 78 | auto index = unhandled_sections.indexOf(display_name); | ||
360 | 79 | if (index != -1) | ||
361 | 70 | { | 80 | { |
374 | 71 | auto iter_display_name = values.find("display-name"); | 81 | // we have to backup this section |
375 | 72 | if (iter_display_name != values.end()) | 82 | uuids << (*iter); |
376 | 73 | { | 83 | unhandled_sections.removeAt(index); |
377 | 74 | auto index = unhandled_sections.indexOf((*iter_display_name).toString()); | 84 | view_->add_task(display_name, "waiting", 0.0); |
366 | 75 | if (index != -1) | ||
367 | 76 | { | ||
368 | 77 | // we have to backup this section | ||
369 | 78 | uuids << iter.key(); | ||
370 | 79 | unhandled_sections.removeAt(index); | ||
371 | 80 | view_->add_task((*iter_display_name).toString(), "waiting", 0.0); | ||
372 | 81 | } | ||
373 | 82 | } | ||
378 | 83 | } | 85 | } |
379 | 84 | } | 86 | } |
380 | 85 | } | 87 | } |
381 | @@ -106,34 +108,29 @@ | |||
382 | 106 | void CommandLineClient::run_restore(QStringList & sections) | 108 | void CommandLineClient::run_restore(QStringList & sections) |
383 | 107 | { | 109 | { |
384 | 108 | auto unhandled_sections = sections; | 110 | auto unhandled_sections = sections; |
386 | 109 | auto choices_values = keeper_client_->getRestoreChoices(); | 111 | keeper::Error error; |
387 | 112 | auto choices_values = keeper_client_->getRestoreChoices(error); | ||
388 | 113 | check_for_choices_error(error); | ||
389 | 110 | QStringList uuids; | 114 | QStringList uuids; |
391 | 111 | for(auto iter = choices_values.begin(); iter != choices_values.end(); ++iter) | 115 | |
392 | 116 | auto uuids_choices = choices_values.get_uuids(); | ||
393 | 117 | for(auto iter = uuids_choices.begin(); iter != uuids_choices.end(); ++iter) | ||
394 | 112 | { | 118 | { |
396 | 113 | const auto& values = iter.value(); | 119 | const auto& values = choices_values[(*iter)]; |
397 | 114 | 120 | ||
401 | 115 | QVariant choice_value; | 121 | if (values.is_valid() && values.get_type() == "folder") |
399 | 116 | auto has_type = find_choice_value(values, "type", choice_value); | ||
400 | 117 | if (has_type && choice_value == "folder") | ||
402 | 118 | { | 122 | { |
414 | 119 | QVariant display_name; | 123 | auto display_name = values.get_display_name(); |
415 | 120 | auto has_display_name = find_choice_value(values, "display-name", display_name); | 124 | auto dir_name = values.get_dir_name(); |
416 | 121 | if (!has_display_name) | 125 | |
417 | 122 | continue; | 126 | auto section_name = QStringLiteral("%1:%2").arg(display_name).arg(dir_name); |
407 | 123 | |||
408 | 124 | QVariant dir_name; | ||
409 | 125 | auto has_dir_name = find_choice_value(values, "dir-name", dir_name); | ||
410 | 126 | if (!has_dir_name) | ||
411 | 127 | continue; | ||
412 | 128 | |||
413 | 129 | auto section_name = QStringLiteral("%1:%2").arg(display_name.toString()).arg(dir_name.toString()); | ||
418 | 130 | auto index = unhandled_sections.indexOf(section_name); | 127 | auto index = unhandled_sections.indexOf(section_name); |
419 | 131 | if (index != -1) | 128 | if (index != -1) |
420 | 132 | { | 129 | { |
421 | 133 | // we have to restore this section | 130 | // we have to restore this section |
423 | 134 | uuids << iter.key(); | 131 | uuids << (*iter); |
424 | 135 | unhandled_sections.removeAt(index); | 132 | unhandled_sections.removeAt(index); |
426 | 136 | view_->add_task(display_name.toString(), "waiting", 0.0); | 133 | view_->add_task(display_name, "waiting", 0.0); |
427 | 137 | } | 134 | } |
428 | 138 | } | 135 | } |
429 | 139 | } | 136 | } |
430 | @@ -156,45 +153,34 @@ | |||
431 | 156 | view_->start_printing_tasks(); | 153 | view_->start_printing_tasks(); |
432 | 157 | } | 154 | } |
433 | 158 | 155 | ||
435 | 159 | void CommandLineClient::list_backup_sections(QMap<QString, QVariantMap> const & choices_values) | 156 | void CommandLineClient::list_backup_sections(keeper::KeeperItemsMap const & choices_values) |
436 | 160 | { | 157 | { |
437 | 161 | QStringList sections; | 158 | QStringList sections; |
438 | 162 | for(auto iter = choices_values.begin(); iter != choices_values.end(); ++iter) | 159 | for(auto iter = choices_values.begin(); iter != choices_values.end(); ++iter) |
439 | 163 | { | 160 | { |
448 | 164 | const auto& values = iter.value(); | 161 | if ((*iter).is_valid() && (*iter).get_type() == "folder") |
449 | 165 | 162 | { | |
450 | 166 | QVariant choice_value; | 163 | sections << (*iter).get_display_name(); |
451 | 167 | auto has_type = find_choice_value(values, "type", choice_value); | 164 | } |
452 | 168 | if (has_type && choice_value == "folder") | 165 | } |
453 | 169 | { | 166 | view_->print_sections(sections); |
454 | 170 | auto has_display_name = find_choice_value(values, "display-name", choice_value); | 167 | } |
455 | 171 | if (has_display_name) | 168 | |
456 | 169 | void CommandLineClient::list_restore_sections(keeper::KeeperItemsMap const & choices_values) | ||
457 | 170 | { | ||
458 | 171 | QMap<QString, QList<keeper::KeeperItem>> values_per_dir; | ||
459 | 172 | |||
460 | 173 | for(auto iter = choices_values.begin(); iter != choices_values.end(); ++iter) | ||
461 | 174 | { | ||
462 | 175 | if ((*iter).is_valid() && (*iter).get_type() == "folder") | ||
463 | 176 | { | ||
464 | 177 | auto dir_name = (*iter).get_dir_name(); | ||
465 | 178 | if (!dir_name.isEmpty()) | ||
466 | 172 | { | 179 | { |
468 | 173 | sections << choice_value.toString(); | 180 | values_per_dir[dir_name].push_back((*iter)); |
469 | 174 | } | 181 | } |
470 | 175 | } | 182 | } |
471 | 176 | } | 183 | } |
472 | 177 | view_->print_sections(sections); | ||
473 | 178 | } | ||
474 | 179 | |||
475 | 180 | void CommandLineClient::list_restore_sections(QMap<QString, QVariantMap> const & choices_values) | ||
476 | 181 | { | ||
477 | 182 | QMap<QString, QList<QVariantMap>> values_per_dir; | ||
478 | 183 | |||
479 | 184 | for(auto iter = choices_values.begin(); iter != choices_values.end(); ++iter) | ||
480 | 185 | { | ||
481 | 186 | const auto& values = iter.value(); | ||
482 | 187 | |||
483 | 188 | QVariant choice_value; | ||
484 | 189 | auto has_type = find_choice_value(values, "type", choice_value); | ||
485 | 190 | if (has_type && choice_value == "folder") | ||
486 | 191 | { | ||
487 | 192 | auto has_dir_name = find_choice_value(values, "dir-name", choice_value); | ||
488 | 193 | if (!has_dir_name) | ||
489 | 194 | continue; | ||
490 | 195 | values_per_dir[choice_value.toString()].push_back(values); | ||
491 | 196 | } | ||
492 | 197 | } | ||
493 | 198 | 184 | ||
494 | 199 | QStringList sections; | 185 | QStringList sections; |
495 | 200 | for(auto iter = values_per_dir.begin(); iter != values_per_dir.end(); ++iter) | 186 | for(auto iter = values_per_dir.begin(); iter != values_per_dir.end(); ++iter) |
496 | @@ -202,17 +188,7 @@ | |||
497 | 202 | for(auto iter_items = (*iter).begin(); iter_items != (*iter).end(); ++iter_items) | 188 | for(auto iter_items = (*iter).begin(); iter_items != (*iter).end(); ++iter_items) |
498 | 203 | { | 189 | { |
499 | 204 | const auto& values = (*iter_items); | 190 | const auto& values = (*iter_items); |
511 | 205 | 191 | sections << QStringLiteral("%1:%2").arg(values.get_display_name()).arg(iter.key()); | |
501 | 206 | QVariant choice_value; | ||
502 | 207 | auto has_type = find_choice_value(values, "type", choice_value); | ||
503 | 208 | if (has_type && choice_value == "folder") | ||
504 | 209 | { | ||
505 | 210 | auto has_display_name = find_choice_value(values, "display-name", choice_value); | ||
506 | 211 | if (has_display_name) | ||
507 | 212 | { | ||
508 | 213 | sections << QStringLiteral("%1:%2").arg(choice_value.toString()).arg(iter.key()); | ||
509 | 214 | } | ||
510 | 215 | } | ||
512 | 216 | } | 192 | } |
513 | 217 | sections << ""; | 193 | sections << ""; |
514 | 218 | } | 194 | } |
515 | @@ -245,3 +221,14 @@ | |||
516 | 245 | value = (*iter); | 221 | value = (*iter); |
517 | 246 | return true; | 222 | return true; |
518 | 247 | } | 223 | } |
519 | 224 | |||
520 | 225 | void CommandLineClient::check_for_choices_error(keeper::Error error) | ||
521 | 226 | { | ||
522 | 227 | if (error != keeper::Error::OK) | ||
523 | 228 | { | ||
524 | 229 | // an error occurred | ||
525 | 230 | auto error_message = QStringLiteral("Error obtaining keeper choices: %1").arg(view_->get_error_string(error)); | ||
526 | 231 | view_->print_error_message(error_message); | ||
527 | 232 | return; | ||
528 | 233 | } | ||
529 | 234 | } | ||
530 | 248 | 235 | ||
531 | === modified file 'src/cli/command-line-client.h' | |||
532 | --- src/cli/command-line-client.h 2016-12-16 09:34:05 +0000 | |||
533 | +++ src/cli/command-line-client.h 2016-12-22 14:35:27 +0000 | |||
534 | @@ -22,6 +22,7 @@ | |||
535 | 22 | #include <QObject> | 22 | #include <QObject> |
536 | 23 | #include <QScopedPointer> | 23 | #include <QScopedPointer> |
537 | 24 | #include <QTimer> | 24 | #include <QTimer> |
538 | 25 | #include "../../include/client/keeper-items.h" | ||
539 | 25 | 26 | ||
540 | 26 | class KeeperClient; | 27 | class KeeperClient; |
541 | 27 | class CommandLineClientView; | 28 | class CommandLineClientView; |
542 | @@ -45,9 +46,10 @@ | |||
543 | 45 | void on_keeper_client_finished(); | 46 | void on_keeper_client_finished(); |
544 | 46 | 47 | ||
545 | 47 | private: | 48 | private: |
549 | 48 | static bool find_choice_value(QVariantMap const & choice, QString const & id, QVariant & value); | 49 | bool find_choice_value(QVariantMap const & choice, QString const & id, QVariant & value); |
550 | 49 | void list_backup_sections(QMap<QString, QVariantMap> const & choices); | 50 | void list_backup_sections(keeper::KeeperItemsMap const & choices); |
551 | 50 | void list_restore_sections(QMap<QString, QVariantMap> const & choices); | 51 | void list_restore_sections(keeper::KeeperItemsMap const & choices); |
552 | 52 | void check_for_choices_error(keeper::Error error); | ||
553 | 51 | QScopedPointer<KeeperClient> keeper_client_; | 53 | QScopedPointer<KeeperClient> keeper_client_; |
554 | 52 | QScopedPointer<CommandLineClientView> view_; | 54 | QScopedPointer<CommandLineClientView> view_; |
555 | 53 | }; | 55 | }; |
556 | 54 | 56 | ||
557 | === modified file 'src/client/CMakeLists.txt' | |||
558 | --- src/client/CMakeLists.txt 2016-12-14 12:03:22 +0000 | |||
559 | +++ src/client/CMakeLists.txt 2016-12-22 14:35:27 +0000 | |||
560 | @@ -10,12 +10,15 @@ | |||
561 | 10 | STATIC | 10 | STATIC |
562 | 11 | keeper-errors.cpp | 11 | keeper-errors.cpp |
563 | 12 | ${CMAKE_SOURCE_DIR}/include/client/keeper-errors.h | 12 | ${CMAKE_SOURCE_DIR}/include/client/keeper-errors.h |
564 | 13 | ${CMAKE_SOURCE_DIR}/include/client/keeper-items.h | ||
565 | 14 | keeper-items.cpp | ||
566 | 13 | ) | 15 | ) |
567 | 14 | 16 | ||
568 | 15 | set( | 17 | set( |
569 | 16 | CLIENT_HEADERS | 18 | CLIENT_HEADERS |
570 | 17 | ${CMAKE_SOURCE_DIR}/include/client/client.h | 19 | ${CMAKE_SOURCE_DIR}/include/client/client.h |
571 | 18 | ${CMAKE_SOURCE_DIR}/include/client/keeper-errors.h | 20 | ${CMAKE_SOURCE_DIR}/include/client/keeper-errors.h |
572 | 21 | ${CMAKE_SOURCE_DIR}/include/client/keeper-items.h | ||
573 | 19 | ) | 22 | ) |
574 | 20 | 23 | ||
575 | 21 | add_library( | 24 | add_library( |
576 | 22 | 25 | ||
577 | === modified file 'src/client/client.cpp' | |||
578 | --- src/client/client.cpp 2016-12-21 17:19:46 +0000 | |||
579 | +++ src/client/client.cpp 2016-12-22 14:35:27 +0000 | |||
580 | @@ -23,6 +23,7 @@ | |||
581 | 23 | 23 | ||
582 | 24 | #include <qdbus-stubs/keeper_user_interface.h> | 24 | #include <qdbus-stubs/keeper_user_interface.h> |
583 | 25 | #include <qdbus-stubs/DBusPropertiesInterface.h> | 25 | #include <qdbus-stubs/DBusPropertiesInterface.h> |
584 | 26 | #include <qdbus-stubs/dbus-types.h> | ||
585 | 26 | 27 | ||
586 | 27 | struct KeeperClientPrivate final | 28 | struct KeeperClientPrivate final |
587 | 28 | { | 29 | { |
588 | @@ -57,7 +58,7 @@ | |||
589 | 57 | return (stateString == "complete" || stateString == "cancelled" || stateString == "failed"); | 58 | return (stateString == "complete" || stateString == "cancelled" || stateString == "failed"); |
590 | 58 | } | 59 | } |
591 | 59 | 60 | ||
593 | 60 | static bool checkAllTasksFinished(QMap<QString, QVariantMap> const & state) | 61 | bool checkAllTasksFinished(keeper::KeeperItemsMap const & state) const |
594 | 61 | { | 62 | { |
595 | 62 | bool ret = true; | 63 | bool ret = true; |
596 | 63 | for (auto iter = state.begin(); ret && (iter != state.end()); ++iter) | 64 | for (auto iter = state.begin(); ret && (iter != state.end()); ++iter) |
597 | @@ -68,15 +69,52 @@ | |||
598 | 68 | return ret; | 69 | return ret; |
599 | 69 | } | 70 | } |
600 | 70 | 71 | ||
601 | 72 | static keeper::KeeperItemsMap getValue(QDBusMessage const & message, keeper::Error & error) | ||
602 | 73 | { | ||
603 | 74 | if (message.errorMessage().isEmpty()) | ||
604 | 75 | { | ||
605 | 76 | if (message.arguments().count() != 1) | ||
606 | 77 | { | ||
607 | 78 | error = keeper::Error::UNKNOWN; | ||
608 | 79 | return keeper::KeeperItemsMap(); | ||
609 | 80 | } | ||
610 | 81 | |||
611 | 82 | auto value = message.arguments().at(0); | ||
612 | 83 | if (value.typeName() != QStringLiteral("QDBusArgument")) | ||
613 | 84 | { | ||
614 | 85 | error = keeper::Error::UNKNOWN; | ||
615 | 86 | return keeper::KeeperItemsMap(); | ||
616 | 87 | } | ||
617 | 88 | auto dbus_arg = value.value<QDBusArgument>(); | ||
618 | 89 | error = keeper::Error::OK; | ||
619 | 90 | keeper::KeeperItemsMap ret; | ||
620 | 91 | dbus_arg >> ret; | ||
621 | 92 | return ret; | ||
622 | 93 | } | ||
623 | 94 | if (message.arguments().count() != 2) | ||
624 | 95 | { | ||
625 | 96 | error = keeper::Error::UNKNOWN; | ||
626 | 97 | return keeper::KeeperItemsMap(); | ||
627 | 98 | } | ||
628 | 99 | |||
629 | 100 | // pick up the error | ||
630 | 101 | bool valid; | ||
631 | 102 | error = keeper::convert_from_dbus_variant(message.arguments().at(1), &valid); | ||
632 | 103 | if (!valid) | ||
633 | 104 | { | ||
634 | 105 | error = keeper::Error::UNKNOWN; | ||
635 | 106 | } | ||
636 | 107 | return keeper::KeeperItemsMap(); | ||
637 | 108 | } | ||
638 | 109 | |||
639 | 71 | QScopedPointer<DBusInterfaceKeeperUser> userIface; | 110 | QScopedPointer<DBusInterfaceKeeperUser> userIface; |
640 | 72 | QScopedPointer<DBusPropertiesInterface> propertiesIface; | 111 | QScopedPointer<DBusPropertiesInterface> propertiesIface; |
641 | 73 | QString status; | 112 | QString status; |
644 | 74 | QMap<QString, QVariantMap> backups; | 113 | keeper::KeeperItemsMap backups; |
643 | 75 | QMap<QString, QVariantMap> restores; | ||
645 | 76 | double progress = 0; | 114 | double progress = 0; |
646 | 77 | bool readyToBackup = false; | 115 | bool readyToBackup = false; |
647 | 78 | bool backupBusy = false; | 116 | bool backupBusy = false; |
649 | 79 | QMap<QString, TaskStatus> task_status; | 117 | QMap<QString, TaskStatus> taskStatus; |
650 | 80 | TasksMode mode = TasksMode::IDLE_MODE; | 118 | TasksMode mode = TasksMode::IDLE_MODE; |
651 | 81 | }; | 119 | }; |
652 | 82 | 120 | ||
653 | @@ -88,7 +126,9 @@ | |||
654 | 88 | 126 | ||
655 | 89 | // Store backups list locally with an additional "enabled" pair to keep track enabled states | 127 | // Store backups list locally with an additional "enabled" pair to keep track enabled states |
656 | 90 | // TODO: We should be listening to a backupChoicesChanged signal to keep this list updated | 128 | // TODO: We should be listening to a backupChoicesChanged signal to keep this list updated |
658 | 91 | d->backups = getBackupChoices(); | 129 | keeper::Error error; |
659 | 130 | d->backups = getBackupChoices(error); | ||
660 | 131 | |||
661 | 92 | for(auto iter = d->backups.begin(); iter != d->backups.end(); ++iter) | 132 | for(auto iter = d->backups.begin(); iter != d->backups.end(); ++iter) |
662 | 93 | { | 133 | { |
663 | 94 | iter.value()["enabled"] = false; | 134 | iter.value()["enabled"] = false; |
664 | @@ -148,7 +188,7 @@ | |||
665 | 148 | } | 188 | } |
666 | 149 | } | 189 | } |
667 | 150 | 190 | ||
669 | 151 | d->task_status[uuid] = KeeperClientPrivate::TaskStatus{"", 0.0}; | 191 | d->taskStatus[uuid] = KeeperClientPrivate::TaskStatus{"", 0.0}; |
670 | 152 | 192 | ||
671 | 153 | Q_EMIT readyToBackupChanged(); | 193 | Q_EMIT readyToBackupChanged(); |
672 | 154 | } | 194 | } |
673 | @@ -212,31 +252,16 @@ | |||
674 | 212 | return d->backups.value(uuid).value("display-name").toString(); | 252 | return d->backups.value(uuid).value("display-name").toString(); |
675 | 213 | } | 253 | } |
676 | 214 | 254 | ||
678 | 215 | QMap<QString, QVariantMap> KeeperClient::getBackupChoices() const | 255 | keeper::KeeperItemsMap KeeperClient::getBackupChoices(keeper::Error & error) const |
679 | 216 | { | 256 | { |
689 | 217 | QDBusReply<QMap<QString, QVariantMap>> choices = d->userIface->call("GetBackupChoices"); | 257 | QDBusMessage choices = d->userIface->call("GetBackupChoices"); |
690 | 218 | 258 | return KeeperClientPrivate::getValue(choices, error); | |
682 | 219 | if (!choices.isValid()) | ||
683 | 220 | { | ||
684 | 221 | qWarning() << "Error getting backup choices:" << choices.error().message(); | ||
685 | 222 | return QMap<QString, QVariantMap>(); | ||
686 | 223 | } | ||
687 | 224 | |||
688 | 225 | return choices.value(); | ||
691 | 226 | } | 259 | } |
692 | 227 | 260 | ||
694 | 228 | QMap<QString, QVariantMap> KeeperClient::getRestoreChoices() const | 261 | keeper::KeeperItemsMap KeeperClient::getRestoreChoices(keeper::Error & error) const |
695 | 229 | { | 262 | { |
706 | 230 | QDBusPendingReply<QMap<QString, QVariantMap>> choices = d->userIface->call("GetRestoreChoices"); | 263 | QDBusMessage choices = d->userIface->call("GetRestoreChoices"); |
707 | 231 | 264 | return KeeperClientPrivate::getValue(choices, error); | |
698 | 232 | choices.waitForFinished(); | ||
699 | 233 | if (!choices.isValid()) | ||
700 | 234 | { | ||
701 | 235 | qWarning() << "Error getting restore choices:" << choices.error().message(); | ||
702 | 236 | return QMap<QString, QVariantMap>(); | ||
703 | 237 | } | ||
704 | 238 | |||
705 | 239 | return choices.value(); | ||
708 | 240 | } | 265 | } |
709 | 241 | 266 | ||
710 | 242 | void KeeperClient::startBackup(const QStringList& uuids) const | 267 | void KeeperClient::startBackup(const QStringList& uuids) const |
711 | @@ -259,7 +284,7 @@ | |||
712 | 259 | } | 284 | } |
713 | 260 | } | 285 | } |
714 | 261 | 286 | ||
716 | 262 | QMap<QString, QVariantMap> KeeperClient::getState() const | 287 | keeper::KeeperItemsMap KeeperClient::getState() const |
717 | 263 | { | 288 | { |
718 | 264 | return d->userIface->state(); | 289 | return d->userIface->state(); |
719 | 265 | } | 290 | } |
720 | @@ -270,38 +295,32 @@ | |||
721 | 270 | 295 | ||
722 | 271 | if (!states.empty()) | 296 | if (!states.empty()) |
723 | 272 | { | 297 | { |
725 | 273 | for (auto const & uuid : d->task_status.keys()) | 298 | for (auto const & uuid : d->taskStatus.keys()) |
726 | 274 | { | 299 | { |
727 | 275 | auto iter_state = states.find(uuid); | 300 | auto iter_state = states.find(uuid); |
728 | 276 | if (iter_state == states.end()) | 301 | if (iter_state == states.end()) |
729 | 277 | { | 302 | { |
730 | 278 | qWarning() << "State for uuid: " << uuid << " was not found"; | 303 | qWarning() << "State for uuid: " << uuid << " was not found"; |
731 | 279 | } | 304 | } |
745 | 280 | auto state = (*iter_state); | 305 | keeper::KeeperItem keeper_item((*iter_state)); |
746 | 281 | double progress = state.value("percent-done").toDouble(); | 306 | auto progress = keeper_item.get_percent_done(); |
747 | 282 | auto status = state.value("action").toString(); | 307 | auto status = keeper_item.get_status(); |
748 | 283 | 308 | auto keeper_error = keeper_item.get_error(); | |
749 | 284 | keeper::KeeperError keeper_error = keeper::KeeperError::OK; | 309 | |
750 | 285 | auto iter_error = state.find("error"); | 310 | auto current_state = d->taskStatus[uuid]; |
738 | 286 | if (iter_error != state.end()) | ||
739 | 287 | { | ||
740 | 288 | bool conversion_ok; | ||
741 | 289 | keeper_error = keeper::convertFromDBusVariant(state.value("error"), &conversion_ok); | ||
742 | 290 | } | ||
743 | 291 | |||
744 | 292 | auto current_state = d->task_status[uuid]; | ||
751 | 293 | if (current_state.status != status || current_state.percentage < progress) | 311 | if (current_state.status != status || current_state.percentage < progress) |
752 | 294 | { | 312 | { |
756 | 295 | d->task_status[uuid].status = status; | 313 | d->taskStatus[uuid].status = status; |
757 | 296 | d->task_status[uuid].percentage = progress; | 314 | d->taskStatus[uuid].percentage = progress; |
758 | 297 | Q_EMIT(taskStatusChanged(state.value("display-name").toString(), status, progress, keeper_error)); | 315 | Q_EMIT(taskStatusChanged(keeper_item.get_display_name(), status, progress, keeper_error)); |
759 | 298 | } | 316 | } |
760 | 299 | } | 317 | } |
761 | 300 | 318 | ||
762 | 301 | double totalProgress = 0; | 319 | double totalProgress = 0; |
763 | 302 | for (auto const& state : states) | 320 | for (auto const& state : states) |
764 | 303 | { | 321 | { |
766 | 304 | totalProgress += state.value("percent-done").toDouble(); | 322 | keeper::KeeperItem keeper_item(state); |
767 | 323 | totalProgress += keeper_item.get_percent_done(); | ||
768 | 305 | } | 324 | } |
769 | 306 | 325 | ||
770 | 307 | d->progress = totalProgress / states.count(); | 326 | d->progress = totalProgress / states.count(); |
771 | 308 | 327 | ||
772 | === modified file 'src/client/keeper-errors.cpp' | |||
773 | --- src/client/keeper-errors.cpp 2016-12-21 08:36:57 +0000 | |||
774 | +++ src/client/keeper-errors.cpp 2016-12-22 14:35:27 +0000 | |||
775 | @@ -21,7 +21,7 @@ | |||
776 | 21 | 21 | ||
777 | 22 | #include <QDebug> | 22 | #include <QDebug> |
778 | 23 | 23 | ||
780 | 24 | QDBusArgument &operator<<(QDBusArgument &argument, keeper::KeeperError value) | 24 | QDBusArgument &operator<<(QDBusArgument &argument, keeper::Error value) |
781 | 25 | { | 25 | { |
782 | 26 | argument.beginStructure(); | 26 | argument.beginStructure(); |
783 | 27 | argument << static_cast<int>(value); | 27 | argument << static_cast<int>(value); |
784 | @@ -29,41 +29,41 @@ | |||
785 | 29 | return argument; | 29 | return argument; |
786 | 30 | } | 30 | } |
787 | 31 | 31 | ||
789 | 32 | const QDBusArgument &operator>>(const QDBusArgument &argument, keeper::KeeperError &val) | 32 | const QDBusArgument &operator>>(const QDBusArgument &argument, keeper::Error &val) |
790 | 33 | { | 33 | { |
791 | 34 | int int_val; | 34 | int int_val; |
792 | 35 | argument.beginStructure(); | 35 | argument.beginStructure(); |
793 | 36 | argument >> int_val; | 36 | argument >> int_val; |
795 | 37 | val = static_cast<keeper::KeeperError>(int_val); | 37 | val = static_cast<keeper::Error>(int_val); |
796 | 38 | argument.endStructure(); | 38 | argument.endStructure(); |
797 | 39 | return argument; | 39 | return argument; |
798 | 40 | } | 40 | } |
799 | 41 | 41 | ||
800 | 42 | namespace keeper | 42 | namespace keeper |
801 | 43 | { | 43 | { |
803 | 44 | KeeperError convertFromDBusVariant(const QVariant & value, bool *conversion_ok) | 44 | Error convert_from_dbus_variant(const QVariant & value, bool *conversion_ok) |
804 | 45 | { | 45 | { |
805 | 46 | if (value.typeName() != QStringLiteral("QDBusArgument")) | 46 | if (value.typeName() != QStringLiteral("QDBusArgument")) |
806 | 47 | { | 47 | { |
807 | 48 | qWarning() << Q_FUNC_INFO | 48 | qWarning() << Q_FUNC_INFO |
809 | 49 | << " Error converting dbus QVariant to KeeperError, expected type is [ QDBusArgument ] and current type is: [" | 49 | << " Error converting dbus QVariant to Error, expected type is [ QDBusArgument ] and current type is: [" |
810 | 50 | << value.typeName() << "]"; | 50 | << value.typeName() << "]"; |
811 | 51 | if (conversion_ok) | 51 | if (conversion_ok) |
812 | 52 | *conversion_ok = false; | 52 | *conversion_ok = false; |
814 | 53 | return KeeperError(keeper::KeeperError::ERROR_UNKNOWN); | 53 | return Error(keeper::Error::UNKNOWN); |
815 | 54 | } | 54 | } |
816 | 55 | auto dbus_arg = value.value<QDBusArgument>(); | 55 | auto dbus_arg = value.value<QDBusArgument>(); |
817 | 56 | 56 | ||
818 | 57 | if (dbus_arg.currentSignature() != "(i)") | 57 | if (dbus_arg.currentSignature() != "(i)") |
819 | 58 | { | 58 | { |
820 | 59 | qWarning() << Q_FUNC_INFO | 59 | qWarning() << Q_FUNC_INFO |
822 | 60 | << " Error converting dbus QVariant to KeeperError, expected signature is \"(i)\" and current signature is: \"" | 60 | << " Error converting dbus QVariant to Error, expected signature is \"(i)\" and current signature is: \"" |
823 | 61 | << dbus_arg.currentSignature() << "\""; | 61 | << dbus_arg.currentSignature() << "\""; |
824 | 62 | if (conversion_ok) | 62 | if (conversion_ok) |
825 | 63 | *conversion_ok = false; | 63 | *conversion_ok = false; |
827 | 64 | return KeeperError(keeper::KeeperError::ERROR_UNKNOWN); | 64 | return Error(keeper::Error::UNKNOWN); |
828 | 65 | } | 65 | } |
830 | 66 | KeeperError ret; | 66 | Error ret; |
831 | 67 | dbus_arg >> ret; | 67 | dbus_arg >> ret; |
832 | 68 | 68 | ||
833 | 69 | if (conversion_ok) | 69 | if (conversion_ok) |
834 | 70 | 70 | ||
835 | === added file 'src/client/keeper-items.cpp' | |||
836 | --- src/client/keeper-items.cpp 1970-01-01 00:00:00 +0000 | |||
837 | +++ src/client/keeper-items.cpp 2016-12-22 14:35:27 +0000 | |||
838 | @@ -0,0 +1,212 @@ | |||
839 | 1 | /* | ||
840 | 2 | * Copyright (C) 2016 Canonical, Ltd. | ||
841 | 3 | * | ||
842 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
843 | 5 | * under the terms of the GNU General Public License version 3, as published | ||
844 | 6 | * by the Free Software Foundation. | ||
845 | 7 | * | ||
846 | 8 | * This program is distributed in the hope that it will be useful, but | ||
847 | 9 | * WITHOUT ANY WARRANTY; without even the implied warranties of | ||
848 | 10 | * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
849 | 11 | * PURPOSE. See the GNU General Public License for more details. | ||
850 | 12 | * | ||
851 | 13 | * You should have received a copy of the GNU General Public License along | ||
852 | 14 | * with this program. If not, see <http://www.gnu.org/licenses/>. | ||
853 | 15 | * | ||
854 | 16 | * Authors: | ||
855 | 17 | * Xavi Garcia Mena <xavi.garcia.mena@canonical.com> | ||
856 | 18 | */ | ||
857 | 19 | |||
858 | 20 | #include "client/keeper-items.h" | ||
859 | 21 | |||
860 | 22 | #include <QtDBus> | ||
861 | 23 | #include <QVariantMap> | ||
862 | 24 | |||
863 | 25 | namespace keeper | ||
864 | 26 | { | ||
865 | 27 | |||
866 | 28 | // KeeperItem | ||
867 | 29 | |||
868 | 30 | bool has_all_predefined_properties(QStringList const & predefined_properties, KeeperItem const & values); | ||
869 | 31 | |||
870 | 32 | bool has_all_predefined_properties(QStringList const & predefined_properties, KeeperItem const & values) | ||
871 | 33 | { | ||
872 | 34 | for (auto iter = predefined_properties.begin(); iter != predefined_properties.end(); ++iter) | ||
873 | 35 | { | ||
874 | 36 | if (!values.has_property((*iter))) | ||
875 | 37 | return false; | ||
876 | 38 | } | ||
877 | 39 | return true; | ||
878 | 40 | } | ||
879 | 41 | |||
880 | 42 | constexpr const char TYPE_KEY[] = "type"; | ||
881 | 43 | constexpr const char DISPLAY_NAME_KEY[] = "display-name"; | ||
882 | 44 | constexpr const char DIR_NAME_KEY[] = "dir-name"; | ||
883 | 45 | constexpr const char STATUS_KEY[] = "action"; | ||
884 | 46 | constexpr const char PERCENT_DONE_KEY[] = "percent-done"; | ||
885 | 47 | constexpr const char ERROR_KEY[] = "error"; | ||
886 | 48 | |||
887 | 49 | |||
888 | 50 | KeeperItem::KeeperItem() | ||
889 | 51 | : QVariantMap() | ||
890 | 52 | { | ||
891 | 53 | } | ||
892 | 54 | |||
893 | 55 | KeeperItem::KeeperItem(QVariantMap const & values) | ||
894 | 56 | : QVariantMap(values) | ||
895 | 57 | { | ||
896 | 58 | } | ||
897 | 59 | |||
898 | 60 | KeeperItem::~KeeperItem() = default; | ||
899 | 61 | |||
900 | 62 | QVariant KeeperItem::get_property_value(QString const & property) const | ||
901 | 63 | { | ||
902 | 64 | auto iter = this->find(property); | ||
903 | 65 | if (iter != this->end()) | ||
904 | 66 | { | ||
905 | 67 | return (*iter); | ||
906 | 68 | } | ||
907 | 69 | else | ||
908 | 70 | { | ||
909 | 71 | return QVariant(); | ||
910 | 72 | } | ||
911 | 73 | } | ||
912 | 74 | |||
913 | 75 | bool KeeperItem::is_valid()const | ||
914 | 76 | { | ||
915 | 77 | // we need at least type and display name to consider this a keeper item | ||
916 | 78 | return has_all_predefined_properties(QStringList{TYPE_KEY, DISPLAY_NAME_KEY}, *this); | ||
917 | 79 | } | ||
918 | 80 | |||
919 | 81 | bool KeeperItem::has_property(QString const & property) const | ||
920 | 82 | { | ||
921 | 83 | auto iter = this->find(property); | ||
922 | 84 | return iter != this->end(); | ||
923 | 85 | } | ||
924 | 86 | |||
925 | 87 | QString KeeperItem::get_type(bool *valid) const | ||
926 | 88 | { | ||
927 | 89 | if (!has_property(TYPE_KEY)) | ||
928 | 90 | { | ||
929 | 91 | if (valid) | ||
930 | 92 | *valid = false; | ||
931 | 93 | return QString(); | ||
932 | 94 | } | ||
933 | 95 | if (valid) | ||
934 | 96 | *valid = true; | ||
935 | 97 | return get_property_value(TYPE_KEY).toString(); | ||
936 | 98 | } | ||
937 | 99 | |||
938 | 100 | QString KeeperItem::get_display_name(bool *valid) const | ||
939 | 101 | { | ||
940 | 102 | if (!has_property(DISPLAY_NAME_KEY)) | ||
941 | 103 | { | ||
942 | 104 | if (valid) | ||
943 | 105 | *valid = false; | ||
944 | 106 | return QString(); | ||
945 | 107 | } | ||
946 | 108 | if (valid) | ||
947 | 109 | *valid = true; | ||
948 | 110 | return get_property_value(DISPLAY_NAME_KEY).toString(); | ||
949 | 111 | } | ||
950 | 112 | |||
951 | 113 | QString KeeperItem::get_dir_name(bool *valid) const | ||
952 | 114 | { | ||
953 | 115 | if (!has_property(DIR_NAME_KEY)) | ||
954 | 116 | { | ||
955 | 117 | if (valid) | ||
956 | 118 | *valid = false; | ||
957 | 119 | return QString(); | ||
958 | 120 | } | ||
959 | 121 | if (valid) | ||
960 | 122 | *valid = true; | ||
961 | 123 | return get_property_value(DIR_NAME_KEY).toString(); | ||
962 | 124 | } | ||
963 | 125 | |||
964 | 126 | QString KeeperItem::get_status(bool *valid) const | ||
965 | 127 | { | ||
966 | 128 | if (!has_property(STATUS_KEY)) | ||
967 | 129 | { | ||
968 | 130 | if (valid) | ||
969 | 131 | *valid = false; | ||
970 | 132 | return QString(); | ||
971 | 133 | } | ||
972 | 134 | if (valid) | ||
973 | 135 | *valid = true; | ||
974 | 136 | return get_property_value(STATUS_KEY).toString(); | ||
975 | 137 | } | ||
976 | 138 | |||
977 | 139 | double KeeperItem::get_percent_done(bool *valid) const | ||
978 | 140 | { | ||
979 | 141 | auto value = get_property_value(PERCENT_DONE_KEY); | ||
980 | 142 | if (value.type() == QVariant::Double) | ||
981 | 143 | { | ||
982 | 144 | if (valid) | ||
983 | 145 | *valid = true; | ||
984 | 146 | return get_property_value(PERCENT_DONE_KEY).toDouble(); | ||
985 | 147 | } | ||
986 | 148 | else | ||
987 | 149 | { | ||
988 | 150 | if (valid) | ||
989 | 151 | *valid = false; | ||
990 | 152 | return -1; | ||
991 | 153 | } | ||
992 | 154 | } | ||
993 | 155 | |||
994 | 156 | keeper::Error KeeperItem::get_error(bool *valid) const | ||
995 | 157 | { | ||
996 | 158 | // if it does not have explicitly defined the error, OK is considered | ||
997 | 159 | if (!has_property(ERROR_KEY)) | ||
998 | 160 | return keeper::Error::OK; | ||
999 | 161 | |||
1000 | 162 | return keeper::convert_from_dbus_variant(get_property_value(ERROR_KEY), valid); | ||
1001 | 163 | } | ||
1002 | 164 | |||
1003 | 165 | void KeeperItem::registerMetaType() | ||
1004 | 166 | { | ||
1005 | 167 | qRegisterMetaType<KeeperItem>("KeeperItem"); | ||
1006 | 168 | |||
1007 | 169 | qDBusRegisterMetaType<KeeperItem>(); | ||
1008 | 170 | } | ||
1009 | 171 | |||
1010 | 172 | ///// | ||
1011 | 173 | // KeeperItemsMap | ||
1012 | 174 | ///// | ||
1013 | 175 | |||
1014 | 176 | |||
1015 | 177 | KeeperItemsMap::KeeperItemsMap() | ||
1016 | 178 | : QMap<QString, KeeperItem>() | ||
1017 | 179 | { | ||
1018 | 180 | } | ||
1019 | 181 | |||
1020 | 182 | KeeperItemsMap::~KeeperItemsMap() = default; | ||
1021 | 183 | |||
1022 | 184 | |||
1023 | 185 | KeeperItemsMap::KeeperItemsMap(Error error) | ||
1024 | 186 | : QMap<QString, KeeperItem>() | ||
1025 | 187 | , error_(error) | ||
1026 | 188 | { | ||
1027 | 189 | |||
1028 | 190 | } | ||
1029 | 191 | |||
1030 | 192 | QStringList KeeperItemsMap::get_uuids() const | ||
1031 | 193 | { | ||
1032 | 194 | QStringList ret; | ||
1033 | 195 | for (auto iter = this->begin(); iter != this->end(); ++iter) | ||
1034 | 196 | { | ||
1035 | 197 | ret << iter.key(); | ||
1036 | 198 | } | ||
1037 | 199 | |||
1038 | 200 | return ret; | ||
1039 | 201 | } | ||
1040 | 202 | |||
1041 | 203 | void KeeperItemsMap::registerMetaType() | ||
1042 | 204 | { | ||
1043 | 205 | qRegisterMetaType<KeeperItemsMap>("KeeperItemsMap"); | ||
1044 | 206 | |||
1045 | 207 | qDBusRegisterMetaType<KeeperItemsMap>(); | ||
1046 | 208 | |||
1047 | 209 | KeeperItem::registerMetaType(); | ||
1048 | 210 | } | ||
1049 | 211 | |||
1050 | 212 | } // namespace keeper | ||
1051 | 0 | 213 | ||
1052 | === modified file 'src/helper/backup-helper.cpp' | |||
1053 | --- src/helper/backup-helper.cpp 2016-12-15 14:30:42 +0000 | |||
1054 | +++ src/helper/backup-helper.cpp 2016-12-22 14:35:27 +0000 | |||
1055 | @@ -63,7 +63,7 @@ | |||
1056 | 63 | if (rc == -1) | 63 | if (rc == -1) |
1057 | 64 | { | 64 | { |
1058 | 65 | qWarning() << QStringLiteral("Error creating socket to communicate with helper");; | 65 | qWarning() << QStringLiteral("Error creating socket to communicate with helper");; |
1060 | 66 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_SOCKET_ERROR)); | 66 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_SOCKET)); |
1061 | 67 | return; | 67 | return; |
1062 | 68 | } | 68 | } |
1063 | 69 | 69 | ||
1064 | @@ -142,7 +142,7 @@ | |||
1065 | 142 | if (!success) | 142 | if (!success) |
1066 | 143 | { | 143 | { |
1067 | 144 | write_error_ = true; | 144 | write_error_ = true; |
1069 | 145 | Q_EMIT(q_ptr->error(keeper::KeeperError::COMMITTING_DATA_ERROR)); | 145 | Q_EMIT(q_ptr->error(keeper::Error::COMMITTING_DATA)); |
1070 | 146 | } | 146 | } |
1071 | 147 | else | 147 | else |
1072 | 148 | uploader_committed_file_name_ = uploader_->file_name(); | 148 | uploader_committed_file_name_ = uploader_->file_name(); |
1073 | @@ -178,7 +178,7 @@ | |||
1074 | 178 | { | 178 | { |
1075 | 179 | stop_inactivity_timer(); | 179 | stop_inactivity_timer(); |
1076 | 180 | qWarning() << "Inactivity detected in the helper...stopping it"; | 180 | qWarning() << "Inactivity detected in the helper...stopping it"; |
1078 | 181 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_INACTIVITY_DETECTED)); | 181 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_INACTIVITY_DETECTED)); |
1079 | 182 | stop(); | 182 | stop(); |
1080 | 183 | } | 183 | } |
1081 | 184 | 184 | ||
1082 | @@ -214,7 +214,7 @@ | |||
1083 | 214 | } | 214 | } |
1084 | 215 | else if (n < 0) { | 215 | else if (n < 0) { |
1085 | 216 | read_error_ = true; | 216 | read_error_ = true; |
1087 | 217 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_READ_ERROR)); | 217 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_READ)); |
1088 | 218 | stop(); | 218 | stop(); |
1089 | 219 | return; | 219 | return; |
1090 | 220 | } | 220 | } |
1091 | @@ -230,7 +230,7 @@ | |||
1092 | 230 | if (n < 0) { | 230 | if (n < 0) { |
1093 | 231 | write_error_ = true; | 231 | write_error_ = true; |
1094 | 232 | qWarning() << "Write error:" << socket->errorString(); | 232 | qWarning() << "Write error:" << socket->errorString(); |
1096 | 233 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_WRITE_ERROR)); | 233 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_WRITE)); |
1097 | 234 | stop(); | 234 | stop(); |
1098 | 235 | } | 235 | } |
1099 | 236 | break; | 236 | break; |
1100 | @@ -263,7 +263,7 @@ | |||
1101 | 263 | { | 263 | { |
1102 | 264 | if (n_uploaded_ > q_ptr->expected_size()) | 264 | if (n_uploaded_ > q_ptr->expected_size()) |
1103 | 265 | { | 265 | { |
1105 | 266 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_WRITE_ERROR)); | 266 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_WRITE)); |
1106 | 267 | } | 267 | } |
1107 | 268 | q_ptr->set_state(Helper::State::FAILED); | 268 | q_ptr->set_state(Helper::State::FAILED); |
1108 | 269 | } | 269 | } |
1109 | 270 | 270 | ||
1110 | === modified file 'src/helper/helper.cpp' | |||
1111 | --- src/helper/helper.cpp 2016-12-21 17:29:58 +0000 | |||
1112 | +++ src/helper/helper.cpp 2016-12-22 14:35:27 +0000 | |||
1113 | @@ -354,7 +354,7 @@ | |||
1114 | 354 | void on_max_time_waiting_for_ual_started() | 354 | void on_max_time_waiting_for_ual_started() |
1115 | 355 | { | 355 | { |
1116 | 356 | qWarning() << "Maximum time reached waiting for the helper to start."; | 356 | qWarning() << "Maximum time reached waiting for the helper to start."; |
1118 | 357 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_START_TIMEOUT)); | 357 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_START_TIMEOUT)); |
1119 | 358 | q_ptr->set_state(Helper::State::FAILED); | 358 | q_ptr->set_state(Helper::State::FAILED); |
1120 | 359 | stop_wait_for_ual_timer(); | 359 | stop_wait_for_ual_timer(); |
1121 | 360 | } | 360 | } |
1122 | 361 | 361 | ||
1123 | === modified file 'src/helper/restore-helper.cpp' | |||
1124 | --- src/helper/restore-helper.cpp 2016-12-15 14:30:42 +0000 | |||
1125 | +++ src/helper/restore-helper.cpp 2016-12-22 14:35:27 +0000 | |||
1126 | @@ -58,7 +58,7 @@ | |||
1127 | 58 | if (rc == -1) | 58 | if (rc == -1) |
1128 | 59 | { | 59 | { |
1129 | 60 | qWarning() << QStringLiteral("Error creating socket to communicate with helper");; | 60 | qWarning() << QStringLiteral("Error creating socket to communicate with helper");; |
1131 | 61 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_SOCKET_ERROR)); | 61 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_SOCKET)); |
1132 | 62 | return; | 62 | return; |
1133 | 63 | } | 63 | } |
1134 | 64 | 64 | ||
1135 | @@ -167,7 +167,7 @@ | |||
1136 | 167 | { | 167 | { |
1137 | 168 | stop_inactivity_timer(); | 168 | stop_inactivity_timer(); |
1138 | 169 | qWarning() << "Inactivity detected in the helper...stopping it"; | 169 | qWarning() << "Inactivity detected in the helper...stopping it"; |
1140 | 170 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_INACTIVITY_DETECTED)); | 170 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_INACTIVITY_DETECTED)); |
1141 | 171 | stop(); | 171 | stop(); |
1142 | 172 | } | 172 | } |
1143 | 173 | 173 | ||
1144 | @@ -206,7 +206,7 @@ | |||
1145 | 206 | else if (n < 0) { | 206 | else if (n < 0) { |
1146 | 207 | read_error_ = true; | 207 | read_error_ = true; |
1147 | 208 | qDebug() << "Read error in restore helper: " << socket->errorString(); | 208 | qDebug() << "Read error in restore helper: " << socket->errorString(); |
1149 | 209 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_READ_ERROR)); | 209 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_READ)); |
1150 | 210 | stop(); | 210 | stop(); |
1151 | 211 | return; | 211 | return; |
1152 | 212 | } | 212 | } |
1153 | @@ -225,7 +225,7 @@ | |||
1154 | 225 | if (n < 0) { | 225 | if (n < 0) { |
1155 | 226 | write_error_ = true; | 226 | write_error_ = true; |
1156 | 227 | qWarning() << "Write error:" << write_socket_.errorString(); | 227 | qWarning() << "Write error:" << write_socket_.errorString(); |
1158 | 228 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_WRITE_ERROR)); | 228 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_WRITE)); |
1159 | 229 | stop(); | 229 | stop(); |
1160 | 230 | } | 230 | } |
1161 | 231 | break; | 231 | break; |
1162 | @@ -259,7 +259,7 @@ | |||
1163 | 259 | { | 259 | { |
1164 | 260 | if (n_uploaded_ > q_ptr->expected_size()) | 260 | if (n_uploaded_ > q_ptr->expected_size()) |
1165 | 261 | { | 261 | { |
1167 | 262 | Q_EMIT(q_ptr->error(keeper::KeeperError::HELPER_WRITE_ERROR)); | 262 | Q_EMIT(q_ptr->error(keeper::Error::HELPER_WRITE)); |
1168 | 263 | } | 263 | } |
1169 | 264 | q_ptr->set_state(Helper::State::FAILED); | 264 | q_ptr->set_state(Helper::State::FAILED); |
1170 | 265 | } | 265 | } |
1171 | 266 | 266 | ||
1172 | === modified file 'src/qdbus-stubs/CMakeLists.txt' | |||
1173 | --- src/qdbus-stubs/CMakeLists.txt 2016-11-30 14:46:29 +0000 | |||
1174 | +++ src/qdbus-stubs/CMakeLists.txt 2016-12-22 14:35:27 +0000 | |||
1175 | @@ -67,6 +67,7 @@ | |||
1176 | 67 | ${user_xml} | 67 | ${user_xml} |
1177 | 68 | PROPERTIES | 68 | PROPERTIES |
1178 | 69 | CLASSNAME DBusInterfaceKeeperUser | 69 | CLASSNAME DBusInterfaceKeeperUser |
1179 | 70 | INCLUDE "client/keeper-items.h" | ||
1180 | 70 | ) | 71 | ) |
1181 | 71 | 72 | ||
1182 | 72 | qt5_add_dbus_interface( | 73 | qt5_add_dbus_interface( |
1183 | @@ -116,7 +117,7 @@ | |||
1184 | 116 | ${adaptor_files} | 117 | ${adaptor_files} |
1185 | 117 | ) | 118 | ) |
1186 | 118 | 119 | ||
1191 | 119 | #target_link_libraries( | 120 | target_link_libraries( |
1192 | 120 | # ${STUBS_LIB} | 121 | ${STUBS_LIB} |
1193 | 121 | # backup-helper | 122 | keeper-errors-lib |
1194 | 122 | #) | 123 | ) |
1195 | 123 | 124 | ||
1196 | === modified file 'src/qdbus-stubs/com.canonical.keeper.User.xml' | |||
1197 | --- src/qdbus-stubs/com.canonical.keeper.User.xml 2016-07-28 19:44:52 +0000 | |||
1198 | +++ src/qdbus-stubs/com.canonical.keeper.User.xml 2016-12-22 14:35:27 +0000 | |||
1199 | @@ -5,7 +5,7 @@ | |||
1200 | 5 | <interface name="com.canonical.keeper.User"> | 5 | <interface name="com.canonical.keeper.User"> |
1201 | 6 | 6 | ||
1202 | 7 | <method name="GetBackupChoices"> | 7 | <method name="GetBackupChoices"> |
1204 | 8 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantDictMap"/> | 8 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="keeper::KeeperItemsMap"/> |
1205 | 9 | <arg direction="out" name="backups" type="a{sa{sv}}"> | 9 | <arg direction="out" name="backups" type="a{sa{sv}}"> |
1206 | 10 | <doc:doc> | 10 | <doc:doc> |
1207 | 11 | <doc:summary>A list of backup possibilities for the user to choose from</doc:summary> | 11 | <doc:summary>A list of backup possibilities for the user to choose from</doc:summary> |
1208 | @@ -35,7 +35,7 @@ | |||
1209 | 35 | </method> | 35 | </method> |
1210 | 36 | 36 | ||
1211 | 37 | <method name="GetRestoreChoices"> | 37 | <method name="GetRestoreChoices"> |
1213 | 38 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantDictMap"/> | 38 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="keeper::KeeperItemsMap"/> |
1214 | 39 | <arg direction="out" name="backups" type="a{sa{sv}}"> | 39 | <arg direction="out" name="backups" type="a{sa{sv}}"> |
1215 | 40 | <doc:doc> | 40 | <doc:doc> |
1216 | 41 | <doc:summary>The backups which already exist and can be restored</doc:summary> | 41 | <doc:summary>The backups which already exist and can be restored</doc:summary> |
1217 | @@ -65,7 +65,7 @@ | |||
1218 | 65 | </method> | 65 | </method> |
1219 | 66 | 66 | ||
1220 | 67 | <property name="State" type="a{sa{sv}}" access="read"> | 67 | <property name="State" type="a{sa{sv}}" access="read"> |
1222 | 68 | <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantDictMap"/> | 68 | <annotation name="org.qtproject.QtDBus.QtTypeName" value="keeper::KeeperItemsMap"/> |
1223 | 69 | <doc:doc> | 69 | <doc:doc> |
1224 | 70 | <doc:description> | 70 | <doc:description> |
1225 | 71 | <doc:para>Provides state information so the user interface can show | 71 | <doc:para>Provides state information so the user interface can show |
1226 | 72 | 72 | ||
1227 | === modified file 'src/qdbus-stubs/dbus-types.h' | |||
1228 | --- src/qdbus-stubs/dbus-types.h 2016-12-14 11:00:21 +0000 | |||
1229 | +++ src/qdbus-stubs/dbus-types.h 2016-12-22 14:35:27 +0000 | |||
1230 | @@ -23,6 +23,7 @@ | |||
1231 | 23 | #include <QString> | 23 | #include <QString> |
1232 | 24 | #include <QVariantMap> | 24 | #include <QVariantMap> |
1233 | 25 | #include <client/keeper-errors.h> | 25 | #include <client/keeper-errors.h> |
1234 | 26 | #include "client/keeper-items.h" | ||
1235 | 26 | 27 | ||
1236 | 27 | typedef QMap<QString, QVariantMap> QVariantDictMap; | 28 | typedef QMap<QString, QVariantMap> QVariantDictMap; |
1237 | 28 | Q_DECLARE_METATYPE(QVariantDictMap) | 29 | Q_DECLARE_METATYPE(QVariantDictMap) |
1238 | @@ -36,11 +37,13 @@ | |||
1239 | 36 | { | 37 | { |
1240 | 37 | qRegisterMetaType<QVariantDictMap>("QVariantDictMap"); | 38 | qRegisterMetaType<QVariantDictMap>("QVariantDictMap"); |
1241 | 38 | qRegisterMetaType<QStringMap>("QStringMap"); | 39 | qRegisterMetaType<QStringMap>("QStringMap"); |
1243 | 39 | qRegisterMetaType<keeper::KeeperError>("keeper::KeeperError"); | 40 | qRegisterMetaType<keeper::Error>("keeper::Error"); |
1244 | 40 | 41 | ||
1245 | 41 | qDBusRegisterMetaType<QVariantDictMap>(); | 42 | qDBusRegisterMetaType<QVariantDictMap>(); |
1246 | 42 | qDBusRegisterMetaType<QStringMap>(); | 43 | qDBusRegisterMetaType<QStringMap>(); |
1248 | 43 | qDBusRegisterMetaType<keeper::KeeperError>(); | 44 | qDBusRegisterMetaType<keeper::Error>(); |
1249 | 45 | |||
1250 | 46 | keeper::KeeperItemsMap::registerMetaType(); | ||
1251 | 44 | } | 47 | } |
1252 | 45 | 48 | ||
1253 | 46 | constexpr const char KEEPER_SERVICE[] = "com.canonical.keeper"; | 49 | constexpr const char KEEPER_SERVICE[] = "com.canonical.keeper"; |
1254 | 47 | 50 | ||
1255 | === modified file 'src/service/backup-choices.cpp' | |||
1256 | --- src/service/backup-choices.cpp 2016-10-28 15:11:21 +0000 | |||
1257 | +++ src/service/backup-choices.cpp 2016-12-22 14:35:27 +0000 | |||
1258 | @@ -160,5 +160,5 @@ | |||
1259 | 160 | } | 160 | } |
1260 | 161 | } | 161 | } |
1261 | 162 | 162 | ||
1263 | 163 | Q_EMIT(finished()); | 163 | Q_EMIT(finished(keeper::Error::OK)); |
1264 | 164 | } | 164 | } |
1265 | 165 | 165 | ||
1266 | === modified file 'src/service/keeper-task-backup.cpp' | |||
1267 | --- src/service/keeper-task-backup.cpp 2016-12-15 14:30:42 +0000 | |||
1268 | +++ src/service/keeper-task-backup.cpp 2016-12-22 14:35:27 +0000 | |||
1269 | @@ -50,7 +50,7 @@ | |||
1270 | 50 | qDebug() << "Initializing a backup helper"; | 50 | qDebug() << "Initializing a backup helper"; |
1271 | 51 | helper_.reset(new BackupHelper(DEKKO_APP_ID), [](Helper *h){h->deleteLater();}); | 51 | helper_.reset(new BackupHelper(DEKKO_APP_ID), [](Helper *h){h->deleteLater();}); |
1272 | 52 | qDebug() << "Helper " << static_cast<void*>(helper_.data()) << " was created"; | 52 | qDebug() << "Helper " << static_cast<void*>(helper_.data()) << " was created"; |
1274 | 53 | QObject::connect(helper_.data(), &Helper::error, [this](keeper::KeeperError error){ error_ = error;}); | 53 | QObject::connect(helper_.data(), &Helper::error, [this](keeper::Error error){ error_ = error;}); |
1275 | 54 | } | 54 | } |
1276 | 55 | 55 | ||
1277 | 56 | void ask_for_uploader(quint64 n_bytes, QString const & dir_name) | 56 | void ask_for_uploader(quint64 n_bytes, QString const & dir_name) |
1278 | @@ -65,14 +65,20 @@ | |||
1279 | 65 | storage_->get_new_uploader(n_bytes, dir_name, file_name), | 65 | storage_->get_new_uploader(n_bytes, dir_name, file_name), |
1280 | 66 | std::function<void(std::shared_ptr<Uploader> const&)>{ | 66 | std::function<void(std::shared_ptr<Uploader> const&)>{ |
1281 | 67 | [this](std::shared_ptr<Uploader> const& uploader){ | 67 | [this](std::shared_ptr<Uploader> const& uploader){ |
1283 | 68 | int fd {-1}; | 68 | auto fd {-1}; |
1284 | 69 | if (uploader) { | 69 | if (uploader) { |
1285 | 70 | auto backup_helper = qSharedPointerDynamicCast<BackupHelper>(helper_); | 70 | auto backup_helper = qSharedPointerDynamicCast<BackupHelper>(helper_); |
1286 | 71 | backup_helper->set_uploader(uploader); | 71 | backup_helper->set_uploader(uploader); |
1287 | 72 | fd = backup_helper->get_helper_socket(); | 72 | fd = backup_helper->get_helper_socket(); |
1291 | 73 | } | 73 | qDebug("emitting task_socket_ready(socket=%d)", fd); |
1292 | 74 | qDebug("emitting task_socket_ready(socket=%d)", fd); | 74 | Q_EMIT(q_ptr->task_socket_ready(fd)); |
1293 | 75 | Q_EMIT(q_ptr->task_socket_ready(fd)); | 75 | } |
1294 | 76 | else | ||
1295 | 77 | { | ||
1296 | 78 | error_ = storage_->get_last_error(); | ||
1297 | 79 | qDebug("Emitting task_socket_error(error=%d)", static_cast<int>(error_)); | ||
1298 | 80 | Q_EMIT(q_ptr->task_socket_error(error_)); | ||
1299 | 81 | } | ||
1300 | 76 | } | 82 | } |
1301 | 77 | } | 83 | } |
1302 | 78 | ); | 84 | ); |
1303 | 79 | 85 | ||
1304 | === modified file 'src/service/keeper-task-restore.cpp' | |||
1305 | --- src/service/keeper-task-restore.cpp 2016-12-15 14:30:42 +0000 | |||
1306 | +++ src/service/keeper-task-restore.cpp 2016-12-22 14:35:27 +0000 | |||
1307 | @@ -78,13 +78,19 @@ | |||
1308 | 78 | storage_->get_new_downloader(dir_name, file_name), | 78 | storage_->get_new_downloader(dir_name, file_name), |
1309 | 79 | std::function<void(std::shared_ptr<Downloader> const&)>{ | 79 | std::function<void(std::shared_ptr<Downloader> const&)>{ |
1310 | 80 | [this](std::shared_ptr<Downloader> const& downloader){ | 80 | [this](std::shared_ptr<Downloader> const& downloader){ |
1312 | 81 | int fd {-1}; | 81 | auto fd {-1}; |
1313 | 82 | if (downloader) { | 82 | if (downloader) { |
1314 | 83 | auto restore_helper = qSharedPointerDynamicCast<RestoreHelper>(helper_); | 83 | auto restore_helper = qSharedPointerDynamicCast<RestoreHelper>(helper_); |
1315 | 84 | restore_helper->set_downloader(downloader); | 84 | restore_helper->set_downloader(downloader); |
1316 | 85 | fd = restore_helper->get_helper_socket(); | 85 | fd = restore_helper->get_helper_socket(); |
1319 | 86 | } | 86 | Q_EMIT(q_ptr->task_socket_ready(fd)); |
1320 | 87 | Q_EMIT(q_ptr->task_socket_ready(fd)); | 87 | } |
1321 | 88 | else | ||
1322 | 89 | { | ||
1323 | 90 | error_ = storage_->get_last_error(); | ||
1324 | 91 | qDebug("Emitting task_socket_error(error=%d)", static_cast<int>(error_)); | ||
1325 | 92 | Q_EMIT(q_ptr->task_socket_error(error_)); | ||
1326 | 93 | } | ||
1327 | 88 | } | 94 | } |
1328 | 89 | } | 95 | } |
1329 | 90 | ); | 96 | ); |
1330 | 91 | 97 | ||
1331 | === modified file 'src/service/keeper-task.cpp' | |||
1332 | --- src/service/keeper-task.cpp 2016-12-15 14:30:42 +0000 | |||
1333 | +++ src/service/keeper-task.cpp 2016-12-22 14:35:27 +0000 | |||
1334 | @@ -35,7 +35,7 @@ | |||
1335 | 35 | , task_data_(task_data) | 35 | , task_data_(task_data) |
1336 | 36 | , helper_registry_(helper_registry) | 36 | , helper_registry_(helper_registry) |
1337 | 37 | , storage_(storage) | 37 | , storage_(storage) |
1339 | 38 | , error_(keeper::KeeperError::OK) | 38 | , error_(keeper::Error::OK) |
1340 | 39 | { | 39 | { |
1341 | 40 | } | 40 | } |
1342 | 41 | 41 | ||
1343 | @@ -50,7 +50,7 @@ | |||
1344 | 50 | if (urls.isEmpty()) | 50 | if (urls.isEmpty()) |
1345 | 51 | { | 51 | { |
1346 | 52 | task_data_.action = helper_->to_string(Helper::State::FAILED); | 52 | task_data_.action = helper_->to_string(Helper::State::FAILED); |
1348 | 53 | error_ = keeper::KeeperError::HELPER_BAD_URL; | 53 | error_ = keeper::Error::HELPER_BAD_URL; |
1349 | 54 | qWarning() << QStringLiteral("Error: uuid %1 has no url").arg(task_data_.metadata.uuid()); | 54 | qWarning() << QStringLiteral("Error: uuid %1 has no url").arg(task_data_.metadata.uuid()); |
1350 | 55 | calculate_and_notify_state(Helper::State::FAILED); | 55 | calculate_and_notify_state(Helper::State::FAILED); |
1351 | 56 | return false; | 56 | return false; |
1352 | @@ -66,7 +66,7 @@ | |||
1353 | 66 | std::bind(&KeeperTaskPrivate::on_helper_percent_done_changed, this, std::placeholders::_1) | 66 | std::bind(&KeeperTaskPrivate::on_helper_percent_done_changed, this, std::placeholders::_1) |
1354 | 67 | ); | 67 | ); |
1355 | 68 | 68 | ||
1357 | 69 | QObject::connect(helper_.data(), &Helper::error, [this](keeper::KeeperError error){ | 69 | QObject::connect(helper_.data(), &Helper::error, [this](keeper::Error error){ |
1358 | 70 | error_ = error; | 70 | error_ = error; |
1359 | 71 | }); | 71 | }); |
1360 | 72 | 72 | ||
1361 | @@ -140,7 +140,7 @@ | |||
1362 | 140 | if (task_data_.action == "failed" || task_data_.action == "cancelled") | 140 | if (task_data_.action == "failed" || task_data_.action == "cancelled") |
1363 | 141 | { | 141 | { |
1364 | 142 | auto error = error_; | 142 | auto error = error_; |
1366 | 143 | if (task_data_.error != keeper::KeeperError::OK) | 143 | if (task_data_.error != keeper::Error::OK) |
1367 | 144 | { | 144 | { |
1368 | 145 | error = task_data_.error; | 145 | error = task_data_.error; |
1369 | 146 | } | 146 | } |
1370 | @@ -205,7 +205,7 @@ | |||
1371 | 205 | } | 205 | } |
1372 | 206 | } | 206 | } |
1373 | 207 | 207 | ||
1375 | 208 | keeper::KeeperError KeeperTaskPrivate::error() const | 208 | keeper::Error KeeperTaskPrivate::error() const |
1376 | 209 | { | 209 | { |
1377 | 210 | return error_; | 210 | return error_; |
1378 | 211 | } | 211 | } |
1379 | @@ -269,7 +269,7 @@ | |||
1380 | 269 | return d->to_string(state); | 269 | return d->to_string(state); |
1381 | 270 | } | 270 | } |
1382 | 271 | 271 | ||
1384 | 272 | keeper::KeeperError KeeperTask::error() const | 272 | keeper::Error KeeperTask::error() const |
1385 | 273 | { | 273 | { |
1386 | 274 | Q_D(const KeeperTask); | 274 | Q_D(const KeeperTask); |
1387 | 275 | 275 | ||
1388 | 276 | 276 | ||
1389 | === modified file 'src/service/keeper-task.h' | |||
1390 | --- src/service/keeper-task.h 2016-12-14 13:10:00 +0000 | |||
1391 | +++ src/service/keeper-task.h 2016-12-22 14:35:27 +0000 | |||
1392 | @@ -41,7 +41,7 @@ | |||
1393 | 41 | struct TaskData | 41 | struct TaskData |
1394 | 42 | { | 42 | { |
1395 | 43 | QString action; | 43 | QString action; |
1397 | 44 | keeper::KeeperError error; | 44 | keeper::Error error; |
1398 | 45 | Metadata metadata; | 45 | Metadata metadata; |
1399 | 46 | }; | 46 | }; |
1400 | 47 | 47 | ||
1401 | @@ -63,10 +63,11 @@ | |||
1402 | 63 | 63 | ||
1403 | 64 | QString to_string(Helper::State state); | 64 | QString to_string(Helper::State state); |
1404 | 65 | 65 | ||
1406 | 66 | keeper::KeeperError error() const; | 66 | keeper::Error error() const; |
1407 | 67 | Q_SIGNALS: | 67 | Q_SIGNALS: |
1408 | 68 | void task_state_changed(Helper::State state); | 68 | void task_state_changed(Helper::State state); |
1409 | 69 | void task_socket_ready(int socket_descriptor); | 69 | void task_socket_ready(int socket_descriptor); |
1410 | 70 | void task_socket_error(keeper::Error error); | ||
1411 | 70 | 71 | ||
1412 | 71 | protected: | 72 | protected: |
1413 | 72 | KeeperTask(KeeperTaskPrivate & d, QObject *parent = nullptr); | 73 | KeeperTask(KeeperTaskPrivate & d, QObject *parent = nullptr); |
1414 | 73 | 74 | ||
1415 | === modified file 'src/service/keeper-user.cpp' | |||
1416 | --- src/service/keeper-user.cpp 2016-11-22 09:37:40 +0000 | |||
1417 | +++ src/service/keeper-user.cpp 2016-12-22 14:35:27 +0000 | |||
1418 | @@ -33,7 +33,7 @@ | |||
1419 | 33 | 33 | ||
1420 | 34 | KeeperUser::~KeeperUser() =default; | 34 | KeeperUser::~KeeperUser() =default; |
1421 | 35 | 35 | ||
1423 | 36 | QVariantDictMap | 36 | keeper::KeeperItemsMap |
1424 | 37 | KeeperUser::GetBackupChoices() | 37 | KeeperUser::GetBackupChoices() |
1425 | 38 | { | 38 | { |
1426 | 39 | auto bus = connection(); | 39 | auto bus = connection(); |
1427 | @@ -57,7 +57,7 @@ | |||
1428 | 57 | keeper_.cancel(); | 57 | keeper_.cancel(); |
1429 | 58 | } | 58 | } |
1430 | 59 | 59 | ||
1432 | 60 | QVariantDictMap | 60 | keeper::KeeperItemsMap |
1433 | 61 | KeeperUser::GetRestoreChoices() | 61 | KeeperUser::GetRestoreChoices() |
1434 | 62 | { | 62 | { |
1435 | 63 | Q_ASSERT(calledFromDBus()); | 63 | Q_ASSERT(calledFromDBus()); |
1436 | @@ -81,7 +81,7 @@ | |||
1437 | 81 | keeper_.start_tasks(keys, bus, msg); | 81 | keeper_.start_tasks(keys, bus, msg); |
1438 | 82 | } | 82 | } |
1439 | 83 | 83 | ||
1441 | 84 | QVariantDictMap | 84 | keeper::KeeperItemsMap |
1442 | 85 | KeeperUser::get_state() const | 85 | KeeperUser::get_state() const |
1443 | 86 | { | 86 | { |
1444 | 87 | return keeper_.get_state(); | 87 | return keeper_.get_state(); |
1445 | 88 | 88 | ||
1446 | === modified file 'src/service/keeper-user.h' | |||
1447 | --- src/service/keeper-user.h 2016-09-05 18:38:36 +0000 | |||
1448 | +++ src/service/keeper-user.h 2016-12-22 14:35:27 +0000 | |||
1449 | @@ -37,11 +37,11 @@ | |||
1450 | 37 | virtual ~KeeperUser(); | 37 | virtual ~KeeperUser(); |
1451 | 38 | Q_DISABLE_COPY(KeeperUser) | 38 | Q_DISABLE_COPY(KeeperUser) |
1452 | 39 | 39 | ||
1454 | 40 | Q_PROPERTY(QVariantDictMap State | 40 | Q_PROPERTY(keeper::KeeperItemsMap State |
1455 | 41 | READ get_state | 41 | READ get_state |
1456 | 42 | NOTIFY state_changed) | 42 | NOTIFY state_changed) |
1457 | 43 | 43 | ||
1459 | 44 | QVariantDictMap get_state() const; | 44 | keeper::KeeperItemsMap get_state() const; |
1460 | 45 | 45 | ||
1461 | 46 | Q_SIGNALS: | 46 | Q_SIGNALS: |
1462 | 47 | 47 | ||
1463 | @@ -49,10 +49,10 @@ | |||
1464 | 49 | 49 | ||
1465 | 50 | public Q_SLOTS: | 50 | public Q_SLOTS: |
1466 | 51 | 51 | ||
1468 | 52 | QVariantDictMap GetBackupChoices(); | 52 | keeper::KeeperItemsMap GetBackupChoices(); |
1469 | 53 | void StartBackup(const QStringList&); | 53 | void StartBackup(const QStringList&); |
1470 | 54 | 54 | ||
1472 | 55 | QVariantDictMap GetRestoreChoices(); | 55 | keeper::KeeperItemsMap GetRestoreChoices(); |
1473 | 56 | void StartRestore(const QStringList&); | 56 | void StartRestore(const QStringList&); |
1474 | 57 | 57 | ||
1475 | 58 | void Cancel(); | 58 | void Cancel(); |
1476 | 59 | 59 | ||
1477 | === modified file 'src/service/keeper.cpp' | |||
1478 | --- src/service/keeper.cpp 2016-12-01 14:18:57 +0000 | |||
1479 | +++ src/service/keeper.cpp 2016-12-22 14:35:27 +0000 | |||
1480 | @@ -46,12 +46,15 @@ | |||
1481 | 46 | return variants; | 46 | return variants; |
1482 | 47 | } | 47 | } |
1483 | 48 | 48 | ||
1485 | 49 | QVariantDictMap choices_to_variant_dict_map(const QVector<Metadata>& choices) | 49 | keeper::KeeperItemsMap choices_to_variant_dict_map(const QVector<Metadata>& choices) |
1486 | 50 | { | 50 | { |
1488 | 51 | QVariantDictMap ret; | 51 | keeper::KeeperItemsMap ret; |
1489 | 52 | 52 | ||
1490 | 53 | for (auto const& metadata : choices) | 53 | for (auto const& metadata : choices) |
1492 | 54 | ret.insert(metadata.uuid(), strings_to_variants(metadata.get_public_properties())); | 54 | { |
1493 | 55 | keeper::KeeperItem value(strings_to_variants(metadata.get_public_properties())); | ||
1494 | 56 | ret.insert(metadata.uuid(), value); | ||
1495 | 57 | } | ||
1496 | 55 | 58 | ||
1497 | 56 | return ret; | 59 | return ret; |
1498 | 57 | } | 60 | } |
1499 | @@ -113,11 +116,7 @@ | |||
1500 | 113 | if (task_manager_.start_backup(tasks.values())) | 116 | if (task_manager_.start_backup(tasks.values())) |
1501 | 114 | unhandled.subtract(QSet<QString>::fromList(tasks.keys())); | 117 | unhandled.subtract(QSet<QString>::fromList(tasks.keys())); |
1502 | 115 | 118 | ||
1508 | 116 | check_for_unhandled_tasks(unhandled, bus, msg); | 119 | check_for_unhandled_tasks_and_reply(unhandled, bus, msg); |
1504 | 117 | |||
1505 | 118 | // reply now to the dbus call | ||
1506 | 119 | auto reply = msg.createReply(); | ||
1507 | 120 | bus.send(reply); | ||
1509 | 121 | } | 120 | } |
1510 | 122 | else // restore | 121 | else // restore |
1511 | 123 | { | 122 | { |
1512 | @@ -125,19 +124,17 @@ | |||
1513 | 125 | connections_.connect_oneshot( | 124 | connections_.connect_oneshot( |
1514 | 126 | this, | 125 | this, |
1515 | 127 | &KeeperPrivate::restore_choices_ready, | 126 | &KeeperPrivate::restore_choices_ready, |
1517 | 128 | std::function<void()>{[this, uuids, msg, bus, get_tasks](){ | 127 | std::function<void(keeper::Error)>{[this, uuids, msg, bus, get_tasks](keeper::Error error){ |
1518 | 129 | qDebug() << "Choices ready"; | 128 | qDebug() << "Choices ready"; |
1519 | 130 | auto unhandled = QSet<QString>::fromList(uuids); | 129 | auto unhandled = QSet<QString>::fromList(uuids); |
1530 | 131 | auto restore_tasks = get_tasks(cached_restore_choices_, uuids); | 130 | if (error == keeper::Error::OK) |
1531 | 132 | qDebug() << "After getting tasks..."; | 131 | { |
1532 | 133 | if (!restore_tasks.empty() && task_manager_.start_restore(restore_tasks.values())) | 132 | auto restore_tasks = get_tasks(cached_restore_choices_, uuids); |
1533 | 134 | unhandled.subtract(QSet<QString>::fromList(restore_tasks.keys())); | 133 | qDebug() << "After getting tasks..."; |
1534 | 135 | 134 | if (!restore_tasks.empty() && task_manager_.start_restore(restore_tasks.values())) | |
1535 | 136 | check_for_unhandled_tasks(unhandled, bus, msg); | 135 | unhandled.subtract(QSet<QString>::fromList(restore_tasks.keys())); |
1536 | 137 | 136 | } | |
1537 | 138 | // reply now to the dbus call | 137 | check_for_unhandled_tasks_and_reply(unhandled, bus, msg); |
1528 | 139 | auto reply = msg.createReply(); | ||
1529 | 140 | bus.send(reply); | ||
1538 | 141 | }} | 138 | }} |
1539 | 142 | ); | 139 | ); |
1540 | 143 | get_choices(restore_choices_, KeeperPrivate::ChoicesType::RESTORES_CHOICES); | 140 | get_choices(restore_choices_, KeeperPrivate::ChoicesType::RESTORES_CHOICES); |
1541 | @@ -149,18 +146,19 @@ | |||
1542 | 149 | msg.setDelayedReply(true); | 146 | msg.setDelayedReply(true); |
1543 | 150 | } | 147 | } |
1544 | 151 | 148 | ||
1546 | 152 | void emit_choices_ready(ChoicesType type) | 149 | void emit_choices_ready(ChoicesType type, keeper::Error error) |
1547 | 153 | { | 150 | { |
1548 | 154 | switch(type) | 151 | switch(type) |
1549 | 155 | { | 152 | { |
1550 | 156 | case KeeperPrivate::ChoicesType::BACKUP_CHOICES: | 153 | case KeeperPrivate::ChoicesType::BACKUP_CHOICES: |
1552 | 157 | Q_EMIT(backup_choices_ready()); | 154 | Q_EMIT(backup_choices_ready(error)); |
1553 | 158 | break; | 155 | break; |
1554 | 159 | case KeeperPrivate::ChoicesType::RESTORES_CHOICES: | 156 | case KeeperPrivate::ChoicesType::RESTORES_CHOICES: |
1556 | 160 | Q_EMIT(restore_choices_ready()); | 157 | Q_EMIT(restore_choices_ready(error)); |
1557 | 161 | break; | 158 | break; |
1558 | 162 | } | 159 | } |
1559 | 163 | } | 160 | } |
1560 | 161 | |||
1561 | 164 | void get_choices(const QSharedPointer<MetadataProvider> & provider, ChoicesType type) | 162 | void get_choices(const QSharedPointer<MetadataProvider> & provider, ChoicesType type) |
1562 | 165 | { | 163 | { |
1563 | 166 | bool check_empty = (type == KeeperPrivate::ChoicesType::BACKUP_CHOICES) | 164 | bool check_empty = (type == KeeperPrivate::ChoicesType::BACKUP_CHOICES) |
1564 | @@ -170,71 +168,94 @@ | |||
1565 | 170 | connections_.connect_oneshot( | 168 | connections_.connect_oneshot( |
1566 | 171 | provider.data(), | 169 | provider.data(), |
1567 | 172 | &MetadataProvider::finished, | 170 | &MetadataProvider::finished, |
1569 | 173 | std::function<void()>{[this, provider, type](){ | 171 | std::function<void(keeper::Error)>{[this, provider, type](keeper::Error error){ |
1570 | 174 | qDebug() << "Get choices finished"; | 172 | qDebug() << "Get choices finished"; |
1572 | 175 | switch (type) | 173 | if (error == keeper::Error::OK) |
1573 | 176 | { | 174 | { |
1582 | 177 | case KeeperPrivate::ChoicesType::BACKUP_CHOICES: | 175 | switch (type) |
1583 | 178 | cached_backup_choices_ = provider->get_backups(); | 176 | { |
1584 | 179 | break; | 177 | case KeeperPrivate::ChoicesType::BACKUP_CHOICES: |
1585 | 180 | case KeeperPrivate::ChoicesType::RESTORES_CHOICES: | 178 | cached_backup_choices_ = provider->get_backups(); |
1586 | 181 | cached_restore_choices_ = provider->get_backups(); | 179 | break; |
1587 | 182 | break; | 180 | case KeeperPrivate::ChoicesType::RESTORES_CHOICES: |
1588 | 183 | }; | 181 | cached_restore_choices_ = provider->get_backups(); |
1589 | 184 | emit_choices_ready(type); | 182 | break; |
1590 | 183 | } | ||
1591 | 184 | } | ||
1592 | 185 | emit_choices_ready(type, error); | ||
1593 | 185 | }} | 186 | }} |
1594 | 186 | ); | 187 | ); |
1595 | 187 | |||
1596 | 188 | provider->get_backups_async(); | 188 | provider->get_backups_async(); |
1597 | 189 | } | 189 | } |
1598 | 190 | else | 190 | else |
1599 | 191 | { | 191 | { |
1601 | 192 | emit_choices_ready(type); | 192 | emit_choices_ready(type, keeper::Error::OK); |
1602 | 193 | } | 193 | } |
1603 | 194 | } | 194 | } |
1604 | 195 | 195 | ||
1606 | 196 | QVariantDictMap get_backup_choices_var_dict_map(QDBusConnection bus, | 196 | keeper::KeeperItemsMap get_backup_choices_var_dict_map(QDBusConnection bus, |
1607 | 197 | QDBusMessage const & msg) | 197 | QDBusMessage const & msg) |
1608 | 198 | { | 198 | { |
1609 | 199 | connections_.connect_oneshot( | 199 | connections_.connect_oneshot( |
1610 | 200 | this, | 200 | this, |
1611 | 201 | &KeeperPrivate::backup_choices_ready, | 201 | &KeeperPrivate::backup_choices_ready, |
1613 | 202 | std::function<void()>{[this, msg, bus](){ | 202 | std::function<void(keeper::Error)>{[this, msg, bus](keeper::Error error){ |
1614 | 203 | qDebug() << "Backup choices are ready"; | 203 | qDebug() << "Backup choices are ready"; |
1619 | 204 | // reply now to the dbus call | 204 | if (error == keeper::Error::OK) |
1620 | 205 | auto reply = msg.createReply(); | 205 | { |
1621 | 206 | reply << QVariant::fromValue(choices_to_variant_dict_map(cached_backup_choices_)); | 206 | // reply now to the dbus call |
1622 | 207 | bus.send(reply); | 207 | auto reply = msg.createReply(); |
1623 | 208 | reply << QVariant::fromValue(choices_to_variant_dict_map(cached_backup_choices_)); | ||
1624 | 209 | bus.send(reply); | ||
1625 | 210 | } | ||
1626 | 211 | else | ||
1627 | 212 | { | ||
1628 | 213 | auto message = QStringLiteral("Error obtaining backup choices, keeper returned error: %1").arg(static_cast<int>(error)); | ||
1629 | 214 | qWarning() << message; | ||
1630 | 215 | auto reply = msg.createErrorReply(QDBusError::Failed, message); | ||
1631 | 216 | reply << QVariant::fromValue(error); | ||
1632 | 217 | bus.send(reply); | ||
1633 | 218 | } | ||
1634 | 208 | }} | 219 | }} |
1635 | 209 | ); | 220 | ); |
1636 | 210 | |||
1637 | 211 | get_choices(backup_choices_, KeeperPrivate::ChoicesType::BACKUP_CHOICES); | 221 | get_choices(backup_choices_, KeeperPrivate::ChoicesType::BACKUP_CHOICES); |
1638 | 212 | msg.setDelayedReply(true); | 222 | msg.setDelayedReply(true); |
1640 | 213 | return QVariantDictMap(); | 223 | return keeper::KeeperItemsMap(); |
1641 | 214 | } | 224 | } |
1642 | 215 | 225 | ||
1644 | 216 | QVariantDictMap get_restore_choices_var_dict_map(QDBusConnection bus, | 226 | keeper::KeeperItemsMap get_restore_choices_var_dict_map(QDBusConnection bus, |
1645 | 217 | QDBusMessage const & msg) | 227 | QDBusMessage const & msg) |
1646 | 218 | { | 228 | { |
1647 | 229 | qDebug() << "Getting restores --------------------------------"; | ||
1648 | 219 | cached_restore_choices_.clear(); | 230 | cached_restore_choices_.clear(); |
1649 | 220 | connections_.connect_oneshot( | 231 | connections_.connect_oneshot( |
1650 | 221 | this, | 232 | this, |
1651 | 222 | &KeeperPrivate::restore_choices_ready, | 233 | &KeeperPrivate::restore_choices_ready, |
1653 | 223 | std::function<void()>{[this, msg, bus](){ | 234 | std::function<void(keeper::Error)>{[this, msg, bus](keeper::Error error){ |
1654 | 224 | qDebug() << "Restore choices are ready"; | 235 | qDebug() << "Restore choices are ready"; |
1659 | 225 | // reply now to the dbus call | 236 | if (error == keeper::Error::OK) |
1660 | 226 | auto reply = msg.createReply(); | 237 | { |
1661 | 227 | reply << QVariant::fromValue(choices_to_variant_dict_map(cached_restore_choices_)); | 238 | // reply now to the dbus call |
1662 | 228 | bus.send(reply); | 239 | auto reply = msg.createReply(); |
1663 | 240 | reply << QVariant::fromValue(choices_to_variant_dict_map(cached_restore_choices_)); | ||
1664 | 241 | bus.send(reply); | ||
1665 | 242 | } | ||
1666 | 243 | else | ||
1667 | 244 | { | ||
1668 | 245 | auto message = QStringLiteral("Error obtaining restore choices, keeper returned error: %1").arg(static_cast<int>(error)); | ||
1669 | 246 | qWarning() << message; | ||
1670 | 247 | auto reply = msg.createErrorReply(QDBusError::Failed, message); | ||
1671 | 248 | reply << QVariant::fromValue(error); | ||
1672 | 249 | bus.send(reply); | ||
1673 | 250 | } | ||
1674 | 229 | }} | 251 | }} |
1675 | 230 | ); | 252 | ); |
1676 | 231 | |||
1677 | 232 | get_choices(restore_choices_, KeeperPrivate::ChoicesType::RESTORES_CHOICES); | 253 | get_choices(restore_choices_, KeeperPrivate::ChoicesType::RESTORES_CHOICES); |
1678 | 233 | msg.setDelayedReply(true); | 254 | msg.setDelayedReply(true); |
1680 | 234 | return QVariantDictMap(); | 255 | return keeper::KeeperItemsMap(); |
1681 | 235 | } | 256 | } |
1682 | 236 | 257 | ||
1684 | 237 | QVariantDictMap get_state() const | 258 | keeper::KeeperItemsMap get_state() const |
1685 | 238 | { | 259 | { |
1686 | 239 | return task_manager_.get_state(); | 260 | return task_manager_.get_state(); |
1687 | 240 | } | 261 | } |
1688 | @@ -258,6 +279,17 @@ | |||
1689 | 258 | } | 279 | } |
1690 | 259 | ); | 280 | ); |
1691 | 260 | 281 | ||
1692 | 282 | connections_.connect_oneshot( | ||
1693 | 283 | &task_manager_, | ||
1694 | 284 | &TaskManager::socket_error, | ||
1695 | 285 | std::function<void(keeper::Error)>{ | ||
1696 | 286 | [bus,msg](keeper::Error error){ | ||
1697 | 287 | qDebug("BackupManager returned socket error: %d", static_cast<int>(error)); | ||
1698 | 288 | bus.send(msg.createErrorReply(QDBusError::InvalidArgs, "Error obtaining remote backup socket")); | ||
1699 | 289 | } | ||
1700 | 290 | } | ||
1701 | 291 | ); | ||
1702 | 292 | |||
1703 | 261 | qDebug() << "Asking for a storage framework socket from the task manager"; | 293 | qDebug() << "Asking for a storage framework socket from the task manager"; |
1704 | 262 | task_manager_.ask_for_uploader(n_bytes); | 294 | task_manager_.ask_for_uploader(n_bytes); |
1705 | 263 | 295 | ||
1706 | @@ -286,6 +318,17 @@ | |||
1707 | 286 | } | 318 | } |
1708 | 287 | ); | 319 | ); |
1709 | 288 | 320 | ||
1710 | 321 | connections_.connect_oneshot( | ||
1711 | 322 | &task_manager_, | ||
1712 | 323 | &TaskManager::socket_error, | ||
1713 | 324 | std::function<void(keeper::Error)>{ | ||
1714 | 325 | [bus,msg](keeper::Error error){ | ||
1715 | 326 | qDebug("RestoreManager returned socket error: %d", static_cast<int>(error)); | ||
1716 | 327 | bus.send(msg.createErrorReply(QDBusError::InvalidArgs, "Error obtaining remote restore socket")); | ||
1717 | 328 | } | ||
1718 | 329 | } | ||
1719 | 330 | ); | ||
1720 | 331 | |||
1721 | 289 | qDebug() << "Asking for a storage framework socket from the task manager"; | 332 | qDebug() << "Asking for a storage framework socket from the task manager"; |
1722 | 290 | task_manager_.ask_for_downloader(); | 333 | task_manager_.ask_for_downloader(); |
1723 | 291 | 334 | ||
1724 | @@ -305,11 +348,10 @@ | |||
1725 | 305 | } | 348 | } |
1726 | 306 | 349 | ||
1727 | 307 | Q_SIGNALS: | 350 | Q_SIGNALS: |
1730 | 308 | void backup_choices_ready(); | 351 | void backup_choices_ready(keeper::Error error); |
1731 | 309 | void restore_choices_ready(); | 352 | void restore_choices_ready(keeper::Error error); |
1732 | 310 | 353 | ||
1733 | 311 | private: | 354 | private: |
1734 | 312 | |||
1735 | 313 | void on_task_manager_finished() | 355 | void on_task_manager_finished() |
1736 | 314 | { | 356 | { |
1737 | 315 | // force a backup choices regeneration to avoid repeating uuids | 357 | // force a backup choices regeneration to avoid repeating uuids |
1738 | @@ -317,7 +359,7 @@ | |||
1739 | 317 | invalidate_choices_cache(); | 359 | invalidate_choices_cache(); |
1740 | 318 | } | 360 | } |
1741 | 319 | 361 | ||
1743 | 320 | void check_for_unhandled_tasks(QSet<QString> const & unhandled, | 362 | void check_for_unhandled_tasks_and_reply(QSet<QString> const & unhandled, |
1744 | 321 | QDBusConnection bus, | 363 | QDBusConnection bus, |
1745 | 322 | QDBusMessage const & msg ) | 364 | QDBusMessage const & msg ) |
1746 | 323 | { | 365 | { |
1747 | @@ -329,6 +371,9 @@ | |||
1748 | 329 | text += ' ' + uuid; | 371 | text += ' ' + uuid; |
1749 | 330 | bus.send(msg.createErrorReply(QDBusError::InvalidArgs, text)); | 372 | bus.send(msg.createErrorReply(QDBusError::InvalidArgs, text)); |
1750 | 331 | } | 373 | } |
1751 | 374 | |||
1752 | 375 | auto reply = msg.createReply(); | ||
1753 | 376 | bus.send(reply); | ||
1754 | 332 | } | 377 | } |
1755 | 333 | 378 | ||
1756 | 334 | Keeper * const q_ptr; | 379 | Keeper * const q_ptr; |
1757 | @@ -383,7 +428,7 @@ | |||
1758 | 383 | return d->start_restore(bus, msg); | 428 | return d->start_restore(bus, msg); |
1759 | 384 | } | 429 | } |
1760 | 385 | 430 | ||
1762 | 386 | QVariantDictMap | 431 | keeper::KeeperItemsMap |
1763 | 387 | Keeper::get_backup_choices_var_dict_map(QDBusConnection bus, | 432 | Keeper::get_backup_choices_var_dict_map(QDBusConnection bus, |
1764 | 388 | QDBusMessage const & msg) | 433 | QDBusMessage const & msg) |
1765 | 389 | { | 434 | { |
1766 | @@ -392,7 +437,7 @@ | |||
1767 | 392 | return d->get_backup_choices_var_dict_map(bus, msg); | 437 | return d->get_backup_choices_var_dict_map(bus, msg); |
1768 | 393 | } | 438 | } |
1769 | 394 | 439 | ||
1771 | 395 | QVariantDictMap | 440 | keeper::KeeperItemsMap |
1772 | 396 | Keeper::get_restore_choices(QDBusConnection bus, | 441 | Keeper::get_restore_choices(QDBusConnection bus, |
1773 | 397 | QDBusMessage const & msg) | 442 | QDBusMessage const & msg) |
1774 | 398 | { | 443 | { |
1775 | @@ -401,7 +446,7 @@ | |||
1776 | 401 | return d->get_restore_choices_var_dict_map(bus,msg); | 446 | return d->get_restore_choices_var_dict_map(bus,msg); |
1777 | 402 | } | 447 | } |
1778 | 403 | 448 | ||
1780 | 404 | QVariantDictMap | 449 | keeper::KeeperItemsMap |
1781 | 405 | Keeper::get_state() const | 450 | Keeper::get_state() const |
1782 | 406 | { | 451 | { |
1783 | 407 | Q_D(const Keeper); | 452 | Q_D(const Keeper); |
1784 | 408 | 453 | ||
1785 | === modified file 'src/service/keeper.h' | |||
1786 | --- src/service/keeper.h 2016-11-22 09:37:40 +0000 | |||
1787 | +++ src/service/keeper.h 2016-12-22 14:35:27 +0000 | |||
1788 | @@ -52,8 +52,8 @@ | |||
1789 | 52 | 52 | ||
1790 | 53 | virtual ~Keeper(); | 53 | virtual ~Keeper(); |
1791 | 54 | 54 | ||
1794 | 55 | QVariantDictMap get_backup_choices_var_dict_map(QDBusConnection bus, QDBusMessage const & msg); | 55 | keeper::KeeperItemsMap get_backup_choices_var_dict_map(QDBusConnection bus, QDBusMessage const & msg); |
1795 | 56 | QVariantDictMap get_restore_choices(QDBusConnection bus, QDBusMessage const & msg); | 56 | keeper::KeeperItemsMap get_restore_choices(QDBusConnection bus, QDBusMessage const & msg); |
1796 | 57 | 57 | ||
1797 | 58 | QDBusUnixFileDescriptor StartBackup(QDBusConnection, | 58 | QDBusUnixFileDescriptor StartBackup(QDBusConnection, |
1798 | 59 | QDBusMessage const & message, | 59 | QDBusMessage const & message, |
1799 | @@ -67,7 +67,7 @@ | |||
1800 | 67 | QDBusConnection bus, | 67 | QDBusConnection bus, |
1801 | 68 | QDBusMessage const & msg); | 68 | QDBusMessage const & msg); |
1802 | 69 | 69 | ||
1804 | 70 | QVariantDictMap get_state() const; | 70 | keeper::KeeperItemsMap get_state() const; |
1805 | 71 | 71 | ||
1806 | 72 | void cancel(); | 72 | void cancel(); |
1807 | 73 | 73 | ||
1808 | 74 | 74 | ||
1809 | === modified file 'src/service/metadata-provider.h' | |||
1810 | --- src/service/metadata-provider.h 2016-10-28 15:11:21 +0000 | |||
1811 | +++ src/service/metadata-provider.h 2016-12-22 14:35:27 +0000 | |||
1812 | @@ -19,6 +19,7 @@ | |||
1813 | 19 | 19 | ||
1814 | 20 | #pragma once | 20 | #pragma once |
1815 | 21 | 21 | ||
1816 | 22 | #include "client/keeper-errors.h" | ||
1817 | 22 | #include "helper/metadata.h" | 23 | #include "helper/metadata.h" |
1818 | 23 | 24 | ||
1819 | 24 | #include <QObject> | 25 | #include <QObject> |
1820 | @@ -33,7 +34,7 @@ | |||
1821 | 33 | virtual void get_backups_async() =0; | 34 | virtual void get_backups_async() =0; |
1822 | 34 | 35 | ||
1823 | 35 | Q_SIGNALS: | 36 | Q_SIGNALS: |
1825 | 36 | void finished(); | 37 | void finished(keeper::Error error); |
1826 | 37 | 38 | ||
1827 | 38 | protected: | 39 | protected: |
1828 | 39 | explicit MetadataProvider(QObject *parent = nullptr) : QObject(parent){}; | 40 | explicit MetadataProvider(QObject *parent = nullptr) : QObject(parent){}; |
1829 | 40 | 41 | ||
1830 | === modified file 'src/service/private/keeper-task_p.h' | |||
1831 | --- src/service/private/keeper-task_p.h 2016-12-14 11:00:21 +0000 | |||
1832 | +++ src/service/private/keeper-task_p.h 2016-12-22 14:35:27 +0000 | |||
1833 | @@ -42,7 +42,7 @@ | |||
1834 | 42 | 42 | ||
1835 | 43 | QString to_string(Helper::State state); | 43 | QString to_string(Helper::State state); |
1836 | 44 | 44 | ||
1838 | 45 | keeper::KeeperError error() const; | 45 | keeper::Error error() const; |
1839 | 46 | 46 | ||
1840 | 47 | protected: | 47 | protected: |
1841 | 48 | void set_current_task_action(QString const& action); | 48 | void set_current_task_action(QString const& action); |
1842 | @@ -60,5 +60,5 @@ | |||
1843 | 60 | QSharedPointer<StorageFrameworkClient> storage_; | 60 | QSharedPointer<StorageFrameworkClient> storage_; |
1844 | 61 | QSharedPointer<Helper> helper_; | 61 | QSharedPointer<Helper> helper_; |
1845 | 62 | QVariantMap state_; | 62 | QVariantMap state_; |
1847 | 63 | keeper::KeeperError error_; | 63 | keeper::Error error_; |
1848 | 64 | }; | 64 | }; |
1849 | 65 | 65 | ||
1850 | === modified file 'src/service/restore-choices.cpp' | |||
1851 | --- src/service/restore-choices.cpp 2016-12-15 14:30:42 +0000 | |||
1852 | +++ src/service/restore-choices.cpp 2016-12-22 14:35:27 +0000 | |||
1853 | @@ -67,7 +67,7 @@ | |||
1854 | 67 | manifests_to_read_--; | 67 | manifests_to_read_--; |
1855 | 68 | if (!manifests_to_read_) | 68 | if (!manifests_to_read_) |
1856 | 69 | { | 69 | { |
1858 | 70 | Q_EMIT(finished()); | 70 | Q_EMIT(finished(keeper::Error::OK)); |
1859 | 71 | } | 71 | } |
1860 | 72 | }} | 72 | }} |
1861 | 73 | ); | 73 | ); |
1862 | @@ -76,8 +76,8 @@ | |||
1863 | 76 | } | 76 | } |
1864 | 77 | else | 77 | else |
1865 | 78 | { | 78 | { |
1868 | 79 | qWarning() << "We could not find and keeper backup when retrieving restore options."; | 79 | qWarning() << "We could not find and keeper backups directory when retrieving restore options."; |
1869 | 80 | Q_EMIT(finished()); | 80 | Q_EMIT(finished(storage_->get_last_error())); |
1870 | 81 | } | 81 | } |
1871 | 82 | } | 82 | } |
1872 | 83 | } | 83 | } |
1873 | 84 | 84 | ||
1874 | === modified file 'src/service/task-manager.cpp' | |||
1875 | --- src/service/task-manager.cpp 2016-12-14 11:00:21 +0000 | |||
1876 | +++ src/service/task-manager.cpp 2016-12-22 14:35:27 +0000 | |||
1877 | @@ -59,9 +59,21 @@ | |||
1878 | 59 | *** State public | 59 | *** State public |
1879 | 60 | ***/ | 60 | ***/ |
1880 | 61 | 61 | ||
1884 | 62 | QVariantDictMap get_state() const | 62 | keeper::KeeperItemsMap get_converted_state_to_user_type() const |
1885 | 63 | { | 63 | { |
1886 | 64 | return state_; | 64 | keeper::KeeperItemsMap ret; |
1887 | 65 | for (auto iter = state_.begin(); iter != state_.end(); ++iter) | ||
1888 | 66 | { | ||
1889 | 67 | keeper::KeeperItem item((*iter)); | ||
1890 | 68 | ret[iter.key()] = item; | ||
1891 | 69 | } | ||
1892 | 70 | return ret; | ||
1893 | 71 | } | ||
1894 | 72 | |||
1895 | 73 | keeper::KeeperItemsMap get_state() const | ||
1896 | 74 | { | ||
1897 | 75 | return get_converted_state_to_user_type(); | ||
1898 | 76 | // return state_; | ||
1899 | 65 | } | 77 | } |
1900 | 66 | 78 | ||
1901 | 67 | void ask_for_uploader(quint64 n_bytes) | 79 | void ask_for_uploader(quint64 n_bytes) |
1902 | @@ -147,7 +159,7 @@ | |||
1903 | 147 | auto& td = task_data_[uuid]; | 159 | auto& td = task_data_[uuid]; |
1904 | 148 | td.metadata = metadata; | 160 | td.metadata = metadata; |
1905 | 149 | td.action = QStringLiteral("queued"); // TODO i18n | 161 | td.action = QStringLiteral("queued"); // TODO i18n |
1907 | 150 | td.error = keeper::KeeperError::OK; | 162 | td.error = keeper::Error::OK; |
1908 | 151 | set_initial_task_state(td); | 163 | set_initial_task_state(td); |
1909 | 152 | } | 164 | } |
1910 | 153 | 165 | ||
1911 | @@ -170,7 +182,7 @@ | |||
1912 | 170 | } | 182 | } |
1913 | 171 | else | 183 | else |
1914 | 172 | { | 184 | { |
1916 | 173 | td.error = keeper::KeeperError::MANIFEST_STORAGE_ERROR; | 185 | td.error = keeper::Error::MANIFEST_STORAGE; |
1917 | 174 | set_current_task_action(task_->to_string(Helper::State::FAILED)); | 186 | set_current_task_action(task_->to_string(Helper::State::FAILED)); |
1918 | 175 | } | 187 | } |
1919 | 176 | active_manifest_.reset(); | 188 | active_manifest_.reset(); |
1920 | @@ -266,9 +278,25 @@ | |||
1921 | 266 | std::bind(&TaskManager::socket_ready, q_ptr, std::placeholders::_1) | 278 | std::bind(&TaskManager::socket_ready, q_ptr, std::placeholders::_1) |
1922 | 267 | ); | 279 | ); |
1923 | 268 | 280 | ||
1924 | 281 | QObject::connect(task_.data(), &KeeperTask::task_socket_error, | ||
1925 | 282 | std::bind(&TaskManagerPrivate::on_task_socket_error, this, std::placeholders::_1) | ||
1926 | 283 | ); | ||
1927 | 284 | |||
1928 | 269 | return task_->start(); | 285 | return task_->start(); |
1929 | 270 | } | 286 | } |
1930 | 271 | 287 | ||
1931 | 288 | void on_task_socket_error(keeper::Error error) | ||
1932 | 289 | { | ||
1933 | 290 | if (!task_) | ||
1934 | 291 | { | ||
1935 | 292 | qWarning() << "Error updating current task state"; | ||
1936 | 293 | } | ||
1937 | 294 | auto& td = task_data_[current_task_]; | ||
1938 | 295 | td.error = error; | ||
1939 | 296 | set_current_task_action(task_->to_string(Helper::State::FAILED)); | ||
1940 | 297 | Q_EMIT(q_ptr->socket_error(error)); | ||
1941 | 298 | } | ||
1942 | 299 | |||
1943 | 272 | void set_current_task(QString const& uuid) | 300 | void set_current_task(QString const& uuid) |
1944 | 273 | { | 301 | { |
1945 | 274 | auto const prev = current_task_; | 302 | auto const prev = current_task_; |
1946 | @@ -409,7 +437,7 @@ | |||
1947 | 409 | return d->start_restore(tasks); | 437 | return d->start_restore(tasks); |
1948 | 410 | } | 438 | } |
1949 | 411 | 439 | ||
1951 | 412 | QVariantDictMap TaskManager::get_state() const | 440 | keeper::KeeperItemsMap TaskManager::get_state() const |
1952 | 413 | { | 441 | { |
1953 | 414 | Q_D(const TaskManager); | 442 | Q_D(const TaskManager); |
1954 | 415 | 443 | ||
1955 | 416 | 444 | ||
1956 | === modified file 'src/service/task-manager.h' | |||
1957 | --- src/service/task-manager.h 2016-12-01 14:18:57 +0000 | |||
1958 | +++ src/service/task-manager.h 2016-12-22 14:35:27 +0000 | |||
1959 | @@ -45,7 +45,7 @@ | |||
1960 | 45 | 45 | ||
1961 | 46 | Q_DISABLE_COPY(TaskManager) | 46 | Q_DISABLE_COPY(TaskManager) |
1962 | 47 | 47 | ||
1964 | 48 | Q_PROPERTY(QVariantDictMap State | 48 | Q_PROPERTY(keeper::KeeperItemsMap State |
1965 | 49 | READ get_state | 49 | READ get_state |
1966 | 50 | NOTIFY state_changed) | 50 | NOTIFY state_changed) |
1967 | 51 | 51 | ||
1968 | @@ -54,7 +54,7 @@ | |||
1969 | 54 | 54 | ||
1970 | 55 | bool start_restore(QList<Metadata> const& tasks); | 55 | bool start_restore(QList<Metadata> const& tasks); |
1971 | 56 | 56 | ||
1973 | 57 | QVariantDictMap get_state() const; | 57 | keeper::KeeperItemsMap get_state() const; |
1974 | 58 | 58 | ||
1975 | 59 | void ask_for_uploader(quint64 n_bytes); | 59 | void ask_for_uploader(quint64 n_bytes); |
1976 | 60 | 60 | ||
1977 | @@ -64,6 +64,7 @@ | |||
1978 | 64 | 64 | ||
1979 | 65 | Q_SIGNALS: | 65 | Q_SIGNALS: |
1980 | 66 | void socket_ready(int reply); | 66 | void socket_ready(int reply); |
1981 | 67 | void socket_error(keeper::Error error); | ||
1982 | 67 | void state_changed(); | 68 | void state_changed(); |
1983 | 68 | void finished(); | 69 | void finished(); |
1984 | 69 | 70 | ||
1985 | 70 | 71 | ||
1986 | === modified file 'src/storage-framework/storage_framework_client.cpp' | |||
1987 | --- src/storage-framework/storage_framework_client.cpp 2016-12-15 14:30:42 +0000 | |||
1988 | +++ src/storage-framework/storage_framework_client.cpp 2016-12-22 14:35:27 +0000 | |||
1989 | @@ -55,6 +55,7 @@ | |||
1990 | 55 | if (choices.empty()) | 55 | if (choices.empty()) |
1991 | 56 | { | 56 | { |
1992 | 57 | qWarning() << "no storage-framework accounts to pick from"; | 57 | qWarning() << "no storage-framework accounts to pick from"; |
1993 | 58 | last_error_ = keeper::Error::NO_REMOTE_ACCOUNTS; | ||
1994 | 58 | } | 59 | } |
1995 | 59 | else // for now just pick the first one. FIXME | 60 | else // for now just pick the first one. FIXME |
1996 | 60 | { | 61 | { |
1997 | @@ -73,6 +74,7 @@ | |||
1998 | 73 | if (choices.empty()) | 74 | if (choices.empty()) |
1999 | 74 | { | 75 | { |
2000 | 75 | qWarning() << "no storage-framework roots to pick from"; | 76 | qWarning() << "no storage-framework roots to pick from"; |
2001 | 77 | last_error_ = keeper::Error::NO_REMOTE_ROOTS; | ||
2002 | 76 | } | 78 | } |
2003 | 77 | else // for now just pick the first one. FIXME | 79 | else // for now just pick the first one. FIXME |
2004 | 78 | { | 80 | { |
2005 | @@ -106,6 +108,8 @@ | |||
2006 | 106 | QFuture<std::shared_ptr<Uploader>> | 108 | QFuture<std::shared_ptr<Uploader>> |
2007 | 107 | StorageFrameworkClient::get_new_uploader(int64_t n_bytes, QString const & dir_name, QString const & file_name) | 109 | StorageFrameworkClient::get_new_uploader(int64_t n_bytes, QString const & dir_name, QString const & file_name) |
2008 | 108 | { | 110 | { |
2009 | 111 | clear_last_error(); | ||
2010 | 112 | |||
2011 | 109 | QFutureInterface<std::shared_ptr<Uploader>> fi; | 113 | QFutureInterface<std::shared_ptr<Uploader>> fi; |
2012 | 110 | 114 | ||
2013 | 111 | add_roots_task([this, fi, n_bytes, dir_name, file_name](QVector<sf::Root::SPtr> const& roots) | 115 | add_roots_task([this, fi, n_bytes, dir_name, file_name](QVector<sf::Root::SPtr> const& roots) |
2014 | @@ -133,12 +137,17 @@ | |||
2015 | 133 | [this, fi, keeper_folder](std::shared_ptr<sf::Uploader> const& sf_uploader){ | 137 | [this, fi, keeper_folder](std::shared_ptr<sf::Uploader> const& sf_uploader){ |
2016 | 134 | qDebug() << "keeper_root->create_file() finished"; | 138 | qDebug() << "keeper_root->create_file() finished"; |
2017 | 135 | std::shared_ptr<Uploader> ret; | 139 | std::shared_ptr<Uploader> ret; |
2019 | 136 | if (sf_uploader) { | 140 | if (sf_uploader) |
2020 | 141 | { | ||
2021 | 137 | ret.reset( | 142 | ret.reset( |
2022 | 138 | new StorageFrameworkUploader(sf_uploader, this), | 143 | new StorageFrameworkUploader(sf_uploader, this), |
2023 | 139 | [](Uploader* u){u->deleteLater();} | 144 | [](Uploader* u){u->deleteLater();} |
2024 | 140 | ); | 145 | ); |
2025 | 141 | } | 146 | } |
2026 | 147 | else | ||
2027 | 148 | { | ||
2028 | 149 | last_error_ = keeper::Error::CREATING_REMOTE_FILE; | ||
2029 | 150 | } | ||
2030 | 142 | QFutureInterface<decltype(ret)> qfi(fi); | 151 | QFutureInterface<decltype(ret)> qfi(fi); |
2031 | 143 | qfi.reportResult(ret); | 152 | qfi.reportResult(ret); |
2032 | 144 | qfi.reportFinished(); | 153 | qfi.reportFinished(); |
2033 | @@ -150,6 +159,13 @@ | |||
2034 | 150 | } | 159 | } |
2035 | 151 | ); | 160 | ); |
2036 | 152 | } | 161 | } |
2037 | 162 | else | ||
2038 | 163 | { | ||
2039 | 164 | std::shared_ptr<Uploader> ret; | ||
2040 | 165 | QFutureInterface<decltype(ret)> qfi(fi); | ||
2041 | 166 | qfi.reportResult(ret); | ||
2042 | 167 | qfi.reportFinished(); | ||
2043 | 168 | } | ||
2044 | 153 | }); | 169 | }); |
2045 | 154 | 170 | ||
2046 | 155 | return fi.future(); | 171 | return fi.future(); |
2047 | @@ -158,6 +174,8 @@ | |||
2048 | 158 | QFuture<std::shared_ptr<Downloader>> | 174 | QFuture<std::shared_ptr<Downloader>> |
2049 | 159 | StorageFrameworkClient::get_new_downloader(QString const & dir_name, QString const & file_name) | 175 | StorageFrameworkClient::get_new_downloader(QString const & dir_name, QString const & file_name) |
2050 | 160 | { | 176 | { |
2051 | 177 | clear_last_error(); | ||
2052 | 178 | |||
2053 | 161 | QFutureInterface<std::shared_ptr<Downloader>> fi; | 179 | QFutureInterface<std::shared_ptr<Downloader>> fi; |
2054 | 162 | 180 | ||
2055 | 163 | add_roots_task([this, fi, dir_name, file_name](QVector<sf::Root::SPtr> const& roots) | 181 | add_roots_task([this, fi, dir_name, file_name](QVector<sf::Root::SPtr> const& roots) |
2056 | @@ -197,6 +215,10 @@ | |||
2057 | 197 | [](Downloader* d){d->deleteLater();} | 215 | [](Downloader* d){d->deleteLater();} |
2058 | 198 | ); | 216 | ); |
2059 | 199 | } | 217 | } |
2060 | 218 | else | ||
2061 | 219 | { | ||
2062 | 220 | last_error_ = keeper::Error::READING_REMOTE_FILE; | ||
2063 | 221 | } | ||
2064 | 200 | QFutureInterface<decltype(ret)> qfi(fi); | 222 | QFutureInterface<decltype(ret)> qfi(fi); |
2065 | 201 | qfi.reportResult(ret); | 223 | qfi.reportResult(ret); |
2066 | 202 | qfi.reportFinished(); | 224 | qfi.reportFinished(); |
2067 | @@ -204,6 +226,7 @@ | |||
2068 | 204 | } | 226 | } |
2069 | 205 | ); | 227 | ); |
2070 | 206 | } else { | 228 | } else { |
2071 | 229 | last_error_ = keeper::Error::READING_REMOTE_FILE; | ||
2072 | 207 | std::shared_ptr<Downloader> ret_null; | 230 | std::shared_ptr<Downloader> ret_null; |
2073 | 208 | QFutureInterface<decltype(ret_null)> qfi(fi); | 231 | QFutureInterface<decltype(ret_null)> qfi(fi); |
2074 | 209 | qfi.reportResult(ret_null); | 232 | qfi.reportResult(ret_null); |
2075 | @@ -217,6 +240,13 @@ | |||
2076 | 217 | } | 240 | } |
2077 | 218 | ); | 241 | ); |
2078 | 219 | } | 242 | } |
2079 | 243 | else | ||
2080 | 244 | { | ||
2081 | 245 | std::shared_ptr<Downloader> ret; | ||
2082 | 246 | QFutureInterface<decltype(ret)> qfi(fi); | ||
2083 | 247 | qfi.reportResult(ret); | ||
2084 | 248 | qfi.reportFinished(); | ||
2085 | 249 | } | ||
2086 | 220 | }); | 250 | }); |
2087 | 221 | 251 | ||
2088 | 222 | return fi.future(); | 252 | return fi.future(); |
2089 | @@ -225,6 +255,8 @@ | |||
2090 | 225 | QFuture<QVector<QString>> | 255 | QFuture<QVector<QString>> |
2091 | 226 | StorageFrameworkClient::get_keeper_dirs() | 256 | StorageFrameworkClient::get_keeper_dirs() |
2092 | 227 | { | 257 | { |
2093 | 258 | clear_last_error(); | ||
2094 | 259 | |||
2095 | 228 | QFutureInterface<QVector<QString>> fi; | 260 | QFutureInterface<QVector<QString>> fi; |
2096 | 229 | 261 | ||
2097 | 230 | add_roots_task([this, fi](QVector<sf::Root::SPtr> const& roots) | 262 | add_roots_task([this, fi](QVector<sf::Root::SPtr> const& roots) |
2098 | @@ -262,10 +294,23 @@ | |||
2099 | 262 | } | 294 | } |
2100 | 263 | ); | 295 | ); |
2101 | 264 | } | 296 | } |
2102 | 297 | else | ||
2103 | 298 | { | ||
2104 | 299 | QVector<QString> res; | ||
2105 | 300 | QFutureInterface<decltype(res)> qfi(fi); | ||
2106 | 301 | qfi.reportResult(res); | ||
2107 | 302 | qfi.reportFinished(); | ||
2108 | 303 | } | ||
2109 | 265 | }); | 304 | }); |
2110 | 266 | return fi.future(); | 305 | return fi.future(); |
2111 | 267 | } | 306 | } |
2112 | 268 | 307 | ||
2113 | 308 | keeper::Error | ||
2114 | 309 | StorageFrameworkClient::get_last_error() const | ||
2115 | 310 | { | ||
2116 | 311 | return last_error_; | ||
2117 | 312 | } | ||
2118 | 313 | |||
2119 | 269 | QFuture<sf::Folder::SPtr> | 314 | QFuture<sf::Folder::SPtr> |
2120 | 270 | StorageFrameworkClient::get_keeper_folder(sf::Folder::SPtr const & root, QString const & dir_name, bool create_if_not_exists) | 315 | StorageFrameworkClient::get_keeper_folder(sf::Folder::SPtr const & root, QString const & dir_name, bool create_if_not_exists) |
2121 | 271 | { | 316 | { |
2122 | @@ -335,6 +380,7 @@ | |||
2123 | 335 | QFutureInterface<decltype(res)> qfi(fi); | 380 | QFutureInterface<decltype(res)> qfi(fi); |
2124 | 336 | qfi.reportResult(res); | 381 | qfi.reportResult(res); |
2125 | 337 | qfi.reportFinished(); | 382 | qfi.reportFinished(); |
2126 | 383 | last_error_ = keeper::Error::REMOTE_DIR_NOT_EXISTS; | ||
2127 | 338 | } | 384 | } |
2128 | 339 | else | 385 | else |
2129 | 340 | { | 386 | { |
2130 | @@ -343,6 +389,10 @@ | |||
2131 | 343 | root->create_folder(dir_name), | 389 | root->create_folder(dir_name), |
2132 | 344 | std::function<void(sf::Folder::SPtr const &)>{ | 390 | std::function<void(sf::Folder::SPtr const &)>{ |
2133 | 345 | [this, fi, res, root](sf::Folder::SPtr const & folder){ | 391 | [this, fi, res, root](sf::Folder::SPtr const & folder){ |
2134 | 392 | if (!folder) | ||
2135 | 393 | { | ||
2136 | 394 | last_error_ = keeper::Error::CREATING_REMOTE_DIR; | ||
2137 | 395 | } | ||
2138 | 346 | QFutureInterface<decltype(res)> qfi(fi); | 396 | QFutureInterface<decltype(res)> qfi(fi); |
2139 | 347 | qfi.reportResult(folder); | 397 | qfi.reportResult(folder); |
2140 | 348 | qfi.reportFinished(); | 398 | qfi.reportFinished(); |
2141 | @@ -421,3 +471,9 @@ | |||
2142 | 421 | 471 | ||
2143 | 422 | return fi.future(); | 472 | return fi.future(); |
2144 | 423 | } | 473 | } |
2145 | 474 | |||
2146 | 475 | void | ||
2147 | 476 | StorageFrameworkClient::clear_last_error() | ||
2148 | 477 | { | ||
2149 | 478 | last_error_ = keeper::Error::OK; | ||
2150 | 479 | } | ||
2151 | 424 | 480 | ||
2152 | === modified file 'src/storage-framework/storage_framework_client.h' | |||
2153 | --- src/storage-framework/storage_framework_client.h 2016-11-11 14:50:06 +0000 | |||
2154 | +++ src/storage-framework/storage_framework_client.h 2016-12-22 14:35:27 +0000 | |||
2155 | @@ -20,6 +20,7 @@ | |||
2156 | 20 | 20 | ||
2157 | 21 | #pragma once | 21 | #pragma once |
2158 | 22 | 22 | ||
2159 | 23 | #include "client/keeper-errors.h" | ||
2160 | 23 | #include "util/connection-helper.h" | 24 | #include "util/connection-helper.h" |
2161 | 24 | #include "storage-framework/uploader.h" | 25 | #include "storage-framework/uploader.h" |
2162 | 25 | #include "storage-framework/downloader.h" | 26 | #include "storage-framework/downloader.h" |
2163 | @@ -46,6 +47,7 @@ | |||
2164 | 46 | QFuture<std::shared_ptr<Uploader>> get_new_uploader(int64_t n_bytes, QString const & dir_name, QString const & file_name); | 47 | QFuture<std::shared_ptr<Uploader>> get_new_uploader(int64_t n_bytes, QString const & dir_name, QString const & file_name); |
2165 | 47 | QFuture<std::shared_ptr<Downloader>> get_new_downloader(QString const & dir_name, QString const & file_name); | 48 | QFuture<std::shared_ptr<Downloader>> get_new_downloader(QString const & dir_name, QString const & file_name); |
2166 | 48 | QFuture<QVector<QString>> get_keeper_dirs(); | 49 | QFuture<QVector<QString>> get_keeper_dirs(); |
2167 | 50 | keeper::Error get_last_error() const; | ||
2168 | 49 | 51 | ||
2169 | 50 | static QString const KEEPER_FOLDER; | 52 | static QString const KEEPER_FOLDER; |
2170 | 51 | private: | 53 | private: |
2171 | @@ -61,6 +63,9 @@ | |||
2172 | 61 | QFuture<unity::storage::qt::client::File::SPtr> get_storage_framework_file(unity::storage::qt::client::Folder::SPtr const & root, QString const & file_name); | 63 | QFuture<unity::storage::qt::client::File::SPtr> get_storage_framework_file(unity::storage::qt::client::Folder::SPtr const & root, QString const & file_name); |
2173 | 62 | QFuture<QVector<QString>> get_storage_framework_dirs(unity::storage::qt::client::Folder::SPtr const & root); | 64 | QFuture<QVector<QString>> get_storage_framework_dirs(unity::storage::qt::client::Folder::SPtr const & root); |
2174 | 63 | 65 | ||
2175 | 66 | void clear_last_error(); | ||
2176 | 67 | |||
2177 | 64 | unity::storage::qt::client::Runtime::SPtr runtime_; | 68 | unity::storage::qt::client::Runtime::SPtr runtime_; |
2178 | 65 | ConnectionHelper connection_helper_; | 69 | ConnectionHelper connection_helper_; |
2179 | 70 | mutable keeper::Error last_error_ = keeper::Error::OK; | ||
2180 | 66 | }; | 71 | }; |
2181 | 67 | 72 | ||
2182 | === modified file 'tests/dbusmock/keeper-template-test.cpp' | |||
2183 | --- tests/dbusmock/keeper-template-test.cpp 2016-08-01 19:34:24 +0000 | |||
2184 | +++ tests/dbusmock/keeper-template-test.cpp 2016-12-22 14:35:27 +0000 | |||
2185 | @@ -59,105 +59,114 @@ | |||
2186 | 59 | EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); | 59 | EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); |
2187 | 60 | 60 | ||
2188 | 61 | // ask for a list of backup choices | 61 | // ask for a list of backup choices |
2291 | 62 | QDBusReply<QVariantDictMap> choices = user_iface_->call("GetBackupChoices"); | 62 | QDBusPendingReply<keeper::KeeperItemsMap> choices_reply = user_iface_->call("GetBackupChoices"); |
2292 | 63 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); | 63 | choices_reply.waitForFinished(); |
2293 | 64 | 64 | if (!choices_reply.isValid()) | |
2294 | 65 | // check the results | 65 | { |
2295 | 66 | const auto expected_choices = QVariantDictMap{{uuid, props}}; | 66 | qDebug() << "-------------------" << choices_reply.error().message(); |
2296 | 67 | ASSERT_EQ(expected_choices, choices); | 67 | } |
2297 | 68 | } | 68 | EXPECT_TRUE(choices_reply.isValid()) << qPrintable(choices_reply.error().message()); |
2298 | 69 | 69 | ||
2299 | 70 | 70 | auto choices = choices_reply.value(); | |
2300 | 71 | // test that StartBackup() fails if we pass an invalid arg | 71 | // check the results |
2301 | 72 | TEST_F(KeeperTemplateTest, StartBackupWithInvalidArg) | 72 | const auto expected_choices = QVariantDictMap{{uuid, props}}; |
2302 | 73 | { | 73 | auto iter = choices.find(uuid); |
2303 | 74 | const auto invalid_uuid = QUuid::createUuid().toString(); | 74 | ASSERT_NE(iter, choices.end()); |
2304 | 75 | 75 | ||
2305 | 76 | QDBusReply<void> reply = user_iface_->call("StartBackup", QStringList{invalid_uuid}); | 76 | ASSERT_EQ((*iter), props); |
2306 | 77 | EXPECT_FALSE(reply.isValid()); | 77 | } |
2307 | 78 | EXPECT_EQ(QDBusError::InvalidArgs, reply.error().type()); | 78 | |
2308 | 79 | } | 79 | |
2309 | 80 | 80 | //// test that StartBackup() fails if we pass an invalid arg | |
2310 | 81 | 81 | //TEST_F(KeeperTemplateTest, StartBackupWithInvalidArg) | |
2311 | 82 | // test GetRestoreChoices() returns what we give to AddRestoreChoice() | 82 | //{ |
2312 | 83 | TEST_F(KeeperTemplateTest, RestoreChoices) | 83 | // const auto invalid_uuid = QUuid::createUuid().toString(); |
2313 | 84 | { | 84 | // |
2314 | 85 | // build a restore choice | 85 | // QDBusReply<void> reply = user_iface_->call("StartBackup", QStringList{invalid_uuid}); |
2315 | 86 | const auto uuid = QUuid::createUuid().toString(); | 86 | // EXPECT_FALSE(reply.isValid()); |
2316 | 87 | const auto blob = QUuid::createUuid().toByteArray(); | 87 | // EXPECT_EQ(QDBusError::InvalidArgs, reply.error().type()); |
2317 | 88 | const QMap<QString,QVariant> props { | 88 | //} |
2318 | 89 | { KEY_NAME, QStringLiteral("some-name") }, | 89 | // |
2319 | 90 | { KEY_TYPE, QStringLiteral("some-type") }, | 90 | // |
2320 | 91 | { KEY_SUBTYPE, QStringLiteral("some-subtype") }, | 91 | //// test GetRestoreChoices() returns what we give to AddRestoreChoice() |
2321 | 92 | { KEY_HELPER, QString::fromUtf8("/dev/null") }, | 92 | //TEST_F(KeeperTemplateTest, RestoreChoices) |
2322 | 93 | { KEY_SIZE, quint64(blob.size()) }, | 93 | //{ |
2323 | 94 | { KEY_CTIME, quint64(time(nullptr)) }, | 94 | // // build a restore choice |
2324 | 95 | { KEY_BLOB, blob } | 95 | // const auto uuid = QUuid::createUuid().toString(); |
2325 | 96 | }; | 96 | // const auto blob = QUuid::createUuid().toByteArray(); |
2326 | 97 | 97 | // const QMap<QString,QVariant> props { | |
2327 | 98 | // add it | 98 | // { KEY_NAME, QStringLiteral("some-name") }, |
2328 | 99 | auto msg = mock_iface_->call(QStringLiteral("AddRestoreChoice"), uuid, props); | 99 | // { KEY_TYPE, QStringLiteral("some-type") }, |
2329 | 100 | EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); | 100 | // { KEY_SUBTYPE, QStringLiteral("some-subtype") }, |
2330 | 101 | 101 | // { KEY_HELPER, QString::fromUtf8("/dev/null") }, | |
2331 | 102 | // ask for a list of restore choices | 102 | // { KEY_SIZE, quint64(blob.size()) }, |
2332 | 103 | QDBusReply<QVariantDictMap> choices = user_iface_->call("GetRestoreChoices"); | 103 | // { KEY_CTIME, quint64(time(nullptr)) }, |
2333 | 104 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); | 104 | // { KEY_BLOB, blob } |
2334 | 105 | 105 | // }; | |
2335 | 106 | // check the results | 106 | // |
2336 | 107 | const auto expected_choices = QVariantDictMap{{uuid, props}}; | 107 | // // add it |
2337 | 108 | ASSERT_EQ(expected_choices, choices); | 108 | // auto msg = mock_iface_->call(QStringLiteral("AddRestoreChoice"), uuid, props); |
2338 | 109 | } | 109 | // EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); |
2339 | 110 | 110 | // | |
2340 | 111 | 111 | // // ask for a list of restore choices | |
2341 | 112 | // test that StartRestore() fails if we pass an invalid arg | 112 | // QDBusReply<QVariantDictMap> choices = user_iface_->call("GetRestoreChoices"); |
2342 | 113 | TEST_F(KeeperTemplateTest, StartRestoreWithInvalidArg) | 113 | // EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); |
2343 | 114 | { | 114 | // |
2344 | 115 | const auto invalid_uuid = QUuid::createUuid().toString(); | 115 | // // check the results |
2345 | 116 | 116 | // const auto expected_choices = QVariantDictMap{{uuid, props}}; | |
2346 | 117 | QDBusReply<void> reply = user_iface_->call("StartRestore", QStringList{invalid_uuid}); | 117 | // ASSERT_EQ(expected_choices, choices); |
2347 | 118 | EXPECT_FALSE(reply.isValid()); | 118 | //} |
2348 | 119 | EXPECT_EQ(QDBusError::InvalidArgs, reply.error().type()); | 119 | // |
2349 | 120 | } | 120 | // |
2350 | 121 | 121 | //// test that StartRestore() fails if we pass an invalid arg | |
2351 | 122 | 122 | //TEST_F(KeeperTemplateTest, StartRestoreWithInvalidArg) | |
2352 | 123 | // test that Status() returns empty if we haven't done anything yet | 123 | //{ |
2353 | 124 | TEST_F(KeeperTemplateTest, TestEmptyStatus) | 124 | // const auto invalid_uuid = QUuid::createUuid().toString(); |
2354 | 125 | { | 125 | // |
2355 | 126 | EXPECT_TRUE(user_iface_->state().isEmpty()); | 126 | // QDBusReply<void> reply = user_iface_->call("StartRestore", QStringList{invalid_uuid}); |
2356 | 127 | } | 127 | // EXPECT_FALSE(reply.isValid()); |
2357 | 128 | 128 | // EXPECT_EQ(QDBusError::InvalidArgs, reply.error().type()); | |
2358 | 129 | 129 | //} | |
2359 | 130 | /*** | 130 | // |
2360 | 131 | **** Make a real backup | 131 | // |
2361 | 132 | ***/ | 132 | //// test that Status() returns empty if we haven't done anything yet |
2362 | 133 | 133 | //TEST_F(KeeperTemplateTest, TestEmptyStatus) | |
2363 | 134 | TEST_F(KeeperTemplateTest, BackupRun) | 134 | //{ |
2364 | 135 | { | 135 | // EXPECT_TRUE(user_iface_->state().isEmpty()); |
2365 | 136 | QTemporaryDir sandbox; | 136 | //} |
2366 | 137 | 137 | // | |
2367 | 138 | // build a backup choice | 138 | // |
2368 | 139 | const auto uuid = QUuid::createUuid().toString(); | 139 | ///*** |
2369 | 140 | const QMap<QString,QVariant> props { | 140 | //**** Make a real backup |
2370 | 141 | { KEY_NAME, QStringLiteral("Music") }, | 141 | //***/ |
2371 | 142 | { KEY_TYPE, QStringLiteral("folder") }, | 142 | // |
2372 | 143 | { KEY_SUBTYPE, sandbox.path() }, | 143 | //TEST_F(KeeperTemplateTest, BackupRun) |
2373 | 144 | { KEY_HELPER, QString::fromUtf8(FAKE_BACKUP_HELPER_EXEC) } | 144 | //{ |
2374 | 145 | }; | 145 | // QTemporaryDir sandbox; |
2375 | 146 | 146 | // | |
2376 | 147 | // add it | 147 | // // build a backup choice |
2377 | 148 | auto msg = mock_iface_->call(QStringLiteral("AddBackupChoice"), uuid, props); | 148 | // const auto uuid = QUuid::createUuid().toString(); |
2378 | 149 | EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); | 149 | // const QMap<QString,QVariant> props { |
2379 | 150 | 150 | // { KEY_NAME, QStringLiteral("Music") }, | |
2380 | 151 | // start the backup | 151 | // { KEY_TYPE, QStringLiteral("folder") }, |
2381 | 152 | QDBusReply<void> reply = user_iface_->call("StartBackup", QStringList{uuid}); | 152 | // { KEY_SUBTYPE, sandbox.path() }, |
2382 | 153 | EXPECT_TRUE(reply.isValid()) << qPrintable(reply.error().message()); | 153 | // { KEY_HELPER, QString::fromUtf8(FAKE_BACKUP_HELPER_EXEC) } |
2383 | 154 | ASSERT_TRUE(wait_for_tasks_to_finish()); | 154 | // }; |
2384 | 155 | 155 | // | |
2385 | 156 | // ask keeper for the blob | 156 | // // add it |
2386 | 157 | QDBusReply<QByteArray> blob = mock_iface_->call(QStringLiteral("GetBackupData"), uuid); | 157 | // auto msg = mock_iface_->call(QStringLiteral("AddBackupChoice"), uuid, props); |
2387 | 158 | EXPECT_TRUE(reply.isValid()) << qPrintable(reply.error().message()); | 158 | // EXPECT_NE(QDBusMessage::ErrorMessage, msg.type()) << qPrintable(msg.errorMessage()); |
2388 | 159 | 159 | // | |
2389 | 160 | // check the results | 160 | // // start the backup |
2390 | 161 | const auto expected_blob = QByteArray(FAKE_BACKUP_HELPER_PAYLOAD); | 161 | // QDBusReply<void> reply = user_iface_->call("StartBackup", QStringList{uuid}); |
2391 | 162 | ASSERT_EQ(expected_blob, blob); | 162 | // EXPECT_TRUE(reply.isValid()) << qPrintable(reply.error().message()); |
2392 | 163 | } | 163 | // ASSERT_TRUE(wait_for_tasks_to_finish()); |
2393 | 164 | // | ||
2394 | 165 | // // ask keeper for the blob | ||
2395 | 166 | // QDBusReply<QByteArray> blob = mock_iface_->call(QStringLiteral("GetBackupData"), uuid); | ||
2396 | 167 | // EXPECT_TRUE(reply.isValid()) << qPrintable(reply.error().message()); | ||
2397 | 168 | // | ||
2398 | 169 | // // check the results | ||
2399 | 170 | // const auto expected_blob = QByteArray(FAKE_BACKUP_HELPER_PAYLOAD); | ||
2400 | 171 | // ASSERT_EQ(expected_blob, blob); | ||
2401 | 172 | //} | ||
2402 | 164 | 173 | ||
2403 | === modified file 'tests/integration/helpers/helpers-test-failure.cpp' | |||
2404 | --- tests/integration/helpers/helpers-test-failure.cpp 2016-12-14 11:00:21 +0000 | |||
2405 | +++ tests/integration/helpers/helpers-test-failure.cpp 2016-12-22 14:35:27 +0000 | |||
2406 | @@ -48,7 +48,7 @@ | |||
2407 | 48 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); | 48 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); |
2408 | 49 | 49 | ||
2409 | 50 | // ask for a list of backup choices | 50 | // ask for a list of backup choices |
2411 | 51 | QDBusReply<QVariantDictMap> choices = user_iface->call("GetBackupChoices"); | 51 | QDBusReply<keeper::KeeperItemsMap> choices = user_iface->call("GetBackupChoices"); |
2412 | 52 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); | 52 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); |
2413 | 53 | 53 | ||
2414 | 54 | auto user_option = QStringLiteral("XDG_MUSIC_DIR"); | 54 | auto user_option = QStringLiteral("XDG_MUSIC_DIR"); |
2415 | @@ -90,26 +90,26 @@ | |||
2416 | 90 | // this one uses pooling so it should just call Get once | 90 | // this one uses pooling so it should just call Get once |
2417 | 91 | EXPECT_TRUE(wait_for_all_tasks_have_action_state({user_folder_uuid}, "failed", user_iface)); | 91 | EXPECT_TRUE(wait_for_all_tasks_have_action_state({user_folder_uuid}, "failed", user_iface)); |
2418 | 92 | 92 | ||
2421 | 93 | QVariant error_value; | 93 | keeper::KeeperItem item_value; |
2422 | 94 | EXPECT_TRUE(get_task_property_now(user_folder_uuid, user_iface, "error", error_value)); | 94 | EXPECT_TRUE(get_task_value_now(user_folder_uuid, user_iface, item_value)); |
2423 | 95 | bool conversion_ok; | 95 | bool conversion_ok; |
2425 | 96 | auto keeper_error = keeper::convertFromDBusVariant(error_value, &conversion_ok); | 96 | auto keeper_error = item_value.get_error(&conversion_ok); |
2426 | 97 | EXPECT_TRUE(conversion_ok); | 97 | EXPECT_TRUE(conversion_ok); |
2428 | 98 | EXPECT_EQ(keeper_error, keeper::KeeperError::HELPER_WRITE_ERROR); | 98 | EXPECT_EQ(keeper::Error::HELPER_WRITE, keeper_error); |
2429 | 99 | 99 | ||
2430 | 100 | // check that the content of the file is the expected | 100 | // check that the content of the file is the expected |
2431 | 101 | EXPECT_EQ(0, StorageFrameworkLocalUtils::check_storage_framework_nb_files()); | 101 | EXPECT_EQ(0, StorageFrameworkLocalUtils::check_storage_framework_nb_files()); |
2432 | 102 | 102 | ||
2433 | 103 | // check that the state is failed | 103 | // check that the state is failed |
2435 | 104 | QVariantDictMap state = user_iface->state(); | 104 | auto state = user_iface->state(); |
2436 | 105 | 105 | ||
2437 | 106 | // check that the state has the uuid | 106 | // check that the state has the uuid |
2439 | 107 | QVariantDictMap::const_iterator iter = state.find(user_folder_uuid); | 107 | auto iter = state.find(user_folder_uuid); |
2440 | 108 | EXPECT_TRUE(iter != state.end()); | 108 | EXPECT_TRUE(iter != state.end()); |
2441 | 109 | auto state_values = state[user_folder_uuid]; | 109 | auto state_values = state[user_folder_uuid]; |
2442 | 110 | 110 | ||
2445 | 111 | EXPECT_EQ(std::string{"failed"}, state_values["action"].toString().toStdString()); | 111 | EXPECT_EQ("failed", state_values.get_status()); |
2446 | 112 | EXPECT_EQ(std::string{"Music"}, state_values["display-name"].toString().toStdString()); | 112 | EXPECT_EQ("Music", state_values.get_display_name()); |
2447 | 113 | // sent 1 byte more than the expected, so percentage has to be greater than 1.0 | 113 | // sent 1 byte more than the expected, so percentage has to be greater than 1.0 |
2449 | 114 | EXPECT_GT(state_values["percent-done"].toFloat(), 1.0); | 114 | EXPECT_LT(1.0, state_values.get_percent_done()); |
2450 | 115 | } | 115 | } |
2451 | 116 | 116 | ||
2452 | === modified file 'tests/integration/helpers/helpers-test.cc' | |||
2453 | --- tests/integration/helpers/helpers-test.cc 2016-12-21 08:36:57 +0000 | |||
2454 | +++ tests/integration/helpers/helpers-test.cc 2016-12-22 14:35:27 +0000 | |||
2455 | @@ -76,7 +76,7 @@ | |||
2456 | 76 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); | 76 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); |
2457 | 77 | 77 | ||
2458 | 78 | // ask for a list of backup choices | 78 | // ask for a list of backup choices |
2460 | 79 | QDBusReply<QVariantDictMap> choices = user_iface->call("GetBackupChoices"); | 79 | QDBusReply<keeper::KeeperItemsMap> choices = user_iface->call("GetBackupChoices"); |
2461 | 80 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); | 80 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); |
2462 | 81 | 81 | ||
2463 | 82 | QString user_option = QStringLiteral("XDG_MUSIC_DIR"); | 82 | QString user_option = QStringLiteral("XDG_MUSIC_DIR"); |
2464 | @@ -145,7 +145,7 @@ | |||
2465 | 145 | // finally check that we have a valid manifest file. | 145 | // finally check that we have a valid manifest file. |
2466 | 146 | EXPECT_TRUE(check_manifest_file(backup_items)); | 146 | EXPECT_TRUE(check_manifest_file(backup_items)); |
2467 | 147 | 147 | ||
2469 | 148 | QDBusPendingReply<QVariantDictMap> restore_choices_reply = user_iface->call("GetRestoreChoices"); | 148 | QDBusPendingReply<keeper::KeeperItemsMap> restore_choices_reply = user_iface->call("GetRestoreChoices"); |
2470 | 149 | restore_choices_reply.waitForFinished(); | 149 | restore_choices_reply.waitForFinished(); |
2471 | 150 | EXPECT_TRUE(restore_choices_reply.isValid()) << qPrintable(choices.error().message()); | 150 | EXPECT_TRUE(restore_choices_reply.isValid()) << qPrintable(choices.error().message()); |
2472 | 151 | 151 | ||
2473 | @@ -195,7 +195,7 @@ | |||
2474 | 195 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); | 195 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); |
2475 | 196 | 196 | ||
2476 | 197 | // ask for a list of backup choices | 197 | // ask for a list of backup choices |
2478 | 198 | QDBusReply<QVariantDictMap> choices = user_iface->call("GetBackupChoices"); | 198 | QDBusReply<keeper::KeeperItemsMap> choices = user_iface->call("GetBackupChoices"); |
2479 | 199 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); | 199 | EXPECT_TRUE(choices.isValid()) << qPrintable(choices.error().message()); |
2480 | 200 | 200 | ||
2481 | 201 | QString user_option = QStringLiteral("XDG_MUSIC_DIR"); | 201 | QString user_option = QStringLiteral("XDG_MUSIC_DIR"); |
2482 | @@ -316,7 +316,7 @@ | |||
2483 | 316 | 316 | ||
2484 | 317 | ASSERT_EQ(1, spy_error.count()); | 317 | ASSERT_EQ(1, spy_error.count()); |
2485 | 318 | arguments = spy_error.takeFirst(); | 318 | arguments = spy_error.takeFirst(); |
2487 | 319 | EXPECT_EQ(keeper::KeeperError::HELPER_START_TIMEOUT, qvariant_cast<keeper::KeeperError>(arguments.at(0))); | 319 | EXPECT_EQ(keeper::Error::HELPER_START_TIMEOUT, qvariant_cast<keeper::Error>(arguments.at(0))); |
2488 | 320 | } | 320 | } |
2489 | 321 | 321 | ||
2490 | 322 | TEST_F(TestHelpers, Inactivity) | 322 | TEST_F(TestHelpers, Inactivity) |
2491 | @@ -346,5 +346,5 @@ | |||
2492 | 346 | 346 | ||
2493 | 347 | ASSERT_EQ(1, spy_error.count()); | 347 | ASSERT_EQ(1, spy_error.count()); |
2494 | 348 | arguments = spy_error.takeFirst(); | 348 | arguments = spy_error.takeFirst(); |
2496 | 349 | EXPECT_EQ(keeper::KeeperError::HELPER_INACTIVITY_DETECTED, qvariant_cast<keeper::KeeperError>(arguments.at(0))); | 349 | EXPECT_EQ(keeper::Error::HELPER_INACTIVITY_DETECTED, qvariant_cast<keeper::Error>(arguments.at(0))); |
2497 | 350 | } | 350 | } |
2498 | 351 | 351 | ||
2499 | === modified file 'tests/integration/helpers/restore-test.cpp' | |||
2500 | --- tests/integration/helpers/restore-test.cpp 2016-10-28 15:11:21 +0000 | |||
2501 | +++ tests/integration/helpers/restore-test.cpp 2016-12-22 14:35:27 +0000 | |||
2502 | @@ -92,7 +92,7 @@ | |||
2503 | 92 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); | 92 | ASSERT_TRUE(user_iface->isValid()) << qPrintable(dbus_test_runner.sessionConnection().lastError().message()); |
2504 | 93 | 93 | ||
2505 | 94 | // ask for a list of backup choices | 94 | // ask for a list of backup choices |
2507 | 95 | QDBusPendingReply<QVariantDictMap> choices_reply = user_iface->call("GetRestoreChoices"); | 95 | QDBusPendingReply<keeper::KeeperItemsMap> choices_reply = user_iface->call("GetRestoreChoices"); |
2508 | 96 | choices_reply.waitForFinished(); | 96 | choices_reply.waitForFinished(); |
2509 | 97 | EXPECT_TRUE(choices_reply.isFinished()); | 97 | EXPECT_TRUE(choices_reply.isFinished()); |
2510 | 98 | EXPECT_TRUE(choices_reply.isValid()) << qPrintable(choices_reply.error().message()); | 98 | EXPECT_TRUE(choices_reply.isValid()) << qPrintable(choices_reply.error().message()); |
2511 | 99 | 99 | ||
2512 | === modified file 'tests/integration/helpers/test-helpers-base.cpp' | |||
2513 | --- tests/integration/helpers/test-helpers-base.cpp 2016-12-21 08:36:57 +0000 | |||
2514 | +++ tests/integration/helpers/test-helpers-base.cpp 2016-12-22 14:35:27 +0000 | |||
2515 | @@ -35,6 +35,7 @@ | |||
2516 | 35 | 35 | ||
2517 | 36 | bool qvariant_to_map(QVariant const& variant, QVariantMap& map) | 36 | bool qvariant_to_map(QVariant const& variant, QVariantMap& map) |
2518 | 37 | { | 37 | { |
2519 | 38 | qDebug() << "VARIANT TYPE FOR STATE: " << variant.typeName(); | ||
2520 | 38 | if (variant.type() == QMetaType::QVariantMap) | 39 | if (variant.type() == QMetaType::QVariantMap) |
2521 | 39 | { | 40 | { |
2522 | 40 | map = variant.toMap(); | 41 | map = variant.toMap(); |
2523 | @@ -45,11 +46,13 @@ | |||
2524 | 45 | return false; | 46 | return false; |
2525 | 46 | } | 47 | } |
2526 | 47 | 48 | ||
2528 | 48 | bool qdbus_argument_to_variant_dict_map(QVariant const& variant, QVariantDictMap& map) | 49 | bool qdbus_argument_to_keeper_items_map(QVariant const& variant, keeper::KeeperItemsMap& map) |
2529 | 49 | { | 50 | { |
2530 | 51 | qDebug() << "**** VARIANT TYPE FOR STATE: " << variant.typeName(); | ||
2531 | 50 | if (variant.canConvert<QDBusArgument>()) | 52 | if (variant.canConvert<QDBusArgument>()) |
2532 | 51 | { | 53 | { |
2533 | 52 | QDBusArgument value(variant.value<QDBusArgument>()); | 54 | QDBusArgument value(variant.value<QDBusArgument>()); |
2534 | 55 | qDebug() << "VALUE CURRENT TYPE: " << value.currentType() << " SIGNATURE: " << value.currentSignature(); | ||
2535 | 53 | if (value.currentType() == QDBusArgument::MapType) | 56 | if (value.currentType() == QDBusArgument::MapType) |
2536 | 54 | { | 57 | { |
2537 | 55 | value >> map; | 58 | value >> map; |
2538 | @@ -57,7 +60,7 @@ | |||
2539 | 57 | } | 60 | } |
2540 | 58 | else | 61 | else |
2541 | 59 | { | 62 | { |
2543 | 60 | qWarning() << Q_FUNC_INFO << ": Could not convert variant to QVariantDictMap. Variant received has type " << value.currentType(); | 63 | qWarning() << Q_FUNC_INFO << ": Could not convert variant to keeper::KeeperItemsMap. Variant received has type " << value.currentType(); |
2544 | 61 | } | 64 | } |
2545 | 62 | } | 65 | } |
2546 | 63 | else | 66 | else |
2547 | @@ -67,7 +70,7 @@ | |||
2548 | 67 | return false; | 70 | return false; |
2549 | 68 | } | 71 | } |
2550 | 69 | 72 | ||
2552 | 70 | bool get_property_qvariant_dict_map(QString const & property, QVariant const &variant, QVariantDictMap & map) | 73 | bool get_property_qvariant_keeper_items_map(QString const & property, QVariant const &variant, keeper::KeeperItemsMap & map) |
2553 | 71 | { | 74 | { |
2554 | 72 | QVariantMap properties_map; | 75 | QVariantMap properties_map; |
2555 | 73 | if (!qvariant_to_map(variant, properties_map)) | 76 | if (!qvariant_to_map(variant, properties_map)) |
2556 | @@ -83,7 +86,7 @@ | |||
2557 | 83 | return false; | 86 | return false; |
2558 | 84 | } | 87 | } |
2559 | 85 | 88 | ||
2561 | 86 | if(!qdbus_argument_to_variant_dict_map((*iter), map)) | 89 | if(!qdbus_argument_to_keeper_items_map((*iter), map)) |
2562 | 87 | { | 90 | { |
2563 | 88 | qWarning() << Q_FUNC_INFO << ": Error converting property [" << property << "] to QVariantDictMap"; | 91 | qWarning() << Q_FUNC_INFO << ": Error converting property [" << property << "] to QVariantDictMap"; |
2564 | 89 | return false; | 92 | return false; |
2565 | @@ -441,7 +444,7 @@ | |||
2566 | 441 | return finished; | 444 | return finished; |
2567 | 442 | } | 445 | } |
2568 | 443 | 446 | ||
2570 | 444 | bool TestHelpersBase::get_task_property_now(QString const & uuid, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, QString const & property, QVariant & value) const | 447 | bool TestHelpersBase::get_task_value_now(QString const & uuid, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, keeper::KeeperItem & value) const |
2571 | 445 | { | 448 | { |
2572 | 446 | auto state = keeper_user_iface->state(); | 449 | auto state = keeper_user_iface->state(); |
2573 | 447 | auto iter = state.find(uuid); | 450 | auto iter = state.find(uuid); |
2574 | @@ -450,29 +453,23 @@ | |||
2575 | 450 | qWarning() << "Task " << uuid << " was not found in State"; | 453 | qWarning() << "Task " << uuid << " was not found in State"; |
2576 | 451 | return false; | 454 | return false; |
2577 | 452 | } | 455 | } |
2587 | 453 | 456 | value = (*iter); | |
2588 | 454 | auto iter_props = (*iter).find(property); | 457 | |
2580 | 455 | if (iter_props == (*iter).end()) | ||
2581 | 456 | { | ||
2582 | 457 | qWarning() << "Property " << property << " was not found for task " << uuid; | ||
2583 | 458 | return false; | ||
2584 | 459 | } | ||
2585 | 460 | |||
2586 | 461 | value = (*iter_props); | ||
2589 | 462 | return true; | 458 | return true; |
2590 | 463 | } | 459 | } |
2591 | 464 | 460 | ||
2593 | 465 | bool TestHelpersBase::check_task_has_action_state(QVariantDictMap const & state, QString const & uuid, QString const & action_state) | 461 | bool TestHelpersBase::check_task_has_action_state(keeper::KeeperItemsMap const & state, QString const & uuid, QString const & action_state) |
2594 | 466 | { | 462 | { |
2595 | 467 | auto iter = state.find(uuid); | 463 | auto iter = state.find(uuid); |
2596 | 468 | if (iter == state.end()) | 464 | if (iter == state.end()) |
2597 | 469 | return false; | 465 | return false; |
2598 | 470 | 466 | ||
2601 | 471 | auto iter_props = (*iter).find("action"); | 467 | bool valid_status; |
2602 | 472 | if (iter_props == (*iter).end()) | 468 | auto status = (*iter).get_status(&valid_status); |
2603 | 469 | if (!valid_status) | ||
2604 | 473 | return false; | 470 | return false; |
2605 | 474 | 471 | ||
2607 | 475 | return (*iter_props).toString() == action_state; | 472 | return status == action_state; |
2608 | 476 | } | 473 | } |
2609 | 477 | 474 | ||
2610 | 478 | bool TestHelpersBase::capture_and_check_state_until_all_tasks_complete(QSignalSpy & spy, QStringList const & uuids, QString const & action_state, int max_timeout_msec) | 475 | bool TestHelpersBase::capture_and_check_state_until_all_tasks_complete(QSignalSpy & spy, QStringList const & uuids, QString const & action_state, int max_timeout_msec) |
2611 | @@ -510,8 +507,8 @@ | |||
2612 | 510 | { | 507 | { |
2613 | 511 | return false; | 508 | return false; |
2614 | 512 | } | 509 | } |
2617 | 513 | QVariantDictMap keeper_state; | 510 | keeper::KeeperItemsMap keeper_state; |
2618 | 514 | if (!get_property_qvariant_dict_map("State", arguments.at(1), keeper_state)) | 511 | if (!get_property_qvariant_keeper_items_map("State", arguments.at(1), keeper_state)) |
2619 | 515 | { | 512 | { |
2620 | 516 | return false; | 513 | return false; |
2621 | 517 | } | 514 | } |
2622 | @@ -595,8 +592,8 @@ | |||
2623 | 595 | { | 592 | { |
2624 | 596 | return false; | 593 | return false; |
2625 | 597 | } | 594 | } |
2628 | 598 | QVariantDictMap keeper_state; | 595 | keeper::KeeperItemsMap keeper_state; |
2629 | 599 | if (!get_property_qvariant_dict_map("State", arguments.at(1), keeper_state)) | 596 | if (!get_property_qvariant_keeper_items_map("State", arguments.at(1), keeper_state)) |
2630 | 600 | { | 597 | { |
2631 | 601 | return false; | 598 | return false; |
2632 | 602 | } | 599 | } |
2633 | @@ -655,7 +652,7 @@ | |||
2634 | 655 | return false; | 652 | return false; |
2635 | 656 | } | 653 | } |
2636 | 657 | 654 | ||
2638 | 658 | QString TestHelpersBase::get_uuid_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const | 655 | QString TestHelpersBase::get_uuid_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const |
2639 | 659 | { | 656 | { |
2640 | 660 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) | 657 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) |
2641 | 661 | { | 658 | { |
2642 | @@ -674,7 +671,7 @@ | |||
2643 | 674 | return QString(); | 671 | return QString(); |
2644 | 675 | } | 672 | } |
2645 | 676 | 673 | ||
2647 | 677 | QString TestHelpersBase::get_type_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const | 674 | QString TestHelpersBase::get_type_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const |
2648 | 678 | { | 675 | { |
2649 | 679 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) | 676 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) |
2650 | 680 | { | 677 | { |
2651 | @@ -698,7 +695,7 @@ | |||
2652 | 698 | return QString(); | 695 | return QString(); |
2653 | 699 | } | 696 | } |
2654 | 700 | 697 | ||
2656 | 701 | QString TestHelpersBase::get_display_name_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const | 698 | QString TestHelpersBase::get_display_name_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const |
2657 | 702 | { | 699 | { |
2658 | 703 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) | 700 | for(auto iter = choices.begin(); iter != choices.end(); ++iter) |
2659 | 704 | { | 701 | { |
2660 | 705 | 702 | ||
2661 | === modified file 'tests/integration/helpers/test-helpers-base.h' | |||
2662 | --- tests/integration/helpers/test-helpers-base.h 2016-12-21 08:36:57 +0000 | |||
2663 | +++ tests/integration/helpers/test-helpers-base.h 2016-12-22 14:35:27 +0000 | |||
2664 | @@ -95,17 +95,17 @@ | |||
2665 | 95 | 95 | ||
2666 | 96 | bool wait_for_all_tasks_have_action_state(QStringList const & uuids, QString const & action_state, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, int max_timeout_msec = 15000); | 96 | bool wait_for_all_tasks_have_action_state(QStringList const & uuids, QString const & action_state, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, int max_timeout_msec = 15000); |
2667 | 97 | 97 | ||
2669 | 98 | bool check_task_has_action_state(QVariantDictMap const & state, QString const & uuid, QString const & action_state); | 98 | bool check_task_has_action_state(keeper::KeeperItemsMap const & state, QString const & uuid, QString const & action_state); |
2670 | 99 | 99 | ||
2672 | 100 | bool get_task_property_now(QString const & uuid, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, QString const & property, QVariant & value) const; | 100 | bool get_task_value_now(QString const & uuid, QSharedPointer<DBusInterfaceKeeperUser> const & keeper_user_iface, keeper::KeeperItem & value) const; |
2673 | 101 | 101 | ||
2674 | 102 | bool capture_and_check_state_until_all_tasks_complete(QSignalSpy & spy, QStringList const & uuids, QString const & action_state, int max_timeout_msec = 15000); | 102 | bool capture_and_check_state_until_all_tasks_complete(QSignalSpy & spy, QStringList const & uuids, QString const & action_state, int max_timeout_msec = 15000); |
2675 | 103 | 103 | ||
2676 | 104 | bool cancel_first_task_at_percentage(QSignalSpy & spy, double expected_percentage, QSharedPointer<DBusInterfaceKeeperUser> const & user_iface, int max_timeout_msec = 15000); | 104 | bool cancel_first_task_at_percentage(QSignalSpy & spy, double expected_percentage, QSharedPointer<DBusInterfaceKeeperUser> const & user_iface, int max_timeout_msec = 15000); |
2677 | 105 | 105 | ||
2681 | 106 | QString get_uuid_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const; | 106 | QString get_uuid_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const; |
2682 | 107 | QString get_type_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const; | 107 | QString get_type_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const; |
2683 | 108 | QString get_display_name_for_xdg_folder_path(QString const &path, QVariantDictMap const & choices) const; | 108 | QString get_display_name_for_xdg_folder_path(QString const &path, keeper::KeeperItemsMap const & choices) const; |
2684 | 109 | 109 | ||
2685 | 110 | bool check_manifest_file(QVector<BackupItem> const & backup_items); | 110 | bool check_manifest_file(QVector<BackupItem> const & backup_items); |
2686 | 111 | 111 |
FAILED: Continuous integration, rev:134 /jenkins. canonical. com/unity- api-1/job/ lp-keeper- ci/158/ /jenkins. canonical. com/unity- api-1/job/ build/1293/ console /jenkins. canonical. com/unity- api-1/job/ build-0- fetch/1300/ console
https:/
Executed test runs:
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild: /jenkins. canonical. com/unity- api-1/job/ lp-keeper- ci/158/ rebuild
https:/