diff options
| author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2009-04-25 22:54:15 -0300 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2009-04-25 22:54:15 -0300 | 
| commit | cc6fd7f646e372a50c56db1c9af1b9d0bcbe8d6c (patch) | |
| tree | 4fca59e27fe04fe22d1966a681adfb24e3e087b6 /hardinfo2 | |
| parent | 77baf70fba7d7fbdd10d677a3a0357c7337d8b12 (diff) | |
Start implementing the XML-RPC server
Diffstat (limited to 'hardinfo2')
| -rw-r--r-- | hardinfo2/hardinfo.c | 2 | ||||
| -rw-r--r-- | hardinfo2/hardinfo.h | 1 | ||||
| -rw-r--r-- | hardinfo2/remote.c | 7 | ||||
| -rw-r--r-- | hardinfo2/uidefs.h | 4 | ||||
| -rw-r--r-- | hardinfo2/util.c | 10 | ||||
| -rw-r--r-- | hardinfo2/xmlrpc-server.c | 228 | ||||
| -rw-r--r-- | hardinfo2/xmlrpc-server.h | 17 | 
7 files changed, 255 insertions, 14 deletions
| diff --git a/hardinfo2/hardinfo.c b/hardinfo2/hardinfo.c index d8eb40a1..ac52a9a4 100644 --- a/hardinfo2/hardinfo.c +++ b/hardinfo2/hardinfo.c @@ -1,6 +1,6 @@  /*   *    HardInfo - Displays System Information - *    Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org> + *    Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org>   *   *    This program is free software; you can redistribute it and/or modify   *    it under the terms of the GNU General Public License as published by diff --git a/hardinfo2/hardinfo.h b/hardinfo2/hardinfo.h index 030cc46a..31b1365a 100644 --- a/hardinfo2/hardinfo.h +++ b/hardinfo2/hardinfo.h @@ -97,6 +97,7 @@ gchar	     *find_program(gchar *program_name);  inline gchar *size_human_readable(gfloat size);  void          nonblock_sleep(guint msec);  void          open_url(gchar *url); +GSList	     *modules_get_list(void);  GSList	     *modules_load_selected(void);  GSList       *modules_load_all(void);  ModuleAbout  *module_get_about(ShellModule *module); diff --git a/hardinfo2/remote.c b/hardinfo2/remote.c index ae144b5d..de3a9692 100644 --- a/hardinfo2/remote.c +++ b/hardinfo2/remote.c @@ -69,7 +69,7 @@ static RemoteDialog *remote_dialog_new(GtkWidget *parent);  static void remote_connect(RemoteDialog *rd)  { -     +  }  void remote_dialog_show(GtkWidget *parent) @@ -114,19 +114,22 @@ static void populate_store(GtkListStore * store)          for (i = 0; i < no_hosts; i++) {              gchar *hostname;              gchar *hostgroup; +            gchar *icon;              hostgroup = g_strdup_printf("Host%d", i);              hostname = g_key_file_get_string(remote, hostgroup, "name", NULL); +            icon = g_key_file_get_string(remote, hostgroup, "icon", NULL);              gtk_list_store_append(store, &iter);              gtk_list_store_set(store, &iter, -                               0, icon_cache_get_pixbuf("server.png"), +                               0, icon_cache_get_pixbuf(icon ? icon : "server.png"),                                 1, hostname,                                 2, GINT_TO_POINTER(i),                                 -1);              g_free(hostgroup); +            g_free(icon);          }      } diff --git a/hardinfo2/uidefs.h b/hardinfo2/uidefs.h index e3f1d728..ed1abf92 100644 --- a/hardinfo2/uidefs.h +++ b/hardinfo2/uidefs.h @@ -5,6 +5,8 @@ char *uidefs_str = "<ui>" \  "	<menubar>" \  "	<menu name=\"InformationMenu\" action=\"InformationMenuAction\">" \  "		<menuitem name=\"ConnectTo\" action=\"ConnectToAction\" />" \ +"		<menuitem name=\"SyncManager\" action=\"SyncManagerAction\" />" \ +"		<separator/>" \  "		<menuitem name=\"Report\" action=\"ReportAction\" />" \  "		<separator/>" \  "		<menuitem name=\"Copy\" action=\"CopyAction\" />" \ @@ -13,8 +15,6 @@ char *uidefs_str = "<ui>" \   * "<menuitem name=\"SaveGraph\" action=\"SaveGraphAction\" />" \   */  "		<separator/>" \ -"		<menuitem name=\"SyncManager\" action=\"SyncManagerAction\" />" \ -"		<separator/>" \  "		<menuitem name=\"Quit\" action=\"QuitAction\" />" \  "	</menu>" \  "	<menu name=\"ViewMenu\" action=\"ViewMenuAction\">" \ diff --git a/hardinfo2/util.c b/hardinfo2/util.c index 510c5d0e..9cef2cef 100644 --- a/hardinfo2/util.c +++ b/hardinfo2/util.c @@ -807,6 +807,13 @@ static GSList *modules_check_deps(GSList * modules)      return modules;  } +static GSList *modules_list = NULL; + +GSList *modules_get_list() +{ +    return modules_list; +} +  static GSList *modules_load(gchar ** module_list)  {      GDir *dir; @@ -845,7 +852,8 @@ static GSList *modules_load(gchar ** module_list)  	}      } -    return g_slist_sort(modules, module_cmp); +    modules_list = g_slist_sort(modules, module_cmp); +    return modules_list;  }  GSList *modules_load_selected(void) diff --git a/hardinfo2/xmlrpc-server.c b/hardinfo2/xmlrpc-server.c index 519eef81..8ddefffc 100644 --- a/hardinfo2/xmlrpc-server.c +++ b/hardinfo2/xmlrpc-server.c @@ -1,28 +1,229 @@ +/* + *    HardInfo - Displays System Information + *    Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> + * + *    This file is based off xmlrpc-server-test.c from libsoup test suite + *    Copyright (C) 2008 Red Hat, Inc. + * + *    This program is free software; you can redistribute it and/or modify + *    it under the terms of the GNU General Public License as published by + *    the Free Software Foundation, version 2. + * + *    This program is distributed in the hope that it will be useful, + *    but WITHOUT ANY WARRANTY; without even the implied warranty of + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *    GNU General Public License for more details. + * + *    You should have received a copy of the GNU General Public License + *    along with this program; if not, write to the Free Software + *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA + */ +  +#include "config.h" + +#ifdef HAS_LIBSOUP  #include <stdio.h> +#include <string.h>  #include <libsoup/soup.h> -#include "config.h" +#include "shell.h" +#include "hardinfo.h"  #define XMLRPC_SERVER_VERSION		1 - +/* server namespace */  static void method_get_api_version(SoupMessage *msg, GValueArray *params);  static void method_shutdown_server(SoupMessage *msg, GValueArray *params); +/* module namespace */ +static void method_get_module_list(SoupMessage *msg, GValueArray *params); +static void method_get_entry_list(SoupMessage *msg, GValueArray *params); +static void method_entry_reload(SoupMessage *msg, GValueArray *params); +static void method_entry_scan(SoupMessage *msg, GValueArray *params); +static void method_entry_scan_all(SoupMessage *msg, GValueArray *params); +static void method_entry_scan_all_except(SoupMessage *msg, GValueArray *params); +static void method_entry_get_field(SoupMessage *msg, GValueArray *params); +static void method_entry_get_moreinfo(SoupMessage *msg, GValueArray *params); +static void method_entry_get_note(SoupMessage *msg, GValueArray *params); +static void method_entry_function(SoupMessage *msg, GValueArray *params); +static void method_get_about_info(SoupMessage *msg, GValueArray *params); +static void method_call_method(SoupMessage *msg, GValueArray *params); +static void method_call_method_param(SoupMessage *msg, GValueArray *params); +/* method handler table */  static const struct {    gchar	*method_name;    void	*callback;  } handler_table[] = { -  { "getAPIVersion", 	method_get_api_version }, -  { "shutdownServer",	method_shutdown_server }, +  /* server namespace */ +  { "server.getAPIVersion", 		method_get_api_version }, +  { "server.shutdownServer",		method_shutdown_server }, +  /* module namespace */ +  { "module.getModuleList",		method_get_module_list }, +  { "module.getEntryList",		method_get_entry_list }, +  { "module.entryReload",		method_entry_reload }, +  { "module.entryScan",			method_entry_scan }, +  { "module.entryFunction",		method_entry_function }, +  { "module.entryGetNote",		method_entry_get_note }, +  { "module.entryGetField",		method_entry_get_field }, +  { "module.entryGetMoreInfo",		method_entry_get_moreinfo }, +  { "module.entryScanAll",		method_entry_scan_all }, +  { "module.entryScannAllExcept",	method_entry_scan_all_except }, +  { "module.getAboutInfo",		method_get_about_info }, +  { "module.callMethod",		method_call_method }, +  { "module.callMethodParam",		method_call_method_param },    { NULL }  };  static GHashTable *handlers = NULL;  static GMainLoop *loop = NULL; +static void +args_error (SoupMessage *msg, GValueArray *params, int expected) +{ +  soup_xmlrpc_set_fault (msg, +                         SOUP_XMLRPC_FAULT_SERVER_ERROR_INVALID_METHOD_PARAMETERS, +                         "Wrong number of parameters: expected %d, got %d", +                         expected, params->n_values); +} + +static void +type_error (SoupMessage *msg, GType expected, GValueArray *params, int bad_value) +{ +  soup_xmlrpc_set_fault (msg, +                         SOUP_XMLRPC_FAULT_SERVER_ERROR_INVALID_METHOD_PARAMETERS, +                         "Bad parameter #%d: expected %s, got %s", +                         bad_value + 1, g_type_name (expected), +                         g_type_name (G_VALUE_TYPE (¶ms->values[bad_value]))); +} + +static void method_entry_get_field(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_get_moreinfo(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_get_module_list(SoupMessage *msg, GValueArray *params) +{ +  GValueArray *out; +  GSList *modules; +   +  out = soup_value_array_new(); +   +  for (modules = modules_get_list(); modules; modules = modules->next) { +    ShellModule *module = (ShellModule *)modules->data; +     +    soup_value_array_append(out, G_TYPE_STRING, module->name); +  } +   +  soup_xmlrpc_set_response(msg, G_TYPE_VALUE_ARRAY, out); +  g_value_array_free(out); +} + +static void method_get_entry_list(SoupMessage *msg, GValueArray *params) +{ +  ShellModule *module; +  ShellModuleEntry *module_entry; +  GSList *entry; +  GValueArray *out; +  gboolean found = FALSE; +  gchar *module_name; +  GSList *modules; + +  if (params->n_values != 1) { +    args_error(msg, params, 1); +    return; +  }   +   +  if (!soup_value_array_get_nth(params, 0, G_TYPE_STRING, &module_name)) { +    type_error(msg, G_TYPE_STRING, params, 0); +    return; +  } +   +  for (modules = modules_get_list(); modules; modules = modules->next) { +    ShellModule *module = (ShellModule *)modules->data; +     +    if (!strncmp(module->name, module_name, strlen(module->name))) { +      found = TRUE; +      break; +    } +  } +   +  out = soup_value_array_new(); + +  if (!found) { +    goto bad; +  } +   +  module = (ShellModule *)modules->data; +  for (entry = module->entries; entry; entry = entry->next) { +    GValueArray *tuple; +     +    module_entry = (ShellModuleEntry *)entry->data; +    tuple = soup_value_array_new(); +     +    soup_value_array_append(tuple, G_TYPE_STRING, module_entry->name); +    soup_value_array_append(tuple, G_TYPE_INT, module_entry->number); +    soup_value_array_append(out, G_TYPE_VALUE_ARRAY, tuple); +     +    g_value_array_free(tuple); +  } +   +bad: +  soup_xmlrpc_set_response(msg, G_TYPE_VALUE_ARRAY, out); +  g_value_array_free(out); +} + +static void method_entry_reload(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_scan(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_function(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_get_note(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_scan_all(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_entry_scan_all_except(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_get_about_info(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_call_method(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} + +static void method_call_method_param(SoupMessage *msg, GValueArray *params) +{ +  soup_xmlrpc_set_response(msg, G_TYPE_BOOLEAN, FALSE); +} +  static void method_get_api_version(SoupMessage *msg, GValueArray *params)  { -  soup_xmlrpc_set_response(msg, G_TYPE_INT, 1); +  soup_xmlrpc_set_response(msg, G_TYPE_INT, XMLRPC_SERVER_VERSION);  }  static void method_shutdown_server(SoupMessage *msg, GValueArray *params) @@ -31,9 +232,11 @@ static void method_shutdown_server(SoupMessage *msg, GValueArray *params)    g_main_loop_quit(loop);  } +#endif /* HAS_LIBSOUP */  void xmlrpc_server_init(void)  { +#ifdef HAS_LIBSOUP    if (!loop) {      loop = g_main_loop_new(NULL, FALSE);    } @@ -47,8 +250,10 @@ void xmlrpc_server_init(void)                            handler_table[i].method_name, handler_table[i].callback);      }    } +#endif /* HAS_LIBSOUP */  } +#ifdef HAS_LIBSOUP  static SoupServer *xmlrpc_server_new(void)  {    SoupServer *server; @@ -57,6 +262,7 @@ static SoupServer *xmlrpc_server_new(void)    server = soup_server_new(SOUP_SERVER_SSL_CERT_FILE, NULL,                             SOUP_SERVER_SSL_KEY_FILE, NULL,                             SOUP_SERVER_ASYNC_CONTEXT, NULL, +                           SOUP_SERVER_PORT, 4242,                             NULL);    if (!server) {      return NULL; @@ -97,7 +303,7 @@ static void xmlrpc_server_callback(SoupServer *server,        callback(msg, params);      } else {        DEBUG("callback not found"); -      soup_message_set_status(msg, SOUP_STATUS_NOT_ACCEPTABLE); +      soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED);      }      g_free(method_name); @@ -107,9 +313,11 @@ static void xmlrpc_server_callback(SoupServer *server,      soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED);    }  } +#endif /* HAS_LIBSOUP */  void xmlrpc_server_start(void)  { +#ifdef HAS_LIBSOUP    SoupServer *server;    if (!loop || !handlers) { @@ -123,21 +331,25 @@ void xmlrpc_server_start(void)    soup_server_add_handler(server, "/xmlrpc", xmlrpc_server_callback, NULL, NULL); -  g_print("XML-RPC server listening on port: %d\n", soup_server_get_port(server)); -      DEBUG("starting server");    g_main_loop_run(loop); +    DEBUG("shutting down server");    g_main_loop_unref(loop); +  soup_server_quit(server); +  g_object_unref(server); +#endif /* HAS_LIBSOUP */  }  #ifdef XMLRPC_SERVER_TEST  int main(void)  { +#ifdef HAS_LIBSOUP    g_type_init();    g_thread_init(NULL);    xmlrpc_server_init();    xmlrpc_server_start(); +#endif /* HAS_LIBSOUP */  }  #endif /* XMLRPC_SERVER_TEST */  diff --git a/hardinfo2/xmlrpc-server.h b/hardinfo2/xmlrpc-server.h index 5ecafba4..5fbbc47c 100644 --- a/hardinfo2/xmlrpc-server.h +++ b/hardinfo2/xmlrpc-server.h @@ -1,3 +1,20 @@ +/* + *    HardInfo - Displays System Information + *    Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> + * + *    This program is free software; you can redistribute it and/or modify + *    it under the terms of the GNU General Public License as published by + *    the Free Software Foundation, version 2. + * + *    This program is distributed in the hope that it will be useful, + *    but WITHOUT ANY WARRANTY; without even the implied warranty of + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *    GNU General Public License for more details. + * + *    You should have received a copy of the GNU General Public License + *    along with this program; if not, write to the Free Software + *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA + */  #ifndef __XMLRPC_SERVER_H__  #define __XMLRPC_SERVER_H__ | 
