aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/addrbook/macosx
diff options
context:
space:
mode:
authorVincent Lucas <chenzo@jitsi.org>2013-04-08 23:21:41 +0000
committerVincent Lucas <chenzo@jitsi.org>2013-04-08 23:21:41 +0000
commitcf6543e01ab31b1316c37881bd46a99fbf7ca156 (patch)
tree8e5dde63d5e5508b26edc2347a4b92b72a27f4e5 /src/native/addrbook/macosx
parentfc26a933f9ec7096fa93ffbbc76230de2ffce3a0 (diff)
downloadjitsi-cf6543e01ab31b1316c37881bd46a99fbf7ca156.zip
jitsi-cf6543e01ab31b1316c37881bd46a99fbf7ca156.tar.gz
jitsi-cf6543e01ab31b1316c37881bd46a99fbf7ca156.tar.bz2
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.
Diffstat (limited to 'src/native/addrbook/macosx')
-rw-r--r--src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.h9
-rw-r--r--src/native/addrbook/macosx/net_java_sip_communicator_plugin_addrbook_macosx_MacOSXAddrBookContactQuery.m1161
2 files changed, 619 insertions, 551 deletions
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 <AddressBook/AddressBook.h>
-#import <Foundation/NSArray.h>
-#import <Foundation/NSAutoreleasePool.h>
-#import <Foundation/NSData.h>
-
-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, "<init>", "(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 <AddressBook/AddressBook.h>
+#import <Foundation/NSArray.h>
+#import <Foundation/NSAutoreleasePool.h>
+#import <Foundation/NSData.h>
+
+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, "<init>", "(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;
+}