annotate mcabber/mcabber/modules.h @ 2225:dc3b3ac1ba76

Free the buffdata structures when buffers are closed Free the buffdata strcutures when buffers are closed and there are no more users (these structures can be shared if the "symlink" shared history is used).
author Mikael Berthe <mikael@lilotux.net>
date Sat, 07 Nov 2015 12:21:12 +0100
parents e6d355e50d7a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
1 #ifndef __MCABBER_MODULES_H__
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
2 #define __MCABBER_MODULES_H__ 1
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
3
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
4 #include <glib.h>
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
5 #include <gmodule.h>
1762
e7ce50fe19a9 Introduce mcabber/api.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1754
diff changeset
6 #include <mcabber/api.h> // MCABBER_BRANCH, MCABBER_API_VERSION
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
7
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
8 // Module loading process looks like this:
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
9 // check, if module is loaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
10 // load module (+ run g_module_check_init)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
11 // check <modulename>_info variable
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
12 // check version
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
13 // load dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
14 // run initialization callback
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
15 // module loaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
16 // ...
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
17 // run uninitialization callback
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
18 // unload module (+ run g_module_unload)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
19 // unload dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
20 // module unloaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
21
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
22 typedef void (*module_init_t)(void);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
23 typedef void (*module_uninit_t)(void);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
24
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
25 // Structure, that module should provide
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
26 typedef struct module_info_struct module_info_t;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
27 struct module_info_struct {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
28 const gchar *branch; // Contains mcabber branch name, that this module is written to work with
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
29 guint api; // Mcabber branch api version, that module is supposed to work with
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
30 const gchar *version; // Module version string. Optional.
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
31 const gchar *description; // Module description. Can contain multiple lines.
1754
d8442bcb33b7 Reorder fields in module info struct
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1749
diff changeset
32 const gchar **requires; // NULL-terminated list of module names, that must be loaded before this module
d8442bcb33b7 Reorder fields in module info struct
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1749
diff changeset
33 module_init_t init; // Initialization callback to be called after all dependencies will be loaded
d8442bcb33b7 Reorder fields in module info struct
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1749
diff changeset
34 module_uninit_t uninit; // Uninitialization callback to be called before module unloading
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
35 module_info_t *next; // If module supports multiple branches, it can provide several branch structs.
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
36 };
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
37
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
38 const gchar *module_load(const gchar *name, gboolean manual, gboolean force);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
39 const gchar *module_unload(const gchar *name, gboolean manual, gboolean force);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
40
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
41 // Grey zone (these symbols are semi-private and are exposed only for compatibility modules)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
42
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
43 // Information about loaded module
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
44 typedef struct {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
45 guint refcount; // Reference count
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
46 gboolean locked; // If true, one of references is manual
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
47 gchar *name; // Module name
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
48 GModule *module; // Module object
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
49 module_info_t *info; // Module information struct. May be NULL!
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
50 } loaded_module_t;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
51
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
52 // Registry of loaded modules
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
53 extern GSList *loaded_modules;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
54
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
55 // Should be considered mcabber private and not a part of api
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
56
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
57 void module_list_print(void);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1735
diff changeset
58 void module_info_print(const gchar *name);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
59
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
60 void modules_init(void);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
61 void modules_deinit(void);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
62
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
63 #endif
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1762
diff changeset
64
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1762
diff changeset
65 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */