Merge lp:~mzanetti/reminders-app/improve-error-handling into lp:reminders-app
- improve-error-handling
- Merge into trunk
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Riccardo Padovani | ||||||||
Approved revision: | 388 | ||||||||
Merged at revision: | 389 | ||||||||
Proposed branch: | lp:~mzanetti/reminders-app/improve-error-handling | ||||||||
Merge into: | lp:reminders-app | ||||||||
Prerequisite: | lp:~mzanetti/reminders-app/two-job-queues | ||||||||
Diff against target: |
438 lines (+110/-78) 7 files modified
src/app/qml/components/StatusBar.qml (+1/-0) src/libqtevernote/evernoteconnection.cpp (+39/-1) src/libqtevernote/evernoteconnection.h (+3/-0) src/libqtevernote/jobs/evernotejob.cpp (+9/-5) src/libqtevernote/jobs/fetchnotejob.cpp (+2/-0) src/libqtevernote/notesstore.cpp (+54/-72) src/libqtevernote/notesstore.h (+2/-0) |
||||||||
To merge this branch: | bzr merge lp:~mzanetti/reminders-app/improve-error-handling | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Riccardo Padovani | Approve | ||
Ubuntu Phone Apps Jenkins Bot | continuous-integration | Approve | |
Review via email: mp+252227@code.launchpad.net |
Commit message
improve some error handling
* Rate limit exceeded
* Upload quota exceeded
* Authentication expired
Description of the change
To test/reproduce the errors:
* Rate limit exceeded
Delete ~/.local/
* Upload quota exceeded
On evernote website, go to account settings, see the quota status. Upload stuff until the quota is reached. Then on the phone, create a note and attach a picture. The app should show the quota warning.
* Authentication expired
With a properly set up account, go to the evernote webbsite -> settings -> applications, and delete the auth for the account. Then do something with the app.
Pleas try to create other error situations and let me know if you manage to get into some error state where we should show something to the user or that is otherwise unhandled correctly.
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
- 388. By Michael Zanetti
-
update user errors in all callbacks
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:388
http://
Executed test runs:
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Riccardo Padovani (rpadovani) wrote : | # |
Looks good to me, but you discarded 4 gettext, why?
155 - message = gettext(
156 + message = "Authentication expired.";
Michael Zanetti (mzanetti) wrote : | # |
> Looks good to me, but you discarded 4 gettext, why?
>
> 155 - message = gettext(
> 156 + message = "Authentication expired.";
Those are in the "EDAMSystemExce
Riccardo Padovani (rpadovani) wrote : | # |
Okay, then looks good to me, thanks for the explanation!
Preview Diff
1 | === modified file 'src/app/qml/components/StatusBar.qml' | |||
2 | --- src/app/qml/components/StatusBar.qml 2015-03-04 00:23:45 +0000 | |||
3 | +++ src/app/qml/components/StatusBar.qml 2015-03-08 22:06:13 +0000 | |||
4 | @@ -38,6 +38,7 @@ | |||
5 | 38 | id: label | 38 | id: label |
6 | 39 | width: parent.width - x | 39 | width: parent.width - x |
7 | 40 | wrapMode: Text.WordWrap | 40 | wrapMode: Text.WordWrap |
8 | 41 | anchors.verticalCenter: parent.verticalCenter | ||
9 | 41 | } | 42 | } |
10 | 42 | } | 43 | } |
11 | 43 | } | 44 | } |
12 | 44 | 45 | ||
13 | === modified file 'src/libqtevernote/evernoteconnection.cpp' | |||
14 | --- src/libqtevernote/evernoteconnection.cpp 2015-03-08 22:06:13 +0000 | |||
15 | +++ src/libqtevernote/evernoteconnection.cpp 2015-03-08 22:06:13 +0000 | |||
16 | @@ -38,6 +38,7 @@ | |||
17 | 38 | #include <Errors_types.h> | 38 | #include <Errors_types.h> |
18 | 39 | 39 | ||
19 | 40 | #include <QUrl> | 40 | #include <QUrl> |
20 | 41 | #include <QTime> | ||
21 | 41 | 42 | ||
22 | 42 | #include <libintl.h> | 43 | #include <libintl.h> |
23 | 43 | 44 | ||
24 | @@ -65,6 +66,9 @@ | |||
25 | 65 | m_userStoreHttpClient(0) | 66 | m_userStoreHttpClient(0) |
26 | 66 | { | 67 | { |
27 | 67 | qRegisterMetaType<EvernoteConnection::ErrorCode>("EvernoteConnection::ErrorCode"); | 68 | qRegisterMetaType<EvernoteConnection::ErrorCode>("EvernoteConnection::ErrorCode"); |
28 | 69 | |||
29 | 70 | m_reconnectTimer.setSingleShot(true); | ||
30 | 71 | connect(&m_reconnectTimer, &QTimer::timeout, this, &EvernoteConnection::connectToEvernote); | ||
31 | 68 | } | 72 | } |
32 | 69 | 73 | ||
33 | 70 | void EvernoteConnection::setupUserStore() | 74 | void EvernoteConnection::setupUserStore() |
34 | @@ -148,6 +152,10 @@ | |||
35 | 148 | void EvernoteConnection::disconnectFromEvernote() | 152 | void EvernoteConnection::disconnectFromEvernote() |
36 | 149 | { | 153 | { |
37 | 150 | qCDebug(dcConnection) << "Disconnecting from Evernote."; | 154 | qCDebug(dcConnection) << "Disconnecting from Evernote."; |
38 | 155 | |||
39 | 156 | m_errorMessage.clear(); | ||
40 | 157 | emit errorChanged(); | ||
41 | 158 | |||
42 | 151 | if (!isConnected()) { | 159 | if (!isConnected()) { |
43 | 152 | qCWarning(dcConnection()) << "Not connected. Can't disconnect."; | 160 | qCWarning(dcConnection()) << "Not connected. Can't disconnect."; |
44 | 153 | return; | 161 | return; |
45 | @@ -314,6 +322,36 @@ | |||
46 | 314 | emit errorChanged(); | 322 | emit errorChanged(); |
47 | 315 | return false; | 323 | return false; |
48 | 316 | } | 324 | } |
49 | 325 | } catch (const evernote::edam::EDAMUserException &e) { | ||
50 | 326 | qCWarning(dcConnection) << "EDAMUserException getting note store path:" << e.what() << "EDAM Error Code:" << e.errorCode; | ||
51 | 327 | switch (e.errorCode) { | ||
52 | 328 | case evernote::edam::EDAMErrorCode::AUTH_EXPIRED: | ||
53 | 329 | m_errorMessage = gettext("Authentication for Evernote server expired. Please renew login information in the accounts settings."); | ||
54 | 330 | break; | ||
55 | 331 | default: | ||
56 | 332 | m_errorMessage = QString(gettext("Unknown error connecting to Evernote: %1")).arg(e.errorCode); | ||
57 | 333 | break; | ||
58 | 334 | } | ||
59 | 335 | emit errorChanged(); | ||
60 | 336 | return false; | ||
61 | 337 | } catch (const evernote::edam::EDAMSystemException &e) { | ||
62 | 338 | qCWarning(dcConnection) << "EDAMSystemException getting note store path:" << e.what() << e.errorCode; | ||
63 | 339 | switch (e.errorCode) { | ||
64 | 340 | case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED: | ||
65 | 341 | m_errorMessage = gettext("Error connecting to Evernote: Rate limit exceeded. Please try again later."); | ||
66 | 342 | m_reconnectTimer.stop(); | ||
67 | 343 | m_reconnectTimer.start(e.rateLimitDuration * 1000); | ||
68 | 344 | { | ||
69 | 345 | QTime time = QTime::fromMSecsSinceStartOfDay(e.rateLimitDuration * 1000); | ||
70 | 346 | qCDebug(dcConnection) << "Cannot connect. Rate limit exceeded. Reconnecting in" << time.toString("mm:ss"); | ||
71 | 347 | } | ||
72 | 348 | break; | ||
73 | 349 | default: | ||
74 | 350 | m_errorMessage = gettext("Unknown error connecting to Evernote: %1"); | ||
75 | 351 | break; | ||
76 | 352 | } | ||
77 | 353 | emit errorChanged(); | ||
78 | 354 | return false; | ||
79 | 317 | } catch (const TTransportException & e) { | 355 | } catch (const TTransportException & e) { |
80 | 318 | qCWarning(dcConnection) << "Failed to fetch notestore path:" << e.what(); | 356 | qCWarning(dcConnection) << "Failed to fetch notestore path:" << e.what(); |
81 | 319 | m_errorMessage = QString(gettext("Error connecting to Evernote: Connection failure when downloading server information.")); | 357 | m_errorMessage = QString(gettext("Error connecting to Evernote: Connection failure when downloading server information.")); |
82 | @@ -321,7 +359,7 @@ | |||
83 | 321 | return false; | 359 | return false; |
84 | 322 | } catch (const TException & e) { | 360 | } catch (const TException & e) { |
85 | 323 | qCWarning(dcConnection) << "Generic Thrift exception when fetching notestore path:" << e.what(); | 361 | qCWarning(dcConnection) << "Generic Thrift exception when fetching notestore path:" << e.what(); |
87 | 324 | m_errorMessage = gettext("Unknown error connecting to Evernote"); | 362 | m_errorMessage = gettext("Unknown error connecting to Evernote."); |
88 | 325 | emit errorChanged(); | 363 | emit errorChanged(); |
89 | 326 | return false; | 364 | return false; |
90 | 327 | } | 365 | } |
91 | 328 | 366 | ||
92 | === modified file 'src/libqtevernote/evernoteconnection.h' | |||
93 | --- src/libqtevernote/evernoteconnection.h 2015-03-08 22:06:13 +0000 | |||
94 | +++ src/libqtevernote/evernoteconnection.h 2015-03-08 22:06:13 +0000 | |||
95 | @@ -28,6 +28,7 @@ | |||
96 | 28 | #include <transport/THttpClient.h> | 28 | #include <transport/THttpClient.h> |
97 | 29 | 29 | ||
98 | 30 | #include <QObject> | 30 | #include <QObject> |
99 | 31 | #include <QTimer> | ||
100 | 31 | 32 | ||
101 | 32 | namespace evernote { | 33 | namespace evernote { |
102 | 33 | namespace edam { | 34 | namespace edam { |
103 | @@ -141,6 +142,8 @@ | |||
104 | 141 | 142 | ||
105 | 142 | evernote::edam::UserStoreClient *m_userstoreClient; | 143 | evernote::edam::UserStoreClient *m_userstoreClient; |
106 | 143 | boost::shared_ptr<THttpClient> m_userStoreHttpClient; | 144 | boost::shared_ptr<THttpClient> m_userStoreHttpClient; |
107 | 145 | |||
108 | 146 | QTimer m_reconnectTimer; | ||
109 | 144 | }; | 147 | }; |
110 | 145 | 148 | ||
111 | 146 | #endif // EVERNOTECONNECTION_H | 149 | #endif // EVERNOTECONNECTION_H |
112 | 147 | 150 | ||
113 | === modified file 'src/libqtevernote/jobs/evernotejob.cpp' | |||
114 | --- src/libqtevernote/jobs/evernotejob.cpp 2015-03-08 22:06:13 +0000 | |||
115 | +++ src/libqtevernote/jobs/evernotejob.cpp 2015-03-08 22:06:13 +0000 | |||
116 | @@ -100,6 +100,7 @@ | |||
117 | 100 | } | 100 | } |
118 | 101 | } catch (const evernote::edam::EDAMUserException &e) { | 101 | } catch (const evernote::edam::EDAMUserException &e) { |
119 | 102 | QString message; | 102 | QString message; |
120 | 103 | EvernoteConnection::ErrorCode errorCode = EvernoteConnection::ErrorCodeUserException; | ||
121 | 103 | switch (e.errorCode) { | 104 | switch (e.errorCode) { |
122 | 104 | case evernote::edam::EDAMErrorCode::UNKNOWN: | 105 | case evernote::edam::EDAMErrorCode::UNKNOWN: |
123 | 105 | message = "Unknown Error: %1"; | 106 | message = "Unknown Error: %1"; |
124 | @@ -118,15 +119,18 @@ | |||
125 | 118 | break; | 119 | break; |
126 | 119 | case evernote::edam::EDAMErrorCode::LIMIT_REACHED: | 120 | case evernote::edam::EDAMErrorCode::LIMIT_REACHED: |
127 | 120 | message = "Limit reached: %1"; | 121 | message = "Limit reached: %1"; |
128 | 122 | errorCode = EvernoteConnection::ErrorCodeLimitExceeded; | ||
129 | 121 | break; | 123 | break; |
130 | 122 | case evernote::edam::EDAMErrorCode::QUOTA_REACHED: | 124 | case evernote::edam::EDAMErrorCode::QUOTA_REACHED: |
131 | 123 | message = "Quota reached: %1"; | 125 | message = "Quota reached: %1"; |
132 | 126 | errorCode = EvernoteConnection::ErrorCodeQutaExceeded; | ||
133 | 124 | break; | 127 | break; |
134 | 125 | case evernote::edam::EDAMErrorCode::INVALID_AUTH: | 128 | case evernote::edam::EDAMErrorCode::INVALID_AUTH: |
135 | 126 | message = "Invalid auth: %1"; | 129 | message = "Invalid auth: %1"; |
136 | 127 | break; | 130 | break; |
137 | 128 | case evernote::edam::EDAMErrorCode::AUTH_EXPIRED: | 131 | case evernote::edam::EDAMErrorCode::AUTH_EXPIRED: |
138 | 129 | message = "Auth expired: %1"; | 132 | message = "Auth expired: %1"; |
139 | 133 | errorCode = EvernoteConnection::ErrorCodeAuthExpired; | ||
140 | 130 | break; | 134 | break; |
141 | 131 | case evernote::edam::EDAMErrorCode::DATA_CONFLICT: | 135 | case evernote::edam::EDAMErrorCode::DATA_CONFLICT: |
142 | 132 | message = "Data conflict: %1"; | 136 | message = "Data conflict: %1"; |
143 | @@ -161,26 +165,26 @@ | |||
144 | 161 | } | 165 | } |
145 | 162 | message = message.arg(QString::fromStdString(e.parameter)); | 166 | message = message.arg(QString::fromStdString(e.parameter)); |
146 | 163 | qCWarning(dcJobQueue) << metaObject()->className() << "EDAMUserException:" << message; | 167 | qCWarning(dcJobQueue) << metaObject()->className() << "EDAMUserException:" << message; |
148 | 164 | emitJobDone(EvernoteConnection::ErrorCodeUserException, message); | 168 | emitJobDone(errorCode, message); |
149 | 165 | } catch (const evernote::edam::EDAMSystemException &e) { | 169 | } catch (const evernote::edam::EDAMSystemException &e) { |
150 | 166 | qCWarning(dcJobQueue) << "EDAMSystemException in" << metaObject()->className() << e.what() << e.errorCode << QString::fromStdString(e.message); | 170 | qCWarning(dcJobQueue) << "EDAMSystemException in" << metaObject()->className() << e.what() << e.errorCode << QString::fromStdString(e.message); |
151 | 167 | QString message; | 171 | QString message; |
152 | 168 | EvernoteConnection::ErrorCode errorCode; | 172 | EvernoteConnection::ErrorCode errorCode; |
153 | 169 | switch (e.errorCode) { | 173 | switch (e.errorCode) { |
154 | 170 | case evernote::edam::EDAMErrorCode::AUTH_EXPIRED: | 174 | case evernote::edam::EDAMErrorCode::AUTH_EXPIRED: |
156 | 171 | message = gettext("Authentication expired."); | 175 | message = "Authentication expired."; |
157 | 172 | errorCode = EvernoteConnection::ErrorCodeAuthExpired; | 176 | errorCode = EvernoteConnection::ErrorCodeAuthExpired; |
158 | 173 | break; | 177 | break; |
159 | 174 | case evernote::edam::EDAMErrorCode::LIMIT_REACHED: | 178 | case evernote::edam::EDAMErrorCode::LIMIT_REACHED: |
161 | 175 | message = gettext("Limit exceeded."); | 179 | message = "Limit exceeded."; |
162 | 176 | errorCode = EvernoteConnection::ErrorCodeLimitExceeded; | 180 | errorCode = EvernoteConnection::ErrorCodeLimitExceeded; |
163 | 177 | break; | 181 | break; |
164 | 178 | case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED: | 182 | case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED: |
166 | 179 | message = gettext("Rate limit exceeded."); | 183 | message = "Rate limit exceeded."; |
167 | 180 | errorCode = EvernoteConnection::ErrorCodeRateLimitExceeded; | 184 | errorCode = EvernoteConnection::ErrorCodeRateLimitExceeded; |
168 | 181 | break; | 185 | break; |
169 | 182 | case evernote::edam::EDAMErrorCode::QUOTA_REACHED: | 186 | case evernote::edam::EDAMErrorCode::QUOTA_REACHED: |
171 | 183 | message = gettext("Quota exceeded."); | 187 | message = "Quota exceeded."; |
172 | 184 | errorCode = EvernoteConnection::ErrorCodeQutaExceeded; | 188 | errorCode = EvernoteConnection::ErrorCodeQutaExceeded; |
173 | 185 | break; | 189 | break; |
174 | 186 | default: | 190 | default: |
175 | 187 | 191 | ||
176 | === modified file 'src/libqtevernote/jobs/fetchnotejob.cpp' | |||
177 | --- src/libqtevernote/jobs/fetchnotejob.cpp 2015-02-26 22:47:10 +0000 | |||
178 | +++ src/libqtevernote/jobs/fetchnotejob.cpp 2015-03-08 22:06:13 +0000 | |||
179 | @@ -53,6 +53,8 @@ | |||
180 | 53 | 53 | ||
181 | 54 | void FetchNoteJob::startJob() | 54 | void FetchNoteJob::startJob() |
182 | 55 | { | 55 | { |
183 | 56 | // Just in case we error out, make sure the reply can be idenfied by note guid | ||
184 | 57 | m_result.guid = m_guid.toStdString(); | ||
185 | 56 | client()->getNote(m_result, token().toStdString(), m_guid.toStdString(), m_what == LoadContent, m_what == LoadResources, false, false); | 58 | client()->getNote(m_result, token().toStdString(), m_guid.toStdString(), m_what == LoadContent, m_what == LoadResources, false, false); |
186 | 57 | } | 59 | } |
187 | 58 | 60 | ||
188 | 59 | 61 | ||
189 | === modified file 'src/libqtevernote/notesstore.cpp' | |||
190 | --- src/libqtevernote/notesstore.cpp 2015-03-08 22:06:13 +0000 | |||
191 | +++ src/libqtevernote/notesstore.cpp 2015-03-08 22:06:13 +0000 | |||
192 | @@ -307,9 +307,11 @@ | |||
193 | 307 | 307 | ||
194 | 308 | notebook->setLoading(false); | 308 | notebook->setLoading(false); |
195 | 309 | 309 | ||
196 | 310 | handleUserError(errorCode); | ||
197 | 310 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 311 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
198 | 311 | qCWarning(dcSync) << "Error creating notebook:" << errorMessage; | 312 | qCWarning(dcSync) << "Error creating notebook:" << errorMessage; |
199 | 312 | notebook->setSyncError(true); | 313 | notebook->setSyncError(true); |
200 | 314 | emit notebookChanged(notebook->guid()); | ||
201 | 313 | return; | 315 | return; |
202 | 314 | } | 316 | } |
203 | 315 | QString guid = QString::fromStdString(result.guid); | 317 | QString guid = QString::fromStdString(result.guid); |
204 | @@ -503,6 +505,8 @@ | |||
205 | 503 | } | 505 | } |
206 | 504 | 506 | ||
207 | 505 | tag->setLoading(false); | 507 | tag->setLoading(false); |
208 | 508 | |||
209 | 509 | handleUserError(errorCode); | ||
210 | 506 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 510 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
211 | 507 | qCWarning(dcSync) << "Error creating tag on server:" << errorMessage; | 511 | qCWarning(dcSync) << "Error creating tag on server:" << errorMessage; |
212 | 508 | tag->setSyncError(true); | 512 | tag->setSyncError(true); |
213 | @@ -540,6 +544,8 @@ | |||
214 | 540 | return; | 544 | return; |
215 | 541 | } | 545 | } |
216 | 542 | tag->setLoading(false); | 546 | tag->setLoading(false); |
217 | 547 | |||
218 | 548 | handleUserError(errorCode); | ||
219 | 543 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 549 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
220 | 544 | qCWarning(dcSync) << "Error updating tag on server" << errorMessage; | 550 | qCWarning(dcSync) << "Error updating tag on server" << errorMessage; |
221 | 545 | tag->setSyncError(true); | 551 | tag->setSyncError(true); |
222 | @@ -625,26 +631,8 @@ | |||
223 | 625 | 631 | ||
224 | 626 | void NotesStore::fetchNotesJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::NotesMetadataList &results, const QString &filterNotebookGuid) | 632 | void NotesStore::fetchNotesJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::NotesMetadataList &results, const QString &filterNotebookGuid) |
225 | 627 | { | 633 | { |
246 | 628 | switch (errorCode) { | 634 | handleUserError(errorCode); |
247 | 629 | case EvernoteConnection::ErrorCodeNoError: | 635 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
228 | 630 | // All is well... | ||
229 | 631 | break; | ||
230 | 632 | case EvernoteConnection::ErrorCodeUserException: | ||
231 | 633 | qCWarning(dcSync) << "FetchNotesJobDone: EDAMUserException:" << errorMessage; | ||
232 | 634 | m_loading = false; | ||
233 | 635 | emit loadingChanged(); | ||
234 | 636 | return; // silently discarding... | ||
235 | 637 | case EvernoteConnection::ErrorCodeConnectionLost: | ||
236 | 638 | qCWarning(dcSync) << "FetchNotesJobDone: Connection with evernote lost:" << errorMessage; | ||
237 | 639 | m_loading = false; | ||
238 | 640 | emit loadingChanged(); | ||
239 | 641 | return; // silently discarding... | ||
240 | 642 | case EvernoteConnection::ErrorCodeNotFoundExcpetion: | ||
241 | 643 | qCWarning(dcSync) << "FetchNotesJobDone: Item not found on server:" << errorMessage; | ||
242 | 644 | m_loading = false; | ||
243 | 645 | emit loadingChanged(); | ||
244 | 646 | return; // silently discarding... | ||
245 | 647 | default: | ||
248 | 648 | qCWarning(dcSync) << "FetchNotesJobDone: Failed to fetch notes list:" << errorMessage << errorCode; | 636 | qCWarning(dcSync) << "FetchNotesJobDone: Failed to fetch notes list:" << errorMessage << errorCode; |
249 | 649 | m_loading = false; | 637 | m_loading = false; |
250 | 650 | emit loadingChanged(); | 638 | emit loadingChanged(); |
251 | @@ -825,24 +813,10 @@ | |||
252 | 825 | QModelIndex noteIndex = index(m_notes.indexOf(note)); | 813 | QModelIndex noteIndex = index(m_notes.indexOf(note)); |
253 | 826 | QVector<int> roles; | 814 | QVector<int> roles; |
254 | 827 | 815 | ||
273 | 828 | switch (errorCode) { | 816 | handleUserError(errorCode); |
274 | 829 | case EvernoteConnection::ErrorCodeNoError: | 817 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
275 | 830 | // All is well | 818 | note->setLoading(false); |
276 | 831 | break; | 819 | roles << RoleLoading; |
259 | 832 | case EvernoteConnection::ErrorCodeUserException: | ||
260 | 833 | qCWarning(dcSync) << "FetchNoteJobDone: EDAMUserException:" << errorMessage; | ||
261 | 834 | emit dataChanged(noteIndex, noteIndex, roles); | ||
262 | 835 | return; // silently discarding... | ||
263 | 836 | case EvernoteConnection::ErrorCodeConnectionLost: | ||
264 | 837 | qCWarning(dcSync) << "FetchNoteJobDone: Connection with evernote lost:" << errorMessage; | ||
265 | 838 | emit dataChanged(noteIndex, noteIndex, roles); | ||
266 | 839 | return; // silently discarding... | ||
267 | 840 | case EvernoteConnection::ErrorCodeNotFoundExcpetion: | ||
268 | 841 | qCWarning(dcSync) << "FetchNoteJobDone: Item not found on server:" << errorMessage; | ||
269 | 842 | emit dataChanged(noteIndex, noteIndex, roles); | ||
270 | 843 | return; // silently discarding... | ||
271 | 844 | default: | ||
272 | 845 | qCWarning(dcSync) << "FetchNoteJobDone: Failed to fetch note content:" << errorMessage << errorCode; | ||
277 | 846 | note->setSyncError(true); | 820 | note->setSyncError(true); |
278 | 847 | roles << RoleSyncError; | 821 | roles << RoleSyncError; |
279 | 848 | emit dataChanged(noteIndex, noteIndex, roles); | 822 | emit dataChanged(noteIndex, noteIndex, roles); |
280 | @@ -952,20 +926,10 @@ | |||
281 | 952 | m_notebooksLoading = false; | 926 | m_notebooksLoading = false; |
282 | 953 | emit notebooksLoadingChanged(); | 927 | emit notebooksLoadingChanged(); |
283 | 954 | 928 | ||
296 | 955 | switch (errorCode) { | 929 | handleUserError(errorCode); |
297 | 956 | case EvernoteConnection::ErrorCodeNoError: | 930 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
286 | 957 | // All is well... | ||
287 | 958 | break; | ||
288 | 959 | case EvernoteConnection::ErrorCodeUserException: | ||
289 | 960 | qCWarning(dcSync) << "FetchNotebooksJobDone: EDAMUserException:" << errorMessage; | ||
290 | 961 | // silently discarding... | ||
291 | 962 | return; | ||
292 | 963 | case EvernoteConnection::ErrorCodeConnectionLost: | ||
293 | 964 | qCWarning(dcSync) << "FetchNotebooksJobDone: Connection lost:" << errorMessage; | ||
294 | 965 | return; // silently discarding | ||
295 | 966 | default: | ||
298 | 967 | qCWarning(dcSync) << "FetchNotebooksJobDone: Failed to fetch notes list:" << errorMessage << errorCode; | 931 | qCWarning(dcSync) << "FetchNotebooksJobDone: Failed to fetch notes list:" << errorMessage << errorCode; |
300 | 968 | return; // silently discarding | 932 | return; |
301 | 969 | } | 933 | } |
302 | 970 | 934 | ||
303 | 971 | QList<Notebook*> unhandledNotebooks = m_notebooks; | 935 | QList<Notebook*> unhandledNotebooks = m_notebooks; |
304 | @@ -1064,20 +1028,10 @@ | |||
305 | 1064 | m_tagsLoading = false; | 1028 | m_tagsLoading = false; |
306 | 1065 | emit tagsLoadingChanged(); | 1029 | emit tagsLoadingChanged(); |
307 | 1066 | 1030 | ||
320 | 1067 | switch (errorCode) { | 1031 | handleUserError(errorCode); |
321 | 1068 | case EvernoteConnection::ErrorCodeNoError: | 1032 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
310 | 1069 | // All is well... | ||
311 | 1070 | break; | ||
312 | 1071 | case EvernoteConnection::ErrorCodeUserException: | ||
313 | 1072 | qCWarning(dcSync) << "FetchTagsJobDone: EDAMUserException:" << errorMessage; | ||
314 | 1073 | // silently discarding... | ||
315 | 1074 | return; | ||
316 | 1075 | case EvernoteConnection::ErrorCodeConnectionLost: | ||
317 | 1076 | qCWarning(dcSync) << "FetchTagsJobDone: Connection lost:" << errorMessage; | ||
318 | 1077 | return; // silently discarding | ||
319 | 1078 | default: | ||
322 | 1079 | qCWarning(dcSync) << "FetchTagsJobDone: Failed to fetch notes list:" << errorMessage << errorCode; | 1033 | qCWarning(dcSync) << "FetchTagsJobDone: Failed to fetch notes list:" << errorMessage << errorCode; |
324 | 1080 | return; // silently discarding | 1034 | return; |
325 | 1081 | } | 1035 | } |
326 | 1082 | 1036 | ||
327 | 1083 | QHash<QString, Tag*> unhandledTags = m_tagsHash; | 1037 | QHash<QString, Tag*> unhandledTags = m_tagsHash; |
328 | @@ -1204,6 +1158,7 @@ | |||
329 | 1204 | note->setLoading(false); | 1158 | note->setLoading(false); |
330 | 1205 | roles << RoleLoading; | 1159 | roles << RoleLoading; |
331 | 1206 | 1160 | ||
332 | 1161 | handleUserError(errorCode); | ||
333 | 1207 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 1162 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
334 | 1208 | qCWarning(dcSync) << "Error creating note on server:" << tmpGuid << errorMessage; | 1163 | qCWarning(dcSync) << "Error creating note on server:" << tmpGuid << errorMessage; |
335 | 1209 | note->setSyncError(true); | 1164 | note->setSyncError(true); |
336 | @@ -1305,13 +1260,13 @@ | |||
337 | 1305 | int idx = m_notes.indexOf(note); | 1260 | int idx = m_notes.indexOf(note); |
338 | 1306 | note->setLoading(false); | 1261 | note->setLoading(false); |
339 | 1307 | 1262 | ||
340 | 1263 | handleUserError(errorCode); | ||
341 | 1308 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 1264 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
343 | 1309 | qCWarning(dcSync) << "Error saving note:" << errorMessage; | 1265 | qCWarning(dcSync) << "Unhandled error saving note:" << errorCode << "Message:" << errorMessage; |
344 | 1310 | note->setSyncError(true); | 1266 | note->setSyncError(true); |
345 | 1311 | emit dataChanged(index(idx), index(idx), QVector<int>() << RoleLoading << RoleSyncError); | 1267 | emit dataChanged(index(idx), index(idx), QVector<int>() << RoleLoading << RoleSyncError); |
346 | 1312 | return; | 1268 | return; |
347 | 1313 | } | 1269 | } |
348 | 1314 | note->setSyncError(false); | ||
349 | 1315 | 1270 | ||
350 | 1316 | note->setUpdateSequenceNumber(result.updateSequenceNum); | 1271 | note->setUpdateSequenceNumber(result.updateSequenceNum); |
351 | 1317 | note->setLastSyncedSequenceNumber(result.updateSequenceNum); | 1272 | note->setLastSyncedSequenceNumber(result.updateSequenceNum); |
352 | @@ -1328,19 +1283,25 @@ | |||
353 | 1328 | 1283 | ||
354 | 1329 | void NotesStore::saveNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::Notebook &result) | 1284 | void NotesStore::saveNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::Notebook &result) |
355 | 1330 | { | 1285 | { |
356 | 1331 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | ||
357 | 1332 | qCWarning(dcSync) << "Error saving notebook to server" << errorMessage; | ||
358 | 1333 | return; | ||
359 | 1334 | } | ||
360 | 1335 | |||
361 | 1336 | Notebook *notebook = m_notebooksHash.value(QString::fromStdString(result.guid)); | 1286 | Notebook *notebook = m_notebooksHash.value(QString::fromStdString(result.guid)); |
362 | 1337 | if (!notebook) { | 1287 | if (!notebook) { |
363 | 1338 | qCWarning(dcSync) << "Save notebook job done but notebook can't be found any more!"; | 1288 | qCWarning(dcSync) << "Save notebook job done but notebook can't be found any more!"; |
364 | 1339 | return; | 1289 | return; |
365 | 1340 | } | 1290 | } |
366 | 1291 | |||
367 | 1292 | handleUserError(errorCode); | ||
368 | 1293 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | ||
369 | 1294 | qCWarning(dcSync) << "Error saving notebook to server" << errorCode << errorMessage; | ||
370 | 1295 | notebook->setSyncError(true); | ||
371 | 1296 | emit notebookChanged(notebook->guid()); | ||
372 | 1297 | return; | ||
373 | 1298 | } | ||
374 | 1299 | |||
375 | 1300 | notebook->setLoading(false); | ||
376 | 1301 | notebook->setSyncError(false); | ||
377 | 1302 | |||
378 | 1341 | qCDebug(dcSync) << "Notebooks saved to server:" << notebook->guid(); | 1303 | qCDebug(dcSync) << "Notebooks saved to server:" << notebook->guid(); |
379 | 1342 | updateFromEDAM(result, notebook); | 1304 | updateFromEDAM(result, notebook); |
380 | 1343 | notebook->setLoading(false); | ||
381 | 1344 | emit notebookChanged(notebook->guid()); | 1305 | emit notebookChanged(notebook->guid()); |
382 | 1345 | syncToCacheFile(notebook); | 1306 | syncToCacheFile(notebook); |
383 | 1346 | } | 1307 | } |
384 | @@ -1411,6 +1372,7 @@ | |||
385 | 1411 | 1372 | ||
386 | 1412 | void NotesStore::deleteNoteJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid) | 1373 | void NotesStore::deleteNoteJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid) |
387 | 1413 | { | 1374 | { |
388 | 1375 | handleUserError(errorCode); | ||
389 | 1414 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 1376 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
390 | 1415 | qCWarning(dcSync) << "Cannot delete note from server:" << errorMessage; | 1377 | qCWarning(dcSync) << "Cannot delete note from server:" << errorMessage; |
391 | 1416 | return; | 1378 | return; |
392 | @@ -1431,6 +1393,7 @@ | |||
393 | 1431 | 1393 | ||
394 | 1432 | void NotesStore::expungeNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid) | 1394 | void NotesStore::expungeNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid) |
395 | 1433 | { | 1395 | { |
396 | 1396 | handleUserError(errorCode); | ||
397 | 1434 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { | 1397 | if (errorCode != EvernoteConnection::ErrorCodeNoError) { |
398 | 1435 | qCWarning(dcSync) << "Error expunging notebook:" << errorMessage; | 1398 | qCWarning(dcSync) << "Error expunging notebook:" << errorMessage; |
399 | 1436 | return; | 1399 | return; |
400 | @@ -1644,6 +1607,25 @@ | |||
401 | 1644 | notebook->setLastSyncedSequenceNumber(evNotebook.updateSequenceNum); | 1607 | notebook->setLastSyncedSequenceNumber(evNotebook.updateSequenceNum); |
402 | 1645 | } | 1608 | } |
403 | 1646 | 1609 | ||
404 | 1610 | bool NotesStore::handleUserError(EvernoteConnection::ErrorCode errorCode) | ||
405 | 1611 | { | ||
406 | 1612 | switch (errorCode) { | ||
407 | 1613 | case EvernoteConnection::ErrorCodeAuthExpired: | ||
408 | 1614 | m_errorQueue.append(gettext("Authentication for Evernote server expired. Please renew login information in the accounts settings.")); | ||
409 | 1615 | break; | ||
410 | 1616 | case EvernoteConnection::ErrorCodeLimitExceeded: | ||
411 | 1617 | m_errorQueue.append(gettext("Rate limit for Evernote server exceeded. Please try again later.")); | ||
412 | 1618 | break; | ||
413 | 1619 | case EvernoteConnection::ErrorCodeQutaExceeded: | ||
414 | 1620 | m_errorQueue.append(gettext("Upload quota for Evernote server exceed. Please try again later.")); | ||
415 | 1621 | break; | ||
416 | 1622 | default: | ||
417 | 1623 | return false; | ||
418 | 1624 | } | ||
419 | 1625 | emit errorChanged(); | ||
420 | 1626 | return true; | ||
421 | 1627 | } | ||
422 | 1628 | |||
423 | 1647 | 1629 | ||
424 | 1648 | void NotesStore::expungeTag(const QString &guid) | 1630 | void NotesStore::expungeTag(const QString &guid) |
425 | 1649 | { | 1631 | { |
426 | 1650 | 1632 | ||
427 | === modified file 'src/libqtevernote/notesstore.h' | |||
428 | --- src/libqtevernote/notesstore.h 2015-03-04 00:23:45 +0000 | |||
429 | +++ src/libqtevernote/notesstore.h 2015-03-08 22:06:13 +0000 | |||
430 | @@ -203,6 +203,8 @@ | |||
431 | 203 | QVector<int> updateFromEDAM(const evernote::edam::NoteMetadata &evNote, Note *note); | 203 | QVector<int> updateFromEDAM(const evernote::edam::NoteMetadata &evNote, Note *note); |
432 | 204 | void updateFromEDAM(const evernote::edam::Notebook &evNotebook, Notebook *notebook); | 204 | void updateFromEDAM(const evernote::edam::Notebook &evNotebook, Notebook *notebook); |
433 | 205 | 205 | ||
434 | 206 | bool handleUserError(EvernoteConnection::ErrorCode errorCode); | ||
435 | 207 | |||
436 | 206 | private: | 208 | private: |
437 | 207 | explicit NotesStore(QObject *parent = 0); | 209 | explicit NotesStore(QObject *parent = 0); |
438 | 208 | static NotesStore *s_instance; | 210 | static NotesStore *s_instance; |
PASSED: Continuous integration, rev:387 91.189. 93.70:8080/ job/reminders- app-ci/ 710/ 91.189. 93.70:8080/ job/generic- mediumtests- utopic/ 2310 91.189. 93.70:8080/ job/generic- mediumtests- utopic/ 2310/artifact/ work/output/ *zip*/output. zip 91.189. 93.70:8080/ job/reminders- app-utopic- amd64-ci/ 312 91.189. 93.70:8080/ job/reminders- app-vivid- amd64-ci/ 131
http://
Executed test runs:
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild: 91.189. 93.70:8080/ job/reminders- app-ci/ 710/rebuild
http://