Author: iratqq
Date: Mon Dec 31 18:32:52 2007
New Revision: 5082

Modified:
  trunk/notify/uim-knotify.cc
  trunk/notify/uim-libnotify.c
  trunk/scm/im-custom.scm
  trunk/uim/uim-notify.c
  trunk/uim/uim-notify.h
  trunk/uim/uim-util.c

Log:
* uim/uim-notify.c
 - (uim_notify_get_desc): New function.
* uim/uim-notify.c
 - (uim_notify_load_stderr): Initialize notify_desc.
* uim/uim-notify.c
 - (uim_notify_stderr_get_desc): New function.
* notify/uim-libnotify.c
 - (uim_notify_plugin_get_desc): ditto.
* notify/uim-knotify.cc
 - (uim_notify_plugin_get_desc): ditto.
* uim/uim-notify.c
 - (uim_notify_stderr_init, uim_notify_stderr_quit)
   (uim_notify_stderr_info, uim_notify_stderr_fatal):
   Make global.
* uim/uim-notify.h
 - ditto.
* uim/uim-util.c
 - (uim_scm_notify_get_plugins): Change return values as
   '(name "name" "description").
   Get description from uim_notify_plugin_get_desc() via dlopen.
* scm/im-custom.scm
 - (notify-agent): Remove kludge.


Modified: trunk/notify/uim-knotify.cc
==============================================================================
--- trunk/notify/uim-knotify.cc (original)
+++ trunk/notify/uim-knotify.cc Mon Dec 31 18:32:52 2007
@@ -42,7 +42,20 @@
#include "config.h"
#include "uim-notify.h"

