author | Mikael Berthe <mikael@lilotux.net> |
Wed, 27 Jan 2016 10:34:44 +0100 | |
changeset 2241 | d703d6b42b32 |
parent 1811 | e6d355e50d7a |
permissions | -rw-r--r-- |
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> |
1763
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 | 64 |
|
65 |
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |