Lisp HUG Maillist Archive

objc bridge problem with (macosx) addressbook api

This is what I want to do:

+--
ABAddressBook *addressBook;
ABPerson *newPerson;
addressBook = [ABAddressBook sharedAddressBook];
newPerson = [[ABPerson alloc] init];
[newPerson setValue:@"John"
         forProperty:kABFirstNameProperty];
[newPerson setValue:@"Doe"
         forProperty:kABLastNameProperty];
[addressBook addRecord:newPerson];
[addressBook save];
+--

from 
https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AddressBook/Tasks/ManagingGroups.html#//apple_ref/doc/uid/20001022-BABHHIHC

I tried to translate into this:

+--
(objc:ensure-objc-initialized
   :modules
   '("/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation"
     "/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa"
 
"/System/Library/Frameworks/AddressBook.framework/Versions/Current/AddressBook"))

(defun addressbook-create-person (firstname)
   "Calls Addressbook via LW objc-bridge"
   (let ((pool (objc:alloc-init-object "NSAutoreleasePool")))
     (unwind-protect
       (let ((addressbook (objc:invoke "ABAddressBook" 
"sharedAddressBook")))
           (if addressbook
             (let ((person (objc:invoke (objc:invoke "ABPerson" "alloc") 
"initWithAddressBook:" addressbook)))
               (if person
                  (progn
                   ;; the following line crashes LW
                   (objc:invoke person "setValue:forProperty:" 
(objc:invoke "NSString" "stringWithString:" firstname) 
"kABFirstNameProperty")

                   (objc:invoke addressbook "save"))
                 (error "can't create person")))
             (error "can't create shared addressbook")))
       (progn
         (objc:invoke pool "drain")))))
+--

While trying to set the firstname property of my freshly created person 
my LW session crashes noiseless. When I remove the offending line a 
person without properties is visible in my Mac Addressbook.

Obviously I am not allowed to insert a simple Lisp string at the 
position where Objective-C expects an (id) type. But what kind of 
pointer-foo do I have to do to get it right?

thanks
jens




_______________________________________________
Lisp Hug - the mailing list for LispWorks users
lisp-hug@lispworks.com
http://www.lispworks.com/support/lisp-hug.html


Re: objc bridge problem with (macosx) addressbook api

Solved it.

The line

(objc:invoke person "setValue:forProperty:" firstname 
"kABFirstNameProperty")

must simply be

(objc:invoke person "setValue:forProperty:" firstname "First")

Sorry for the noise.


Am 18.05.14 01:11, schrieb Jens Teich:
>
> This is what I want to do:
>
> +--
> ABAddressBook *addressBook;
> ABPerson *newPerson;
> addressBook = [ABAddressBook sharedAddressBook];
> newPerson = [[ABPerson alloc] init];
> [newPerson setValue:@"John"
>          forProperty:kABFirstNameProperty];
> [newPerson setValue:@"Doe"
>          forProperty:kABLastNameProperty];
> [addressBook addRecord:newPerson];
> [addressBook save];
> +--
>
> from
> https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AddressBook/Tasks/ManagingGroups.html#//apple_ref/doc/uid/20001022-BABHHIHC
>
>
> I tried to translate into this:
>
> +--
> (objc:ensure-objc-initialized
>    :modules
>
> '("/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation"
>      "/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa"
>
> "/System/Library/Frameworks/AddressBook.framework/Versions/Current/AddressBook"))
>
>
> (defun addressbook-create-person (firstname)
>    "Calls Addressbook via LW objc-bridge"
>    (let ((pool (objc:alloc-init-object "NSAutoreleasePool")))
>      (unwind-protect
>        (let ((addressbook (objc:invoke "ABAddressBook"
> "sharedAddressBook")))
>            (if addressbook
>              (let ((person (objc:invoke (objc:invoke "ABPerson" "alloc")
> "initWithAddressBook:" addressbook)))
>                (if person
>                   (progn
>                    ;; the following line crashes LW
>                    (objc:invoke person "setValue:forProperty:"
> (objc:invoke "NSString" "stringWithString:" firstname)
> "kABFirstNameProperty")
>
>                    (objc:invoke addressbook "save"))
>                  (error "can't create person")))
>              (error "can't create shared addressbook")))
>        (progn
>          (objc:invoke pool "drain")))))
> +--
>
> While trying to set the firstname property of my freshly created person
> my LW session crashes noiseless. When I remove the offending line a
> person without properties is visible in my Mac Addressbook.
>
> Obviously I am not allowed to insert a simple Lisp string at the
> position where Objective-C expects an (id) type. But what kind of
> pointer-foo do I have to do to get it right?
>
> thanks
> jens
>
>
>
>
> _______________________________________________
> Lisp Hug - the mailing list for LispWorks users
> lisp-hug@lispworks.com
> http://www.lispworks.com/support/lisp-hug.html
>
>

_______________________________________________
Lisp Hug - the mailing list for LispWorks users
lisp-hug@lispworks.com
http://www.lispworks.com/support/lisp-hug.html


Updated at: 2020-12-10 08:34 UTC