summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Laniel <dlaniel@entrouvert.com>2007-06-04 16:23:20 +0000
committerDamien Laniel <dlaniel@entrouvert.com>2007-06-04 16:23:20 +0000
commit0eb84e618078837bbbba61c35a5b9e4aff067d95 (patch)
tree268d38dbba8e298f8ad8e1d0136817eb5eb2b155
parentd9e89319796aa680c8f006cec7dc2cb04b8e6d64 (diff)
downloadlasso-0eb84e618078837bbbba61c35a5b9e4aff067d95.tar.gz
lasso-0eb84e618078837bbbba61c35a5b9e4aff067d95.tar.xz
lasso-0eb84e618078837bbbba61c35a5b9e4aff067d95.zip
use profile namespace for dst queries + added server as parameter to basic IdWsf2DataService constructor
-rw-r--r--lasso/id-wsf-2.0/data_service.c43
-rw-r--r--lasso/id-wsf-2.0/data_service.h2
-rw-r--r--lasso/xml/id-wsf-2.0/dstref_query.c52
-rw-r--r--lasso/xml/id-wsf-2.0/dstref_query.h5
4 files changed, 94 insertions, 8 deletions
diff --git a/lasso/id-wsf-2.0/data_service.c b/lasso/id-wsf-2.0/data_service.c
index f1187c07..b1a7cc9b 100644
--- a/lasso/id-wsf-2.0/data_service.c
+++ b/lasso/id-wsf-2.0/data_service.c
@@ -30,6 +30,8 @@
#include <lasso/xml/id-wsf-2.0/dstref_query.h>
/* #include <lasso/xml/id-wsf-2.0/dstref_query_response.h> */
+#include <lasso/xml/id-wsf-2.0/disco_service_type.h>
+
struct _LassoIdWsf2DataServicePrivate
{
gboolean dispose_has_run;
@@ -47,6 +49,9 @@ lasso_idwsf2_data_service_init_query(LassoIdWsf2DataService *service)
LassoWsf2Profile *profile;
LassoIdWsf2DstRefQuery *query;
LassoWsAddrEndpointReference *epr;
+ GList *metadata_item;
+ GList *i;
+ gchar *service_type = NULL;
g_return_val_if_fail(LASSO_IS_IDWSF2_DATA_SERVICE(service),
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
@@ -64,16 +69,35 @@ lasso_idwsf2_data_service_init_query(LassoIdWsf2DataService *service)
epr = service->private_data->epr;
+ /* Get the service type from the EPR */
+ metadata_item = epr->Metadata->any;
+ for (i = g_list_first(metadata_item); i != NULL; i = g_list_next(i)) {
+ if (LASSO_IS_IDWSF2_DISCO_SERVICE_TYPE(i->data)) {
+ service_type = LASSO_IDWSF2_DISCO_SERVICE_TYPE(i->data)->content;
+ break;
+ }
+ }
+
+ /* Set hrefServiceType and prefixServiceType in query in order to set the profile */
+ /* namespace in the request */
+ if (service_type != NULL) {
+ query->hrefServiceType = g_strdup(service_type);
+ query->prefixServiceType = lasso_get_prefix_for_dst_service_href(
+ query->hrefServiceType);
+ }
+ if (query->prefixServiceType == NULL) {
+ return LASSO_PROFILE_ERROR_MISSING_SERVICE_TYPE;
+ }
+
lasso_wsf2_profile_init_soap_request(profile, LASSO_NODE(query));
+ /* Set msg_url as epr address, which is the SoapEndpoint */
if (epr->Address != NULL) {
profile->msg_url = g_strdup(epr->Address->content);
} else {
return LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE_ADDRESS;
}
- /* Add needed credential for remote service */
-
return 0;
}
@@ -192,9 +216,17 @@ lasso_idwsf2_data_service_get_type()
* Return value: a newly created #LassoIdWsf2DataService object
**/
LassoIdWsf2DataService*
-lasso_idwsf2_data_service_new()
+lasso_idwsf2_data_service_new(LassoServer *server)
{
- return LASSO_IDWSF2_DATA_SERVICE(g_object_new(LASSO_TYPE_IDWSF2_DATA_SERVICE, NULL));
+ LassoIdWsf2DataService *service;
+
+ g_return_val_if_fail(LASSO_IS_SERVER(server), NULL);
+
+ service = g_object_new(LASSO_TYPE_IDWSF2_DATA_SERVICE, NULL);
+
+ LASSO_WSF2_PROFILE(service)->server = g_object_ref(server);
+
+ return service;
}
LassoIdWsf2DataService*
@@ -205,9 +237,8 @@ lasso_idwsf2_data_service_new_full(LassoServer *server, LassoWsAddrEndpointRefer
g_return_val_if_fail(LASSO_IS_SERVER(server), NULL);
g_return_val_if_fail(LASSO_IS_WSA_ENDPOINT_REFERENCE(epr), NULL);
- service = LASSO_IDWSF2_DATA_SERVICE(g_object_new(LASSO_TYPE_IDWSF2_DATA_SERVICE, NULL));
+ service = lasso_idwsf2_data_service_new(server);
- LASSO_WSF2_PROFILE(service)->server = g_object_ref(server);
service->private_data->epr = g_object_ref(epr);
return service;
diff --git a/lasso/id-wsf-2.0/data_service.h b/lasso/id-wsf-2.0/data_service.h
index 89c04e57..d6e58ebc 100644
--- a/lasso/id-wsf-2.0/data_service.h
+++ b/lasso/id-wsf-2.0/data_service.h
@@ -74,7 +74,7 @@ struct _LassoIdWsf2DataServiceClass {
LASSO_EXPORT GType lasso_idwsf2_data_service_get_type(void);
-LASSO_EXPORT LassoIdWsf2DataService* lasso_idwsf2_data_service_new();
+LASSO_EXPORT LassoIdWsf2DataService* lasso_idwsf2_data_service_new(LassoServer *server);
LASSO_EXPORT LassoIdWsf2DataService* lasso_idwsf2_data_service_new_full(LassoServer *server,
LassoWsAddrEndpointReference *epr);
diff --git a/lasso/xml/id-wsf-2.0/dstref_query.c b/lasso/xml/id-wsf-2.0/dstref_query.c
index 15954697..50e96404 100644
--- a/lasso/xml/id-wsf-2.0/dstref_query.c
+++ b/lasso/xml/id-wsf-2.0/dstref_query.c
@@ -56,6 +56,54 @@ static struct XmlSnippet schema_snippets[] = {
static LassoNodeClass *parent_class = NULL;
+static void
+insure_namespace(xmlNode *xmlnode, xmlNs *ns)
+{
+ xmlNode *t = xmlnode->children;
+
+ xmlSetNs(xmlnode, ns);
+ while (t) {
+ if (t->type == XML_ELEMENT_NODE) {
+ insure_namespace(t, ns);
+ }
+ t = t->next;
+ }
+}
+
+static xmlNode*
+get_xmlNode(LassoNode *node, gboolean lasso_dump)
+{
+ xmlNode *xmlnode;
+ xmlNs *ns;
+
+ xmlnode = parent_class->get_xmlNode(node, lasso_dump);
+ ns = xmlNewNs(xmlnode, (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY(node)->hrefServiceType,
+ (xmlChar*)LASSO_IDWSF2_DSTREF_QUERY(node)->prefixServiceType);
+ insure_namespace(xmlnode, ns);
+
+ return xmlnode;
+}
+
+static int
+init_from_xml(LassoNode *node, xmlNode *xmlnode)
+{
+ LassoIdWsf2DstRefQuery *query = LASSO_IDWSF2_DSTREF_QUERY(node);
+ int res;
+
+ res = parent_class->init_from_xml(node, xmlnode);
+ if (res != 0) {
+ return res;
+ }
+
+ 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;
+}
/*****************************************************************************/
/* instance and class init functions */
@@ -66,6 +114,8 @@ instance_init(LassoIdWsf2DstRefQuery *node)
{
node->TestItem = NULL;
node->QueryItem = NULL;
+ node->prefixServiceType = NULL;
+ node->hrefServiceType = NULL;
}
static void
@@ -74,6 +124,8 @@ class_init(LassoIdWsf2DstRefQueryClass *klass)
LassoNodeClass *nclass = LASSO_NODE_CLASS(klass);
parent_class = g_type_class_peek_parent(klass);
+ nclass->get_xmlNode = get_xmlNode;
+ nclass->init_from_xml = init_from_xml;
nclass->node_data = g_new0(LassoNodeClassData, 1);
lasso_node_class_set_nodename(nclass, "Query");
lasso_node_class_set_ns(nclass, LASSO_IDWSF2_DSTREF_HREF, LASSO_IDWSF2_DSTREF_PREFIX);
diff --git a/lasso/xml/id-wsf-2.0/dstref_query.h b/lasso/xml/id-wsf-2.0/dstref_query.h
index ce35566c..ba392a8c 100644
--- a/lasso/xml/id-wsf-2.0/dstref_query.h
+++ b/lasso/xml/id-wsf-2.0/dstref_query.h
@@ -64,9 +64,12 @@ struct _LassoIdWsf2DstRefQuery {
/* elements */
GList *TestItem; /* of LassoIdWsf2DstRefTestItem */
GList *QueryItem; /* of LassoIdWsf2DstRefQueryItem */
+
+ /*< private >*/
+ char *prefixServiceType;
+ char *hrefServiceType;
};
-
struct _LassoIdWsf2DstRefQueryClass {
LassoIdWsf2DstRequestClass parent;
};