From 4970546ecec70e89e2baece66eccfd350c499050 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Mon, 5 Aug 2013 16:40:50 -0700 Subject: Internal callbacks for ops, before and after running. --- src/core/basetypes/MCOperation.cc | 8 ++++++++ src/core/basetypes/MCOperation.h | 8 +++++++- src/core/basetypes/MCOperationQueue.cc | 13 ++++++++++--- src/core/basetypes/MCOperationQueue.h | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/core/basetypes/MCOperation.cc b/src/core/basetypes/MCOperation.cc index d42a0598..73a8d7cd 100644 --- a/src/core/basetypes/MCOperation.cc +++ b/src/core/basetypes/MCOperation.cc @@ -40,10 +40,18 @@ bool Operation::isCancelled() return value; } +void Operation::beforeMain() +{ +} + void Operation::main() { } +void Operation::afterMain() +{ +} + void Operation::start() { } diff --git a/src/core/basetypes/MCOperation.h b/src/core/basetypes/MCOperation.h index 71d0b465..bb77dbb1 100644 --- a/src/core/basetypes/MCOperation.h +++ b/src/core/basetypes/MCOperation.h @@ -18,11 +18,17 @@ namespace mailcore { virtual void setCallback(OperationCallback * callback); virtual OperationCallback * callback(); - + virtual void cancel(); virtual bool isCancelled(); + // Will be called on main thread. + virtual void beforeMain(); + virtual void main(); + + // Will be called on main thread. + virtual void afterMain(); virtual void start(); diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index 9c30ad22..c20cb907 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -84,6 +84,8 @@ void OperationQueue::runOperations() break; } + performMethodOnMainThread((Object::Method) &OperationQueue::beforeMain, op, true); + op->main(); op->retain()->autorelease(); @@ -99,9 +101,7 @@ void OperationQueue::runOperations() pthread_mutex_unlock(&mLock); if (!op->isCancelled()) { - if (op->callback() != NULL) { - performMethodOnMainThread((Object::Method) &OperationQueue::callbackOnMainThread, op, true); - } + performMethodOnMainThread((Object::Method) &OperationQueue::callbackOnMainThread, op, true); } if (needsCheckRunning) { @@ -115,8 +115,15 @@ void OperationQueue::runOperations() MCLog("cleanup thread %p", this); } +void OperationQueue::beforeMain(Operation * op) +{ + op->beforeMain(); +} + void OperationQueue::callbackOnMainThread(Operation * op) { + op->afterMain(); + if (op->isCancelled()) return; diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h index ddfe9de2..0518d62f 100644 --- a/src/core/basetypes/MCOperationQueue.h +++ b/src/core/basetypes/MCOperationQueue.h @@ -43,6 +43,7 @@ namespace mailcore { void startThread(); static void runOperationsOnThread(OperationQueue * queue); void runOperations(); + void beforeMain(Operation * op); void callbackOnMainThread(Operation * op); void checkRunningOnMainThread(void * context); void checkRunningAfterDelay(void * context); -- cgit v1.2.3