Search code examples
macospyobjcdistributed-objects

Missing something for Cocoa/PyObjC Distributed Objects


I'm trying to make a simple example using Distributed Objects with PyObjC. On the server side I have (in Xcode):

class VendedObject(NSObject):
    @objc.signature('@24@0:')
    def speak(self):
        return 'woof'

class TalkAppDelegate(NSObject):      

    def applicationDidFinishLaunching_(self, sender):
        NSLog("Application did finish launching.")
        conn = NSConnection.defaultConnection()
        NSLog("Creating connection")

        obj = VendedObject.alloc().init()
        print obj.description()
        conn.setRootObject_(obj)
        result = conn.registerName_("my_server")
        if not result:
            NSLog("Failed to register Name")
        #conn.setDelegate_(self)
        NSLog(conn.description())

When I run it I get:

2011-01-27 10:27:55.695 Talk[34432:a0f] Application did finish launching.
2011-01-27 10:27:55.698 Talk[34432:a0f] Creating connection
<VendedObject: 0x3e45970>
2011-01-27 10:27:55.701 Talk[34432:a0f] (** NSConnection 0x28f2030 receivePort <NSMachPort: 0x28f2160> sendPort <NSMachPort: 0x28f2160> refCount 2 **)

On the client side I have:

class ListenAppDelegate(NSObject):      

    def applicationDidFinishLaunching_(self, sender):
        NSLog("Application did finish launching.")
        proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
            "my_server", None)
        if not proxy_obj:
            print 'Did not get an object from the server.'
        else:
            print proxy_obj.description()
            print proxy_obj.speak()

I get:

2011-01-27 10:28:35.821 Listen[34460:a0f] Application did finish launching.
<VendedObject: 0x3e45970>
2011-01-27 10:28:35.829 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130
2011-01-27 10:28:35.832 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130

I'm missing something but don't know what?

EDIT: modified to use what I think is the correct signature, and show the new problem that arises. Thanks.


Solution

  • Answering my own question, sorry. It seems to be a problem with PyObjC. I rewrote the Server in Objective-C:

    #import "VendAppDelegate.h"
    
    @interface VendedObject:NSObject {}
    -(NSString *) speak;
    @end
    
    @implementation VendedObject
    
    -(NSString *) speak {
        return @"woof";
    }
    @end
    
    @implementation VendAppDelegate
    
    @synthesize window;
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        NSAutoreleasePool *pool ;
        pool = [[NSAutoreleasePool alloc] init];
        VendedObject *obj;
        obj = [[[VendedObject alloc ] init] autorelease];
        NSLog(@"%@", [obj description]);
    
        NSConnection *conn;
        conn = [[[NSConnection alloc] init] autorelease];
        [conn setRootObject:obj];
        BOOL result;
        result = [conn registerName:@"my_server"];
        if (!result) {
            NSLog(@"Failed to register Name");
        }
        else {
            NSLog(@"%@", [conn description]);
        }
        [pool drain];
    }
    
    @end
    

    And run it with this output:

    2011-01-27 11:45:14.252 Vend[36530:a0f] <VendedObject: 0x1001326f0>
    2011-01-27 11:45:14.254 Vend[36530:a0f] (** NSConnection 0x1004527f0 receivePort <NSMachPort: 0x100452a80> sendPort <NSMachPort: 0x100452a80> refCount 1 **)
    

    I do this from Python:

    from Foundation import *
    
    proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
        "my_server", None)
    if not proxy_obj:
        print 'Did not get an object from the server.'
    else:
        print proxy_obj.description()
        print type(proxy_obj)
        print proxy_obj.speak()
    

    Output:

    <VendedObject: 0x1001326f0>
    <objective-c class NSDistantObject at 0x7fff70a64868>
    woof