From 5d9aa0b9a465e564a30d59fa8d5e26c1e02e7a47 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 24 Jul 2006 22:05:57 +0000 Subject: [PATCH] New, from Fernando Herrera, bug 348532. * libsoup/soup-xmlrpc-message.c (soup_xmlrpc_message_from_string): New, from Fernando Herrera, bug 348532. --- ChangeLog | 5 +++++ libsoup/soup-xmlrpc-message.c | 45 +++++++++++++++++++++++++++++++++++++++++++ libsoup/soup-xmlrpc-message.h | 7 +++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c90793..6a9741d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-07-24 Dan Winship + + * libsoup/soup-xmlrpc-message.c (soup_xmlrpc_message_from_string): + New, from Fernando Herrera, bug 348532. + 2006-07-21 Dan Winship * libsoup/soup-auth.c (soup_auth_new_from_header_list): if the diff --git a/libsoup/soup-xmlrpc-message.c b/libsoup/soup-xmlrpc-message.c index d061282..34f84d5 100644 --- a/libsoup/soup-xmlrpc-message.c +++ b/libsoup/soup-xmlrpc-message.c @@ -327,6 +327,51 @@ soup_xmlrpc_message_to_string (SoupXmlrpcMessage *msg) return body; } +gboolean +soup_xmlrpc_message_from_string (SoupXmlrpcMessage *message, const char *xmlstr) +{ + SoupXmlrpcMessagePrivate *priv; + xmlDocPtr newdoc; + xmlNodePtr body; + gboolean fault = TRUE; + + g_return_val_if_fail (SOUP_IS_XMLRPC_MESSAGE (message), FALSE); + priv = SOUP_XMLRPC_MESSAGE_GET_PRIVATE (message); + g_return_val_if_fail (xmlstr != NULL, FALSE); + + xmlKeepBlanksDefault (0); + newdoc = xmlParseMemory (xmlstr, strlen (xmlstr)); + if (!newdoc) + return FALSE; + + body = xmlDocGetRootElement (newdoc); + if (!body || strcmp ((char *)body->name, "methodCall")) + goto bad; + + body = body->children; + if (!body || strcmp ((char *)body->name, "methodName")) + goto bad; + + body = body->next; + if (!body || strcmp ((char *)body->name, "params")) + goto bad; + + body = xmlGetLastChild (body); + if (!body) + goto bad; + + /* body should be pointing by now to the last param */ + xmlFreeDoc (priv->doc); + priv->doc = newdoc; + priv->last_node = body; + + return TRUE; + +bad: + xmlFreeDoc (newdoc); + return FALSE; +} + void soup_xmlrpc_message_persist (SoupXmlrpcMessage *msg) { diff --git a/libsoup/soup-xmlrpc-message.h b/libsoup/soup-xmlrpc-message.h index f74c405..96e1ce3 100644 --- a/libsoup/soup-xmlrpc-message.h +++ b/libsoup/soup-xmlrpc-message.h @@ -67,8 +67,11 @@ void soup_xmlrpc_message_end_member (SoupXmlrpcMessage *msg); void soup_xmlrpc_message_start_array (SoupXmlrpcMessage *msg); void soup_xmlrpc_message_end_array (SoupXmlrpcMessage *msg); -xmlChar *soup_xmlrpc_message_to_string (SoupXmlrpcMessage *msg); -void soup_xmlrpc_message_persist (SoupXmlrpcMessage *msg); +gboolean soup_xmlrpc_message_from_string (SoupXmlrpcMessage *message, + const char *xmlstr); + +xmlChar *soup_xmlrpc_message_to_string (SoupXmlrpcMessage *msg); +void soup_xmlrpc_message_persist (SoupXmlrpcMessage *msg); SoupXmlrpcResponse *soup_xmlrpc_message_parse_response (SoupXmlrpcMessage *msg); -- 2.7.4