plugin.h

Go to the documentation of this file.
00001 
00009 /* purple
00010  *
00011  * Purple is the legal property of its developers, whose names are too numerous
00012  * to list here.  Please refer to the COPYRIGHT file distributed with this
00013  * source distribution.
00014  *
00015  * This program is free software; you can redistribute it and/or modify
00016  * it under the terms of the GNU General Public License as published by
00017  * the Free Software Foundation; either version 2 of the License, or
00018  * (at your option) any later version.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
00028  */
00029 #ifndef _PURPLE_PLUGIN_H_
00030 #define _PURPLE_PLUGIN_H_
00031 
00032 #include <glib/glist.h>
00033 #include <gmodule.h>
00034 #include "signals.h"
00035 #include "value.h"
00036 
00037 typedef struct _PurplePlugin           PurplePlugin;
00038 typedef struct _PurplePluginInfo       PurplePluginInfo;
00039 typedef struct _PurplePluginUiInfo     PurplePluginUiInfo;
00040 typedef struct _PurplePluginLoaderInfo PurplePluginLoaderInfo;
00041 
00042 typedef struct _PurplePluginAction     PurplePluginAction;
00043 
00044 typedef int PurplePluginPriority; 
00046 #include "pluginpref.h"
00047 
00051 typedef enum
00052 {
00053     PURPLE_PLUGIN_UNKNOWN  = -1,  
00054     PURPLE_PLUGIN_STANDARD = 0,   
00055     PURPLE_PLUGIN_LOADER,         
00056     PURPLE_PLUGIN_PROTOCOL        
00058 } PurplePluginType;
00059 
00060 #define PURPLE_PRIORITY_DEFAULT     0
00061 #define PURPLE_PRIORITY_HIGHEST  9999
00062 #define PURPLE_PRIORITY_LOWEST  -9999
00063 
00064 #define PURPLE_PLUGIN_FLAG_INVISIBLE 0x01
00065 
00066 #define PURPLE_PLUGIN_MAGIC 5 /* once we hit 6.0.0 I think we can remove this */
00067 
00073 struct _PurplePluginInfo
00074 {
00075     unsigned int magic;
00076     unsigned int major_version;
00077     unsigned int minor_version;
00078     PurplePluginType type;
00079     char *ui_requirement;
00080     unsigned long flags;
00081     GList *dependencies;
00082     PurplePluginPriority priority;
00083 
00084     char *id;
00085     char *name;
00086     char *version;
00087     char *summary;
00088     char *description;
00089     char *author;
00090     char *homepage;
00091 
00096     gboolean (*load)(PurplePlugin *plugin);
00097     gboolean (*unload)(PurplePlugin *plugin);
00098     void (*destroy)(PurplePlugin *plugin);
00099 
00100     void *ui_info; 
00101     void *extra_info;
00102     PurplePluginUiInfo *prefs_info; 
00103     GList *(*actions)(PurplePlugin *plugin, gpointer context);
00104 
00105     void (*_purple_reserved1)(void);
00106     void (*_purple_reserved2)(void);
00107     void (*_purple_reserved3)(void);
00108     void (*_purple_reserved4)(void);
00109 };
00110 
00114 struct _PurplePluginLoaderInfo
00115 {
00116     GList *exts;
00117 
00118     gboolean (*probe)(PurplePlugin *plugin);
00119     gboolean (*load)(PurplePlugin *plugin);
00120     gboolean (*unload)(PurplePlugin *plugin);
00121     void     (*destroy)(PurplePlugin *plugin);
00122 
00123     void (*_purple_reserved1)(void);
00124     void (*_purple_reserved2)(void);
00125     void (*_purple_reserved3)(void);
00126     void (*_purple_reserved4)(void);
00127 };
00128 
00132 struct _PurplePlugin
00133 {
00134     gboolean native_plugin;                
00135     gboolean loaded;                       
00136     void *handle;                          
00137     char *path;                            
00138     PurplePluginInfo *info;                  
00139     char *error;
00140     void *ipc_data;                        
00141     void *extra;                           
00142     gboolean unloadable;                   
00143     GList *dependent_plugins;              
00145     void (*_purple_reserved1)(void);
00146     void (*_purple_reserved2)(void);
00147     void (*_purple_reserved3)(void);
00148     void (*_purple_reserved4)(void);
00149 };
00150 
00151 #define PURPLE_PLUGIN_LOADER_INFO(plugin) \
00152     ((PurplePluginLoaderInfo *)(plugin)->info->extra_info)
00153 
00154 struct _PurplePluginUiInfo {
00155     PurplePluginPrefFrame *(*get_plugin_pref_frame)(PurplePlugin *plugin);
00156 
00157     int page_num;                                         
00158     PurplePluginPrefFrame *frame;                           
00160     void (*_purple_reserved1)(void);
00161     void (*_purple_reserved2)(void);
00162     void (*_purple_reserved3)(void);
00163     void (*_purple_reserved4)(void);
00164 };
00165 
00166 #define PURPLE_PLUGIN_HAS_PREF_FRAME(plugin) \
00167     ((plugin)->info != NULL && (plugin)->info->prefs_info != NULL)
00168 
00169 #define PURPLE_PLUGIN_UI_INFO(plugin) \
00170     ((PurplePluginUiInfo*)(plugin)->info->prefs_info)
00171 
00172 
00176 struct _PurplePluginAction {
00177     char *label;
00178     void (*callback)(PurplePluginAction *);
00179 
00181     PurplePlugin *plugin;
00182 
00185     gpointer context;
00186     
00187     gpointer user_data;
00188 };
00189 
00190 #define PURPLE_PLUGIN_HAS_ACTIONS(plugin) \
00191     ((plugin)->info != NULL && (plugin)->info->actions != NULL)
00192 
00193 #define PURPLE_PLUGIN_ACTIONS(plugin, context) \
00194     (PURPLE_PLUGIN_HAS_ACTIONS(plugin)? \
00195     (plugin)->info->actions(plugin, context): NULL)
00196 
00197 
00201 #if !defined(PURPLE_PLUGINS) || defined(PURPLE_STATIC_PRPL)
00202 # define _FUNC_NAME(x) purple_init_##x##_plugin
00203 # define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
00204     gboolean _FUNC_NAME(pluginname)(void);\
00205     gboolean _FUNC_NAME(pluginname)(void) { \
00206         PurplePlugin *plugin = purple_plugin_new(TRUE, NULL); \
00207         plugin->info = &(plugininfo); \
00208         initfunc((plugin)); \
00209         purple_plugin_load((plugin)); \
00210         return purple_plugin_register(plugin); \
00211     }
00212 #else /* PURPLE_PLUGINS  && !PURPLE_STATIC_PRPL */
00213 # define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
00214     G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin); \
00215     G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin) { \
00216         plugin->info = &(plugininfo); \
00217         initfunc((plugin)); \
00218         return purple_plugin_register(plugin); \
00219     }
00220 #endif
00221 
00222 
00223 #ifdef __cplusplus
00224 extern "C" {
00225 #endif
00226 
00227 /**************************************************************************/
00229 /**************************************************************************/
00240 PurplePlugin *purple_plugin_new(gboolean native, const char *path);
00241 
00253 PurplePlugin *purple_plugin_probe(const char *filename);
00254 
00268 gboolean purple_plugin_register(PurplePlugin *plugin);
00269 
00280 gboolean purple_plugin_load(PurplePlugin *plugin);
00281 
00292 gboolean purple_plugin_unload(PurplePlugin *plugin);
00293 
00304 void purple_plugin_disable(PurplePlugin *plugin);
00305 
00316 gboolean purple_plugin_reload(PurplePlugin *plugin);
00317 
00323 void purple_plugin_destroy(PurplePlugin *plugin);
00324 
00332 gboolean purple_plugin_is_loaded(const PurplePlugin *plugin);
00333 
00346 gboolean purple_plugin_is_unloadable(const PurplePlugin *plugin);
00347 
00355 const gchar *purple_plugin_get_id(const PurplePlugin *plugin);
00356 
00364 const gchar *purple_plugin_get_name(const PurplePlugin *plugin);
00365 
00373 const gchar *purple_plugin_get_version(const PurplePlugin *plugin);
00374 
00382 const gchar *purple_plugin_get_summary(const PurplePlugin *plugin);
00383 
00391 const gchar *purple_plugin_get_description(const PurplePlugin *plugin);
00392 
00400 const gchar *purple_plugin_get_author(const PurplePlugin *plugin);
00401 
00409 const gchar *purple_plugin_get_homepage(const PurplePlugin *plugin);
00410 
00413 /**************************************************************************/
00415 /**************************************************************************/
00432 gboolean purple_plugin_ipc_register(PurplePlugin *plugin, const char *command,
00433                                   PurpleCallback func,
00434                                   PurpleSignalMarshalFunc marshal,
00435                                   PurpleValue *ret_value, int num_params, ...);
00436 
00443 void purple_plugin_ipc_unregister(PurplePlugin *plugin, const char *command);
00444 
00450 void purple_plugin_ipc_unregister_all(PurplePlugin *plugin);
00451 
00463 gboolean purple_plugin_ipc_get_params(PurplePlugin *plugin, const char *command,
00464                                     PurpleValue **ret_value, int *num_params,
00465                                     PurpleValue ***params);
00466 
00478 void *purple_plugin_ipc_call(PurplePlugin *plugin, const char *command,
00479                            gboolean *ok, ...);
00480 
00483 /**************************************************************************/
00485 /**************************************************************************/
00493 void purple_plugins_add_search_path(const char *path);
00494 
00498 void purple_plugins_unload_all(void);
00499 
00503 void purple_plugins_destroy_all(void);
00504 
00510 void purple_plugins_save_loaded(const char *key);
00511 
00518 void purple_plugins_load_saved(const char *key);
00519 
00527 void purple_plugins_probe(const char *ext);
00528 
00534 gboolean purple_plugins_enabled(void);
00535 
00536 #ifndef PURPLE_DISABLE_DEPRECATED
00537 
00544 void purple_plugins_register_probe_notify_cb(void (*func)(void *), void *data);
00545 #endif
00546 
00547 #ifndef PURPLE_DISABLE_DEPRECATED
00548 
00554 void purple_plugins_unregister_probe_notify_cb(void (*func)(void *));
00555 #endif
00556 
00557 #ifndef PURPLE_DISABLE_DEPRECATED
00558 
00565 void purple_plugins_register_load_notify_cb(void (*func)(PurplePlugin *, void *),
00566                                           void *data);
00567 #endif
00568 
00569 #ifndef PURPLE_DISABLE_DEPRECATED
00570 
00576 void purple_plugins_unregister_load_notify_cb(void (*func)(PurplePlugin *, void *));
00577 #endif
00578 
00579 #ifndef PURPLE_DISABLE_DEPRECATED
00580 
00587 void purple_plugins_register_unload_notify_cb(void (*func)(PurplePlugin *, void *),
00588                                             void *data);
00589 #endif
00590 
00591 #ifndef PURPLE_DISABLE_DEPRECATED
00592 
00598 void purple_plugins_unregister_unload_notify_cb(void (*func)(PurplePlugin *,
00599                                                            void *));
00600 #endif
00601 
00609 PurplePlugin *purple_plugins_find_with_name(const char *name);
00610 
00618 PurplePlugin *purple_plugins_find_with_filename(const char *filename);
00619 
00627 PurplePlugin *purple_plugins_find_with_basename(const char *basename);
00628 
00636 PurplePlugin *purple_plugins_find_with_id(const char *id);
00637 
00643 GList *purple_plugins_get_loaded(void);
00644 
00653 GList *purple_plugins_get_protocols(void);
00654 
00660 GList *purple_plugins_get_all(void);
00661 
00664 /**************************************************************************/
00666 /**************************************************************************/
00674 void *purple_plugins_get_handle(void);
00675 
00679 void purple_plugins_init(void);
00680 
00684 void purple_plugins_uninit(void);
00685 
00694 PurplePluginAction *purple_plugin_action_new(const char* label, void (*callback)(PurplePluginAction *));
00695 
00701 void purple_plugin_action_free(PurplePluginAction *action);
00702 
00703 #ifdef __cplusplus
00704 }
00705 #endif
00706 
00707 #endif /* _PURPLE_PLUGIN_H_ */

Generated on Fri Jul 3 11:30:39 2009 for pidgin by  doxygen 1.5.5