aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java/TypesUtils.cpp
diff options
context:
space:
mode:
authorGravatar Herb Hrowal <hhrowal@gmail.com>2016-04-16 10:36:17 -0700
committerGravatar HoĆ  V. DINH <dinh.viet.hoa@gmail.com>2016-04-16 10:36:17 -0700
commit19b4b8e47145fa611f8022eb35d1d31f4b8f96a1 (patch)
tree78c181ef575ae7e56ef6db6c33efee5616cbd78e /src/java/TypesUtils.cpp
parent7932a9159aa6748ffdc53f434942992de8ad77a5 (diff)
More android fixes and additions (#1400)
* Fixed templateForMessage to get the correct method. * Fixed hashmapJavaToObjectConverter to correctly convert from java.util.HashMap to mailcore::HashMap * * Fixed fetchArticleByMessageIDOperation to correctly reflect changes in the core * Fixed com_libmailcore_IMAPSession_folderStatusOperation to call folderStatusOperation instead of folderInfoOperation * Added calls to PushLocalFrame and PushLocalFrame to prevent the local reference table from filling up. * Changed signature of templateValuesForHeader and templateValuesForPart to return Map<String, Object> instead of Map<String, String> to better reflect the core methods. * Renamed cleanHTML to cleanHTMLForPart to reflect the core method. * Added mimeType() and setMimeType(). * Made LOCAL_FRAME_CAPACITY constant to use in calls to PushLocalFrame. Fixed indents.
Diffstat (limited to 'src/java/TypesUtils.cpp')
-rw-r--r--src/java/TypesUtils.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/java/TypesUtils.cpp b/src/java/TypesUtils.cpp
index 961bed1a..92efe4e9 100644
--- a/src/java/TypesUtils.cpp
+++ b/src/java/TypesUtils.cpp
@@ -12,6 +12,7 @@ static chash * cppClassHash = NULL;
static chash * javaClassHash = NULL;
#define RANGE_MAX (1ULL >> 63ULL - 1ULL)
+#define LOCAL_FRAME_CAPACITY 32
static void init(void);
static void real_init(void);
@@ -220,7 +221,7 @@ static jobject hashmapObjectToJavaConverter(JNIEnv * env, Object * obj)
jmethodID method = env->GetMethodID(cls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)V");
Array * keys = hashMap->allKeys();
for(unsigned int i = 0 ; i < keys->count() ; i ++) {
- env->PushLocalFrame(32);
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
Object * key = keys->objectAtIndex(i);
jobject javaKey = mcObjectToJava(env, key);
Object * value = hashMap->objectForKey(key);
@@ -240,7 +241,7 @@ static jobject arrayObjectToJavaConverter(JNIEnv * env, Object * obj)
jmethodID method = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
MCLog("add method %p", method);
for(unsigned int i = 0 ; i < array->count() ; i ++) {
- env->PushLocalFrame(32);
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
MCLog("converting object %s", MCUTF8(array->objectAtIndex(i)));
jobject javaObject = mcObjectToJava(env, array->objectAtIndex(i));
MCLog("add object %p", javaObject);
@@ -342,6 +343,7 @@ static bool isJavaMap(JNIEnv * env, jobject obj)
static Object * hashmapJavaToObjectConverter(JNIEnv * env, jobject obj)
{
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
HashMap * result = HashMap::hashMap();
jclass javaClass = env->GetObjectClass(obj);
jmethodID method = env->GetMethodID(javaClass, "entrySet", "()Ljava/util/Set;");
@@ -351,6 +353,7 @@ static Object * hashmapJavaToObjectConverter(JNIEnv * env, jobject obj)
jobjectArray array = (jobjectArray) env->CallObjectMethod(entrySet, method);
int count = (int) env->GetArrayLength(array);
for(int i = 0 ; i < count ; i ++) {
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
jobject entry = env->GetObjectArrayElement(array, i);
javaClass = env->GetObjectClass(entry);
method = env->GetMethodID(javaClass, "getKey", "()Ljava/lang/Object;");
@@ -360,7 +363,9 @@ static Object * hashmapJavaToObjectConverter(JNIEnv * env, jobject obj)
jobject value = env->CallObjectMethod(entry, method);
Object * mcValue = javaToMCObject(env, value);
result->setObjectForKey(mcKey, mcValue);
+ env->PopLocalFrame(NULL);
}
+ env->PopLocalFrame(NULL);
return result;
}
@@ -372,6 +377,7 @@ static bool isJavaList(JNIEnv * env, jobject obj)
static Object * arrayJavaToObjectConverter(JNIEnv * env, jobject obj)
{
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
Array * result = Array::array();
jclass javaClass = env->GetObjectClass(obj);
jmethodID method = env->GetMethodID(javaClass, "toArray", "()[Ljava/lang/Object;");
@@ -380,8 +386,10 @@ static Object * arrayJavaToObjectConverter(JNIEnv * env, jobject obj)
for(int i = 0 ; i < count ; i ++) {
jobject item = env->GetObjectArrayElement(array, i);
Object * mcItem = javaToMCObject(env, item);
+ env->DeleteLocalRef(item);
result->addObject(mcItem);
}
+ env->PopLocalFrame(NULL);
return result;
}
@@ -438,13 +446,11 @@ Object * mailcore::javaToMCObject(JNIEnv * env, jobject obj)
else if (isJavaMap(env, obj)) {
return hashmapJavaToObjectConverter(env, obj);
}
- else if (isJavaMap(env, obj)) {
- return arrayJavaToObjectConverter(env, obj);
- }
else if (isJavaList(env, obj)) {
return arrayJavaToObjectConverter(env, obj);
}
else {
+ env->PushLocalFrame(LOCAL_FRAME_CAPACITY);
Object * result = NULL;
jclass javaClass = env->GetObjectClass(obj);
@@ -468,7 +474,8 @@ Object * mailcore::javaToMCObject(JNIEnv * env, jobject obj)
MCAssert(0);
}
env->ReleaseStringUTFChars(strObj, str);
-
+ env->PopLocalFrame(NULL);
+
return result;
}
}