static gboolean do_xmlrpc (SoupSession *session, const char *method, GValue *retval, ...) { SoupMessage *msg; va_list args; GValueArray *params; GError *err = NULL; char *body; int i; va_start (args, retval); params = soup_value_array_from_args (args); va_end (args); /* for (i = 0; i < params->n_values; i++) { g_print ("param: %s\n", g_value_get_string (g_value_array_get_nth (params, i))); } */ body = soup_xmlrpc_build_method_call (method, params->values, params->n_values); g_value_array_free (params); if (!body) return FALSE; msg = soup_message_new ("POST", "http://dev.map.es/trac/acceda/login/xmlrpc"); soup_message_set_request (msg, "text/xml", SOUP_MEMORY_TAKE, body, strlen (body)); soup_session_send_message (session, msg); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { g_print ("ERROR: %d %s\n", msg->status_code, msg->reason_phrase); g_object_unref (msg); return FALSE; } if (!soup_xmlrpc_parse_method_response (msg->response_body->data, msg->response_body->length, retval, &err)) { if (err) { g_print ("%s", body); g_print ("FAULT: %d %s\n", err->code, err->message); g_error_free (err); } else g_print ("ERROR: could not parse response\n"); g_object_unref (msg); return FALSE; } g_object_unref (msg); return TRUE; }
static gchar* send_xmlrpc (const gchar *uri, const gchar *method, GValue *result, ...) { // Create an XMLRPC request from the arguments va_list args; va_start (args, result); GValueArray *params = soup_value_array_from_args (args); va_end (args); char *body = soup_xmlrpc_build_method_call (method, params->values, params->n_values); g_value_array_free (params); if (!body) return g_strdup("Could not create XMLRPC method call"); // Create and send the actual request message SoupMessage *msg = soup_message_new ("POST", uri); soup_message_set_request (msg, "text/xml", SOUP_MEMORY_TAKE, body, strlen(body)); soup_session_send_message (session, msg); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { gchar *retval = g_strdup_printf("Request failed: %s", msg->reason_phrase); g_object_unref (msg); return retval; } // Parse the XMLRPC response GError *err = NULL; if (!soup_xmlrpc_parse_method_response (msg->response_body->data, msg->response_body->length, result, &err)) { gchar *retval = NULL; if (err) { retval = g_strdup_printf("Error: %s", err->message); g_error_free (err); } else { retval = g_strdup("Could not parse XMLRPC response"); } g_object_unref (msg); return retval; } g_object_unref (msg); return NULL; }
static gboolean do_xmlrpc (const char *method, GValue *retval, ...) { SoupMessage *msg; va_list args; GValueArray *params; GError *err = NULL; char *body; va_start (args, retval); params = soup_value_array_from_args (args); va_end (args); body = soup_xmlrpc_build_method_call (method, params->values, params->n_values); g_value_array_free (params); if (!body) return FALSE; msg = soup_message_new ("POST", uri); soup_message_set_request (msg, "text/xml", SOUP_MEMORY_TAKE, body, strlen (body)); soup_session_send_message (session, msg); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { debug_printf (1, "ERROR: %d %s\n", msg->status_code, msg->reason_phrase); g_object_unref (msg); return FALSE; } if (!soup_xmlrpc_parse_method_response (msg->response_body->data, msg->response_body->length, retval, &err)) { if (err) { debug_printf (1, "FAULT: %d %s\n", err->code, err->message); g_error_free (err); } else debug_printf (1, "ERROR: could not parse response\n"); g_object_unref (msg); return FALSE; } g_object_unref (msg); return TRUE; }