aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/addrbook/macosx
diff options
context:
space:
mode:
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;
+}