From cf6543e01ab31b1316c37881bd46a99fbf7ca156 Mon Sep 17 00:00:00 2001 From: Vincent Lucas Date: Mon, 8 Apr 2013 23:21:41 +0000 Subject: Corrects IMAPIProp_GetProps problem with outlook. Adds contact addition and deletion functionality for outlook and MacOsX contacts. Improves and corrects getting and setting contact details for outlook and MacOsX contacts. --- ...in_addrbook_macosx_MacOSXAddrBookContactQuery.h | 9 + ...in_addrbook_macosx_MacOSXAddrBookContactQuery.m | 1161 ++++++++++---------- 2 files changed, 619 insertions(+), 551 deletions(-) (limited to 'src/native/addrbook/macosx') diff --git a/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h b/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h index 0f4d218..714bdf0 100644 --- a/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h +++ b/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h @@ -557,6 +557,15 @@ JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_ JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_kABAddressCountryKey (JNIEnv *, jclass); +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_deleteContact + (JNIEnv *jniEnv, jclass clazz, jstring id); + +JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_createContact + (JNIEnv *jniEnv, jclass clazz); + +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_getContactPointer + (JNIEnv *jniEnv, jclass clazz, jstring id); + #ifdef __cplusplus } #endif diff --git a/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.m b/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.m index fca3afa..0c2ba19 100644 --- a/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.m +++ b/src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.m @@ -1,551 +1,610 @@ -/* - * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ - -#include "net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h" - -#include "AddrBookContactQuery.h" - -#import -#import -#import -#import - -static void MacOSXAddrBookContactQuery_idToJObject - (JNIEnv *jniEnv, id o, jobjectArray jos, jint i, jclass objectClass); - -JNIEXPORT jbyteArray JNICALL -Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABPerson_1imageData - (JNIEnv *jniEnv, jclass clazz, jlong person) -{ - NSData *imageData = [((ABPerson *) person) imageData]; - jbyteArray jImageData; - - if (imageData) - { - NSUInteger length = [imageData length]; - - if (length) - { - jImageData = (*jniEnv)->NewByteArray(jniEnv, length); - if (jImageData) - { - (*jniEnv)->SetByteArrayRegion( - jniEnv, - jImageData, 0, length, - [imageData bytes]); - } - } - else - jImageData = NULL; - } - else - jImageData = NULL; - return jImageData; -} - -JNIEXPORT jobjectArray JNICALL -Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABRecord_1valuesForProperties - (JNIEnv *jniEnv, jclass clazz, jlong record, jlongArray properties) -{ - jsize propertyCount; - jobjectArray values = NULL; - - propertyCount = (*jniEnv)->GetArrayLength(jniEnv, properties); - if (propertyCount) - { - jclass objectClass; - - objectClass = (*jniEnv)->FindClass(jniEnv, "java/lang/Object"); - if (objectClass) - { - values - = (*jniEnv)->NewObjectArray( - jniEnv, - propertyCount, objectClass, NULL); - if (values) - { - jint i; - ABRecord *r = (ABRecord *) record; - - for (i = 0; i < propertyCount; i++) - { - jlong property; - - (*jniEnv)->GetLongArrayRegion( - jniEnv, - properties, i, 1, &property); - MacOSXAddrBookContactQuery_idToJObject( - jniEnv, - [r valueForProperty:(NSString *)property], - values, i, - objectClass); - if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) - break; - } - } - } - } - return values; -} - -JNIEXPORT void JNICALL -Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_foreachPerson - (JNIEnv *jniEnv, jclass clazz, jstring query, jobject callback) -{ - jmethodID callbackMethodID; - NSAutoreleasePool *autoreleasePool; - ABAddressBook *addressBook; - NSArray *people; - NSUInteger peopleCount; - NSUInteger i; - - callbackMethodID - = AddrBookContactQuery_getPtrCallbackMethodID(jniEnv, callback); - if (!callbackMethodID || (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv))) - return; - - autoreleasePool = [[NSAutoreleasePool alloc] init]; - - addressBook = [ABAddressBook sharedAddressBook]; - people = [addressBook people]; - peopleCount = [people count]; - for (i = 0; i < peopleCount; i++) - { - jboolean proceed; - ABPerson *person = [people objectAtIndex:i]; - - proceed - = (*jniEnv)->CallBooleanMethod( - jniEnv, - callback, callbackMethodID, - person); - if ((JNI_FALSE == proceed) - || (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv))) - break; - } - - [autoreleasePool release]; -} - -/* - * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery - * Method: ABRecord_uniqueId - * Signature: (J)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABRecord_1uniqueId - (JNIEnv *jniEnv, jclass clazz, jlong record) -{ - return (*jniEnv)->NewStringUTF(jniEnv, [[(ABRecord *)record uniqueId] UTF8String]); -} - -NSString *JavaStringToNSString(JNIEnv *env, jstring aString) -{ - if(aString == NULL) - return nil; - - const jchar *chars = (*env)->GetStringChars(env, aString, NULL); - NSString *resultString = [NSString stringWithCharacters:(UniChar *)chars length:(*env)->GetStringLength(env, aString)]; - (*env)->ReleaseStringChars(env, aString, chars); - return resultString; -} - -/* - * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery - * Method: setProperty - * Signature: (Ljava/lang/String;JLjava/lang/String;Ljava/lang/Object;)Z - */ -JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_setProperty - (JNIEnv *jniEnv, jclass clazz, jstring id, jlong prop, jstring subProperty, jobject value) -{ - void* data; - ABAddressBook *addressBook; - ABRecord *r; - NSAutoreleasePool *autoreleasePool; - NSString *property; - BOOL res = FALSE; - int i; - - autoreleasePool = [[NSAutoreleasePool alloc] init]; - - addressBook = [ABAddressBook sharedAddressBook]; - r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; - - property = (NSString *)prop; - - if(property == kABFirstNameProperty - || property == kABLastNameProperty - || property == kABFirstNamePhoneticProperty - || property == kABLastNamePhoneticProperty - || property == kABNicknameProperty - || property == kABMaidenNameProperty - || property == kABOrganizationProperty - || property == kABJobTitleProperty - || property == kABHomePageProperty - || property == kABDepartmentProperty - || property == kABNoteProperty - || property == kABMiddleNameProperty - || property == kABMiddleNamePhoneticProperty - || property == kABTitleProperty - || property == kABSuffixProperty) - { - data = JavaStringToNSString(jniEnv, (jstring)value); - } - else if(property == kABBirthdayProperty) - { - data = [NSDate dateWithTimeIntervalSince1970:(jlong)value]; - } - else if(property == kABURLsProperty - || property == kABCalendarURIsProperty - || property == kABEmailProperty - || property == kABRelatedNamesProperty - || property == kABPhoneProperty - || property == kABAIMInstantProperty - || property == kABJabberInstantProperty - || property == kABMSNInstantProperty - || property == kABYahooInstantProperty - || property == kABICQInstantProperty) - { - data=[[ABMutableMultiValue alloc] init]; - jobjectArray arr = (jobjectArray)value; - jsize propertyCount = (*jniEnv)->GetArrayLength(jniEnv, arr); - - for (i = 0; i < propertyCount; i+=2) - { - jstring value = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i); - jstring label = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+1); - - [(ABMutableMultiValue *) data - addValue:JavaStringToNSString(jniEnv, value) - withLabel:JavaStringToNSString(jniEnv, label)]; - } - } - else if(property == kABAddressProperty) - { - jobjectArray arr = (jobjectArray)value; - jsize propertyCount = (*jniEnv)->GetArrayLength(jniEnv, arr); - - NSMutableDictionary *addr; - addr = [NSMutableDictionary dictionary]; - - data=[[ABMutableMultiValue alloc] init]; - NSString *subProp = NULL; - NSString *lastSubProp; - for (i = 0; i < propertyCount; i+=3) - { - jstring value - = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i); - jstring label - = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+1); - jstring tmpLastSubProp - = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+2); - lastSubProp = JavaStringToNSString(jniEnv, tmpLastSubProp); - // Initiates the first sub-property value. - if(i == 0) - { - subProp = lastSubProp; - } - - // If there is a change in the sub-property, then save the actual - // one to the address property and create a new sub-property list - // (Home, Work). - if(![lastSubProp isEqualToString: subProp]) - { - [(ABMutableMultiValue *) data addValue:addr withLabel:subProp]; - addr = [NSMutableDictionary dictionary]; - // Sets the new current proeperty - subProp = lastSubProp; - } - - //NSLog(@"key:%@, value:%@", JavaStringToNSString(jniEnv, label), - //JavaStringToNSString(jniEnv, value)); - [addr setObject:JavaStringToNSString(jniEnv, value) - forKey:JavaStringToNSString(jniEnv, label)]; - } - // Adds the last sub-property to the address book. - if(i > 0) - { - [(ABMutableMultiValue *) data addValue: addr withLabel: subProp]; - } - } - //else if(property == kABOtherDatesProperty)//kABMultiDateProperty - else - { - data = NULL; - } - - if(data) - res = [r setValue:data forProperty:(NSString *)property]; - - [addressBook save]; - - [autoreleasePool release]; - - return res; -} - -/* - * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery - * Method: removeProperty - * Signature: (Ljava/lang/String;J)Z - */ -JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_removeProperty - (JNIEnv *jniEnv, jclass clazz, jstring id, jlong property) -{ - ABAddressBook *addressBook; - ABRecord *r; - NSAutoreleasePool *autoreleasePool; - - autoreleasePool = [[NSAutoreleasePool alloc] init]; - - addressBook = [ABAddressBook sharedAddressBook]; - r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; - - BOOL res = [r removeValueForProperty:(NSString *)property]; - - [addressBook save]; - - [autoreleasePool release]; - - return res; -} - -#define DEFINE_ABPERSON_PROPERTY_GETTER(property) \ - JNIEXPORT jlong JNICALL \ - Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_##property \ - (JNIEnv *jniEnv, jclass clazz) \ - { \ - return (jlong) property; \ - } - -DEFINE_ABPERSON_PROPERTY_GETTER(kABAIMInstantProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABEmailProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABFirstNameProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABFirstNamePhoneticProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABICQInstantProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABJabberInstantProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABLastNameProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABLastNamePhoneticProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABMiddleNameProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABMiddleNamePhoneticProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABMSNInstantProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABNicknameProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABOrganizationProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABPersonFlags) -DEFINE_ABPERSON_PROPERTY_GETTER(kABPhoneProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABYahooInstantProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABMaidenNameProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABBirthdayProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABJobTitleProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABHomePageProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABURLsProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABCalendarURIsProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABAddressProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABOtherDatesProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABOtherDateComponentsProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABRelatedNamesProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABDepartmentProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABNoteProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABTitleProperty) -DEFINE_ABPERSON_PROPERTY_GETTER(kABSuffixProperty) - -#define DEFINE_ABLABEL_PROPERTY_GETTER(property) \ - JNIEXPORT jstring JNICALL \ - Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_##property \ - (JNIEnv *jniEnv, jclass clazz) \ - { \ - return (*jniEnv)->NewStringUTF(jniEnv, [((NSString *) property) UTF8String]); \ - } -DEFINE_ABLABEL_PROPERTY_GETTER(kABHomePageLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailHomeLabel) -//DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailMobileMeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAnniversaryLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABFatherLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABMotherLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABParentLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABBrotherLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABSisterLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABChildLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABFriendLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABSpouseLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPartnerLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAssistantLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABManagerLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneMobileLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneMainLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneHomeFAXLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneWorkFAXLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABPhonePagerLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMHomeLabel) -//DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMMobileMeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABJabberWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABJabberHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABMSNWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABMSNHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABYahooWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABYahooHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABICQWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABICQHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressStreetKey) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressCityKey) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressStateKey) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressZIPKey) -DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressCountryKey) -DEFINE_ABLABEL_PROPERTY_GETTER(kABWorkLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABHomeLabel) -DEFINE_ABLABEL_PROPERTY_GETTER(kABOtherLabel) - -static void -MacOSXAddrBookContactQuery_idToJObject - (JNIEnv *jniEnv, - id o, - jobjectArray jos, jint i, - jclass objectClass) -{ - if (o) - { - jobject jo; - - if ([o isKindOfClass:[NSString class]]) - { - jo = (*jniEnv)->NewStringUTF(jniEnv, [((NSString *) o) UTF8String]); - } - else if ([o isKindOfClass:[ABMultiValue class]]) - { - /* - * We changed our minds after the initial implementation and decided - * that we want to display not only the values but the labels as - * well. In order to minimize the scope of the modifications, we'll - * be returning each label in the same array right after its - * corresponding value. - */ - ABMultiValue *mv = (ABMultiValue *) o; - NSUInteger mvCount = [mv count]; - jobjectArray joArray - = (*jniEnv)->NewObjectArray( - jniEnv, - mvCount * 2 /* value, label */, - objectClass, NULL); - - jo = joArray; - if (joArray) - { - NSUInteger j, j2; - - for (j = 0; j < mvCount; j++) - { - j2 = j * 2; - - //NSLog(@"key:%@, label:%@", - // [mv valueAtIndex:j], [mv labelAtIndex:j]); - - MacOSXAddrBookContactQuery_idToJObject( - jniEnv, - [mv valueAtIndex:j], - joArray, j2, - objectClass); - if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) - { - jo = NULL; - break; - } - MacOSXAddrBookContactQuery_idToJObject( - jniEnv, - [mv labelAtIndex:j], - joArray, j2 + 1, - objectClass); - if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) - { - jo = NULL; - break; - } - } - } - } - else if ([o isKindOfClass:[NSNumber class]]) - { - jclass longClass = (*jniEnv)->FindClass(jniEnv, "java/lang/Long"); - - jo = NULL; - if (longClass) - { - jmethodID longMethodID - = (*jniEnv)->GetMethodID( - jniEnv, - longClass, "", "(J)V"); - - if (longMethodID) - { - jo - = (*jniEnv)->NewObject( - jniEnv, - longClass, longMethodID, - (jlong) ([((NSNumber *) o) longValue])); - } - } - } - else if ([o isKindOfClass:[NSDictionary class]]) - { - NSDictionary *dict = (NSDictionary *)o; - - NSUInteger dictCount = [dict count]; - jobjectArray joArray - = (*jniEnv)->NewObjectArray( - jniEnv, - dictCount * 2, objectClass, NULL); - jo = joArray; - if (joArray) - { - NSEnumerator *enumerator = [dict keyEnumerator]; - id key; - NSUInteger j, j2; - j = 0; - while ((key = [enumerator nextObject])) - { - //NSLog(@"key:%@, value:%@", key, [dict objectForKey: key]); - - j2 = j * 2; - - MacOSXAddrBookContactQuery_idToJObject( - jniEnv, - [dict objectForKey: key], - joArray, j2, - objectClass); - if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) - { - jo = NULL; - break; - } - MacOSXAddrBookContactQuery_idToJObject( - jniEnv, - key, - joArray, j2 + 1, - objectClass); - if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) - { - jo = NULL; - break; - } - - j++; - } - } - } - else - { - //NSLog(@"type:%@", NSStringFromClass([o class])); - jo = NULL; - } - if (jo) - (*jniEnv)->SetObjectArrayElement(jniEnv, jos, i, jo); - } -} +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +#include "net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h" + +#include "AddrBookContactQuery.h" + +#import +#import +#import +#import + +static void MacOSXAddrBookContactQuery_idToJObject + (JNIEnv *jniEnv, id o, jobjectArray jos, jint i, jclass objectClass); + +JNIEXPORT jbyteArray JNICALL +Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABPerson_1imageData + (JNIEnv *jniEnv, jclass clazz, jlong person) +{ + NSData *imageData = [((ABPerson *) person) imageData]; + jbyteArray jImageData; + + if (imageData) + { + NSUInteger length = [imageData length]; + + if (length) + { + jImageData = (*jniEnv)->NewByteArray(jniEnv, length); + if (jImageData) + { + (*jniEnv)->SetByteArrayRegion( + jniEnv, + jImageData, 0, length, + [imageData bytes]); + } + } + else + jImageData = NULL; + } + else + jImageData = NULL; + return jImageData; +} + +JNIEXPORT jobjectArray JNICALL +Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABRecord_1valuesForProperties + (JNIEnv *jniEnv, jclass clazz, jlong record, jlongArray properties) +{ + jsize propertyCount; + jobjectArray values = NULL; + + propertyCount = (*jniEnv)->GetArrayLength(jniEnv, properties); + if (propertyCount) + { + jclass objectClass; + + objectClass = (*jniEnv)->FindClass(jniEnv, "java/lang/Object"); + if (objectClass) + { + values + = (*jniEnv)->NewObjectArray( + jniEnv, + propertyCount, objectClass, NULL); + if (values) + { + jint i; + ABRecord *r = (ABRecord *) record; + + for (i = 0; i < propertyCount; i++) + { + jlong property; + + (*jniEnv)->GetLongArrayRegion( + jniEnv, + properties, i, 1, &property); + MacOSXAddrBookContactQuery_idToJObject( + jniEnv, + [r valueForProperty:(NSString *)property], + values, i, + objectClass); + if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) + break; + } + } + } + } + return values; +} + +JNIEXPORT void JNICALL +Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_foreachPerson + (JNIEnv *jniEnv, jclass clazz, jstring query, jobject callback) +{ + jmethodID callbackMethodID; + NSAutoreleasePool *autoreleasePool; + ABAddressBook *addressBook; + NSArray *people; + NSUInteger peopleCount; + NSUInteger i; + + callbackMethodID + = AddrBookContactQuery_getPtrCallbackMethodID(jniEnv, callback); + if (!callbackMethodID || (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv))) + return; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + people = [addressBook people]; + peopleCount = [people count]; + for (i = 0; i < peopleCount; i++) + { + jboolean proceed; + ABPerson *person = [people objectAtIndex:i]; + + proceed + = (*jniEnv)->CallBooleanMethod( + jniEnv, + callback, callbackMethodID, + person); + if ((JNI_FALSE == proceed) + || (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv))) + break; + } + + [autoreleasePool release]; +} + +/* + * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery + * Method: ABRecord_uniqueId + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABRecord_1uniqueId + (JNIEnv *jniEnv, jclass clazz, jlong record) +{ + return (*jniEnv)->NewStringUTF(jniEnv, [[(ABRecord *)record uniqueId] UTF8String]); +} + +NSString *JavaStringToNSString(JNIEnv *env, jstring aString) +{ + if(aString == NULL) + return nil; + + const jchar *chars = (*env)->GetStringChars(env, aString, NULL); + NSString *resultString = [NSString stringWithCharacters:(UniChar *)chars length:(*env)->GetStringLength(env, aString)]; + (*env)->ReleaseStringChars(env, aString, chars); + return resultString; +} + +/* + * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery + * Method: setProperty + * Signature: (Ljava/lang/String;JLjava/lang/String;Ljava/lang/Object;)Z + */ +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_setProperty + (JNIEnv *jniEnv, jclass clazz, jstring id, jlong prop, jstring subProperty, jobject value) +{ + void* data; + ABAddressBook *addressBook; + ABRecord *r; + NSAutoreleasePool *autoreleasePool; + NSString *property; + BOOL res = FALSE; + int i; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; + + property = (NSString *)prop; + + if(property == kABFirstNameProperty + || property == kABLastNameProperty + || property == kABFirstNamePhoneticProperty + || property == kABLastNamePhoneticProperty + || property == kABNicknameProperty + || property == kABMaidenNameProperty + || property == kABOrganizationProperty + || property == kABJobTitleProperty + || property == kABHomePageProperty + || property == kABDepartmentProperty + || property == kABNoteProperty + || property == kABMiddleNameProperty + || property == kABMiddleNamePhoneticProperty + || property == kABTitleProperty + || property == kABSuffixProperty) + { + data = JavaStringToNSString(jniEnv, (jstring)value); + } + else if(property == kABBirthdayProperty) + { + data = [NSDate dateWithTimeIntervalSince1970:(jlong)value]; + } + else if(property == kABURLsProperty + || property == kABCalendarURIsProperty + || property == kABEmailProperty + || property == kABRelatedNamesProperty + || property == kABPhoneProperty + || property == kABAIMInstantProperty + || property == kABJabberInstantProperty + || property == kABMSNInstantProperty + || property == kABYahooInstantProperty + || property == kABICQInstantProperty) + { + data=[[ABMutableMultiValue alloc] init]; + jobjectArray arr = (jobjectArray)value; + jsize propertyCount = (*jniEnv)->GetArrayLength(jniEnv, arr); + + for (i = 0; i < propertyCount; i+=2) + { + jstring value = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i); + jstring label = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+1); + + [(ABMutableMultiValue *) data + addValue:JavaStringToNSString(jniEnv, value) + withLabel:JavaStringToNSString(jniEnv, label)]; + } + } + else if(property == kABAddressProperty) + { + jobjectArray arr = (jobjectArray)value; + jsize propertyCount = (*jniEnv)->GetArrayLength(jniEnv, arr); + + NSMutableDictionary *addr; + addr = [NSMutableDictionary dictionary]; + + data=[[ABMutableMultiValue alloc] init]; + NSString *subProp = NULL; + NSString *lastSubProp; + for (i = 0; i < propertyCount; i+=3) + { + jstring value + = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i); + jstring label + = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+1); + jstring tmpLastSubProp + = (jstring) (*jniEnv)->GetObjectArrayElement(jniEnv, arr, i+2); + lastSubProp = JavaStringToNSString(jniEnv, tmpLastSubProp); + // Initiates the first sub-property value. + if(i == 0) + { + subProp = lastSubProp; + } + + // If there is a change in the sub-property, then save the actual + // one to the address property and create a new sub-property list + // (Home, Work). + if(![lastSubProp isEqualToString: subProp]) + { + [(ABMutableMultiValue *) data addValue:addr withLabel:subProp]; + addr = [NSMutableDictionary dictionary]; + // Sets the new current proeperty + subProp = lastSubProp; + } + + //NSLog(@"key:%@, value:%@", JavaStringToNSString(jniEnv, label), + //JavaStringToNSString(jniEnv, value)); + [addr setObject:JavaStringToNSString(jniEnv, value) + forKey:JavaStringToNSString(jniEnv, label)]; + } + // Adds the last sub-property to the address book. + if(i > 0) + { + [(ABMutableMultiValue *) data addValue: addr withLabel: subProp]; + } + } + //else if(property == kABOtherDatesProperty)//kABMultiDateProperty + else + { + data = NULL; + } + + if(data) + res = [r setValue:data forProperty:(NSString *)property]; + + [addressBook save]; + + [autoreleasePool release]; + + return res; +} + +/* + * Class: net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery + * Method: removeProperty + * Signature: (Ljava/lang/String;J)Z + */ +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_removeProperty + (JNIEnv *jniEnv, jclass clazz, jstring id, jlong property) +{ + ABAddressBook *addressBook; + ABRecord *r; + NSAutoreleasePool *autoreleasePool; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; + + BOOL res = [r removeValueForProperty:(NSString *)property]; + + [addressBook save]; + + [autoreleasePool release]; + + return res; +} + +#define DEFINE_ABPERSON_PROPERTY_GETTER(property) \ + JNIEXPORT jlong JNICALL \ + Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_##property \ + (JNIEnv *jniEnv, jclass clazz) \ + { \ + return (jlong) property; \ + } + +DEFINE_ABPERSON_PROPERTY_GETTER(kABAIMInstantProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABEmailProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABFirstNameProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABFirstNamePhoneticProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABICQInstantProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABJabberInstantProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABLastNameProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABLastNamePhoneticProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABMiddleNameProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABMiddleNamePhoneticProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABMSNInstantProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABNicknameProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABOrganizationProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABPersonFlags) +DEFINE_ABPERSON_PROPERTY_GETTER(kABPhoneProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABYahooInstantProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABMaidenNameProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABBirthdayProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABJobTitleProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABHomePageProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABURLsProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABCalendarURIsProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABAddressProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABOtherDatesProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABOtherDateComponentsProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABRelatedNamesProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABDepartmentProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABNoteProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABTitleProperty) +DEFINE_ABPERSON_PROPERTY_GETTER(kABSuffixProperty) + +#define DEFINE_ABLABEL_PROPERTY_GETTER(property) \ + JNIEXPORT jstring JNICALL \ + Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_##property \ + (JNIEnv *jniEnv, jclass clazz) \ + { \ + return (*jniEnv)->NewStringUTF(jniEnv, [((NSString *) property) UTF8String]); \ + } +DEFINE_ABLABEL_PROPERTY_GETTER(kABHomePageLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailHomeLabel) +//DEFINE_ABLABEL_PROPERTY_GETTER(kABEmailMobileMeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAnniversaryLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABFatherLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABMotherLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABParentLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABBrotherLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABSisterLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABChildLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABFriendLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABSpouseLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPartnerLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAssistantLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABManagerLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneMobileLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneMainLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneHomeFAXLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhoneWorkFAXLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABPhonePagerLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMHomeLabel) +//DEFINE_ABLABEL_PROPERTY_GETTER(kABAIMMobileMeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABJabberWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABJabberHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABMSNWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABMSNHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABYahooWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABYahooHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABICQWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABICQHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressStreetKey) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressCityKey) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressStateKey) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressZIPKey) +DEFINE_ABLABEL_PROPERTY_GETTER(kABAddressCountryKey) +DEFINE_ABLABEL_PROPERTY_GETTER(kABWorkLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABHomeLabel) +DEFINE_ABLABEL_PROPERTY_GETTER(kABOtherLabel) + +static void +MacOSXAddrBookContactQuery_idToJObject + (JNIEnv *jniEnv, + id o, + jobjectArray jos, jint i, + jclass objectClass) +{ + if (o) + { + jobject jo; + + if ([o isKindOfClass:[NSString class]]) + { + jo = (*jniEnv)->NewStringUTF(jniEnv, [((NSString *) o) UTF8String]); + } + else if ([o isKindOfClass:[ABMultiValue class]]) + { + /* + * We changed our minds after the initial implementation and decided + * that we want to display not only the values but the labels as + * well. In order to minimize the scope of the modifications, we'll + * be returning each label in the same array right after its + * corresponding value. + */ + ABMultiValue *mv = (ABMultiValue *) o; + NSUInteger mvCount = [mv count]; + jobjectArray joArray + = (*jniEnv)->NewObjectArray( + jniEnv, + mvCount * 2 /* value, label */, + objectClass, NULL); + + jo = joArray; + if (joArray) + { + NSUInteger j, j2; + + for (j = 0; j < mvCount; j++) + { + j2 = j * 2; + + //NSLog(@"key:%@, label:%@", + // [mv valueAtIndex:j], [mv labelAtIndex:j]); + + MacOSXAddrBookContactQuery_idToJObject( + jniEnv, + [mv valueAtIndex:j], + joArray, j2, + objectClass); + if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) + { + jo = NULL; + break; + } + MacOSXAddrBookContactQuery_idToJObject( + jniEnv, + [mv labelAtIndex:j], + joArray, j2 + 1, + objectClass); + if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) + { + jo = NULL; + break; + } + } + } + } + else if ([o isKindOfClass:[NSNumber class]]) + { + jclass longClass = (*jniEnv)->FindClass(jniEnv, "java/lang/Long"); + + jo = NULL; + if (longClass) + { + jmethodID longMethodID + = (*jniEnv)->GetMethodID( + jniEnv, + longClass, "", "(J)V"); + + if (longMethodID) + { + jo + = (*jniEnv)->NewObject( + jniEnv, + longClass, longMethodID, + (jlong) ([((NSNumber *) o) longValue])); + } + } + } + else if ([o isKindOfClass:[NSDictionary class]]) + { + NSDictionary *dict = (NSDictionary *)o; + + NSUInteger dictCount = [dict count]; + jobjectArray joArray + = (*jniEnv)->NewObjectArray( + jniEnv, + dictCount * 2, objectClass, NULL); + jo = joArray; + if (joArray) + { + NSEnumerator *enumerator = [dict keyEnumerator]; + id key; + NSUInteger j, j2; + j = 0; + while ((key = [enumerator nextObject])) + { + //NSLog(@"key:%@, value:%@", key, [dict objectForKey: key]); + + j2 = j * 2; + + MacOSXAddrBookContactQuery_idToJObject( + jniEnv, + [dict objectForKey: key], + joArray, j2, + objectClass); + if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) + { + jo = NULL; + break; + } + MacOSXAddrBookContactQuery_idToJObject( + jniEnv, + key, + joArray, j2 + 1, + objectClass); + if (JNI_TRUE == (*jniEnv)->ExceptionCheck(jniEnv)) + { + jo = NULL; + break; + } + + j++; + } + } + } + else + { + //NSLog(@"type:%@", NSStringFromClass([o class])); + jo = NULL; + } + if (jo) + (*jniEnv)->SetObjectArrayElement(jniEnv, jos, i, jo); + } +} + +JNIEXPORT jboolean JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_deleteContact + (JNIEnv *jniEnv, jclass clazz, jstring id) +{ + ABAddressBook *addressBook; + ABRecord *r; + NSAutoreleasePool *autoreleasePool; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; + + BOOL res = [addressBook removeRecord: r]; + + [addressBook save]; + + [autoreleasePool release]; + + return res; +} + +JNIEXPORT jstring JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_createContact + (JNIEnv *jniEnv, jclass clazz) +{ + ABAddressBook *addressBook; + NSAutoreleasePool *autoreleasePool; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + ABPerson* person = [[ABPerson alloc] initWithAddressBook:addressBook]; + + [addressBook save]; + + [autoreleasePool release]; + + return + Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_ABRecord_1uniqueId(jniEnv, clazz, (jlong) person); +} + +JNIEXPORT jlong JNICALL Java_net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery_getContactPointer + (JNIEnv *jniEnv, jclass clazz, jstring id) +{ + ABAddressBook *addressBook; + ABRecord *r; + NSAutoreleasePool *autoreleasePool; + + autoreleasePool = [[NSAutoreleasePool alloc] init]; + + addressBook = [ABAddressBook sharedAddressBook]; + r = [addressBook recordForUniqueId:JavaStringToNSString(jniEnv, id)]; + + [addressBook save]; + + [autoreleasePool release]; + + return (jlong) r; +} -- cgit v1.1