annotate mcabber/mcabber/modules.c @ 1909:9c14153e2580

Do not display unhandled IQ result messages to the log window We display the message only in the debug log file, because these messages are usually ignored anyway (ideally we would create a handler explicitly when sending the initial IQ request). Thanks to VarLog for the report!
author Mikael Berthe <mikael@lilotux.net>
date Sun, 18 Apr 2010 14:14:05 +0200
parents 78616d66a7f2
children f5402d705f67
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 /*
1828
8f7d7c05f275 Small coding style update
Mikael Berthe <mikael@lilotux.net>
parents: 1822
diff changeset
2 * modules.c -- Modules handling
1735
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 * Copyright (C) 2010 Myhailo Danylenko <isbear@ukrpost.net>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
5 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
9 * your option) any later version.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
10 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
14 * General Public License for more details.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
15 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
19 * USA
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
20 */
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 #include <glib.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
23 #include <gmodule.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
24 #include <string.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
25
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
26 #include "settings.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
27 #include "config.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
28 #include "modules.h"
1773
553e7aa88c9f Set the message flag for /module info output
Mikael Berthe <mikael@lilotux.net>
parents: 1771
diff changeset
29 #include "screen.h"
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
30 #include "utils.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
31
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
32 // Registry of loaded modules
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
33 GSList *loaded_modules = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
34
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
35 const gchar *mcabber_branch = MCABBER_BRANCH;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
36 const guint mcabber_api_version = MCABBER_API_VERSION;
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 static gint module_list_comparator(gconstpointer arg1, gconstpointer arg2)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
39 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
40 const loaded_module_t *module = arg1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
41 const char *name = arg2;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
42 return g_strcmp0(module->name, name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
43 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
44
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
45 // module_load(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
46 // Tries to load specified module and any modules, that this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
47 // depends on. Returns NULL on success or constant error string in a
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
48 // case of error. Error message not necessarily indicates error.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
49 const gchar *module_load(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
50 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
51 GModule *mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
52 module_info_t *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
53
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
54 if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
55 return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
56
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
57 { // Check if module is already loaded
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
58 GSList *lmod = g_slist_find_custom(loaded_modules, arg,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
59 module_list_comparator);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
60
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
61 if (lmod) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
62 loaded_module_t *module = lmod->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
63
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
64 if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
65 if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
66 module->locked = TRUE;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
67 module->refcount += 1;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
68 return force ? NULL : "Module is already automatically loaded, "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
69 "marked as manually loaded";
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
70 } else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
71 return force ? NULL : "Module is already loaded";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
72 } else {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
73 module->refcount += 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
74 return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
75 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
76 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
77 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
78
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
79 { // Load module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
80 gchar *mdir = expand_filename(settings_opt_get("modules_dir"));
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
81 gchar *path = g_module_build_path(mdir ? mdir : PKGLIB_DIR, arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
82 g_free(mdir);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
83 mod = g_module_open(path, G_MODULE_BIND_LAZY);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
84 g_free(path);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
85 if (!mod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
86 return g_module_error();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
87 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
88
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
89 { // Obtain module information structures list
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
90 gchar *varname = g_strdup_printf("info_%s", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
91 gpointer var = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
92
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
93 // convert to a valid symbol name
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
94 g_strcanon(varname, "abcdefghijklmnopqrstuvwxyz0123456789", '_');
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
95
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
96 if (!g_module_symbol(mod, varname, &var)) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
97 if (!force) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
98 g_free(varname);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
99 if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
100 scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
101 g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
102 return "Module provides no information structure";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
103 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
104
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
105 scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
106 "Module provides no information structure.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
107 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
108
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
109 g_free(varname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
110 info = var;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
111 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
112
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
113 // Find appropriate info struct
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
114 if (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
115 while (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
116 if (!info->branch || !*(info->branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
117 scr_LogPrint(LPRINT_DEBUG, "No branch name, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
118 "skipping info chunk.");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
119 } else if (strcmp(info->branch, mcabber_branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
120 scr_LogPrint(LPRINT_DEBUG, "Unhandled branch %s, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
121 "skipping info chunk.", info->branch);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
122 } else if (info->api > mcabber_api_version ||
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
123 info->api < MCABBER_API_MIN) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
124 if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
125 scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
126 g_module_error());
1771
ffd0f245de40 Minor cosmetic change (api->API)
Mikael Berthe <mikael@lilotux.net>
parents: 1770
diff changeset
127 return "Incompatible mcabber API version";
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
128 } else
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
129 break;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
130 info = info->next;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
131 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
132
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
133 if (!info) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
134 if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
135 scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
136 g_module_error());
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
137 return "No supported mcabber branch description found";
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
138 }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
139 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
140
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
141 // Load dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
142 if (info && info->requires) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
143 const gchar **dep;
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
144 GSList *deps = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
145
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
146 for (dep = info->requires; *dep; ++dep) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
147 const gchar *err = module_load(*dep, FALSE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
148
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
149 if (err) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
150 GSList *mel;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
151 scr_LogPrint(LPRINT_LOGNORM, "Error loading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
152 *dep, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
153
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
154 // Unload already loaded dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
155 for (mel = deps; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
156 gchar *ldmname = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
157 err = module_unload(ldmname, FALSE, FALSE);
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
158 scr_LogPrint(LPRINT_LOGNORM,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
159 "Error unloading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
160 ldmname, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
161 g_free(ldmname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
162 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
163 g_slist_free(deps);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
164
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
165 // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
166 if (!g_module_close(mod))
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
167 scr_LogPrint(LPRINT_LOGNORM, "Error unloading module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
168 arg, g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
169 return "Dependency problems";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
170 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
171
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
172 deps = g_slist_append(deps, (gpointer) *dep);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
173 }
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
174
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
175 g_slist_free(deps);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
176 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
177
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
178 { // Register module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
179 loaded_module_t *module = g_new(loaded_module_t, 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
180
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
181 module->refcount = 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
182 module->locked = manual;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
183 module->name = g_strdup(arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
184 module->module = mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
185 module->info = info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
186
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
187 loaded_modules = g_slist_prepend(loaded_modules, module);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
188 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
189
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
190 // Run initialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
191 if (info && info->init)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
192 info->init();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
193
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
194 // XXX Run hk_loaded_module hook (and move this line there)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
195 scr_LogPrint(LPRINT_LOGNORM, "Loaded module %s.", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
196
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
197 return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
198 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
199
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
200 // module_unload(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
201 // Unload specified module and any automatically loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
202 // that are no more required.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
203 const gchar *module_unload(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
204 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
205 GSList *lmod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
206 loaded_module_t *module;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
207 module_info_t *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
208
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
209 if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
210 return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
211
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
212 lmod = g_slist_find_custom(loaded_modules, arg, module_list_comparator);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
213 if (!lmod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
214 return "Module not found";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
215
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
216 module = lmod->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
217
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
218 // Check if user can unload this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
219 if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
220 if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
221 if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
222 scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
223 "Manually unloading automatically loaded module.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
224 else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
225 return "Module is not loaded manually";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
226 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
227 module->locked = FALSE;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
228 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
229
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
230 // Check refcount
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
231 module->refcount -= 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
232 if (module->refcount > 0) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
233 if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
234 scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
235 "Refcount is not zero (%u).", module->refcount);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
236 else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
237 return manual ? "Module is required by some other modules" : NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
238 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
239
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
240 info = module->info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
241
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
242 // Run uninitialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
243 if (info && info->uninit)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
244 info->uninit();
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
245
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
246 // Unload dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
247 if (info && info->requires) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
248 const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
249 for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
250 const gchar *err = module_unload(*dep, FALSE, FALSE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
251 if (err) // XXX
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
252 scr_LogPrint(LPRINT_LOGNORM,
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
253 "Error unloading automatically loaded module %s: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
254 *dep, err);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
255 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
256 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
257
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
258 // XXX Prevent uninitialization routine and dep unloading to be performed again
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
259 module->info = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
260
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
261 // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
262 if (!g_module_close(module->module))
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
263 return g_module_error(); // XXX destroy structure?
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
264
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
265 // Destroy structure
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
266 loaded_modules = g_slist_delete_link(loaded_modules, lmod);
1763
5b497046df40 Fix output of message on module unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1755
diff changeset
267 // Output this here, as arg may point to module->name
5b497046df40 Fix output of message on module unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1755
diff changeset
268 scr_LogPrint(LPRINT_LOGNORM, "Unloaded module %s.", module->name);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
269 g_free(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
270 g_free(module);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
271
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
272 return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
273 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
274
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
275 // module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
276 // Prints into status buffer and log list of the currently loaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
277 // modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
278 void module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
279 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
280 GSList *mel;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
281 gsize maxlen = 0;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
282 gchar *format;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
283 GString *message;
1820
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
284 guint module_count = 0;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
285
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
286 if (!loaded_modules) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
287 scr_LogPrint(LPRINT_LOGNORM, "No modules loaded.");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
288 return;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
289 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
290
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
291 // Count maximum module name length
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
292 for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
293 loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
294 gsize len = strlen(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
295 if (len > maxlen)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
296 maxlen = len;
1820
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
297 module_count++;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
298 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
299
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
300 // Create format string
1774
dc4bd31c2254 Fix two warnings
Mikael Berthe <mikael@lilotux.net>
parents: 1773
diff changeset
301 format = g_strdup_printf("%%-%us %%2u (%%c)", (unsigned)maxlen);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
302
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
303 // Fill the message to be printed
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
304 message = g_string_new("Loaded modules:\n");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
305 for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
306 loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
307
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
308 g_string_append_printf(message, format, module->name, module->refcount,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
309 module->locked ? 'M' : 'A');
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
310
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
311 if (module->info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
312 module_info_t *info = module->info;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
313
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
314 // Module version
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
315 if (info->version) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
316 g_string_append(message, " version: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
317 g_string_append(message, info->version);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
318 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
319
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
320 // Module dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
321 if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
322 const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
323 g_string_append(message, " depends: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
324
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
325 for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
326 g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
327 g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
328 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
329
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
330 // Chop extra ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
331 g_string_truncate(message, message->len - 2);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
332 }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
333 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
334
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
335 g_string_append_c(message, '\n');
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
336 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
337
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
338 // Chop extra "\n"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
339 g_string_truncate(message, message->len - 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
340
1820
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
341 scr_LogPrint(LPRINT_NORMAL, "%s", message->str);
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
342
1822
f44c375dabf1 Slight change for changeset 0628dcecaddf
Mikael Berthe <mikael@lilotux.net>
parents: 1820
diff changeset
343 if (module_count + 1 > scr_getlogwinheight()) {
1820
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
344 scr_setmsgflag_if_needed(SPECIAL_BUFFER_STATUS_ID, TRUE);
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
345 scr_setattentionflag_if_needed(SPECIAL_BUFFER_STATUS_ID, TRUE,
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
346 ROSTER_UI_PRIO_STATUS_WIN_MESSAGE, prio_max);
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
347 }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
348
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
349 g_string_free(message, TRUE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
350 g_free(format);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
351 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
352
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
353 // module_info_print(name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
354 // Prints info about specific module
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
355 void module_info_print(const gchar *name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
356 {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
357 GSList *lmod;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
358 loaded_module_t *module;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
359 module_info_t *info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
360
1755
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
361 if (!name || !name[0]) {
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
362 scr_LogPrint(LPRINT_NORMAL, "Please specify a module name.");
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
363 return;
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
364 }
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
365
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
366 lmod = g_slist_find_custom(loaded_modules, name, module_list_comparator);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
367 if (!lmod) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
368 scr_LogPrint(LPRINT_NORMAL, "Module %s not found.", name);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
369 return;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
370 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
371
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
372 module = lmod->data;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
373 info = module->info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
374
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
375 scr_LogPrint(LPRINT_NORMAL, "Module %s", module->name);
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
376 scr_LogPrint(LPRINT_NORMAL, " Location: %s", g_module_name(module->module));
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
377 scr_LogPrint(LPRINT_NORMAL, " Loaded: %s",
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
378 module->locked ? "Manually" : "Automatically");
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
379 scr_LogPrint(LPRINT_NORMAL, " Reference count: %u", module->refcount);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
380
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
381 if (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
382
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
383 if (info->version)
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
384 scr_LogPrint(LPRINT_NORMAL, " Version: %s", info->version);
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
385 scr_LogPrint(LPRINT_NORMAL, " API: %s:%u", info->branch, info->api);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
386
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
387 if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
388 GString *message = g_string_new("Depends on: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
389 const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
390 for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
391 g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
392 g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
393 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
394
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
395 // Chop last ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
396 g_string_truncate(message, message->len - 2);
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
397 scr_LogPrint(LPRINT_NORMAL, " %s", message->str);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
398 g_string_free(message, TRUE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
399 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
400
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
401 if (info->description)
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
402 scr_LogPrint(LPRINT_NORMAL, " Description: %s", info->description);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
403 }
1773
553e7aa88c9f Set the message flag for /module info output
Mikael Berthe <mikael@lilotux.net>
parents: 1771
diff changeset
404 scr_setmsgflag_if_needed(SPECIAL_BUFFER_STATUS_ID, TRUE);
1815
6abca6000762 Make use of ROSTER_UI_PRIO_STATUS_WIN_MESSAGE
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
405 scr_setattentionflag_if_needed(SPECIAL_BUFFER_STATUS_ID, TRUE,
6abca6000762 Make use of ROSTER_UI_PRIO_STATUS_WIN_MESSAGE
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
406 ROSTER_UI_PRIO_STATUS_WIN_MESSAGE, prio_max);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
407 }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
408
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
409 // modules_init()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
410 // Initializes module system.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
411 void modules_init(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
412 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
413 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
414
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
415 // modules_deinit()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
416 // Unloads all the modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
417 void modules_deinit(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
418 {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
419 GSList *mel;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
420
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
421 // We need only manually loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
422 for (mel = loaded_modules; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
423 loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
424 if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
425 break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
426 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
427
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
428 while (mel) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
429 loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
430 const gchar *err;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
431
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
432 // Find next manually loaded module to treat
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
433 for (mel = mel->next; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
434 loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
435 if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
436 break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
437 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
438
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
439 // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
440 scr_LogPrint(LPRINT_LOGNORM, "Unloading module %s.", module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
441 err = module_unload(module->name, TRUE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
442 if (err)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
443 scr_LogPrint(LPRINT_LOGNORM, "* Module unloading failed: %s.", err);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
444 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
445 }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
446
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1774
diff changeset
447 /* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */