diff options
author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2009-04-29 22:15:49 -0300 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2009-04-29 22:15:49 -0300 |
commit | 20731a3f2e262440e00da501452b1efe5e6f1d52 (patch) | |
tree | 316c3623baa4d878e8b81458cd695ad1b8bbdcc3 | |
parent | 576526c996d3646ad80cfd5a248408ed69cca0e9 (diff) |
Implement an icon server (to download missing icons via HTTP).
-rw-r--r-- | hardinfo2/xmlrpc-server.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/hardinfo2/xmlrpc-server.c b/hardinfo2/xmlrpc-server.c index a85e8a45..e05478f7 100644 --- a/hardinfo2/xmlrpc-server.c +++ b/hardinfo2/xmlrpc-server.c @@ -119,7 +119,16 @@ static gboolean validate_parameters(SoupMessage *msg, GValueArray *params, if (!soup_value_array_get_nth(params, i, method_params[i].param_type, method_params[i].variable)) { + int j; + type_error(msg, method_params[i].param_type, params, i); + + for (j = 0; j < i; j++) { + if (method_params[j].param_type == G_TYPE_STRING) { + g_free(method_params[j].variable); + } + } + return FALSE; } } @@ -247,6 +256,7 @@ static void method_entry_get_moreinfo(SoupMessage * msg, MethodParameter method_params[] = { { G_TYPE_STRING, &module_name }, { G_TYPE_INT, &entry_number }, + { G_TYPE_STRING, &field_name }, }; if (!validate_parameters(msg, params, method_params, G_N_ELEMENTS(method_params))) { @@ -267,7 +277,7 @@ static void method_entry_get_moreinfo(SoupMessage * msg, GSList *entry_node = g_slist_nth(module->entries, entry_number); ShellModuleEntry *entry = (ShellModuleEntry *)entry_node->data; - answer = module_entry_get_moreinfo(entry); + answer = module_entry_get_moreinfo(entry, field_name); } } @@ -594,7 +604,7 @@ static void xmlrpc_server_callback(SoupServer * server, GValueArray *params; void (*callback) (SoupMessage * msg, GValueArray * params); - DEBUG("received POST request"); + DEBUG("POST %s", path); if (!soup_xmlrpc_parse_method_call(msg->request_body->data, msg->request_body->length, @@ -622,6 +632,58 @@ static void xmlrpc_server_callback(SoupServer * server, soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED); } } + +static void icon_server_callback(SoupServer * server, + SoupMessage * msg, + const char *path, + GHashTable * query, + SoupClientContext * context, + gpointer data) +{ + if (msg->method == SOUP_METHOD_GET) { + path = g_strrstr(path, "/"); + + DEBUG("GET %s", path); + + if (!path || !g_str_has_suffix(path, ".png")) { + DEBUG("not an icon, invalid path, etc"); + soup_message_set_status(msg, SOUP_STATUS_FORBIDDEN); + soup_message_set_response(msg, + "text/plain", + SOUP_MEMORY_STATIC, + "500 :(", 6); + } else { + gchar *file, *icon; + gint size; + + file = g_build_filename(params.path_data, + "pixmaps", + path + 1, + NULL); + + if (g_file_get_contents(file, &icon, &size, NULL)) { + DEBUG("icon found"); + soup_message_set_status(msg, SOUP_STATUS_OK); + soup_message_set_response(msg, + "image/png", + SOUP_MEMORY_TAKE, + icon, size); + } else { + DEBUG("icon not found"); + soup_message_set_status(msg, SOUP_STATUS_NOT_FOUND); + soup_message_set_response(msg, + "text/plain", + SOUP_MEMORY_STATIC, + "404 :(", 6); + } + + g_free(file); + } + } else { + DEBUG("received request of unknown method"); + soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED); + } +} #endif /* HAS_LIBSOUP */ void xmlrpc_server_start(void) @@ -640,6 +702,8 @@ void xmlrpc_server_start(void) soup_server_add_handler(server, "/xmlrpc", xmlrpc_server_callback, NULL, NULL); + soup_server_add_handler(server, "/icon/", icon_server_callback, + NULL, NULL); DEBUG("starting server"); g_main_loop_run(loop); |