diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-11-11 13:06:27 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-11-11 15:26:32 +0100 |
commit | 4e6b3ce7d1ce97c3e1fb9ae53c5b2be1787acc6b (patch) | |
tree | 08d80bbe1cc890f949110a760cba18e8f2b5249b /examples/imapresource/imapresource.cpp | |
parent | e5bec3abfe2f2463244d65386dbd1088bf56f5f3 (diff) | |
download | sink-4e6b3ce7d1ce97c3e1fb9ae53c5b2be1787acc6b.tar.gz sink-4e6b3ce7d1ce97c3e1fb9ae53c5b2be1787acc6b.zip |
Prepared new query based synchronization API
Diffstat (limited to 'examples/imapresource/imapresource.cpp')
-rw-r--r-- | examples/imapresource/imapresource.cpp | 121 |
1 files changed, 91 insertions, 30 deletions
diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index d5a59b9..302d681 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp | |||
@@ -272,41 +272,102 @@ public: | |||
272 | 272 | ||
273 | } | 273 | } |
274 | 274 | ||
275 | KAsync::Job<void> synchronizeWithSource(const Sink::QueryBase &query) Q_DECL_OVERRIDE | 275 | QList<Synchronizer::SyncRequest> getSyncRequests(const Sink::QueryBase &query) Q_DECL_OVERRIDE |
276 | { | 276 | { |
277 | SinkLog() << " Synchronizing"; | 277 | QList<Synchronizer::SyncRequest> list; |
278 | return KAsync::start<void>([this]() { | 278 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Mail>()) { |
279 | SinkTrace() << "Connecting to:" << mServer << mPort; | 279 | list << Synchronizer::SyncRequest{query}; |
280 | SinkTrace() << "as:" << mUser; | 280 | } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { |
281 | auto imap = QSharedPointer<ImapServerProxy>::create(mServer, mPort); | 281 | list << Synchronizer::SyncRequest{query}; |
282 | } else { | ||
283 | list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName<ApplicationDomain::Folder>())}; | ||
284 | list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName<ApplicationDomain::Mail>())}; | ||
285 | } | ||
286 | return list; | ||
287 | } | ||
282 | 288 | ||
283 | return imap->login(mUser, mPassword) | 289 | KAsync::Job<void> login(QSharedPointer<ImapServerProxy> imap) |
284 | .addToContext(imap) | 290 | { |
285 | .onError([](const KAsync::Error &error) { | 291 | SinkTrace() << "Connecting to:" << mServer << mPort; |
286 | SinkWarning() << "Login failed."; | 292 | SinkTrace() << "as:" << mUser; |
287 | }) | 293 | return imap->login(mUser, mPassword) |
288 | .then<QVector<Folder>>([this, imap]() { | 294 | .addToContext(imap) |
289 | auto folderList = QSharedPointer<QVector<Folder>>::create(); | 295 | .onError([](const KAsync::Error &error) { |
290 | SinkLog() << "Login was successful"; | 296 | SinkWarning() << "Login failed."; |
291 | return imap->fetchFolders([folderList](const Folder &folder) { | 297 | }); |
292 | *folderList << folder; | 298 | } |
293 | }) | 299 | |
294 | .onError([](const KAsync::Error &error) { | 300 | KAsync::Job<void> synchronizeWithSource(const Sink::QueryBase &query) Q_DECL_OVERRIDE |
295 | SinkWarning() << "Folder list sync failed."; | 301 | { |
302 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { | ||
303 | return KAsync::start<void>([this]() { | ||
304 | auto imap = QSharedPointer<ImapServerProxy>::create(mServer, mPort); | ||
305 | auto job = login(imap); | ||
306 | job = job.then<QVector<Folder>>([this, imap]() { | ||
307 | auto folderList = QSharedPointer<QVector<Folder>>::create(); | ||
308 | return imap->fetchFolders([folderList](const Folder &folder) { | ||
309 | *folderList << folder; | ||
310 | }) | ||
311 | .onError([](const KAsync::Error &error) { | ||
312 | SinkWarning() << "Folder list sync failed."; | ||
313 | }) | ||
314 | .syncThen<QVector<Folder>>([this, folderList]() { | ||
315 | synchronizeFolders(*folderList); | ||
316 | commit(); | ||
317 | return *folderList; | ||
318 | }); | ||
319 | }); | ||
320 | return job; | ||
321 | }); | ||
322 | } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Mail>()) { | ||
323 | //TODO | ||
324 | //if we have a folder filter: | ||
325 | //* execute the folder query and resolve the results to the remote identifier | ||
326 | //* query only those folders | ||
327 | //if we have a date filter: | ||
328 | //* apply the date filter to the fetch | ||
329 | //if we have no folder filter: | ||
330 | //* fetch list of folders from server directly and sync (because we have no guarantee that the folder sync was already processed by the pipeline). | ||
331 | return KAsync::start<void>([this, query]() { | ||
332 | auto imap = QSharedPointer<ImapServerProxy>::create(mServer, mPort); | ||
333 | auto job = login(imap); | ||
334 | job = job.then<QVector<Folder>>([this, imap, query]() { | ||
335 | SinkLog() << "Login was successful"; | ||
336 | //FIXME If we were able to to flush in between we could just query the local store for the folder list. | ||
337 | // | ||
338 | if (query.hasFilter<ApplicationDomain::Mail::Folder>()) { | ||
339 | QVector<Folder> folders; | ||
340 | auto folderFilter = query.getFilter<ApplicationDomain::Mail::Folder>(); | ||
341 | auto localIds = resolveFilter(folderFilter); | ||
342 | auto folderRemoteIds = syncStore().resolveLocalIds(ApplicationDomain::getTypeName<ApplicationDomain::Folder>(), localIds); | ||
343 | for (const auto &r : folderRemoteIds) { | ||
344 | folders << Folder{r}; | ||
345 | } | ||
346 | return KAsync::value(folders); | ||
347 | } else { | ||
348 | auto folderList = QSharedPointer<QVector<Folder>>::create(); | ||
349 | return imap->fetchFolders([folderList](const Folder &folder) { | ||
350 | *folderList << folder; | ||
351 | }) | ||
352 | .onError([](const KAsync::Error &error) { | ||
353 | SinkWarning() << "Folder list sync failed."; | ||
354 | }) | ||
355 | .syncThen<QVector<Folder>>([this, folderList]() { | ||
356 | return *folderList; | ||
357 | }); | ||
358 | } | ||
296 | }) | 359 | }) |
297 | .syncThen<QVector<Folder>>([this, folderList]() { | 360 | .serialEach<void>([this, imap](const Folder &folder) { |
298 | synchronizeFolders(*folderList); | 361 | if (folder.noselect) { |
299 | commit(); | 362 | return KAsync::null<void>(); |
300 | return *folderList; | 363 | } |
364 | return synchronizeFolder(imap, folder); | ||
301 | }); | 365 | }); |
302 | }) | 366 | |
303 | .serialEach<void>([this, imap](const Folder &folder) { | 367 | return job; |
304 | if (folder.noselect) { | ||
305 | return KAsync::null<void>(); | ||
306 | } | ||
307 | return synchronizeFolder(imap, folder); | ||
308 | }); | 368 | }); |
309 | }); | 369 | } |
370 | return KAsync::error<void>("Nothing to do"); | ||
310 | } | 371 | } |
311 | 372 | ||
312 | public: | 373 | public: |