00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
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
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