00001
00025 #ifndef _GAIM_PLUGIN_H_
00026 #define _GAIM_PLUGIN_H_
00027
00028 #include <gmodule.h>
00029 #include "signals.h"
00030 #include "value.h"
00031
00032 typedef struct _GaimPlugin GaimPlugin;
00033 typedef struct _GaimPluginInfo GaimPluginInfo;
00034 typedef struct _GaimPluginUiInfo GaimPluginUiInfo;
00035 typedef struct _GaimPluginLoaderInfo GaimPluginLoaderInfo;
00036
00037 typedef int GaimPluginPriority;
00039 #include "pluginpref.h"
00040
00044 typedef enum
00045 {
00046 GAIM_PLUGIN_UNKNOWN = -1,
00047 GAIM_PLUGIN_STANDARD = 0,
00048 GAIM_PLUGIN_LOADER,
00049 GAIM_PLUGIN_PROTOCOL
00051 } GaimPluginType;
00052
00053 #define GAIM_PRIORITY_DEFAULT 0
00054 #define GAIM_PRIORITY_HIGHEST 9999
00055 #define GAIM_PRIORITY_LOWEST -9999
00056
00057 #define GAIM_PLUGIN_FLAG_INVISIBLE 0x01
00058
00059 #define GAIM_PLUGIN_API_VERSION 3
00060 #define GAIM_LOADER_API_VERSION 2
00061
00067 struct _GaimPluginInfo
00068 {
00069 unsigned int api_version;
00070 GaimPluginType type;
00071 char *ui_requirement;
00072 unsigned long flags;
00073 GList *dependencies;
00074 GaimPluginPriority priority;
00075
00076 char *id;
00077 char *name;
00078 char *version;
00079 char *summary;
00080 char *description;
00081 char *author;
00082 char *homepage;
00083
00084 gboolean (*load)(GaimPlugin *plugin);
00085 gboolean (*unload)(GaimPlugin *plugin);
00086 void (*destroy)(GaimPlugin *plugin);
00087
00088 void *ui_info;
00089 void *extra_info;
00090 void *prefs_info;
00091 };
00092
00096 struct _GaimPluginLoaderInfo
00097 {
00098 unsigned int api_version;
00099
00100 GList *exts;
00101
00102 gboolean (*probe)(GaimPlugin *plugin);
00103 gboolean (*load)(GaimPlugin *plugin);
00104 gboolean (*unload)(GaimPlugin *plugin);
00105 void (*destroy)(GaimPlugin *plugin);
00106 };
00107
00111 struct _GaimPlugin
00112 {
00113 gboolean native_plugin;
00114 gboolean loaded;
00115 void *handle;
00116 char *path;
00117 GaimPluginInfo *info;
00118 char *error;
00119 void *ipc_data;
00120 void *extra;
00121 };
00122
00123 #define GAIM_PLUGIN_LOADER_INFO(plugin) \
00124 ((GaimPluginLoaderInfo *)(plugin)->info->extra_info)
00125
00126 struct _GaimPluginUiInfo {
00127 GaimPluginPrefFrame *(*get_plugin_pref_frame)(GaimPlugin *plugin);
00128
00129 void *iter;
00130 };
00131
00132 #define GAIM_PLUGIN_HAS_PREF_FRAME(plugin) \
00133 ((plugin)->info != NULL && (plugin)->info->prefs_info != NULL)
00134
00135 #define GAIM_PLUGIN_UI_INFO(plugin) \
00136 ((GaimPluginUiInfo*)(plugin)->info->prefs_info)
00137
00141 #if !defined(GAIM_PLUGINS) || defined(GAIM_STATIC_PRPL)
00142 # define GAIM_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
00143 gboolean gaim_init_##pluginname##_plugin(void) { \
00144 GaimPlugin *plugin = gaim_plugin_new(TRUE, NULL); \
00145 plugin->info = &(plugininfo); \
00146 initfunc((plugin)); \
00147 return gaim_plugin_register(plugin); \
00148 }
00149 #else
00150 # define GAIM_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
00151 G_MODULE_EXPORT gboolean gaim_init_plugin(GaimPlugin *plugin) { \
00152 plugin->info = &(plugininfo); \
00153 initfunc((plugin)); \
00154 return gaim_plugin_register(plugin); \
00155 }
00156 #endif
00157
00158 #ifdef __cplusplus
00159 extern "C" {
00160 #endif
00161
00162
00164
00175 GaimPlugin *gaim_plugin_new(gboolean native, const char *path);
00176
00188 GaimPlugin *gaim_plugin_probe(const char *filename);
00189
00197 gboolean gaim_plugin_register(GaimPlugin *plugin);
00198
00209 gboolean gaim_plugin_load(GaimPlugin *plugin);
00210
00221 gboolean gaim_plugin_unload(GaimPlugin *plugin);
00222
00233 gboolean gaim_plugin_reload(GaimPlugin *plugin);
00234
00240 void gaim_plugin_destroy(GaimPlugin *plugin);
00241
00249 gboolean gaim_plugin_is_loaded(const GaimPlugin *plugin);
00250
00253
00255
00272 gboolean gaim_plugin_ipc_register(GaimPlugin *plugin, const char *command,
00273 GaimCallback func,
00274 GaimSignalMarshalFunc marshal,
00275 GaimValue *ret_value, int num_params, ...);
00276
00283 void gaim_plugin_ipc_unregister(GaimPlugin *plugin, const char *command);
00284
00290 void gaim_plugin_ipc_unregister_all(GaimPlugin *plugin);
00291
00303 gboolean gaim_plugin_ipc_get_params(GaimPlugin *plugin, const char *command,
00304 GaimValue **ret_value, int *num_params,
00305 GaimValue ***params);
00306
00318 void *gaim_plugin_ipc_call(GaimPlugin *plugin, const char *command,
00319 gboolean *ok, ...);
00320
00323
00325
00334 void gaim_plugins_set_search_paths(size_t count, char **paths);
00335
00339 void gaim_plugins_unload_all(void);
00340
00344 void gaim_plugins_destroy_all(void);
00345
00352 void gaim_plugins_load_saved(const char *key);
00353
00361 void gaim_plugins_probe(const char *ext);
00362
00368 gboolean gaim_plugins_enabled(void);
00369
00376 void gaim_plugins_register_probe_notify_cb(void (*func)(void *), void *data);
00377
00383 void gaim_plugins_unregister_probe_notify_cb(void (*func)(void *));
00384
00391 void gaim_plugins_register_load_notify_cb(void (*func)(GaimPlugin *, void *),
00392 void *data);
00393
00399 void gaim_plugins_unregister_load_notify_cb(void (*func)(GaimPlugin *, void *));
00400
00407 void gaim_plugins_register_unload_notify_cb(void (*func)(GaimPlugin *, void *),
00408 void *data);
00409
00415 void gaim_plugins_unregister_unload_notify_cb(void (*func)(GaimPlugin *,
00416 void *));
00417
00425 GaimPlugin *gaim_plugins_find_with_name(const char *name);
00426
00434 GaimPlugin *gaim_plugins_find_with_filename(const char *filename);
00435
00443 GaimPlugin *gaim_plugins_find_with_basename(const char *basename);
00444
00452 GaimPlugin *gaim_plugins_find_with_id(const char *id);
00453
00459 GList *gaim_plugins_get_loaded(void);
00460
00466 GList *gaim_plugins_get_protocols(void);
00467
00473 GList *gaim_plugins_get_all(void);
00474
00477 #ifdef __cplusplus
00478 }
00479 #endif
00480
00481 #endif