Comments below. Hope this is not too late to be of help.
On Mar 12, 2008, at 4:24 AM, Pedro Melo wrote:
Hi,
I'm trying to tap into the NSDistributedNotificationCenter with Perl.
The simplest script that almost works is this:
#### START
package Listener;
use strict;
use Foundation;
sub start {
my ($class) = @_;
my $self = bless {}, $class;
my $center = NSDistributedNotificationCenter->defaultCenter;
$center->addObserver_selector_name_object_($self, 'updated',
"org.simplicidade.guy.whatsup", undef);
NSRunLoop->currentRunLoop->run;
}
sub updated {}
package main;
use strict;
Listener->start;
#### END
I get the events but I cannot figure out how to pass a selector (the
'updated' argument in the addObserver... call above) from Perl to
ObjC. I've also tried the following:
* using base as PerlObjCBridge or NSObject;
* using PerlObjCBridge::preloadSelectors('Listener');
* using a anonymous coderef;
* using a coderef to &updated.
The following messages are generated when the notification is
received.
2008-03-12 10:14:11.710 perl[22003] *** -[PerlProxy updated]:
selector not recognized [self = 0x3323c0]
2008-03-12 10:14:11.710 perl[22003] Exception raised during posting
of notification. Ignored. exception: *** -[PerlProxy updated]:
selector not recognized [self = 0x3323c0]
So the "updated" selector is recognized somehow, the then he uses a
PerlProxy base class? I could not find any documentation on PerlProxy.
Any ideas on how to give a selector to objC?
Thanks in advance,
--
Pedro Melo
Blog: http://www.simplicidade.org/notes/
XMPP ID: [EMAIL PROTECTED]
Use XMPP!
Try these steps:
# create a new Perl XSUB module
> cd /tmp
> h2xs -A -P -n Listener
> cd Listener
# add an Objective-C stub for the "updated" method to Listener.xs
> vi Listener.xs
> cat Listener.xs
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifdef Move
#undef Move
#endif Move
#import <Foundation/Foundation.h>
@interface Listener: NSObject
@end
@implementation Listener
- (void)updated {}
@end
MODULE = Listener PACKAGE = Listener
# add the Listener package code to Listener.pm
> vi lib/Listener.pm
> cat lib/Listener.pm
package Listener;
use 5.008008;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration use Listener ':all';
# If you do not need this, moving things directly into @EXPORT or
@EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
);
our $VERSION = '0.01';
require XSLoader;
XSLoader::load('Listener', $VERSION);
# Preloaded methods go here.
use Foundation;
PerlObjCBridge::preloadSelectors('Listener');
sub new {
return bless {};
}
sub updated {
printf "Here in updated\n";
}
1;
# add "-ObjC" to INC field in Makefile.PL
> vi Makefile.PL
> cat Makefile.PL
use 5.008008;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'Listener',
VERSION_FROM => 'lib/Listener.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/Listener.pm', # retrieve abstract from
module
AUTHOR => 'Doug <[EMAIL PROTECTED]>') : ()),
LIBS => [''], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I. -ObjC', # e.g., '-I. -I/usr/include/
other'
# Un-comment this if you add C files to link with later:
# OBJECT => '$(O_FILES)', # link all the C files too
);
# build and install the module
> perl Makefile.PL INSTALLDIRS=site
> make
> make test
> sudo make install
# write the listener tool
> touch listener
> chmod +x listener
> vi listener
> cat testFoo
#!/usr/bin/perl
use strict;
use warnings;
use Listener;
my $listener = new Listener;
my $center = NSDistributedNotificationCenter->defaultCenter;
$center->addObserver_selector_name_object_( $listener, 'updated',
'foo.bar.baz', undef );
NSRunLoop->currentRunLoop->run;
# write the sender tool
> touch sender
> chmod +x sender
> vi sender
> cat sender
#!/usr/bin/perl
use strict;
use warnings;
use Foundation;
my $center = NSDistributedNotificationCenter->defaultCenter;
$center-
>
postNotificationName_object_userInfo_deliverImmediately_
( 'foo.bar.baz', undef, undef, 1 );
# run the listener tool in one shell
> ./listener
# run the sender tool in a different shell
> ./sender
You should see the listener tool emit:
Here in updated
- Doug