added first functions for ID-WSF 2 attribute modification

This commit is contained in:
Damien Laniel 2007-07-30 13:24:02 +00:00
parent e55dfe929e
commit 2867ab1933
7 changed files with 180 additions and 6 deletions

View File

@ -34,6 +34,9 @@
#include <lasso/xml/id-wsf-2.0/dstref_data.h>
#include <lasso/xml/id-wsf-2.0/util_status.h>
#include <lasso/xml/id-wsf-2.0/sb2_redirect_request.h>
#include <lasso/xml/id-wsf-2.0/dstref_modify.h>
#include <lasso/xml/id-wsf-2.0/dstref_modify_item.h>
#include <lasso/xml/id-wsf-2.0/dstref_modify_response.h>
#include <lasso/xml/soap_fault.h>
@ -456,6 +459,138 @@ lasso_idwsf2_data_service_init_redirect_user_for_consent(LassoIdWsf2DataService
return 0;
}
gint
lasso_idwsf2_data_service_init_modify(LassoIdWsf2DataService *service)
{
LassoIdWsf2Profile *profile = LASSO_IDWSF2_PROFILE(service);
LassoIdWsf2DstRefModify *modify;
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);
modify = lasso_idwsf2_dstref_modify_new();
if (LASSO_PROFILE(profile)->request) {
lasso_node_destroy(LASSO_NODE(LASSO_PROFILE(profile)->request));
}
LASSO_PROFILE(profile)->request = LASSO_NODE(modify);
if (service == NULL || service->private_data == NULL
|| service->private_data->epr == NULL
|| service->private_data->epr->Metadata == NULL) {
return LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE;
}
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) {
modify->hrefServiceType = g_strdup(service_type);
modify->prefixServiceType = lasso_get_prefix_for_idwsf2_dst_service_href(
modify->hrefServiceType);
}
if (modify->prefixServiceType == NULL) {
return LASSO_PROFILE_ERROR_MISSING_SERVICE_TYPE;
}
lasso_idwsf2_profile_init_soap_request(profile, LASSO_NODE(modify), service_type);
/* Set msg_url as epr address, which is the SoapEndpoint */
if (epr->Address != NULL) {
LASSO_PROFILE(profile)->msg_url = g_strdup(epr->Address->content);
} else {
return LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE_ADDRESS;
}
return 0;
}
static void set_xml_string(xmlNode **xmlnode, const char* string)
{
xmlDoc *doc;
xmlNode *node;
doc = xmlReadDoc((xmlChar*)string, NULL, NULL, XML_PARSE_NONET);
node = xmlDocGetRootElement(doc);
if (node != NULL) {
node = xmlCopyNode(node, 1);
}
xmlFreeDoc(doc);
if (*xmlnode) {
xmlFreeNode(*xmlnode);
}
*xmlnode = node;
}
gint
lasso_idwsf2_data_service_add_modify_item(LassoIdWsf2DataService *service, const gchar *item_xpath,
const gchar *item_id, const gchar *new_data, const gboolean overrideAllowed)
{
LassoIdWsf2Profile *profile = LASSO_IDWSF2_PROFILE(service);
LassoIdWsf2DstRefModify *modify;
LassoIdWsf2DstRefModifyItem *item;
xmlNode *new_data_node = NULL;
g_return_val_if_fail(LASSO_IS_IDWSF2_DATA_SERVICE(service),
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(item_xpath != NULL, LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(item_id != NULL, LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
if (! LASSO_IS_IDWSF2_DSTREF_MODIFY(LASSO_PROFILE(profile)->request)) {
return LASSO_PROFILE_ERROR_MISSING_REQUEST;
}
modify = LASSO_IDWSF2_DSTREF_MODIFY(LASSO_PROFILE(profile)->request);
set_xml_string(&new_data_node, new_data);
item = lasso_idwsf2_dstref_modify_item_new_full(
item_xpath, item_id, new_data_node, overrideAllowed);
modify->ModifyItem = g_list_append(modify->ModifyItem, item);
return 0;
}
gint
lasso_idwsf2_data_service_process_modify_msg(LassoIdWsf2DataService *service, const gchar *message)
{
LassoIdWsf2Profile *profile = LASSO_IDWSF2_PROFILE(service);
LassoIdWsf2DstRefModify *request = NULL;
LassoIdWsf2DstRefModifyItem *item = NULL;
GList *i;
int res = 0;
g_return_val_if_fail(LASSO_IS_IDWSF2_DATA_SERVICE(service),
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
res = lasso_idwsf2_profile_process_soap_request_msg(profile, message);
if (! LASSO_IS_IDWSF2_DSTREF_MODIFY(LASSO_PROFILE(profile)->request)) {
res = LASSO_PROFILE_ERROR_INVALID_SOAP_MSG;
} else {
request = LASSO_IDWSF2_DSTREF_MODIFY(LASSO_PROFILE(profile)->request);
service->type = g_strdup(request->hrefServiceType);
}
return res;
}
/*****************************************************************************/
/* private methods */
/*****************************************************************************/

View File

@ -98,6 +98,15 @@ LASSO_EXPORT gchar* lasso_idwsf2_data_service_get_attribute_string(LassoIdWsf2Da
LASSO_EXPORT gint lasso_idwsf2_data_service_init_redirect_user_for_consent(
LassoIdWsf2DataService *service, const gchar *redirect_url);
LASSO_EXPORT gint lasso_idwsf2_data_service_init_modify(LassoIdWsf2DataService *service);
LASSO_EXPORT gint lasso_idwsf2_data_service_add_modify_item(
LassoIdWsf2DataService *service, const gchar *item_xpath, const gchar *item_id,
const gchar *new_data, const gboolean overrideAllowed);
LASSO_EXPORT gint lasso_idwsf2_data_service_process_modify_msg(LassoIdWsf2DataService *service,
const gchar *message);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -72,8 +72,6 @@ struct _LassoIdWsf2DstRefAppDataClass {
LASSO_EXPORT GType lasso_idwsf2_dstref_app_data_get_type(void);
LASSO_EXPORT LassoIdWsf2DstRefAppData* lasso_idwsf2_dstref_app_data_new(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -56,7 +56,6 @@ static struct XmlSnippet schema_snippets[] = {
static LassoNodeClass *parent_class = NULL;
static xmlNode*
get_xmlNode(LassoNode *node, gboolean lasso_dump)
{
@ -91,7 +90,6 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
return 0;
}
/*****************************************************************************/
/* instance and class init functions */
/*****************************************************************************/

View File

@ -124,3 +124,20 @@ lasso_idwsf2_dstref_modify_item_new()
{
return g_object_new(LASSO_TYPE_IDWSF2_DSTREF_MODIFY_ITEM, NULL);
}
LassoIdWsf2DstRefModifyItem*
lasso_idwsf2_dstref_modify_item_new_full(const gchar *item_xpath, const gchar *item_id,
xmlNode *new_data, const gboolean overrideAllowed)
{
LassoIdWsf2DstRefModifyItem *item;
item = g_object_new(LASSO_TYPE_IDWSF2_DSTREF_MODIFY_ITEM, NULL);
item->Select = g_strdup(item_xpath);
item->id = g_strdup(item_id);
item->NewData = lasso_idwsf2_dstref_app_data_new();
item->NewData->any = g_list_append(item->NewData->any, new_data);
item->overrideAllowed = overrideAllowed;
return item;
}

View File

@ -79,7 +79,9 @@ struct _LassoIdWsf2DstRefModifyItemClass {
LASSO_EXPORT GType lasso_idwsf2_dstref_modify_item_get_type(void);
LASSO_EXPORT LassoIdWsf2DstRefModifyItem* lasso_idwsf2_dstref_modify_item_new(void);
LASSO_EXPORT LassoIdWsf2DstRefModifyItem* lasso_idwsf2_dstref_modify_item_new_full(
const gchar *item_xpath, const gchar *item_id, xmlNode *new_data,
const gboolean overrideAllowed);
#ifdef __cplusplus
}

View File

@ -379,8 +379,20 @@ typedef struct {
char* getAttributeString(const char *item_id = NULL);
THROW_ERROR()
gint initRedirectUserForConsent(const char *redirect_url);
int initRedirectUserForConsent(const char *redirect_url);
END_THROW_ERROR()
THROW_ERROR()
int initModify();
END_THROW_ERROR()
THROW_ERROR()
int addModifyItem(const char *item_xpath, const char *item_id, const char *new_data,
const gboolean overrideAllowed=FALSE);
END_THROW_ERROR()
THROW_ERROR()
int processModifyMsg(const char *message);
}
%{
@ -463,6 +475,9 @@ typedef struct {
get_xml_string(lasso_idwsf2_data_service_get_attribute_node(self, itemId))
#define LassoIdWsf2DataService_getAttributeString lasso_idwsf2_data_service_get_attribute_string
#define LassoIdWsf2DataService_initRedirectUserForConsent lasso_idwsf2_data_service_init_redirect_user_for_consent
#define LassoIdWsf2DataService_initModify lasso_idwsf2_data_service_init_modify
#define LassoIdWsf2DataService_addModifyItem lasso_idwsf2_data_service_add_modify_item
#define LassoIdWsf2DataService_processModifyMsg lasso_idwsf2_data_service_process_modify_msg
%}