Porting libpurple plugin: newbie question
Evan Schoenberg, M.D.
evan at adium.im
Thu Nov 5 13:05:13 UTC 2009
Matt,
On Nov 4, 2009, at 4:32 PM, Matt Meissner wrote:
> It would be very helpful for my day job to have SIPE <http://sipe.sf.net/
> > in Adium. So I'm attempting to port it -- never having used Cocoa
> before, there's no better way to learn I guess.
>
> Here's my current state of affairs:
> <http://dl.getdropbox.com/u/535204/pidgin-sipe-1.7.0.zip> (545 KB)
> My plugin is in pidgin-sipe-1.7.0/contrib/SIPEAdiumPlugin. I'm
> building against Adium 1.4b12.
>
> My problem right now is that after adding a SIPE account, Adium
> crashes hard. Here's what's in system.log:
>
> Nov 1 21:59:12 Scooter [0x0-0x1f06f05].com.adiumX.adiumX[24744]: **
> (process:24744): CRITICAL **: purple_accounts_add: assertion
> `account != NULL' failed
Peter's correct about the other problem, but changing that alone isn't
enough to get you up and running.
1. Use [ESSIPEService registerService] to do your service
registration. alloc/init is coincidentally okay, but you should use
Adium's public API wherever possible to avoid fragility.
2. in -[ESSIPEService installLibpurplePlugin], you need to ask
libpurple to load the libpurple component of the plugin. Doing it in
installPlugin is too soon, as libpurple is not guaranteed to be loaded
and ready to listen yet.
Currently, you do this:
PurplePlugin *prpl = purple_plugin_new(TRUE, NULL);
purple_init_plugin(prpl);
Looking at the docs for purple_plugin_new, we see:
/**
* Creates a new plugin structure.
*
* @param native Whether or not the plugin is native.
* @param path The path to the plugin, or @c NULL if statically
compiled.
*
* @return A new PurplePlugin structure.
*/
PurplePlugin *purple_plugin_new(gboolean native, const char *path);
So this definitely isn't what you want, and doing it with a NULL path
is not going to load anything.
Instead, what you need to do is to link statically against the built
plugin (that is, against the .a file that is produced when building
it) and call
purple_init_##x##_plugin()
from -[ESSIPEService installLibpurplePlugin].
where ##x## is the prpl's name, sipe.
This, on the other hand, does require the plugin not be broken for
static compilation. sipe is... because, at the bottom of the sipe.c
file, it says:
/* I had to redefined the function for it load, but works */
gboolean purple_init_plugin(PurplePlugin *plugin){
plugin->info = &(info);
init_plugin((plugin));
sipe_plugin_load((plugin));
return purple_plugin_register(plugin);
}
Programmers: If you have to redefine something you shouldn't, you're
doing it wrong. That's a pasted-in version of PURPLE_INIT_PLUGIN()
from plugin.h... which just has the non-static-compilation bit.
That'll need to be changed to call PURPLE_INIT_PLUGIN() as other
plugins do in order for static loading to be possible.
Hope that helps you get off on the right foot!
Cheers,
Evan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://adium.im/pipermail/devel_adium.im/attachments/20091105/722565aa/attachment-0002.html>
More information about the devel
mailing list