diff options
| author | Damien Laniel <dlaniel@entrouvert.com> | 2007-06-04 16:23:20 +0000 |
|---|---|---|
| committer | Damien Laniel <dlaniel@entrouvert.com> | 2007-06-04 16:23:20 +0000 |
| commit | 0eb84e618078837bbbba61c35a5b9e4aff067d95 (patch) | |
| tree | 268d38dbba8e298f8ad8e1d0136817eb5eb2b155 | |
| parent | d9e89319796aa680c8f006cec7dc2cb04b8e6d64 (diff) | |
| download | lasso-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.c | 43 | ||||
| -rw-r--r-- | lasso/id-wsf-2.0/data_service.h | 2 | ||||
| -rw-r--r-- | lasso/xml/id-wsf-2.0/dstref_query.c | 52 | ||||
| -rw-r--r-- | lasso/xml/id-wsf-2.0/dstref_query.h | 5 |
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; }; |
