Mercurial > pidgin.yaz
diff PRPL @ 981:7e231bc0018a
[gaim-migrate @ 991]
I think I need a Pepsi.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Fri, 13 Oct 2000 07:24:40 +0000 |
parents | |
children | 38452403563b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PRPL Fri Oct 13 07:24:40 2000 +0000 @@ -0,0 +1,70 @@ +Protocol Plugins. What EveryBuddy should have been. + +Protocol Plugins are easier than GUI plugins. This is because there is necessarily a limited set +of server functions; protocols are limited. What a programmer can do with a UI is limitless. + +In order to design a framework for which Protocol Plugins can work, we must first think about +which protocols can be pluginized. (Henceforth PRPL will stand for both the Protocol Plugin +system and an individual Protocol Plugin.) + +Oscar. TOC. Yahoo. MSN. ICQ. FTP. IRC. + +There is a longer list. Note that FTP is in the list presented. FTP has basic functions similar +to those of the others. The basic functions that must be performed are: + +Sign on. (log in) +Sign off. +Send and receive messages. + +There really isn't much more to it than that. There are, then, additional functions that some +protocols implement: + +Chat. +File Transfer. +Away/Idle. (states) +Directory Info. + +Before PRPL there was a slight abstraction in the code. The UI simply needed to call serv_login, +and that function would decide between the protocols, which function to call. It did that with +an if-elseif-else series. + +With PRPL, each PRPL is stored in a struct. The structs are then kept in a GSList. The serv_ +functions then simply need to search the GSList for the correct protocol, and call the desired +function. The struct holds void * references to the desired functions. serv_* simply needs to +call that function. (Even better, each connection has a reference to the PRPL struct it uses; +this will reduce search time.) + +A new PRPL can be loaded at any time. They can be either static or dynamic code. When a new +protocol is loaded, gaim will call its protocol_init function, which is expected to return a +pointer to the aforementioned struct. If it returns NULL, the PRPL will not be loaded. (This is +not entirely true and needs to be modified in the code to work similarly to how it's decscribed +here.) + +Each PRPL needs to have a unique identifier. In the pre-PRPL system TOC was 0 and Oscar was 1. +This identifier can be found in prpl.h. They are pre-assigned. PROTO_TOC is still 0, PROTO_OSCAR +is still 1. The protocol_init function is expected to set the struct's protocol member to the +appropriate value. If you want to write a new PRPL for gaim, please email one of the maintainers +with the name of the protocol. We'll then reserve a number for it. Please do not use a number +that has not been assigned to your protocol, not even for testing purposes. + +The addition of PRPL to gaim means that gaim now supports multiple connections and multiple (and +dynamically loadable) protocols. + +====== + +In order to test that PRPL was working with as little work as possible I made Oscar a plugin. In +order to use Oscar as a plugin, first recompile gaim with the make variable DEBUG_CFLAGS set to +-DDYNAMIC_OSCAR, e.g. + +/usr/src/gaim $ make DEBUG_CFLAGS=-DDYNAMIC_OSCAR + +This will then remove Oscar support from the code (though it will still link with libfaim. However, +gaim does not need to link to libfaim itself). Making the Oscar plugin is straight-forward; simply +make oscar.so in the plugins directory, e.g. + +/usr/src/gaim/plugins $ make oscar.so + +You will then be presented with a gaim binary in src/gaim and the Oscar plugin in plugins/oscar.so. +Simply load the oscar.so file from the normal plugin window. This will set up everything necessary. +You may unload the plugin at any time, but the protocol will still be loaded. This may or may not +be a problem and may or may not be fixed at a later point in time.