aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2009-04-25 22:54:15 -0300
committerLeandro A. F. Pereira <leandro@hardinfo.org>2009-04-25 22:54:15 -0300
commitcc6fd7f646e372a50c56db1c9af1b9d0bcbe8d6c (patch)
tree4fca59e27fe04fe22d1966a681adfb24e3e087b6
parent77baf70fba7d7fbdd10d677a3a0357c7337d8b12 (diff)
Start implementing the XML-RPC server
-rw-r--r--hardinfo2/hardinfo.c2
-rw-r--r--hardinfo2/hardinfo.h1
-rw-r--r--hardinfo2/remote.c7
-rw-r--r--hardinfo2/uidefs.h4
-rw-r--r--hardinfo2/util.c10
-rw-r--r--hardinfo2/xmlrpc-server.c228
-rw-r--r--hardinfo2/xmlrpc-server.h17
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 (&params->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__