summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2005-09-11 09:08:31 +0000
committerFrederic Peters <fpeters@entrouvert.com>2005-09-11 09:08:31 +0000
commit930965e7f450a4855889fdb6412ca814e0051ef9 (patch)
tree02c2e30363dd351b388e1b57dcc7c7cd538a01e0
parent27e9d0edcd1d0fb088bba0b2927ec06f45bac0b3 (diff)
downloadlasso-930965e7f450a4855889fdb6412ca814e0051ef9.tar.gz
lasso-930965e7f450a4855889fdb6412ca814e0051ef9.tar.xz
lasso-930965e7f450a4855889fdb6412ca814e0051ef9.zip
possibility to register new dst services.
-rw-r--r--docs/reference/lasso-sections.txt1
-rw-r--r--lasso/id-wsf/data_service.c18
-rw-r--r--lasso/id-wsf/data_service.h5
-rw-r--r--lasso/xml/dst_modify.c13
-rw-r--r--lasso/xml/dst_modify_response.c13
-rw-r--r--lasso/xml/dst_query.c13
-rw-r--r--lasso/xml/dst_query_response.c13
-rw-r--r--lasso/xml/xml.c56
-rw-r--r--lasso/xml/xml.h4
-rw-r--r--swig/Lasso.i5
10 files changed, 88 insertions, 53 deletions
diff --git a/docs/reference/lasso-sections.txt b/docs/reference/lasso-sections.txt
index 899e0a4c..62254c24 100644
--- a/docs/reference/lasso-sections.txt
+++ b/docs/reference/lasso-sections.txt
@@ -901,6 +901,7 @@ lasso_init
lasso_shutdown
lasso_check_version
LassoCheckVersionMode
+lasso_register_dst_service
</SECTION>
<SECTION>
diff --git a/lasso/id-wsf/data_service.c b/lasso/id-wsf/data_service.c
index 456951c5..154957f8 100644
--- a/lasso/id-wsf/data_service.c
+++ b/lasso/id-wsf/data_service.c
@@ -142,12 +142,8 @@ lasso_data_service_init_query(LassoDataService *service, const char *select,
offering = service->private_data->offering;
query->hrefServiceType = g_strdup(offering->ServiceInstance->ServiceType);
- if (strcmp(query->hrefServiceType, LASSO_PP_HREF) == 0)
- query->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- else if (strcmp(query->hrefServiceType, LASSO_EP_HREF) == 0)
- query->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- else {
- /* unknown service type, (needs registration mechanism) */
+ query->prefixServiceType = lasso_get_prefix_for_dst_service_href(query->hrefServiceType);
+ if (query->prefixServiceType == NULL) {
return LASSO_ERROR_UNDEFINED;
}
@@ -487,14 +483,8 @@ lasso_data_service_init_modify(LassoDataService *service, const gchar *select, x
offering = service->private_data->offering;
modify->hrefServiceType = g_strdup(offering->ServiceInstance->ServiceType);
- if (strcmp(modify->hrefServiceType, LASSO_PP_HREF) == 0) {
- modify->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- }
- else if (strcmp(modify->hrefServiceType, LASSO_EP_HREF) == 0) {
- modify->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- }
- else {
- /* unknown service type, (needs registration mechanism) */
+ modify->prefixServiceType = lasso_get_prefix_for_dst_service_href(modify->hrefServiceType);
+ if (modify->prefixServiceType == NULL) {
return LASSO_ERROR_UNDEFINED;
}
diff --git a/lasso/id-wsf/data_service.h b/lasso/id-wsf/data_service.h
index a2dd075f..0b218de5 100644
--- a/lasso/id-wsf/data_service.h
+++ b/lasso/id-wsf/data_service.h
@@ -114,7 +114,10 @@ LASSO_EXPORT gint lasso_data_service_process_modify_msg(LassoDataService *servic
const gchar *soap_msg);
LASSO_EXPORT gint lasso_data_service_process_modify_response_msg(LassoDataService *service,
- const gchar *soap_msg);
+ const gchar *soap_msg);
+
+LASSO_EXPORT void lasso_data_service_register_service(LassoDataService *service,
+ const char *prefix, const char *href);
#ifdef __cplusplus
}
diff --git a/lasso/xml/dst_modify.c b/lasso/xml/dst_modify.c
index e7626389..1d5b5150 100644
--- a/lasso/xml/dst_modify.c
+++ b/lasso/xml/dst_modify.c
@@ -109,14 +109,11 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
rc = parent_class->init_from_xml(node, xmlnode);
if (rc) return rc;
- if (strcmp((char*)xmlnode->ns->href, LASSO_PP_HREF) == 0) {
- query->hrefServiceType = g_strdup(LASSO_PP_HREF);
- query->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- } else if (strcmp((char*)xmlnode->ns->href, LASSO_EP_HREF) == 0) {
- query->hrefServiceType = g_strdup(LASSO_EP_HREF);
- query->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- } else {
- /* XXX */
+ query->hrefServiceType = g_strdup((char*)xmlnode->ns->href);
+ query->prefixServiceType = lasso_get_prefix_for_dst_service_href(
+ query->hrefServiceType);
+ if (query->prefixServiceType == NULL) {
+ /* XXX: what to do here ? */
}
return 0;
diff --git a/lasso/xml/dst_modify_response.c b/lasso/xml/dst_modify_response.c
index 7fc40331..8a85263f 100644
--- a/lasso/xml/dst_modify_response.c
+++ b/lasso/xml/dst_modify_response.c
@@ -90,14 +90,11 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
rc = parent_class->init_from_xml(node, xmlnode);
if (rc) return rc;
- if (strcmp((char*)xmlnode->ns->href, LASSO_PP_HREF) == 0) {
- response->hrefServiceType = g_strdup(LASSO_PP_HREF);
- response->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- } else if (strcmp((char*)xmlnode->ns->href, LASSO_EP_HREF) == 0) {
- response->hrefServiceType = g_strdup(LASSO_EP_HREF);
- response->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- } else {
- /* XXX */
+ response->hrefServiceType = g_strdup((char*)xmlnode->ns->href);
+ response->prefixServiceType = lasso_get_prefix_for_dst_service_href(
+ response->hrefServiceType);
+ if (response->prefixServiceType == NULL) {
+ /* XXX: what to do here ? */
}
return 0;
diff --git a/lasso/xml/dst_query.c b/lasso/xml/dst_query.c
index 1f68b061..02209c70 100644
--- a/lasso/xml/dst_query.c
+++ b/lasso/xml/dst_query.c
@@ -100,14 +100,11 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
rc = parent_class->init_from_xml(node, xmlnode);
if (rc) return rc;
- if (strcmp((char*)xmlnode->ns->href, LASSO_PP_HREF) == 0) {
- query->hrefServiceType = g_strdup(LASSO_PP_HREF);
- query->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- } else if (strcmp((char*)xmlnode->ns->href, LASSO_EP_HREF) == 0) {
- query->hrefServiceType = g_strdup(LASSO_EP_HREF);
- query->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- } else {
- /* XXX */
+ query->hrefServiceType = g_strdup((char*)xmlnode->ns->href);
+ query->prefixServiceType = lasso_get_prefix_for_dst_service_href(
+ query->hrefServiceType);
+ if (query->prefixServiceType == NULL) {
+ /* XXX: what to do here ? */
}
return 0;
diff --git a/lasso/xml/dst_query_response.c b/lasso/xml/dst_query_response.c
index 338ea927..f718c5a1 100644
--- a/lasso/xml/dst_query_response.c
+++ b/lasso/xml/dst_query_response.c
@@ -105,14 +105,11 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
rc = parent_class->init_from_xml(node, xmlnode);
if (rc) return rc;
- if (strcmp((char*)xmlnode->ns->href, LASSO_PP_HREF) == 0) {
- response->hrefServiceType = g_strdup(LASSO_PP_HREF);
- response->prefixServiceType = g_strdup(LASSO_PP_PREFIX);
- } else if (strcmp((char*)xmlnode->ns->href, LASSO_EP_HREF) == 0) {
- response->hrefServiceType = g_strdup(LASSO_EP_HREF);
- response->prefixServiceType = g_strdup(LASSO_EP_PREFIX);
- } else {
- /* XXX */
+ response->hrefServiceType = g_strdup((char*)xmlnode->ns->href);
+ response->prefixServiceType = lasso_get_prefix_for_dst_service_href(
+ response->hrefServiceType);
+ if (response->prefixServiceType == NULL) {
+ /* XXX: what to do here ? */
}
return 0;
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index 43d8b126..7fd2a1c7 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -50,6 +50,50 @@ static
void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode,
struct XmlSnippet *snippet_signature);
+
+GHashTable *dst_services_by_href = NULL; /* Extra DST services, indexed on href */
+GHashTable *dst_services_by_prefix = NULL; /* Extra DST services, indexed on prefix */
+
+/*****************************************************************************/
+/* global methods */
+/*****************************************************************************/
+
+
+/**
+ * lasso_register_dst_service:
+ * @prefix: prefix of DST service
+ * @href: href of DST service
+ *
+ * Registers prefix and href of a custom data service template service.
+ **/
+void
+lasso_register_dst_service(const char *prefix, const char *href)
+{
+ if (dst_services_by_href == NULL) {
+ dst_services_by_href = g_hash_table_new_full(
+ g_str_hash, g_str_equal, g_free, g_free);
+ dst_services_by_prefix = g_hash_table_new_full(
+ g_str_hash, g_str_equal, g_free, g_free);
+ }
+ g_hash_table_insert(dst_services_by_prefix, g_strdup(prefix), g_strdup(href));
+ g_hash_table_insert(dst_services_by_href, g_strdup(href), g_strdup(prefix));
+}
+
+char*
+lasso_get_prefix_for_dst_service_href(const char *href)
+{
+ if (strcmp(href, LASSO_PP_HREF) == 0)
+ return g_strdup(LASSO_PP_PREFIX);
+ if (strcmp(href, LASSO_EP_HREF) == 0)
+ return g_strdup(LASSO_EP_PREFIX);
+
+ if (dst_services_by_href == NULL)
+ return NULL;
+
+ return g_strdup(g_hash_table_lookup(dst_services_by_href, href));
+}
+
+
/*****************************************************************************/
/* virtual public methods */
/*****************************************************************************/
@@ -712,6 +756,7 @@ lasso_node_new_from_xmlNode(xmlNode *xmlnode)
{
char *prefix = NULL;
char *typename;
+ char *tmp;
GType gtype;
LassoNode *node;
xmlChar *xsitype;
@@ -741,13 +786,12 @@ lasso_node_new_from_xmlNode(xmlNode *xmlnode)
if (strcmp((char*)xmlnode->ns->href, LASSO_WSSE_HREF) == 0)
prefix = "Wsse";
- /* XXX: new Dst namespaces can be added dynamically; they should not
- * be hardcoded here
- */
- if (strcmp((char*)xmlnode->ns->href, LASSO_PP_HREF) == 0)
- prefix = "Dst";
- if (strcmp((char*)xmlnode->ns->href, LASSO_EP_HREF) == 0)
+ tmp = lasso_get_prefix_for_dst_service_href((char*)xmlnode->ns->href);
+ if (tmp) {
prefix = "Dst";
+ g_free(tmp);
+ }
+
if (strcmp((char*)prefix, "Dst") == 0 && strcmp((char*)xmlnode->name, "Status") == 0)
prefix = "Utility";
if (strcmp((char*)prefix, "Disco") == 0 && strcmp((char*)xmlnode->name, "Status") == 0)
diff --git a/lasso/xml/xml.h b/lasso/xml/xml.h
index b87b3a4a..25cb122f 100644
--- a/lasso/xml/xml.h
+++ b/lasso/xml/xml.h
@@ -145,6 +145,10 @@ LASSO_EXPORT int lasso_node_init_from_xml(LassoNode *node, xmlNode *xmlnode);
LASSO_EXPORT const char* lasso_strerror(int error_code);
+LASSO_EXPORT void lasso_register_dst_service(const char *prefix, const char *href);
+LASSO_EXPORT char* lasso_get_prefix_for_dst_service_href(const char *href);
+
+
#ifdef LASSO_INTERNALS
#include <lasso/xml/private.h>
#endif
diff --git a/swig/Lasso.i b/swig/Lasso.i
index abcaadb4..caa8e8b7 100644
--- a/swig/Lasso.i
+++ b/swig/Lasso.i
@@ -1103,6 +1103,11 @@ typedef enum {
int lasso_check_version(int major, int minor, int subminor,
LassoCheckVersionMode mode = LASSO_CHECK_VERSION_NUMERIC);
+#ifndef SWIGPHP4
+%rename(registerDstService) lasso_register_dst_service;
+#endif
+void lasso_register_dst_service(const char *prefix, const char *href);
+
/***********************************************************************
* Utility functions to handle nodes, strings, lists...