diff options
author | 2013-08-05 16:40:50 -0700 | |
---|---|---|
committer | 2013-08-05 16:40:50 -0700 | |
commit | 4970546ecec70e89e2baece66eccfd350c499050 (patch) | |
tree | 5e30fde0455b9b6b50e79524c0279dc1abdc1b9d | |
parent | becd63c496705796ae3f8d9fb5bf277a460a6ea3 (diff) |
Internal callbacks for ops, before and after running.
-rw-r--r-- | src/core/basetypes/MCOperation.cc | 8 | ||||
-rw-r--r-- | src/core/basetypes/MCOperation.h | 8 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 13 | ||||
-rw-r--r-- | 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); |