Merge lp:~mzanetti/reminders-app/improve-error-handling into lp:reminders-app

Proposed by Michael Zanetti
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
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/share/com.ubuntu.reminders/, connect to the evernote300 account, scroll from top to bottom and wait until everything is synced. Repeat twice and you'll run into the rate limit.

* 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.

To post a comment you must log in.
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
388. By Michael Zanetti

update user errors in all callbacks

Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Riccardo Padovani (rpadovani) wrote :

Looks good to me, but you discarded 4 gettext, why?

155 - message = gettext("Authentication expired.");
156 + message = "Authentication expired.";

review: Needs Information
Revision history for this message
Michael Zanetti (mzanetti) wrote :

> Looks good to me, but you discarded 4 gettext, why?
>
> 155 - message = gettext("Authentication expired.");
> 156 + message = "Authentication expired.";

Those are in the "EDAMSystemException" case. That one will only throw errors which are not to be presented to the user. The ones to be shown are in the EDAMUserException case. It's a bit odd that both have the same range of error codes, as I believe the "Authentication expired" error can never happen inside the SystemException block. Anyhow, as the api does in theory allow it, I kept the handling and still print this message to the debug output. It is not directly shown to the user any more though, so no need in making translators translate it.

Revision history for this message
Riccardo Padovani (rpadovani) wrote :

