new class for managing SOAP responses.
authorRodrigo Moya <rodrigo@ximian.com>
Mon, 24 Nov 2003 17:50:17 +0000 (17:50 +0000)
committerRodrigo Moya <rodrigo@src.gnome.org>
Mon, 24 Nov 2003 17:50:17 +0000 (17:50 +0000)
2003-11-23  Rodrigo Moya <rodrigo@ximian.com>

* libsoup/soup-soap-response.[ch]: new class for managing SOAP
responses.

* libsoup/soup-soap-message.[ch] (soup_soap_message_parse_response):
new function.

* libsoup/Makefile.am: added new files.

ChangeLog
libsoup/Makefile.am
libsoup/soup-soap-message.c
libsoup/soup-soap-message.h
libsoup/soup-soap-response.c [new file with mode: 0644]
libsoup/soup-soap-response.h [new file with mode: 0644]

index 3566c8e..3c17d1b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2003-11-23  Rodrigo Moya <rodrigo@ximian.com>
+
+       * libsoup/soup-soap-response.[ch]: new class for managing SOAP
+       responses.
+
+       * libsoup/soup-soap-message.[ch] (soup_soap_message_parse_response):
+       new function.
+
+       * libsoup/Makefile.am: added new files.
+
 2003-11-18  Rodney Dawes  <dobey@ximian.com>
 
        * gtk-doc.make: Add gtk-doc.make to cvs for systems without gtk-doc
index 4bd46c6..2781ff8 100644 (file)
@@ -39,6 +39,7 @@ libsoupinclude_HEADERS =      \
        soup-server.h           \
        soup-session.h          \
        soup-soap-message.h     \
+       soup-soap-response.h    \
        soup-socket.h           \
        soup-status.h           \
        soup-types.h            \
@@ -88,6 +89,7 @@ libsoup_2_2_la_SOURCES =              \
        soup-server-message.c           \
        soup-session.c                  \
        soup-soap-message.c             \
+       soup-soap-response.c            \
        soup-socket.c                   \
        soup-ssl.h                      \
        soup-status.c                   \
index e903567..758a46b 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2003, Novell, Inc.
  */
 
+#include <string.h>
 #include "soup-misc.h"
 #include "soup-soap-message.h"
 #include "soup-uri.h"
@@ -713,3 +714,29 @@ soup_soap_message_get_xml_doc (SoupSoapMessage *msg)
 
        return msg->priv->doc;
 }
+
+/**
+ * soup_soap_message_parse_response:
+ * @msg: the %SoupSoapMessage.
+ *
+ * Parses the response returned by the server.
+ *
+ * Return value: a %SoupSoapResponse representing the response from the server,
+ * or %NULL if there was an error.
+ */
+SoupSoapResponse *
+soup_soap_message_parse_response (SoupSoapMessage *msg)
+{
+       char *xmlstr;
+       SoupSoapResponse *soap_response;
+
+       g_return_val_if_fail (SOUP_IS_SOAP_MESSAGE (msg), NULL);
+
+       xmlstr = g_malloc0 (SOUP_MESSAGE (msg)->response.length + 1);
+       strncpy (xmlstr, SOUP_MESSAGE (msg)->response.body, SOUP_MESSAGE (msg)->response.length);
+
+       soap_response = soup_soap_response_new_from_string (xmlstr);
+       g_free (xmlstr);
+
+       return soap_response;
+}
index e3ab4ab..1dd982f 100644 (file)
@@ -9,6 +9,9 @@
 #include <time.h>
 #include <libxml/tree.h>
 #include <libsoup/soup-message.h>
+#include <libsoup/soup-soap-response.h>
+
+G_BEGIN_DECLS
 
 #define SOUP_TYPE_SOAP_MESSAGE            (soup_soap_message_get_type ())
 #define SOUP_SOAP_MESSAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), SOUP_TYPE_SOAP_MESSAGE, SoupSoapMessage))
@@ -28,64 +31,68 @@ typedef struct {
        SoupMessageClass parent_class;
 } SoupSoapMessageClass;
 
-GType            soup_soap_message_get_type (void);
+GType             soup_soap_message_get_type (void);
 
