diff options
Diffstat (limited to 'src/java/TypesUtils.h')
-rw-r--r-- | src/java/TypesUtils.h | 120 |
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 |