Okay, then looks good to me, thanks for the explanation!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/app/qml/components/StatusBar.qml'
--- src/app/qml/components/StatusBar.qml 2015-03-04 00:23:45 +0000
+++ src/app/qml/components/StatusBar.qml 2015-03-08 22:06:13 +0000
@@ -38,6 +38,7 @@
38 id: label38 id: label
39 width: parent.width - x39 width: parent.width - x
40 wrapMode: Text.WordWrap40 wrapMode: Text.WordWrap
41 anchors.verticalCenter: parent.verticalCenter
41 }42 }
42 }43 }
43 }44 }
4445
=== modified file 'src/libqtevernote/evernoteconnection.cpp'
--- src/libqtevernote/evernoteconnection.cpp 2015-03-08 22:06:13 +0000
+++ src/libqtevernote/evernoteconnection.cpp 2015-03-08 22:06:13 +0000
@@ -38,6 +38,7 @@
38#include <Errors_types.h>38#include <Errors_types.h>
3939
40#include <QUrl>40#include <QUrl>
41#include <QTime>
4142
42#include <libintl.h>43#include <libintl.h>
4344
@@ -65,6 +66,9 @@
65 m_userStoreHttpClient(0)66 m_userStoreHttpClient(0)
66{67{
67 qRegisterMetaType<EvernoteConnection::ErrorCode>("EvernoteConnection::ErrorCode");68 qRegisterMetaType<EvernoteConnection::ErrorCode>("EvernoteConnection::ErrorCode");
69
70 m_reconnectTimer.setSingleShot(true);
71 connect(&m_reconnectTimer, &QTimer::timeout, this, &EvernoteConnection::connectToEvernote);
68}72}
6973
70void EvernoteConnection::setupUserStore()74void EvernoteConnection::setupUserStore()
@@ -148,6 +152,10 @@
148void EvernoteConnection::disconnectFromEvernote()152void EvernoteConnection::disconnectFromEvernote()
149{153{
150 qCDebug(dcConnection) << "Disconnecting from Evernote.";154 qCDebug(dcConnection) << "Disconnecting from Evernote.";
155
156 m_errorMessage.clear();
157 emit errorChanged();
158
151 if (!isConnected()) {159 if (!isConnected()) {
152 qCWarning(dcConnection()) << "Not connected. Can't disconnect.";160 qCWarning(dcConnection()) << "Not connected. Can't disconnect.";
153 return;161 return;
@@ -314,6 +322,36 @@
314 emit errorChanged();322 emit errorChanged();
315 return false;323 return false;
316 }324 }
325 } catch (const evernote::edam::EDAMUserException &e) {
326 qCWarning(dcConnection) << "EDAMUserException getting note store path:" << e.what() << "EDAM Error Code:" << e.errorCode;
327 switch (e.errorCode) {
328 case evernote::edam::EDAMErrorCode::AUTH_EXPIRED:
329 m_errorMessage = gettext("Authentication for Evernote server expired. Please renew login information in the accounts settings.");
330 break;
331 default:
332 m_errorMessage = QString(gettext("Unknown error connecting to Evernote: %1")).arg(e.errorCode);
333 break;
334 }
335 emit errorChanged();
336 return false;
337 } catch (const evernote::edam::EDAMSystemException &e) {
338 qCWarning(dcConnection) << "EDAMSystemException getting note store path:" << e.what() << e.errorCode;
339 switch (e.errorCode) {
340 case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED:
341 m_errorMessage = gettext("Error connecting to Evernote: Rate limit exceeded. Please try again later.");
342 m_reconnectTimer.stop();
343 m_reconnectTimer.start(e.rateLimitDuration * 1000);
344 {
345 QTime time = QTime::fromMSecsSinceStartOfDay(e.rateLimitDuration * 1000);
346 qCDebug(dcConnection) << "Cannot connect. Rate limit exceeded. Reconnecting in" << time.toString("mm:ss");
347 }
348 break;
349 default:
350 m_errorMessage = gettext("Unknown error connecting to Evernote: %1");
351 break;
352 }
353 emit errorChanged();
354 return false;
317 } catch (const TTransportException & e) {355 } catch (const TTransportException & e) {
318 qCWarning(dcConnection) << "Failed to fetch notestore path:" << e.what();356 qCWarning(dcConnection) << "Failed to fetch notestore path:" << e.what();
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."));
@@ -321,7 +359,7 @@
321 return false;359 return false;
322 } catch (const TException & e) {360 } catch (const TException & e) {
323 qCWarning(dcConnection) << "Generic Thrift exception when fetching notestore path:" << e.what();361 qCWarning(dcConnection) << "Generic Thrift exception when fetching notestore path:" << e.what();
324 m_errorMessage = gettext("Unknown error connecting to Evernote");362 m_errorMessage = gettext("Unknown error connecting to Evernote.");
325 emit errorChanged();363 emit errorChanged();
326 return false;364 return false;
327 }365 }
328366
=== modified file 'src/libqtevernote/evernoteconnection.h'
--- src/libqtevernote/evernoteconnection.h 2015-03-08 22:06:13 +0000
+++ src/libqtevernote/evernoteconnection.h 2015-03-08 22:06:13 +0000
@@ -28,6 +28,7 @@
28#include <transport/THttpClient.h>28#include <transport/THttpClient.h>
2929
30#include <QObject>30#include <QObject>
31#include <QTimer>
3132
32namespace evernote {33namespace evernote {
33namespace edam {34namespace edam {
@@ -141,6 +142,8 @@
141142
142 evernote::edam::UserStoreClient *m_userstoreClient;143 evernote::edam::UserStoreClient *m_userstoreClient;
143 boost::shared_ptr<THttpClient> m_userStoreHttpClient;144 boost::shared_ptr<THttpClient> m_userStoreHttpClient;
145
146 QTimer m_reconnectTimer;
144};147};
145148
146#endif // EVERNOTECONNECTION_H149#endif // EVERNOTECONNECTION_H
147150
=== modified file 'src/libqtevernote/jobs/evernotejob.cpp'
--- src/libqtevernote/jobs/evernotejob.cpp 2015-03-08 22:06:13 +0000
+++ src/libqtevernote/jobs/evernotejob.cpp 2015-03-08 22:06:13 +0000
@@ -100,6 +100,7 @@
100 }100 }
101 } catch (const evernote::edam::EDAMUserException &e) {101 } catch (const evernote::edam::EDAMUserException &e) {
102 QString message;102 QString message;
103 EvernoteConnection::ErrorCode errorCode = EvernoteConnection::ErrorCodeUserException;
103 switch (e.errorCode) {104 switch (e.errorCode) {
104 case evernote::edam::EDAMErrorCode::UNKNOWN:105 case evernote::edam::EDAMErrorCode::UNKNOWN:
105 message = "Unknown Error: %1";106 message = "Unknown Error: %1";
@@ -118,15 +119,18 @@
118 break;119 break;
119 case evernote::edam::EDAMErrorCode::LIMIT_REACHED:120 case evernote::edam::EDAMErrorCode::LIMIT_REACHED:
120 message = "Limit reached: %1";121 message = "Limit reached: %1";
122 errorCode = EvernoteConnection::ErrorCodeLimitExceeded;
121 break;123 break;
122 case evernote::edam::EDAMErrorCode::QUOTA_REACHED:124 case evernote::edam::EDAMErrorCode::QUOTA_REACHED:
123 message = "Quota reached: %1";125 message = "Quota reached: %1";
126 errorCode = EvernoteConnection::ErrorCodeQutaExceeded;
124 break;127 break;
125 case evernote::edam::EDAMErrorCode::INVALID_AUTH:128 case evernote::edam::EDAMErrorCode::INVALID_AUTH:
126 message = "Invalid auth: %1";129 message = "Invalid auth: %1";
127 break;130 break;
128 case evernote::edam::EDAMErrorCode::AUTH_EXPIRED:131 case evernote::edam::EDAMErrorCode::AUTH_EXPIRED:
129 message = "Auth expired: %1";132 message = "Auth expired: %1";
133 errorCode = EvernoteConnection::ErrorCodeAuthExpired;
130 break;134 break;
131 case evernote::edam::EDAMErrorCode::DATA_CONFLICT:135 case evernote::edam::EDAMErrorCode::DATA_CONFLICT:
132 message = "Data conflict: %1";136 message = "Data conflict: %1";
@@ -161,26 +165,26 @@
161 }165 }
162 message = message.arg(QString::fromStdString(e.parameter));166 message = message.arg(QString::fromStdString(e.parameter));
163 qCWarning(dcJobQueue) << metaObject()->className() << "EDAMUserException:" << message;167 qCWarning(dcJobQueue) << metaObject()->className() << "EDAMUserException:" << message;
164 emitJobDone(EvernoteConnection::ErrorCodeUserException, message);168 emitJobDone(errorCode, message);
165 } catch (const evernote::edam::EDAMSystemException &e) {169 } catch (const evernote::edam::EDAMSystemException &e) {
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);
167 QString message;171 QString message;
168 EvernoteConnection::ErrorCode errorCode;172 EvernoteConnection::ErrorCode errorCode;
169 switch (e.errorCode) {173 switch (e.errorCode) {
170 case evernote::edam::EDAMErrorCode::AUTH_EXPIRED:174 case evernote::edam::EDAMErrorCode::AUTH_EXPIRED:
171 message = gettext("Authentication expired.");175 message = "Authentication expired.";
172 errorCode = EvernoteConnection::ErrorCodeAuthExpired;176 errorCode = EvernoteConnection::ErrorCodeAuthExpired;
173 break;177 break;
174 case evernote::edam::EDAMErrorCode::LIMIT_REACHED:178 case evernote::edam::EDAMErrorCode::LIMIT_REACHED:
175 message = gettext("Limit exceeded.");179 message = "Limit exceeded.";
176 errorCode = EvernoteConnection::ErrorCodeLimitExceeded;180 errorCode = EvernoteConnection::ErrorCodeLimitExceeded;
177 break;181 break;
178 case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED:182 case evernote::edam::EDAMErrorCode::RATE_LIMIT_REACHED:
179 message = gettext("Rate limit exceeded.");183 message = "Rate limit exceeded.";
180 errorCode = EvernoteConnection::ErrorCodeRateLimitExceeded;184 errorCode = EvernoteConnection::ErrorCodeRateLimitExceeded;
181 break;185 break;
182 case evernote::edam::EDAMErrorCode::QUOTA_REACHED:186 case evernote::edam::EDAMErrorCode::QUOTA_REACHED:
183 message = gettext("Quota exceeded.");187 message = "Quota exceeded.";
184 errorCode = EvernoteConnection::ErrorCodeQutaExceeded;188 errorCode = EvernoteConnection::ErrorCodeQutaExceeded;
185 break;189 break;
186 default:190 default:
187191
=== modified file 'src/libqtevernote/jobs/fetchnotejob.cpp'
--- src/libqtevernote/jobs/fetchnotejob.cpp 2015-02-26 22:47:10 +0000
+++ src/libqtevernote/jobs/fetchnotejob.cpp 2015-03-08 22:06:13 +0000
@@ -53,6 +53,8 @@
5353
54void FetchNoteJob::startJob()54void FetchNoteJob::startJob()
55{55{
56 // Just in case we error out, make sure the reply can be idenfied by note guid
57 m_result.guid = m_guid.toStdString();
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);
57}59}
5860
5961
=== modified file 'src/libqtevernote/notesstore.cpp'
--- src/libqtevernote/notesstore.cpp 2015-03-08 22:06:13 +0000
+++ src/libqtevernote/notesstore.cpp 2015-03-08 22:06:13 +0000
@@ -307,9 +307,11 @@
307307
308 notebook->setLoading(false);308 notebook->setLoading(false);
309309
310 handleUserError(errorCode);
310 if (errorCode != EvernoteConnection::ErrorCodeNoError) {311 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
311 qCWarning(dcSync) << "Error creating notebook:" << errorMessage;312 qCWarning(dcSync) << "Error creating notebook:" << errorMessage;
312 notebook->setSyncError(true);313 notebook->setSyncError(true);
314 emit notebookChanged(notebook->guid());
313 return;315 return;
314 }316 }
315 QString guid = QString::fromStdString(result.guid);317 QString guid = QString::fromStdString(result.guid);
@@ -503,6 +505,8 @@
503 }505 }
504506
505 tag->setLoading(false);507 tag->setLoading(false);
508
509 handleUserError(errorCode);
506 if (errorCode != EvernoteConnection::ErrorCodeNoError) {510 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
507 qCWarning(dcSync) << "Error creating tag on server:" << errorMessage;511 qCWarning(dcSync) << "Error creating tag on server:" << errorMessage;
508 tag->setSyncError(true);512 tag->setSyncError(true);
@@ -540,6 +544,8 @@
540 return;544 return;
541 }545 }
542 tag->setLoading(false);546 tag->setLoading(false);
547
548 handleUserError(errorCode);
543 if (errorCode != EvernoteConnection::ErrorCodeNoError) {549 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
544 qCWarning(dcSync) << "Error updating tag on server" << errorMessage;550 qCWarning(dcSync) << "Error updating tag on server" << errorMessage;
545 tag->setSyncError(true);551 tag->setSyncError(true);
@@ -625,26 +631,8 @@
625631
626void NotesStore::fetchNotesJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::NotesMetadataList &results, const QString &filterNotebookGuid)632void NotesStore::fetchNotesJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::NotesMetadataList &results, const QString &filterNotebookGuid)
627{633{
628 switch (errorCode) {634 handleUserError(errorCode);
629 case EvernoteConnection::ErrorCodeNoError:635 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
630 // All is well...
631 break;
632 case EvernoteConnection::ErrorCodeUserException:
633 qCWarning(dcSync) << "FetchNotesJobDone: EDAMUserException:" << errorMessage;
634 m_loading = false;
635 emit loadingChanged();
636 return; // silently discarding...
637 case EvernoteConnection::ErrorCodeConnectionLost:
638 qCWarning(dcSync) << "FetchNotesJobDone: Connection with evernote lost:" << errorMessage;
639 m_loading = false;
640 emit loadingChanged();
641 return; // silently discarding...
642 case EvernoteConnection::ErrorCodeNotFoundExcpetion:
643 qCWarning(dcSync) << "FetchNotesJobDone: Item not found on server:" << errorMessage;
644 m_loading = false;
645 emit loadingChanged();
646 return; // silently discarding...
647 default:
648 qCWarning(dcSync) << "FetchNotesJobDone: Failed to fetch notes list:" << errorMessage << errorCode;636 qCWarning(dcSync) << "FetchNotesJobDone: Failed to fetch notes list:" << errorMessage << errorCode;
649 m_loading = false;637 m_loading = false;
650 emit loadingChanged();638 emit loadingChanged();
@@ -825,24 +813,10 @@
825 QModelIndex noteIndex = index(m_notes.indexOf(note));813 QModelIndex noteIndex = index(m_notes.indexOf(note));
826 QVector<int> roles;814 QVector<int> roles;
827815
828 switch (errorCode) {816 handleUserError(errorCode);
829 case EvernoteConnection::ErrorCodeNoError:817 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
830 // All is well818 note->setLoading(false);
831 break;819 roles << RoleLoading;
832 case EvernoteConnection::ErrorCodeUserException:
833 qCWarning(dcSync) << "FetchNoteJobDone: EDAMUserException:" << errorMessage;
834 emit dataChanged(noteIndex, noteIndex, roles);
835 return; // silently discarding...
836 case EvernoteConnection::ErrorCodeConnectionLost:
837 qCWarning(dcSync) << "FetchNoteJobDone: Connection with evernote lost:" << errorMessage;
838 emit dataChanged(noteIndex, noteIndex, roles);
839 return; // silently discarding...
840 case EvernoteConnection::ErrorCodeNotFoundExcpetion:
841 qCWarning(dcSync) << "FetchNoteJobDone: Item not found on server:" << errorMessage;
842 emit dataChanged(noteIndex, noteIndex, roles);
843 return; // silently discarding...
844 default:
845 qCWarning(dcSync) << "FetchNoteJobDone: Failed to fetch note content:" << errorMessage << errorCode;
846 note->setSyncError(true);820 note->setSyncError(true);
847 roles << RoleSyncError;821 roles << RoleSyncError;
848 emit dataChanged(noteIndex, noteIndex, roles);822 emit dataChanged(noteIndex, noteIndex, roles);
@@ -952,20 +926,10 @@
952 m_notebooksLoading = false;926 m_notebooksLoading = false;
953 emit notebooksLoadingChanged();927 emit notebooksLoadingChanged();
954928
955 switch (errorCode) {929 handleUserError(errorCode);
956 case EvernoteConnection::ErrorCodeNoError:930 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
957 // All is well...
958 break;
959 case EvernoteConnection::ErrorCodeUserException:
960 qCWarning(dcSync) << "FetchNotebooksJobDone: EDAMUserException:" << errorMessage;
961 // silently discarding...
962 return;
963 case EvernoteConnection::ErrorCodeConnectionLost:
964 qCWarning(dcSync) << "FetchNotebooksJobDone: Connection lost:" << errorMessage;
965 return; // silently discarding
966 default:
967 qCWarning(dcSync) << "FetchNotebooksJobDone: Failed to fetch notes list:" << errorMessage << errorCode;931 qCWarning(dcSync) << "FetchNotebooksJobDone: Failed to fetch notes list:" << errorMessage << errorCode;
968 return; // silently discarding932 return;
969 }933 }
970934
971 QList<Notebook*> unhandledNotebooks = m_notebooks;935 QList<Notebook*> unhandledNotebooks = m_notebooks;
@@ -1064,20 +1028,10 @@
1064 m_tagsLoading = false;1028 m_tagsLoading = false;
1065 emit tagsLoadingChanged();1029 emit tagsLoadingChanged();
10661030
1067 switch (errorCode) {1031 handleUserError(errorCode);
1068 case EvernoteConnection::ErrorCodeNoError:1032 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1069 // All is well...
1070 break;
1071 case EvernoteConnection::ErrorCodeUserException:
1072 qCWarning(dcSync) << "FetchTagsJobDone: EDAMUserException:" << errorMessage;
1073 // silently discarding...
1074 return;
1075 case EvernoteConnection::ErrorCodeConnectionLost:
1076 qCWarning(dcSync) << "FetchTagsJobDone: Connection lost:" << errorMessage;
1077 return; // silently discarding
1078 default:
1079 qCWarning(dcSync) << "FetchTagsJobDone: Failed to fetch notes list:" << errorMessage << errorCode;1033 qCWarning(dcSync) << "FetchTagsJobDone: Failed to fetch notes list:" << errorMessage << errorCode;
1080 return; // silently discarding1034 return;
1081 }1035 }
10821036
1083 QHash<QString, Tag*> unhandledTags = m_tagsHash;1037 QHash<QString, Tag*> unhandledTags = m_tagsHash;
@@ -1204,6 +1158,7 @@
1204 note->setLoading(false);1158 note->setLoading(false);
1205 roles << RoleLoading;1159 roles << RoleLoading;
12061160
1161 handleUserError(errorCode);
1207 if (errorCode != EvernoteConnection::ErrorCodeNoError) {1162 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1208 qCWarning(dcSync) << "Error creating note on server:" << tmpGuid << errorMessage;1163 qCWarning(dcSync) << "Error creating note on server:" << tmpGuid << errorMessage;
1209 note->setSyncError(true);1164 note->setSyncError(true);
@@ -1305,13 +1260,13 @@
1305 int idx = m_notes.indexOf(note);1260 int idx = m_notes.indexOf(note);
1306 note->setLoading(false);1261 note->setLoading(false);
13071262
1263 handleUserError(errorCode);
1308 if (errorCode != EvernoteConnection::ErrorCodeNoError) {1264 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1309 qCWarning(dcSync) << "Error saving note:" << errorMessage;1265 qCWarning(dcSync) << "Unhandled error saving note:" << errorCode << "Message:" << errorMessage;
1310 note->setSyncError(true);1266 note->setSyncError(true);
1311 emit dataChanged(index(idx), index(idx), QVector<int>() << RoleLoading << RoleSyncError);1267 emit dataChanged(index(idx), index(idx), QVector<int>() << RoleLoading << RoleSyncError);
1312 return;1268 return;
1313 }1269 }
1314 note->setSyncError(false);
13151270
1316 note->setUpdateSequenceNumber(result.updateSequenceNum);1271 note->setUpdateSequenceNumber(result.updateSequenceNum);
1317 note->setLastSyncedSequenceNumber(result.updateSequenceNum);1272 note->setLastSyncedSequenceNumber(result.updateSequenceNum);
@@ -1328,19 +1283,25 @@
13281283
1329void NotesStore::saveNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::Notebook &result)1284void NotesStore::saveNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const evernote::edam::Notebook &result)
1330{1285{
1331 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1332 qCWarning(dcSync) << "Error saving notebook to server" << errorMessage;
1333 return;
1334 }
1335
1336 Notebook *notebook = m_notebooksHash.value(QString::fromStdString(result.guid));1286 Notebook *notebook = m_notebooksHash.value(QString::fromStdString(result.guid));
1337 if (!notebook) {1287 if (!notebook) {
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!";
1339 return;1289 return;
1340 }1290 }
1291
1292 handleUserError(errorCode);
1293 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1294 qCWarning(dcSync) << "Error saving notebook to server" << errorCode << errorMessage;
1295 notebook->setSyncError(true);
1296 emit notebookChanged(notebook->guid());
1297 return;
1298 }
1299
1300 notebook->setLoading(false);
1301 notebook->setSyncError(false);
1302
1341 qCDebug(dcSync) << "Notebooks saved to server:" << notebook->guid();1303 qCDebug(dcSync) << "Notebooks saved to server:" << notebook->guid();
1342 updateFromEDAM(result, notebook);1304 updateFromEDAM(result, notebook);
1343 notebook->setLoading(false);
1344 emit notebookChanged(notebook->guid());1305 emit notebookChanged(notebook->guid());
1345 syncToCacheFile(notebook);1306 syncToCacheFile(notebook);
1346}1307}
@@ -1411,6 +1372,7 @@
14111372
1412void NotesStore::deleteNoteJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid)1373void NotesStore::deleteNoteJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid)
1413{1374{
1375 handleUserError(errorCode);
1414 if (errorCode != EvernoteConnection::ErrorCodeNoError) {1376 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1415 qCWarning(dcSync) << "Cannot delete note from server:" << errorMessage;1377 qCWarning(dcSync) << "Cannot delete note from server:" << errorMessage;
1416 return;1378 return;
@@ -1431,6 +1393,7 @@
14311393
1432void NotesStore::expungeNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid)1394void NotesStore::expungeNotebookJobDone(EvernoteConnection::ErrorCode errorCode, const QString &errorMessage, const QString &guid)
1433{1395{
1396 handleUserError(errorCode);
1434 if (errorCode != EvernoteConnection::ErrorCodeNoError) {1397 if (errorCode != EvernoteConnection::ErrorCodeNoError) {
1435 qCWarning(dcSync) << "Error expunging notebook:" << errorMessage;1398 qCWarning(dcSync) << "Error expunging notebook:" << errorMessage;
1436 return;1399 return;
@@ -1644,6 +1607,25 @@
1644 notebook->setLastSyncedSequenceNumber(evNotebook.updateSequenceNum);1607 notebook->setLastSyncedSequenceNumber(evNotebook.updateSequenceNum);
1645}1608}
16461609
1610bool NotesStore::handleUserError(EvernoteConnection::ErrorCode errorCode)
1611{
1612 switch (errorCode) {
1613 case EvernoteConnection::ErrorCodeAuthExpired:
1614 m_errorQueue.append(gettext("Authentication for Evernote server expired. Please renew login information in the accounts settings."));
1615 break;
1616 case EvernoteConnection::ErrorCodeLimitExceeded:
1617 m_errorQueue.append(gettext("Rate limit for Evernote server exceeded. Please try again later."));
1618 break;
1619 case EvernoteConnection::ErrorCodeQutaExceeded:
1620 m_errorQueue.append(gettext("Upload quota for Evernote server exceed. Please try again later."));
1621 break;
1622 default:
1623 return false;
1624 }
1625 emit errorChanged();
1626 return true;
1627}
1628
16471629
1648void NotesStore::expungeTag(const QString &guid)1630void NotesStore::expungeTag(const QString &guid)
1649{1631{
16501632
=== modified file 'src/libqtevernote/notesstore.h'
--- src/libqtevernote/notesstore.h 2015-03-04 00:23:45 +0000
+++ src/libqtevernote/notesstore.h 2015-03-08 22:06:13 +0000
@@ -203,6 +203,8 @@
203 QVector<int> updateFromEDAM(const evernote::edam::NoteMetadata &evNote, Note *note);203 QVector<int> updateFromEDAM(const evernote::edam::NoteMetadata &evNote, Note *note);
204 void updateFromEDAM(const evernote::edam::Notebook &evNotebook, Notebook *notebook);204 void updateFromEDAM(const evernote::edam::Notebook &evNotebook, Notebook *notebook);
205205
206 bool handleUserError(EvernoteConnection::ErrorCode errorCode);
207
206private:208private:
207 explicit NotesStore(QObject *parent = 0);209 explicit NotesStore(QObject *parent = 0);
208 static NotesStore *s_instance;210 static NotesStore *s_instance;

Subscribers

People subscribed via source and target branches