view mcabber/mcabber/modules.h @ 2223:965e0282c128

Backed out changeset fa516ef22145 Turns out that in this hash the value pointer is the same as the key pointer, so there's no need to free both the key and the value.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 06 Nov 2015 22:31:40 +0100
parents e6d355e50d7a
children
line wrap: on
line source

#ifndef __MCABBER_MODULES_H__
#define __MCABBER_MODULES_H__ 1

#include <glib.h>
#include <gmodule.h>
#include <mcabber/api.h> // MCABBER_BRANCH, MCABBER_API_VERSION

// Module loading process looks like this:
//   check, if module is loaded
//   load module (+ run g_module_check_init)
//   check <modulename>_info variable
//   check version
//   load dependencies
//   run initialization callback
//   module loaded
//   ...
//   run uninitialization callback
//   unload module (+ run g_module_unload)
//   unload dependencies
//   module unloaded

typedef void (*module_init_t)(void);
typedef void (*module_uninit_t)(void);

// Structure, that module should provide
typedef struct module_info_struct module_info_t;
struct module_info_struct {
  const gchar      *branch;           // Contains mcabber branch name, that this module is written to work with
  guint             api;              // Mcabber branch api version, that module is supposed to work with
  const gchar      *version;          // Module version string. Optional.
  const gchar      *description;      // Module description. Can contain multiple lines.
  const gchar     **requires;         // NULL-terminated list of module names, that must be loaded before this module
  module_init_t     init;             // Initialization callback to be called after all dependencies will be loaded
  module_uninit_t   uninit;           // Uninitialization callback to be called before module unloading
  module_info_t    *next;             // If module supports multiple branches, it can provide several branch structs.
};

const gchar *module_load(const gchar *name, gboolean manual, gboolean force);
const gchar *module_unload(const gchar *name, gboolean manual, gboolean force);

// Grey zone (these symbols are semi-private and are exposed only for compatibility modules)

// Information about loaded module
typedef struct {
  guint          refcount;      // Reference count
  gboolean       locked;        // If true, one of references is manual
  gchar         *name;          // Module name
  GModule       *module;        // Module object
  module_info_t *info;          // Module information struct. May be NULL!
} loaded_module_t;

// Registry of loaded modules
extern GSList *loaded_modules;

// Should be considered mcabber private and not a part of api

void module_list_print(void);
void module_info_print(const gchar *name);

void modules_init(void);
void modules_deinit(void);

#endif

/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */