aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java/TypesUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/TypesUtils.h')
-rw-r--r--src/java/TypesUtils.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/java/TypesUtils.h b/src/java/TypesUtils.h
new file mode 100644
index 00000000..67430c72
--- /dev/null
+++ b/src/java/TypesUtils.h
@@ -0,0 +1,120 @@
+#ifndef MAILCORE_TYPES_UTILS_H
+
+#define MAILCORE_TYPES_UTILS_H
+
+#include <typeinfo>
+#include <jni.h>
+#include "MCBaseTypes.h"
+#include "MCDefines.h"
+#include "MCRange.h"
+
+#define MC_TO_JAVA(obj) mailcore::mcObjectToJava(env, (Object *) obj)
+#define MC_FROM_JAVA(type, obj) ((type *) mailcore::javaToMCObject(env, (jobject) obj))
+#define MC_JAVA_NATIVE_INSTANCE ((nativeType *) mailcore::getHandle(env, obj))
+#define MC_JAVA_BRIDGE_GET(getter) MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter())
+#define MC_JAVA_BRIDGE_GET_STRING(getter) ((jstring) MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter()))
+#define MC_JAVA_BRIDGE_GET_DATA(getter) ((jbyteArray) MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter()))
+#define MC_JAVA_BRIDGE_GET_SCALAR(javaScalarType, getter) ((javaScalarType) MC_JAVA_NATIVE_INSTANCE->getter())
+
+#define MC_JAVA_SYNTHESIZE(type, setter, getter) MC_JAVA_SYNTHESIZE_internal(type, javaType, setter, getter)
+#define MC_JAVA_SYNTHESIZE_STRING(setter, getter) MC_JAVA_SYNTHESIZE_STRING_internal(javaType, setter, getter)
+#define MC_JAVA_SYNTHESIZE_DATA(setter, getter) MC_JAVA_SYNTHESIZE_DATA_internal(javaType, setter, getter)
+#define MC_JAVA_SYNTHESIZE_SCALAR(javaScalarType, scalarType, setter, getter) MC_JAVA_SYNTHESIZE_SCALAR_internal(javaScalarType, scalarType, javaType, setter, getter)
+#define MC_JAVA_BRIDGE MC_JAVA_BRIDGE_internal(javaType, nativeType)
+
+#define MC_JAVA_CONCAT(a, b) a ## b
+//#define prefix MC_JAVA_CONCAT(prefix1, _)
+//#define prefix(nativeType) Java_com_libmailcore_ ## nativeType ## _
+#define prefixed_function(javaType, function_name) Java_com_libmailcore_ ## javaType ## _ ## function_name
+
+#define MC_JAVA_SYNTHESIZE_internal(type, javaType, setter, getter) \
+ JNIEXPORT jobject JNICALL prefixed_function(javaType, getter) (JNIEnv * env, jobject obj) \
+ { \
+ return MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter()); \
+ } \
+ \
+ JNIEXPORT void JNICALL prefixed_function(javaType, setter) (JNIEnv * env, jobject obj, jobject value) \
+ { \
+ MC_JAVA_NATIVE_INSTANCE->setter(MC_FROM_JAVA(type, value)); \
+ }
+
+#define MC_JAVA_SYNTHESIZE_STRING_internal(javaType, setter, getter) \
+ JNIEXPORT jstring JNICALL prefixed_function(javaType, getter) (JNIEnv * env, jobject obj) \
+ { \
+ return (jstring) MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter()); \
+ } \
+ \
+ JNIEXPORT void JNICALL prefixed_function(javaType, setter) (JNIEnv * env, jobject obj, jstring value) \
+ { \
+ MC_JAVA_NATIVE_INSTANCE->setter(MC_FROM_JAVA(String, value)); \
+ }
+
+#define MC_JAVA_SYNTHESIZE_DATA_internal(javaType, setter, getter) \
+ JNIEXPORT jbyteArray JNICALL prefixed_function(javaType, getter) (JNIEnv * env, jobject obj) \
+ { \
+ return (jbyteArray) MC_TO_JAVA(MC_JAVA_NATIVE_INSTANCE->getter()); \
+ } \
+ \
+ JNIEXPORT void JNICALL prefixed_function(javaType, setter) (JNIEnv * env, jobject obj, jbyteArray value) \
+ { \
+ MC_JAVA_NATIVE_INSTANCE->setter(MC_FROM_JAVA(Data, value)); \
+ }
+
+#define MC_JAVA_SYNTHESIZE_SCALAR_internal(javaScalarType, scalarType, javaType, setter, getter) \
+ JNIEXPORT javaScalarType JNICALL prefixed_function(javaType, getter) (JNIEnv * env, jobject obj) \
+ { \
+ return (javaScalarType) MC_JAVA_NATIVE_INSTANCE->getter(); \
+ } \
+ \
+ JNIEXPORT void JNICALL prefixed_function(javaType, setter) (JNIEnv * env, jobject obj, javaScalarType value) \
+ { \
+ MC_JAVA_NATIVE_INSTANCE->setter((scalarType) value); \
+ }
+
+#define mc_quote(word) #word
+#define mc_expand_and_quote(word) mc_quote(word)
+
+#define MC_JAVA_BRIDGE_internal(javaType, nativeType) \
+ JNIEXPORT void JNICALL prefixed_function(javaType, setupNative) \
+ (JNIEnv * env, jobject obj) \
+ { \
+ setHandle(env, obj, new nativeType()); \
+ } \
+ \
+ static jobject objectToJavaConverter(JNIEnv * env, Object * obj) \
+ { \
+ jclass cls = env->FindClass("com/libmailcore/" mc_expand_and_quote(javaType)); \
+ jmethodID constructor = env->GetMethodID(cls, "initWithNative", "(J)V"); \
+ jobject javaObject = env->NewObject(cls, constructor, obj); \
+ return javaObject; \
+ } \
+ \
+ INITIALIZE(prefixed_function(javaType,)) \
+ { \
+ MCJNIRegisterNativeClass(&typeid(mailcore::nativeType), (ObjectToJavaConverter *) objectToJavaConverter); \
+ }
+
+namespace mailcore {
+ typedef jobject ObjectToJavaConverter(JNIEnv * env, Object * obj);
+ typedef Object * JavaToObjectConverter(JNIEnv * env, jobject obj);
+
+ Object * javaToMCObject(JNIEnv * env, jobject obj);
+ jobject mcObjectToJava(JNIEnv * env, Object * obj);
+
+ Range javaToRange(JNIEnv * env, jobject range);
+ jobject rangeToJava(JNIEnv * env, Range range);
+
+ jobject errorToJava(int errorCode);
+
+ time_t javaDateToTime(JNIEnv * env, jobject date);
+ jobject timeToJavaDate(JNIEnv * env, time_t t);
+
+ jobject rangeToJava(JNIEnv * env, Range range);
+ Range rangeFromJava(JNIEnv * env, jobject obj);
+
+ void MCJNIRegisterNativeClass(const std::type_info * info, ObjectToJavaConverter converter);
+ void MCJNIRegisterJavaClass(const char * className, JavaToObjectConverter converter);
+ void MCTypesUtilsInit(void);
+}
+
+#endif