diff options
Diffstat (limited to 'src/java/native/com_libmailcore_Operation.cpp')
-rw-r--r-- | src/java/native/com_libmailcore_Operation.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/java/native/com_libmailcore_Operation.cpp b/src/java/native/com_libmailcore_Operation.cpp new file mode 100644 index 00000000..dfd8c64c --- /dev/null +++ b/src/java/native/com_libmailcore_Operation.cpp @@ -0,0 +1,64 @@ +#include "com_libmailcore_Operation.h" + +#include "TypesUtils.h" +#include "JavaHandle.h" +#include "MCOperation.h" +#include "MCDefines.h" + +using namespace mailcore; + +#define nativeType Operation +#define javaType nativeType + +class JavaOperationCallback : public Object, public OperationCallback { +public: + JavaOperationCallback(JNIEnv * env, jobject obj) { + mEnv = env; + mGlobalRef = env->NewGlobalRef(obj); + } + + virtual ~JavaOperationCallback() { + if (mGlobalRef != NULL) { + mEnv->DeleteGlobalRef(mGlobalRef); + mGlobalRef = NULL; + } + } + + virtual void operationFinished(Operation * op) + { + jclass cls = mEnv->GetObjectClass(mGlobalRef); + jmethodID mid = mEnv->GetMethodID(cls, "callCallback", "()V"); + mEnv->CallVoidMethod(mGlobalRef, mid); + + mEnv->DeleteGlobalRef(mGlobalRef); + mGlobalRef = NULL; + + this->release(); + } + +private: + JNIEnv * mEnv; + jobject mGlobalRef; +}; + +JNIEXPORT void JNICALL Java_com_libmailcore_Operation_cancel + (JNIEnv * env, jobject obj) +{ + MC_JAVA_NATIVE_INSTANCE->cancel(); +} + +JNIEXPORT jboolean JNICALL Java_com_libmailcore_Operation_isCancelled + (JNIEnv * env, jobject obj) +{ + return MC_JAVA_BRIDGE_GET_SCALAR(jboolean, isCancelled); +} + +JNIEXPORT void JNICALL Java_com_libmailcore_Operation_nativeStart + (JNIEnv * env, jobject obj) +{ + JavaOperationCallback * callback = new JavaOperationCallback(env, obj); + MC_JAVA_NATIVE_INSTANCE->setCallback(callback); + MC_JAVA_NATIVE_INSTANCE->start(); +} + +MC_JAVA_BRIDGE |