Merge lp:~mzanetti/reminders-app/no-network into lp:reminders-app

Proposed by Michael Zanetti
Status: Merged
Approved by: Riccardo Padovani
Approved revision: 112
Merged at revision: 110
Proposed branch: lp:~mzanetti/reminders-app/no-network
Merge into: lp:reminders-app
Diff against target: 240 lines (+102/-80)
4 files modified
src/plugin/Evernote/evernoteconnection.cpp (+86/-75)
src/plugin/Evernote/evernoteconnection.h (+4/-3)
src/plugin/Evernote/jobs/notesstorejob.cpp (+6/-1)
src/plugin/Evernote/jobs/userstorejob.cpp (+6/-1)
To merge this branch: bzr merge lp:~mzanetti/reminders-app/no-network
Reviewer Review Type Date Requested Status
Riccardo Padovani Approve
Ubuntu Phone Apps Jenkins Bot continuous-integration Approve
Review via email: mp+217820@code.launchpad.net

Commit message

Make the app more robust against network outtakes.

Description of the change

This makes the app not crash when there's no network connection at startup.

Basically it moves the part that could fail from setupUserStore() and setupNotesStore() into a separate method connectToEvernote() which just does the open() on the network sockets (also checks the server's version number and prints a note for us that we should update it).

The jobs were already smart enough to reopen the connection on demand. I just added a small check for them to be opened before closing them to avoid the exception bailing out before reaching the open() call.

Now the app should recover automatically if the network fails for a while and comes back after.

Still TODO:
* Expose connection errors to the ui and show them to the user somehow.
* Use QNetworkConfigurationManager to detect when a connection comes up and refresh the notes store.

To post a comment you must log in.
111. By Michael Zanetti

remove debug prints

Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
112. By Michael Zanetti

flush the pipes when reestablishing the connection

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 :

It's a good start, at least there are no crashes.

As said on IRC, if I disconnect before launch the app it doesn't riconnect, but as said on IRC you will investigate on this in the future and will do another branch

Good work!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/plugin/Evernote/evernoteconnection.cpp'
2--- src/plugin/Evernote/evernoteconnection.cpp 2014-02-18 14:04:33 +0000
3+++ src/plugin/Evernote/evernoteconnection.cpp 2014-04-30 20:46:23 +0000
4@@ -61,81 +61,56 @@
5 qRegisterMetaType<EvernoteConnection::ErrorCode>("EvernoteConnection::ErrorCode");
6 setupUserStore();
7 setupNotesStore();
8-}
9-
10-bool EvernoteConnection::setupUserStore()
11-{
12- bool versionOK = false;
13- try {
14- boost::shared_ptr<TSocket> socket;
15-
16- if (m_useSSL) {
17- boost::shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
18- socket = sslSocketFactory->createSocket(EVERNOTE_HOST.toStdString(), 443);
19- qDebug() << "created UserStore SSL socket";
20- } else {
21- // Create a non-secure socket
22- socket = boost::shared_ptr<TSocket> (new TSocket(EVERNOTE_HOST.toStdString(), 80));
23- qDebug() << "created insecure UserStore socket";
24- }
25-
26- boost::shared_ptr<TBufferedTransport> bufferedTransport(new TBufferedTransport(socket));
27- m_userStoreHttpClient = boost::shared_ptr<THttpClient>(new THttpClient(bufferedTransport,
28- EVERNOTE_HOST.toStdString(),
29- EDAM_USER_STORE_PATH.toStdString()));
30- m_userStoreHttpClient->open();
31- boost::shared_ptr<TProtocol> iprot(new TBinaryProtocol(m_userStoreHttpClient));
32- m_userstoreClient = new evernote::edam::UserStoreClient(iprot);
33- evernote::edam::UserStoreConstants constants;
34- versionOK = m_userstoreClient->checkVersion(EDAM_CLIENT_NAME.toStdString(),
35- constants.EDAM_VERSION_MAJOR,
36- constants.EDAM_VERSION_MINOR);
37- qDebug() << "UserStoreClient created. Version check:" << versionOK;
38-
39- } catch (const TTransportException & e) {
40- qWarning() << "Failed to create Transport for UserStore:" << e.what();
41- } catch (const TException & e) {
42- qWarning() << "Generic Thrift exception in UserStore setup:" << e.what();
43- }
44- return versionOK;
45-}
46-
47-bool EvernoteConnection::setupNotesStore()
48-{
49- try {
50- boost::shared_ptr<TSocket> socket;
51-
52- if (m_useSSL) {
53- boost::shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
54- socket = sslSocketFactory->createSocket(EVERNOTE_HOST.toStdString(), 443);
55- qDebug() << "created NotesStore SSL socket";
56- } else {
57- // Create a non-secure socket
58- socket = boost::shared_ptr<TSocket> (new TSocket(EVERNOTE_HOST.toStdString(), 80));
59- qDebug() << "created insecure NotesStore socket";
60- }
61-
62- // setup UserStore
63- boost::shared_ptr<TBufferedTransport> bufferedTransport(new TBufferedTransport(socket));
64- m_notesStoreHttpClient = boost::shared_ptr<THttpClient>(new THttpClient(bufferedTransport,
65- EVERNOTE_HOST.toStdString(),
66- EDAM_NOTE_STORE_PATH.toStdString()));
67- m_notesStoreHttpClient->open();
68- boost::shared_ptr<TProtocol> iprot(new TBinaryProtocol(m_notesStoreHttpClient));
69-
70- // setup notesstore
71- m_notesStoreClient = new evernote::edam::NoteStoreClient(iprot);
72-
73- qDebug() << "NoteStore client created.";
74-
75- } catch (const TTransportException & e) {
76- qWarning() << "Failed to create Transport for NotesStore:" << e.what();
77- return false;
78- } catch (const TException & e) {
79- qWarning() << "Generic Thrift exception in NotesStore setup:" << e.what();
80- return false;
81- }
82- return true;
83+
84+ connectToEvernote();
85+}
86+
87+void EvernoteConnection::setupUserStore()
88+{
89+ boost::shared_ptr<TSocket> socket;
90+
91+ if (m_useSSL) {
92+ boost::shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
93+ socket = sslSocketFactory->createSocket(EVERNOTE_HOST.toStdString(), 443);
94+ qDebug() << "created UserStore SSL socket";
95+ } else {
96+ // Create a non-secure socket
97+ socket = boost::shared_ptr<TSocket> (new TSocket(EVERNOTE_HOST.toStdString(), 80));
98+ qDebug() << "created insecure UserStore socket";
99+ }
100+
101+ // setup UserStore client
102+ boost::shared_ptr<TBufferedTransport> bufferedTransport(new TBufferedTransport(socket));
103+ m_userStoreHttpClient = boost::shared_ptr<THttpClient>(new THttpClient(bufferedTransport,
104+ EVERNOTE_HOST.toStdString(),
105+ EDAM_USER_STORE_PATH.toStdString()));
106+
107+ boost::shared_ptr<TProtocol> userstoreiprot(new TBinaryProtocol(m_userStoreHttpClient));
108+ m_userstoreClient = new evernote::edam::UserStoreClient(userstoreiprot);
109+}
110+
111+void EvernoteConnection::setupNotesStore()
112+{
113+ boost::shared_ptr<TSocket> socket;
114+
115+ if (m_useSSL) {
116+ boost::shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
117+ socket = sslSocketFactory->createSocket(EVERNOTE_HOST.toStdString(), 443);
118+ qDebug() << "created NotesStore SSL socket";
119+ } else {
120+ // Create a non-secure socket
121+ socket = boost::shared_ptr<TSocket> (new TSocket(EVERNOTE_HOST.toStdString(), 80));
122+ qDebug() << "created insecure NotesStore socket";
123+ }
124+
125+ // setup NotesStore client
126+ boost::shared_ptr<TBufferedTransport> bufferedTransport(new TBufferedTransport(socket));
127+ m_notesStoreHttpClient = boost::shared_ptr<THttpClient>(new THttpClient(bufferedTransport,
128+ EVERNOTE_HOST.toStdString(),
129+ EDAM_NOTE_STORE_PATH.toStdString()));
130+
131+ boost::shared_ptr<TProtocol> notesstoreiprot(new TBinaryProtocol(m_notesStoreHttpClient));
132+ m_notesStoreClient = new evernote::edam::NoteStoreClient(notesstoreiprot);
133 }
134
135 EvernoteConnection *EvernoteConnection::instance()
136@@ -171,6 +146,42 @@
137 }
138 }
139
140+void EvernoteConnection::connectToEvernote()
141+{
142+ if (m_userStoreHttpClient->isOpen() && m_notesStoreHttpClient->isOpen()) {
143+ return;
144+ }
145+
146+ try {
147+ m_userStoreHttpClient->open();
148+ qDebug() << "UserStoreClient socket opened.";
149+
150+ m_notesStoreHttpClient->open();
151+ qDebug() << "NoteStoreClient socket opened.";
152+
153+ } catch (const TTransportException & e) {
154+ qWarning() << "Failed to open connection:" << e.what();
155+ } catch (const TException & e) {
156+ qWarning() << "Generic Thrift exception when opening the connection:" << e.what();
157+ }
158+
159+ try {
160+ evernote::edam::UserStoreConstants constants;
161+ bool versionOk = m_userstoreClient->checkVersion(EDAM_CLIENT_NAME.toStdString(),
162+ constants.EDAM_VERSION_MAJOR,
163+ constants.EDAM_VERSION_MINOR);
164+
165+ if (!versionOk) {
166+ qWarning() << "Server version mismatch! This application should be updated!";
167+ }
168+
169+ } catch (const TTransportException & e) {
170+ qWarning() << "Failed to fetch server version:" << e.what();
171+ } catch (const TException & e) {
172+ qWarning() << "Generic Thrift exception when fetching server version:" << e.what();
173+ }
174+}
175+
176 void EvernoteConnection::enqueue(EvernoteJob *job)
177 {
178 connect(job, &EvernoteJob::finished, this, &EvernoteConnection::startNextJob);
179
180=== modified file 'src/plugin/Evernote/evernoteconnection.h'
181--- src/plugin/Evernote/evernoteconnection.h 2014-02-06 00:01:52 +0000
182+++ src/plugin/Evernote/evernoteconnection.h 2014-04-30 20:46:23 +0000
183@@ -72,6 +72,8 @@
184 void tokenChanged();
185
186 private slots:
187+ void connectToEvernote();
188+
189 void startJobQueue();
190 void startNextJob();
191
192@@ -79,11 +81,10 @@
193 explicit EvernoteConnection(QObject *parent = 0);
194 static EvernoteConnection *s_instance;
195
196- bool setupUserStore();
197- bool setupNotesStore();
198+ void setupUserStore();
199+ void setupNotesStore();
200
201 bool m_useSSL;
202-
203 QString m_token;
204
205 // There must be only one job running at a time
206
207=== modified file 'src/plugin/Evernote/jobs/notesstorejob.cpp'
208--- src/plugin/Evernote/jobs/notesstorejob.cpp 2014-01-27 13:00:41 +0000
209+++ src/plugin/Evernote/jobs/notesstorejob.cpp 2014-04-30 20:46:23 +0000
210@@ -29,7 +29,12 @@
211
212 void NotesStoreJob::resetConnection()
213 {
214- EvernoteConnection::instance()->m_notesStoreHttpClient->close();
215+ if (EvernoteConnection::instance()->m_notesStoreHttpClient->isOpen()) {
216+ EvernoteConnection::instance()->m_notesStoreHttpClient->close();
217+ }
218+ try {
219+ EvernoteConnection::instance()->m_notesStoreHttpClient->readEnd();
220+ } catch(...) {}
221 EvernoteConnection::instance()->m_notesStoreHttpClient->open();
222 }
223
224
225=== modified file 'src/plugin/Evernote/jobs/userstorejob.cpp'
226--- src/plugin/Evernote/jobs/userstorejob.cpp 2014-01-27 13:00:41 +0000
227+++ src/plugin/Evernote/jobs/userstorejob.cpp 2014-04-30 20:46:23 +0000
228@@ -29,7 +29,12 @@
229
230 void UserStoreJob::resetConnection()
231 {
232- EvernoteConnection::instance()->m_userStoreHttpClient->close();
233+ if (EvernoteConnection::instance()->m_userStoreHttpClient->isOpen()) {
234+ EvernoteConnection::instance()->m_userStoreHttpClient->close();
235+ }
236+ try {
237+ EvernoteConnection::instance()->m_userStoreHttpClient->readEnd();
238+ } catch(...) {}
239 EvernoteConnection::instance()->m_userStoreHttpClient->open();
240 }
241

Subscribers

People subscribed via source and target branches