aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2009-04-26 18:19:40 -0300
committerLeandro A. F. Pereira <leandro@hardinfo.org>2009-04-26 18:19:40 -0300
commit22f840d9ca7fade0ebeeb44c54fad3cc64b07ac7 (patch)
tree8dcda7b111d2e2761d197164755f5446c09b7e8c
parentc2367073c9eb18987c6b9278d63f29fb7880283a (diff)
Making more room to implement the remote mode :)
-rw-r--r--hardinfo2/Makefile.in3
-rw-r--r--hardinfo2/remote.c71
-rw-r--r--hardinfo2/shell.h1
-rw-r--r--hardinfo2/util.c1
-rw-r--r--hardinfo2/xmlrpc-client.c227
-rw-r--r--hardinfo2/xmlrpc-client.h39
-rw-r--r--hardinfo2/xmlrpc-server.c2
7 files changed, 341 insertions, 3 deletions
diff --git a/hardinfo2/Makefile.in b/hardinfo2/Makefile.in
index 3cf83329..aaa76794 100644
--- a/hardinfo2/Makefile.in
+++ b/hardinfo2/Makefile.in
@@ -8,7 +8,8 @@ CCSLOW = gcc -O0 -g
OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o \
menu.o stock.o callbacks.o expr.o report.o binreloc.o \
- vendor.o socket.o syncmanager.o remote.o xmlrpc-server.o
+ vendor.o socket.o syncmanager.o remote.o xmlrpc-server.o \
+ xmlrpc-client.o
BENCHMARK_OBJECTS = fbench.o sha1.o blowfish.o md5.o nqueens.o fftbench.o
MODULES = computer.so devices.so benchmark.so network.so
diff --git a/hardinfo2/remote.c b/hardinfo2/remote.c
index de3a9692..556299ca 100644
--- a/hardinfo2/remote.c
+++ b/hardinfo2/remote.c
@@ -24,6 +24,8 @@
#include <hardinfo.h>
#include <config.h>
+#include "xmlrpc-client.h"
+
/*
* TODO
*
@@ -67,9 +69,75 @@ struct _RemoteDialog {
static RemoteDialog *remote_dialog_new(GtkWidget *parent);
-static void remote_connect(RemoteDialog *rd)
+static gboolean remote_version_is_supported(void)
+{
+ shell_status_update("Obtaining remote server API version...");
+
+ switch (xmlrpc_get_integer("http://localhost:4242/xmlrpc", "server.getAPIVersion", NULL)) {
+ case -1:
+ g_warning("Remote Host didn't respond.");
+ break;
+ case 1:
+ return TRUE;
+ default:
+ g_warning("Remote Host has an unsupported API version.");
+ }
+
+ return FALSE;
+}
+
+static gboolean load_module_list()
{
+ GValueArray *modules;
+ int i = 0;
+
+ shell_status_update("Obtaining remote server module list...");
+
+ modules = xmlrpc_get_array("http://localhost:4242/xmlrpc", "module.getModuleList", NULL);
+ if (!modules) {
+ return FALSE;
+ }
+
+ for (; i < modules->n_values; i++) {
+ GValueArray *entries;
+ const gchar *module = g_value_get_string(&modules->values[i]);
+ int j = 0;
+
+ DEBUG("%s", module);
+
+ shell_status_pulse();
+ entries = xmlrpc_get_array("http://localhost:4242/xmlrpc", "module.getEntryList", "%s", module);
+ if (entries) {
+ for (; j < entries->n_values; j++) {
+ GValueArray *tuple = g_value_get_boxed(&entries->values[j]);
+
+ DEBUG("--- %s [%s](%d)",
+ g_value_get_string(&tuple->values[0]),
+ g_value_get_string(&tuple->values[1]),
+ j);
+ }
+
+ g_value_array_free(entries);
+ }
+ }
+
+ g_value_array_free(modules);
+
+ return TRUE;
+}
+static void remote_connect(RemoteDialog *rd)
+{
+ xmlrpc_init();
+
+ /* check API version */
+ if (remote_version_is_supported()) {
+ if (!load_module_list()) {
+ g_warning("Remote module list couldn't be loaded.");
+ }
+ }
+
+ shell_status_update("Done.");
}
void remote_dialog_show(GtkWidget *parent)
@@ -83,6 +151,7 @@ void remote_dialog_show(GtkWidget *parent)
shell_status_set_enabled(TRUE);
remote_connect(rd);
+
shell_status_set_enabled(FALSE);
}
diff --git a/hardinfo2/shell.h b/hardinfo2/shell.h
index 56b7765f..6fe86009 100644
--- a/hardinfo2/shell.h
+++ b/hardinfo2/shell.h
@@ -134,6 +134,7 @@ struct _ShellModuleMethod {
struct _ShellModuleEntry {
gchar *name;
GdkPixbuf *icon;
+ gchar *icon_file;
gboolean selected;
gint number;
diff --git a/hardinfo2/util.c b/hardinfo2/util.c
index b1771957..7b99f0ea 100644
--- a/hardinfo2/util.c
+++ b/hardinfo2/util.c
@@ -637,6 +637,7 @@ static ShellModule *module_load(gchar * filename)
if (params.gui_running) {
entry->icon = icon_cache_get_pixbuf(entries[i].icon);
}
+ entry->icon_file = entries[i].icon;
g_module_symbol(module->dll, "hi_more_info",
(gpointer) & (entry->morefunc));
diff --git a/hardinfo2/xmlrpc-client.c b/hardinfo2/xmlrpc-client.c
new file mode 100644
index 00000000..81177381
--- /dev/null
+++ b/hardinfo2/xmlrpc-client.c
@@ -0,0 +1,227 @@
+/*
+ * XMLRPC Client
+ * 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
+ */
+
+#include <string.h>
+#include "config.h"
+#include "xmlrpc-client.h"
+
+static GMainLoop *loop = NULL;
+static SoupSession *session = NULL;
+
+void xmlrpc_init(void)
+{
+ if (!loop) {
+ loop = g_main_loop_new(FALSE, TRUE);
+ }
+
+ if (!session) {
+ session = soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 10, NULL);
+ }
+}
+
+static void xmlrpc_response_get_integer(SoupSession *s,
+ SoupMessage *m,
+ gpointer user_data)
+{
+ gint *response = user_data;
+
+ *response = -1;
+
+ if (SOUP_STATUS_IS_SUCCESSFUL(m->status_code)) {
+ soup_xmlrpc_extract_method_response(m->response_body->data,
+ m->response_body->length,
+ NULL,
+ G_TYPE_INT, response);
+ }
+
+ g_main_quit(loop);
+}
+
+gint xmlrpc_get_integer(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...)
+{
+ gint integer;
+ GValueArray *params;
+ SoupMessage *msg;
+ gchar *body;
+
+ msg = soup_message_new("POST", addr);
+
+ params = g_value_array_new(1);
+
+ if (param_types && *param_types) {
+ va_list ap;
+
+ va_start(ap, param_types);
+ while (*param_types) {
+ switch (*param_types) {
+ case '%':
+ break;
+ case 'i':
+ soup_value_array_append(params, G_TYPE_INT, va_arg(ap, int));
+ break;
+ case 's':
+ default:
+ soup_value_array_append(params, G_TYPE_STRING, va_arg(ap, char *));
+ break;
+ }
+
+ param_types++;
+ }
+
+ va_end(ap);
+ }
+
+ body = soup_xmlrpc_build_method_call(method, params->values, params->n_values);
+ g_value_array_free(params);
+
+ soup_message_set_request(msg, "text/xml",
+ SOUP_MEMORY_TAKE, body, strlen(body));
+
+ soup_session_queue_message(session, msg, xmlrpc_response_get_integer, &integer);
+ g_main_run(loop);
+
+ return integer;
+}
+
+static void xmlrpc_response_get_string(SoupSession *s,
+ SoupMessage *m,
+ gpointer user_data)
+{
+ if (SOUP_STATUS_IS_SUCCESSFUL(m->status_code)) {
+ soup_xmlrpc_extract_method_response(m->response_body->data,
+ m->response_body->length,
+ NULL,
+ G_TYPE_STRING, user_data);
+ }
+
+ g_main_quit(loop);
+}
+
+gchar *xmlrpc_get_string(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...)
+{
+ GValueArray *params;
+ SoupMessage *msg;
+ gchar *body, *string = NULL;
+
+ msg = soup_message_new("POST", addr);
+
+ params = g_value_array_new(1);
+
+ if (param_types && *param_types) {
+ va_list ap;
+
+ va_start(ap, param_types);
+ while (*param_types) {
+ switch (*param_types) {
+ case '%':
+ break;
+ case 'i':
+ soup_value_array_append(params, G_TYPE_INT, va_arg(ap, int));
+ break;
+ case 's':
+ default:
+ soup_value_array_append(params, G_TYPE_STRING, va_arg(ap, char *));
+ break;
+ }
+
+ param_types++;
+ }
+
+ va_end(ap);
+ }
+
+ body = soup_xmlrpc_build_method_call(method, params->values, params->n_values);
+ g_value_array_free(params);
+
+ soup_message_set_request(msg, "text/xml",
+ SOUP_MEMORY_TAKE, body, strlen(body));
+
+ soup_session_queue_message(session, msg, xmlrpc_response_get_string, &string);
+ g_main_run(loop);
+
+ return string;
+}
+
+static void xmlrpc_response_get_array(SoupSession *s,
+ SoupMessage *m,
+ gpointer user_data)
+{
+ if (SOUP_STATUS_IS_SUCCESSFUL(m->status_code)) {
+ soup_xmlrpc_extract_method_response(m->response_body->data,
+ m->response_body->length,
+ NULL,
+ G_TYPE_VALUE_ARRAY, user_data);
+ }
+
+ g_main_quit(loop);
+}
+
+GValueArray *xmlrpc_get_array(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...)
+{
+ GValueArray *params, *answer = NULL;
+ SoupMessage *msg;
+ gchar *body;
+
+ msg = soup_message_new("POST", addr);
+
+ params = g_value_array_new(1);
+
+ if (param_types && *param_types) {
+ va_list ap;
+
+ va_start(ap, param_types);
+ while (*param_types) {
+ switch (*param_types) {
+ case '%':
+ break;
+ case 'i':
+ soup_value_array_append(params, G_TYPE_INT, va_arg(ap, int));
+ break;
+ case 's':
+ default:
+ soup_value_array_append(params, G_TYPE_STRING, va_arg(ap, char *));
+ break;
+ }
+
+ param_types++;
+ }
+
+ va_end(ap);
+ }
+
+ body = soup_xmlrpc_build_method_call(method, params->values, params->n_values);
+ g_value_array_free(params);
+
+ soup_message_set_request(msg, "text/xml",
+ SOUP_MEMORY_TAKE, body, strlen(body));
+
+ soup_session_queue_message(session, msg, xmlrpc_response_get_array, &answer);
+ g_main_run(loop);
+
+ return answer;
+}
diff --git a/hardinfo2/xmlrpc-client.h b/hardinfo2/xmlrpc-client.h
new file mode 100644
index 00000000..98afd63b
--- /dev/null
+++ b/hardinfo2/xmlrpc-client.h
@@ -0,0 +1,39 @@
+/*
+ * XMLRPC Client
+ * 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_CLIENT_H__
+#define __XMLRPC_CLIENT_H__
+
+#include <libsoup/soup.h>
+
+void xmlrpc_init(void);
+gint xmlrpc_get_integer(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...);
+gchar *xmlrpc_get_string(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...);
+GValueArray *xmlrpc_get_array(gchar *addr,
+ gchar *method,
+ const gchar *param_types,
+ ...);
+
+#endif /* __XMLRPC_CLIENT_H__ */
diff --git a/hardinfo2/xmlrpc-server.c b/hardinfo2/xmlrpc-server.c
index f66d646c..e0643e2a 100644
--- a/hardinfo2/xmlrpc-server.c
+++ b/hardinfo2/xmlrpc-server.c
@@ -180,7 +180,7 @@ static void method_get_entry_list(SoupMessage * msg, GValueArray * params)
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(tuple, G_TYPE_STRING, module_entry->icon_file);
soup_value_array_append(out, G_TYPE_VALUE_ARRAY, tuple);
g_value_array_free(tuple);