On Nov 6, 2009, at 10:25 AM, Matt Meissner wrote:
On Nov 5, 2009, at 7:05 AM, Evan Schoenberg, M.D. wrote: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' failedPeter'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 callpurple_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, EvanEvan and Peter,Thanks for the ideas and help -- I'm crashing in a different place now, so that's progress.I'll have more time to look over the weekend. Thanks again, Matt
Thanks to the help from Evan and Peter, I'm successfully connecting and chatting using Adium and my SIPE server. Most recent source code is at <http://dl.dropbox.com/u/535204/pidgin-sipe-1.7.0.zip>
There are still a few outstanding items that I know about -- I need to figure out how to modify the account preferences panel to allow for protocol-specific settings and I've hardcoded a setting or two for my server just to get things moving -- but I'm encouraged.
Thanks again Evan and Peter and all of the Adium developers for their hard work on the project.
Matt -- Matt Meissner meiss...@gmail.com
smime.p7s
Description: S/MIME cryptographic signature