+
static int inited = 0;
+
+static uim_notify_desc uim_notify_knotify_desc = {
+  "knotify",
+  "Output via knotify",
+};
+
+uim_notify_desc*
+uim_notify_plugin_get_desc(void)
+{
+  return &uim_notify_knotify_desc;
+}
+
int
uim_notify_plugin_init()
{

Modified: trunk/notify/uim-libnotify.c
==============================================================================
--- trunk/notify/uim-libnotify.c        (original)
+++ trunk/notify/uim-libnotify.c        Mon Dec 31 18:32:52 2007
@@ -87,6 +87,17 @@
/*
  interface
 */
+static uim_notify_desc uim_notify_libnotify_desc = {
+  "libnotify",
+  "Output via libnotify",
+};
+
+uim_notify_desc*
+uim_notify_plugin_get_desc(void)
+{
+  return &uim_notify_libnotify_desc;
+}
+
int
uim_notify_plugin_init(void)
{

Modified: trunk/scm/im-custom.scm
==============================================================================
--- trunk/scm/im-custom.scm     (original)
+++ trunk/scm/im-custom.scm     Mon Dec 31 18:32:52 2007
@@ -552,9 +552,7 @@
(define-custom 'notify-agent 'stderr
  '(notify)
  `(choice
-    ,@(map (lambda (str)
-             (list (string->symbol str) str str))
-           (uim-notify-get-plugins)))
+    ,@(uim-notify-get-plugins))
  (N_ "Notify agent name")
  (N_ "long description will be here."))


Modified: trunk/uim/uim-notify.c
==============================================================================
--- trunk/uim/uim-notify.c      (original)
+++ trunk/uim/uim-notify.c      Mon Dec 31 18:32:52 2007
@@ -55,23 +55,21 @@
#define dlfunc dlsym
#endif

-static int uim_notify_stderr_init(void);
-static void uim_notify_stderr_quit(void);
-static int uim_notify_stderr_info(const char *);
-static int uim_notify_stderr_fatal(const char *);
+static uim_notify_desc uim_notify_stderr_desc;

+static uim_notify_desc* (*uim_notify_get_desc_func)(void) = 
uim_notify_stderr_get_desc;
static int (*uim_notify_init_func)(void) = uim_notify_stderr_init;
static void (*uim_notify_quit_func)(void) = uim_notify_stderr_quit;
static int (*uim_notify_info_func)(const char *) = uim_notify_stderr_info;
static int (*uim_notify_fatal_func)(const char *) = uim_notify_stderr_fatal;

static void *notify_dlhandle = NULL;
-static char notify_agent_name[PATH_MAX];
+static uim_notify_desc* notify_desc = &uim_notify_stderr_desc;

static void
uim_notify_load_stderr()
{
-  strlcpy(notify_agent_name, "stderr", sizeof(notify_agent_name));
+  notify_desc = &uim_notify_stderr_desc;
  uim_notify_init_func  = uim_notify_stderr_init;
  uim_notify_quit_func  = uim_notify_stderr_quit;
  uim_notify_info_func  = uim_notify_stderr_info;
@@ -94,7 +92,7 @@

  if (strcmp(name, "stderr") == 0) {
    uim_notify_load_stderr();
-  } else if (strcmp(notify_agent_name, name) == 0) {
+  } else if (strcmp(notify_desc->name, name) == 0) {
    return 1;
  } else {
    char path[PATH_MAX];
@@ -108,6 +106,13 @@
      uim_notify_load_stderr();
      return 0;
    }
+    uim_notify_get_desc_func = (uim_notify_desc* 
(*)(void))(intptr_t)dlfunc(notify_dlhandle, "uim_notify_plugin_get_desc");
+    if (!uim_notify_get_desc_func) {
+ fprintf(stderr, "uim-notify: cannot found 'uim_notify_get_desc()' in %s\n", path);
+      dlclose(notify_dlhandle);
+      uim_notify_load_stderr();
+      return 0;
+    }
    uim_notify_init_func  = (int (*)(void))(intptr_t)dlfunc(notify_dlhandle, 
"uim_notify_plugin_init");
    if (!uim_notify_init_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_init()' in %s\n", path);
@@ -137,13 +142,18 @@
      return 0;
    }

+    notify_desc = uim_notify_get_desc_func();
    uim_notify_init_func();
-
-    strlcpy(notify_agent_name, name, sizeof(notify_agent_name));
  }
  return 1;
}

+uim_notify_desc*
+uim_notify_get_desc(void)
+{
+  return uim_notify_get_desc_func();
+}
+
int
uim_notify_init(void)
{
@@ -188,25 +198,36 @@
/*
 * builtin functions
 */
-static int
+static uim_notify_desc uim_notify_stderr_desc = {
+  "stderr",
+  "Standard Error output",
+};
+
+uim_notify_desc*
+uim_notify_stderr_get_desc(void)
+{
+  return &uim_notify_stderr_desc;
+}
+
+int
uim_notify_stderr_init(void)
{
  return 1;
}

-static void
+void
uim_notify_stderr_quit(void)
{
  return;
}

-static int
+int
uim_notify_stderr_info(const char *msg)
{
  return fprintf(stderr, "uim [Info]: %s", msg);
}

-static int
+int
uim_notify_stderr_fatal(const char *msg)
{
  return fprintf(stderr, "uim [Fatal]: %s", msg);

Modified: trunk/uim/uim-notify.h
==============================================================================
--- trunk/uim/uim-notify.h      (original)
+++ trunk/uim/uim-notify.h      Mon Dec 31 18:32:52 2007
@@ -21,17 +21,31 @@
extern "C" {
#endif

+typedef struct {
+  char *name;
+  char *desc;
+} uim_notify_desc;
+
+uim_notify_desc* uim_notify_get_desc(void);
int uim_notify_load(const char *);
int uim_notify_init(void);
void uim_notify_quit(void);
int uim_notify_info(const char *, ...);
int uim_notify_fatal(const char *, ...);

+uim_notify_desc* uim_notify_plugin_get_desc(void);
int uim_notify_plugin_load(const char *);
int uim_notify_plugin_init(void);
void uim_notify_plugin_quit(void);
int uim_notify_plugin_info(const char *);
int uim_notify_plugin_fatal(const char *);
+
+/* builtin notify module */
+uim_notify_desc* uim_notify_stderr_get_desc(void);
+int uim_notify_stderr_init(void);
+void uim_notify_stderr_quit(void);
+int uim_notify_stderr_info(const char *);
+int uim_notify_stderr_fatal(const char *);

#ifdef __cplusplus
}

Modified: trunk/uim/uim-util.c
==============================================================================
--- trunk/uim/uim-util.c        (original)
+++ trunk/uim/uim-util.c        Mon Dec 31 18:32:52 2007
@@ -40,6 +40,7 @@
#include <string.h>
#include <assert.h>
#include <dirent.h>
+#include <dlfcn.h>

#include "uim-internal.h"
#include "uim-scm.h"
@@ -285,6 +286,10 @@
  return MAKE_BOOL(uim_issetugid());
}

+#ifndef HAVE_DLFUNC
+#define dlfunc dlsym
+#endif
+
static uim_lisp
uim_scm_notify_get_plugins(void)
{
@@ -292,11 +297,19 @@
  DIR *dirp;
  struct dirent *dp;
  int plen, slen;
+  uim_notify_desc* desc;
+  void *handle;
+  uim_notify_desc* (*desc_func)(void);
+  char *str;

  plen = strlen(NOTIFY_PLUGIN_PREFIX);
  slen = strlen(NOTIFY_PLUGIN_SUFFIX);

-  ret_ = CONS(MAKE_STR("stderr"), uim_scm_null());
+  desc = uim_notify_stderr_get_desc();
+  ret_ = CONS(LIST3(MAKE_SYM(desc->name),
+                   MAKE_STR(desc->name),
+                   MAKE_STR(desc->desc)),
+             uim_scm_null());
  dirp = opendir(NOTIFY_PLUGIN_PATH);
  if (dirp) {
    while ((dp = readdir(dirp)) != NULL) {
@@ -308,8 +321,26 @@
          (strcmp(dp->d_name + len - slen, NOTIFY_PLUGIN_SUFFIX) != 0))
        continue;

-      strlcpy(name, dp->d_name + plen, len - plen - slen + 1);
-      ret_ = CONS(MAKE_STR(name), ret_);
+      handle = dlopen(dp->d_name, RTLD_NOW);
+      if ((str = dlerror()) != NULL) {
+       fprintf(stderr, "load failed %s(%s)\n", dp->d_name, str);
+       continue;
+      }
+      desc_func = (uim_notify_desc* (*)(void))(intptr_t)dlfunc(handle, 
"uim_notify_plugin_get_desc");
+      if (!desc_func) {
+       fprintf(stderr, "cannot found 'uim_notify_get_desc()' in %s\n", 
dp->d_name);
+       dlclose(handle);
+       continue;
+      }
+
+      desc = desc_func();
+
+      ret_ = CONS(LIST3(MAKE_SYM(desc->name),
+                       MAKE_STR(desc->name),
+                       MAKE_STR(desc->desc)),
+                 ret_);
+
+      dlclose(handle);
    }
    (void)closedir(dirp);
  }

Reply via email to