mcabber/mcabber/modules.c
author Holger Weiß <holger@zedat.fu-berlin.de>
Sun, 26 Jul 2015 22:45:56 +0200
changeset 2308 e8c8665c824e
parent 2268 f5402d705f67
permissions -rw-r--r--
Let <Enter> (un)fold groups in vi mode When the input line is empty and the user hits the <Enter> key on a roster group name, (un)fold that group even if vi_mode is set to 1. --- mcabber/mcabber/screen.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
2268
f5402d705f67 Fix FSF addresses in all files
Mikael Berthe <mikael@lilotux.net>
parents: 1831
diff changeset
    17
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 */
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
#include <glib.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
#include <gmodule.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <string.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include "settings.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include "config.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include "modules.h"
1773
553e7aa88c9f Set the message flag for /module info output
Mikael Berthe <mikael@lilotux.net>
parents: 1771
diff changeset
    27
#include "screen.h"
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include "utils.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    30
// Registry of loaded modules
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    31
GSList *loaded_modules = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    33
const gchar *mcabber_branch = MCABBER_BRANCH;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    34
const guint mcabber_api_version = MCABBER_API_VERSION;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
static gint module_list_comparator(gconstpointer arg1, gconstpointer arg2)
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 loaded_module_t *module = arg1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
  const char *name = arg2;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
  return g_strcmp0(module->name, name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
//  module_load(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
// Tries to load specified module and any modules, that this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
// 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
    46
// case of error. Error message not necessarily indicates error.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
const gchar *module_load(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
  GModule       *mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
  module_info_t *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
  if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
    return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
  { // Check if module is already loaded
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    56
    GSList *lmod = g_slist_find_custom(loaded_modules, arg,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    57
                                       module_list_comparator);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
    if (lmod) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
      loaded_module_t *module = lmod->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
      if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
        if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
          module->locked = TRUE;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
          module->refcount += 1;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    66
          return force ? NULL : "Module is already automatically loaded, "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    67
                                "marked as manually loaded";
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
        } else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
          return force ? NULL : "Module is already loaded";
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
        module->refcount += 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
        return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
    }
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
  { // Load module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
    gchar *mdir = expand_filename(settings_opt_get("modules_dir"));
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
    gchar *path = g_module_build_path(mdir ? mdir : PKGLIB_DIR, arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
    g_free(mdir);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
    mod = g_module_open(path, G_MODULE_BIND_LAZY);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
    g_free(path);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
    if (!mod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
      return g_module_error();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    87
  { // Obtain module information structures list
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
    gchar *varname = g_strdup_printf("info_%s", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
    gpointer var = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
    // convert to a valid symbol name
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
    g_strcanon(varname, "abcdefghijklmnopqrstuvwxyz0123456789", '_');
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
    if (!g_module_symbol(mod, varname, &var)) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
      if (!force) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
        g_free(varname);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    97
        if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    98
          scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    99
                       g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
        return "Module provides no information structure";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   103
      scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   104
                                 "Module provides no information structure.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
    g_free(varname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
    info = var;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   111
  // Find appropriate info struct
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   112
  if (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   113
    while (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   114
      if (!info->branch || !*(info->branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   115
        scr_LogPrint(LPRINT_DEBUG, "No branch name, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   116
                     "skipping info chunk.");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   117
      } else if (strcmp(info->branch, mcabber_branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   118
        scr_LogPrint(LPRINT_DEBUG, "Unhandled branch %s, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   119
                     "skipping info chunk.", info->branch);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   120
      } else if (info->api > mcabber_api_version ||
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   121
                 info->api < MCABBER_API_MIN) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   122
        if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   123
          scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   124
                       g_module_error());
1771
ffd0f245de40 Minor cosmetic change (api->API)
Mikael Berthe <mikael@lilotux.net>
parents: 1770
diff changeset
   125
        return "Incompatible mcabber API version";
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   126
      } else
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   127
        break;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   128
      info = info->next;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   131
    if (!info) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   132
      if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   133
        scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   134
                     g_module_error());
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   135
      return "No supported mcabber branch description found";
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   136
    }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
  // Load dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
  if (info && info->requires) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
    const gchar **dep;
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   142
    GSList *deps = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
    for (dep = info->requires; *dep; ++dep) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
      const gchar *err = module_load(*dep, FALSE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
      if (err) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
        GSList *mel;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   149
        scr_LogPrint(LPRINT_LOGNORM, "Error loading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   150
                     *dep, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
        // Unload already loaded dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
        for (mel = deps; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
          gchar *ldmname = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
          err = module_unload(ldmname, FALSE, FALSE);
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   156
          scr_LogPrint(LPRINT_LOGNORM,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   157
                       "Error unloading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   158
                       ldmname, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
          g_free(ldmname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
        }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
        g_slist_free(deps);
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
        // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
        if (!g_module_close(mod))
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   165
          scr_LogPrint(LPRINT_LOGNORM, "Error unloading module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   166
                       arg, g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
        return "Dependency problems";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   170
      deps = g_slist_append(deps, (gpointer) *dep);
1735
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
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   173
    g_slist_free(deps);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
  { // Register module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
    loaded_module_t *module = g_new(loaded_module_t, 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
    module->refcount     = 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
    module->locked       = manual;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
    module->name         = g_strdup(arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
    module->module       = mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
    module->info         = info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
    loaded_modules = g_slist_prepend(loaded_modules, module);
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
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
  // Run initialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
  if (info && info->init)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
    info->init();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   191
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
  // XXX Run hk_loaded_module hook (and move this line there)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
  scr_LogPrint(LPRINT_LOGNORM, "Loaded module %s.", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
  return NULL;
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
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
//  module_unload(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
// Unload specified module and any automatically loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
// that are no more required.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
const gchar *module_unload(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
  GSList          *lmod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
  loaded_module_t *module;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
  module_info_t   *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
  if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
    return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
  lmod = g_slist_find_custom(loaded_modules, arg, module_list_comparator);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
  if (!lmod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
    return "Module not found";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
  module = lmod->data;
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
  // Check if user can unload this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
  if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
    if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
      if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   220
        scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   221
                     "Manually unloading automatically loaded module.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
      else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
        return "Module is not loaded manually";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
    module->locked = FALSE;
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
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
  // Check refcount
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
  module->refcount -= 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
  if (module->refcount > 0) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
    if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   232
      scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   233
                   "Refcount is not zero (%u).", module->refcount);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
    else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
      return manual ? "Module is required by some other modules" : NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
  info = module->info;
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
  // Run uninitialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
  if (info && info->uninit)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
    info->uninit();
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   243
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   244
  // Unload dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   245
  if (info && info->requires) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   246
    const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   247
    for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   248
      const gchar *err = module_unload(*dep, FALSE, FALSE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   249
      if (err) // XXX
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   250
        scr_LogPrint(LPRINT_LOGNORM,
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   251
                     "Error unloading automatically loaded module %s: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   252
                     *dep, err);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   253
    }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   254
  }
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
  // 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
   257
  module->info = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
  // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
  if (!g_module_close(module->module))
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
    return g_module_error(); // XXX destroy structure?
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
  // Destroy structure
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
  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
   265
  // 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
   266
  scr_LogPrint(LPRINT_LOGNORM, "Unloaded module %s.", module->name);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
  g_free(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
  g_free(module);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
  return NULL;
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
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
//  module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
// Prints into status buffer and log list of the currently loaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
// modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
void module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
  GSList *mel;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
  gsize maxlen = 0;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
  gchar *format;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
  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
   282
  guint module_count = 0;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
  if (!loaded_modules) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
    scr_LogPrint(LPRINT_LOGNORM, "No modules loaded.");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
    return;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   289
  // Count maximum module name length
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
  for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
    gsize len = strlen(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
    if (len > maxlen)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
      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
   295
    module_count++;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
  // Create format string
1774
dc4bd31c2254 Fix two warnings
Mikael Berthe <mikael@lilotux.net>
parents: 1773
diff changeset
   299
  format = g_strdup_printf("%%-%us  %%2u (%%c)", (unsigned)maxlen);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
  // Fill the message to be printed
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
  message = g_string_new("Loaded modules:\n");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
  for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   304
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   306
    g_string_append_printf(message, format, module->name, module->refcount,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   307
                           module->locked ? 'M' : 'A');
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   309
    if (module->info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   310
      module_info_t *info = module->info;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   312
      // Module version
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   313
      if (info->version) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   314
        g_string_append(message, " version: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   315
        g_string_append(message, info->version);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   317
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   318
      // Module dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   319
      if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   320
        const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   321
        g_string_append(message, " depends: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   322
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   323
        for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   324
          g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   325
          g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   326
        }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   327
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   328
        // Chop extra ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   329
        g_string_truncate(message, message->len - 2);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   330
      }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   331
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
    g_string_append_c(message, '\n');
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
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
  // Chop extra "\n"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
  g_string_truncate(message, message->len - 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
1820
0628dcecaddf Set the message flag with module list (when there are several modules)
Mikael Berthe <mikael@lilotux.net>
parents: 1815
diff changeset
   339
  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
   340
1822
f44c375dabf1 Slight change for changeset 0628dcecaddf
Mikael Berthe <mikael@lilotux.net>
parents: 1820
diff changeset
   341
  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
   342
    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
   343
    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
   344
                                  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
   345
  }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   346
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   347
  g_string_free(message, TRUE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   348
  g_free(format);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   349
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   350
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   351
//  module_info_print(name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   352
// Prints info about specific module
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   353
void module_info_print(const gchar *name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   354
{
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   355
  GSList *lmod;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   356
  loaded_module_t *module;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   357
  module_info_t *info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   358
1755
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
   359
  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
   360
    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
   361
    return;
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
   362
  }
84487d78d0ea Add a warning when using /module info with no module name
Mikael Berthe <mikael@lilotux.net>
parents: 1749
diff changeset
   363
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   364
  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
   365
  if (!lmod) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   366
    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
   367
    return;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   368
  }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   369
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   370
  module = lmod->data;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   371
  info = module->info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   372
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
   373
  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
   374
  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
   375
  scr_LogPrint(LPRINT_NORMAL, " Loaded: %s",
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   376
               module->locked ? "Manually" : "Automatically");
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
   377
  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
   378
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   379
  if (info) {
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->version)
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
   382
      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
   383
    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
   384
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   385
    if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   386
      GString *message = g_string_new("Depends on: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   387
      const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   388
      for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   389
        g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   390
        g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   391
      }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   392
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   393
      // Chop last ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   394
      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
   395
      scr_LogPrint(LPRINT_NORMAL, " %s", message->str);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   396
      g_string_free(message, TRUE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   397
    }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   398
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   399
    if (info->description)
1831
78616d66a7f2 Make module info output slightly more readable
Mikael Berthe <mikael@lilotux.net>
parents: 1828
diff changeset
   400
      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
   401
  }
1773
553e7aa88c9f Set the message flag for /module info output
Mikael Berthe <mikael@lilotux.net>
parents: 1771
diff changeset
   402
  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
   403
  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
   404
                                 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
   405
}
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   406
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
//  modules_init()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
// Initializes module system.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
void modules_init(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
}
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
//  modules_deinit()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
// Unloads all the modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
void modules_deinit(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
  GSList *mel;
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
  // We need only manually loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
  for (mel = loaded_modules; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
    if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
      break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
  while (mel) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
    const gchar     *err;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   430
    // Find next manually loaded module to treat
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   431
    for (mel = mel->next; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   432
      loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   433
      if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   434
        break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   435
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   436
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   437
    // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   438
    scr_LogPrint(LPRINT_LOGNORM, "Unloading module %s.", module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   439
    err = module_unload(module->name, TRUE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   440
    if (err)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   441
      scr_LogPrint(LPRINT_LOGNORM, "* Module unloading failed: %s.", err);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   442
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   443
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   444
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1774
diff changeset
   445
/* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2:  For Vim users... */