-SoupSoapMessage *soup_soap_message_new (const char *method, const char *uri_string,
-                                       gboolean standalone, const char *xml_encoding,
-                                       const char *env_prefix, const char *env_uri);
-SoupSoapMessage *soup_soap_message_new_from_uri (const char *method, const SoupUri *uri,
-                                                gboolean standalone, const char *xml_encoding,
-                                                const char *env_prefix, const char *env_uri);
+SoupSoapMessage  *soup_soap_message_new (const char *method, const char *uri_string,
+                                        gboolean standalone, const char *xml_encoding,
+                                        const char *env_prefix, const char *env_uri);
+SoupSoapMessage  *soup_soap_message_new_from_uri (const char *method, const SoupUri *uri,
+                                                 gboolean standalone, const char *xml_encoding,
+                                                 const char *env_prefix, const char *env_uri);
 
-void             soup_soap_message_start_envelope (SoupSoapMessage *msg);
-void             soup_soap_message_end_envelope (SoupSoapMessage *msg);
-void             soup_soap_message_start_body (SoupSoapMessage *msg);
-void             soup_soap_message_end_body (SoupSoapMessage *msg);
-void             soup_soap_message_start_element (SoupSoapMessage *msg,
-                                                 const char *name,
-                                                 const char *prefix,
-                                                 const char *ns_uri);
-void             soup_soap_message_end_element (SoupSoapMessage *msg);
-void             soup_soap_message_start_fault (SoupSoapMessage *msg,
-                                               const char *faultcode,
-                                               const char *faultstring,
-                                               const char *faultfactor);
-void             soup_soap_message_end_fault (SoupSoapMessage *msg);
-void             soup_soap_message_start_fault_detail (SoupSoapMessage *msg);
-void             soup_soap_message_end_fault_detail (SoupSoapMessage *msg);
-void             soup_soap_message_start_header (SoupSoapMessage *msg);
-void             soup_soap_message_end_header (SoupSoapMessage *msg);
-void             soup_soap_message_start_header_element (SoupSoapMessage *msg,
-                                                        const char *name,
-                                                        gboolean must_understand,
-                                                        const char *actor_uri,
-                                                        const char *prefix,
-                                                        const char *ns_uri);
-void             soup_soap_message_end_header_element (SoupSoapMessage *msg);
-void             soup_soap_message_write_int (SoupSoapMessage *msg, long i);
-void             soup_soap_message_write_double (SoupSoapMessage *msg, double d);
-void             soup_soap_message_write_base64 (SoupSoapMessage *msg, const char *string, int len);
-void             soup_soap_message_write_time (SoupSoapMessage *msg, const time_t *timeval);
-void             soup_soap_message_write_string (SoupSoapMessage *msg, const char *string);
-void             soup_soap_message_write_buffer (SoupSoapMessage *msg, const char *buffer, int len);
-void             soup_soap_message_set_element_type (SoupSoapMessage *msg, const char *xsi_type);
-void             soup_soap_message_set_null (SoupSoapMessage *msg);
-void             soup_soap_message_add_attribute (SoupSoapMessage *msg,
-                                                 const char *name,
-                                                 const char *value,
-                                                 const char *prefix,
-                                                 const char *ns_uri);
-void             soup_soap_message_add_namespace (SoupSoapMessage *msg,
-                                                 const char *prefix,
-                                                 const char *ns_uri);
-void             soup_soap_message_set_default_namespace (SoupSoapMessage *msg,
+void              soup_soap_message_start_envelope (SoupSoapMessage *msg);
+void              soup_soap_message_end_envelope (SoupSoapMessage *msg);
+void              soup_soap_message_start_body (SoupSoapMessage *msg);
+void              soup_soap_message_end_body (SoupSoapMessage *msg);
+void              soup_soap_message_start_element (SoupSoapMessage *msg,
+                                                  const char *name,
+                                                  const char *prefix,
+                                                  const char *ns_uri);
+void              soup_soap_message_end_element (SoupSoapMessage *msg);
+void              soup_soap_message_start_fault (SoupSoapMessage *msg,
+                                                const char *faultcode,
+                                                const char *faultstring,
+                                                const char *faultfactor);
+void              soup_soap_message_end_fault (SoupSoapMessage *msg);
+void              soup_soap_message_start_fault_detail (SoupSoapMessage *msg);
+void              soup_soap_message_end_fault_detail (SoupSoapMessage *msg);
+void              soup_soap_message_start_header (SoupSoapMessage *msg);
+void              soup_soap_message_end_header (SoupSoapMessage *msg);
+void              soup_soap_message_start_header_element (SoupSoapMessage *msg,
+                                                         const char *name,
+                                                         gboolean must_understand,
+                                                         const char *actor_uri,
+                                                         const char *prefix,
                                                          const char *ns_uri);
-void             soup_soap_message_set_encoding_style (SoupSoapMessage *msg, const char *enc_style);
-void             soup_soap_message_reset (SoupSoapMessage *msg);
-void             soup_soap_message_persist (SoupSoapMessage *msg);
+void              soup_soap_message_end_header_element (SoupSoapMessage *msg);
+void              soup_soap_message_write_int (SoupSoapMessage *msg, long i);
+void              soup_soap_message_write_double (SoupSoapMessage *msg, double d);
+void              soup_soap_message_write_base64 (SoupSoapMessage *msg, const char *string, int len);
+void              soup_soap_message_write_time (SoupSoapMessage *msg, const time_t *timeval);
+void              soup_soap_message_write_string (SoupSoapMessage *msg, const char *string);
+void              soup_soap_message_write_buffer (SoupSoapMessage *msg, const char *buffer, int len);
+void              soup_soap_message_set_element_type (SoupSoapMessage *msg, const char *xsi_type);
+void              soup_soap_message_set_null (SoupSoapMessage *msg);
+void              soup_soap_message_add_attribute (SoupSoapMessage *msg,
+                                                  const char *name,
+                                                  const char *value,
+                                                  const char *prefix,
+                                                  const char *ns_uri);
+void              soup_soap_message_add_namespace (SoupSoapMessage *msg,
+                                                  const char *prefix,
+                                                  const char *ns_uri);
+void              soup_soap_message_set_default_namespace (SoupSoapMessage *msg,
+                                                          const char *ns_uri);
+void              soup_soap_message_set_encoding_style (SoupSoapMessage *msg, const char *enc_style);
+void              soup_soap_message_reset (SoupSoapMessage *msg);
+void              soup_soap_message_persist (SoupSoapMessage *msg);
+
+const char       *soup_soap_message_get_namespace_prefix (SoupSoapMessage *msg, const char *ns_uri);
+
+xmlDocPtr         soup_soap_message_get_xml_doc (SoupSoapMessage *msg);
 
-const char      *soup_soap_message_get_namespace_prefix (SoupSoapMessage *msg, const char *ns_uri);
+SoupSoapResponse *soup_soap_message_parse_response (SoupSoapMessage *msg);
 
-xmlDocPtr        soup_soap_message_get_xml_doc (SoupSoapMessage *msg);
+G_END_DECLS
 
 #endif
diff --git a/libsoup/soup-soap-response.c b/libsoup/soup-soap-response.c
new file mode 100644 (file)
index 0000000..d5a18e5
--- /dev/null
@@ -0,0 +1,132 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2003, Novell, Inc.
+ */
+
+#include <string.h>
+#include <libxml/tree.h>
+#include "soup-misc.h"
+#include "soup-soap-response.h"
+#include "soup-types.h"
+
+#define PARENT_TYPE G_TYPE_OBJECT
+
+struct _SoupSoapResponsePrivate {
+       xmlDocPtr xmldoc;
+};
+
+static GObjectClass *parent_class = NULL;
+
+static void
+finalize (GObject *object)
+{
+       SoupSoapResponse *response = SOUP_SOAP_RESPONSE (object);
+
+       /* free memory */
+       if (response->priv->xmldoc) {
+               xmlFreeDoc (response->priv->xmldoc);
+               response->priv->xmldoc = NULL;
+       }
+
+       g_free (response->priv);
+       response->priv = NULL;
+
+       parent_class->finalize (object);
+}
+
+static void
+class_init (SoupSoapResponseClass *klass)
+{
+       GObjectClass *object_class;
+
+       parent_class = g_type_class_peek_parent (klass);
+
+       object_class = G_OBJECT_CLASS (klass);
+       object_class->finalize = finalize;
+}
+
+static void
+init (SoupSoapResponse *response, SoupSoapResponseClass *klass)
+{
+       response->priv = g_new0 (SoupSoapResponsePrivate, 1);
+
+       response->priv->xmldoc = xmlNewDoc ("1.0");
+}
+
+SOUP_MAKE_TYPE (soup_soap_response, SoupSoapResponse, class_init, init, PARENT_TYPE)
+
+/**
+ * soup_soap_response_new:
+ *
+ * Create a new empty %SoupSoapResponse object, which can be modified with the
+ * accessor functions provided with this class.
+ *
+ * Return value: the new %SoupSoapResponse (or %NULL if there was an error).
+ */
+SoupSoapResponse *
+soup_soap_response_new (void)
+{
+       SoupSoapResponse *response;
+
+       response = g_object_new (SOUP_TYPE_SOAP_RESPONSE, NULL);
+       return response;
+}
+
+/**
+ * soup_soap_response_new_from_string:
+ * @xmlstr: the XML string to parse.
+ *
+ * Create a new %SoupSoapResponse object from the XML string contained in
+ * @xmlstr.
+ *
+ * Return value: the new %SoupSoapResponse (or %NULL if there was an error).
+ */
+SoupSoapResponse *
+soup_soap_response_new_from_string (const char *xmlstr)
+{
+       SoupSoapResponse *response;
+
+       g_return_val_if_fail (xmlstr != NULL, NULL);
+
+       response = g_object_new (SOUP_TYPE_SOAP_RESPONSE, NULL);
+       if (!soup_soap_response_from_string (response, xmlstr)) {
+               g_object_unref (response);
+               return NULL;
+       }
+
+       return response;
+}
+
+/**
+ * soup_soap_response_from_string:
+ * @response: the %SoupSoapResponse object.
+ * @xmlstr: XML string to parse.
+ *
+ * Parses the string contained in @xmlstr and sets all properties from it in the
+ * @response object.
+ *
+ * Return value: %TRUE if successful, %FALSE otherwise.
+ */
+gboolean
+soup_soap_response_from_string (SoupSoapResponse *response, const char *xmlstr)
+{
+       xmlDocPtr old_doc = NULL;
+
+       g_return_val_if_fail (SOUP_IS_SOAP_RESPONSE (response), FALSE);
+       g_return_val_if_fail (xmlstr != NULL, FALSE);
+
+       /* clear the previous contents */
+       if (response->priv->xmldoc)
+               old_doc = response->priv->xmldoc;
+
+       /* parse the string */
+       response->priv->xmldoc = xmlParseMemory (xmlstr, strlen (xmlstr));
+       if (!response->priv->xmldoc) {
+               response->priv->xmldoc = old_doc;
+               return FALSE;
+       }
+
+       xmlFreeDoc (old_doc);
+
+       return TRUE;
+}
diff --git a/libsoup/soup-soap-response.h b/libsoup/soup-soap-response.h
new file mode 100644 (file)
index 0000000..61e548f
--- /dev/null
@@ -0,0 +1,41 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2003, Novell, Inc.
+ */
+
+#ifndef SOUP_SOAP_RESPONSE_H
+#define SOUP_SOAP_RESPONSE_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define SOUP_TYPE_SOAP_RESPONSE            (soup_soap_response_get_type ())
+#define SOUP_SOAP_RESPONSE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), SOUP_TYPE_SOAP_RESPONSE, SoupSoapResponse))
+#define SOUP_SOAP_RESPONSE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_SOAP_RESPONSE, SoupSoapResponseClass))
+#define SOUP_IS_SOAP_RESPONSE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SOUP_TYPE_SOAP_RESPONSE))
+#define SOUP_IS_SOAP_RESPONSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), SOUP_TYPE_SOAP_RESPONSE))
+#define SOUP_SOAP_RESPONSE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_SOAP_RESPONSE, SoupSoapResponseClass))
+
+typedef struct _SoupSoapResponsePrivate SoupSoapResponsePrivate;
+
+typedef struct {
+       GObject parent;
+       SoupSoapResponsePrivate *priv;
+} SoupSoapResponse;
+
+typedef struct {
+       GObjectClass parent_class;
+} SoupSoapResponseClass;
+
+GType             soup_soap_response_get_type (void);
+
+SoupSoapResponse *soup_soap_response_new (void);
+SoupSoapResponse *soup_soap_response_new_from_string (const char *xmlstr);
+
+gboolean          soup_soap_response_from_string (SoupSoapResponse *response, const char *xmlstr);
+char             *soup_soap_response_to_string (SoupSoapResponse *response);
+
+G_END_DECLS
+
+#endif