doubango/trunk/tinyXCAP/tinyXCAP/src/xdm_xcap-caps.c

224 lines
6.7 KiB
C

/****************************************************************************
_ _
| | | |
_ | | ___ _ _| | _ ____ ____ ____ ___
/ || |/ _ \| | | | || \ / _ | _ \ / _ |/ _ \
( (_| | |_| | |_| | |_) | ( | | | | ( ( | | |_| |
\____|\___/ \____|____/ \_||_|_| |_|\_|| |\___/
(_____|
Copyright (C) 2009 xxxyyyzzz <imsframework(at)gmail.com>
This file is part of Open Source Doubango IMS Client Framework project.
DOUBANGO is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DOUBANGO is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU General Public License
along with DOUBANGO.
****************************************************************************/
/*
xcap-caps
->namespaces
->namespace-1
-> ...
->namespace-2
->extensions
->extension-1
->...
->extension-n
->auids
->auid-1
->...
->auid-n
*/
#include "xdm_xcap-caps.h"
#include "xdm_utils.h"
#define CAPS_RETURN_IF_INVALID(caps) if(!caps || !caps->docPtr || !caps->root) return 0;
//static const char* xdm_xcap_caps_ns = "urn:ietf:params:xml:ns:xcap-caps ";
/* get xxx(auids, namespaces or extensions) */
static xdm_list_t* xdm_xcap_caps_xxx(xmlNodePtr rootNode, const char* root, const char* name1, const char* name2)
{
xdm_list_t *xxx = 0;
xdm_list_item_t* item = 0;
xmlNodePtr node = 0;
XDM_LIST_CREATE(xxx);
node = xdm_xml_select_node(rootNode,
XDM_XML_NODE_SELECT_BY_NAME(root),
XDM_XML_NODE_SELECT_BY_NAME(name1),
XDM_XML_NODE_SELECT_CONTENT(),
XDM_XML_NODE_SELECT_END());
while(node = xdm_xml_find_node(node, name2, nft_next))
{
if(node->children && node->children->type == XML_TEXT_NODE)
{
XDM_LIST_ITEM_CREATE(item);
item->data = xdm_strdup((const char*)node->children->content);
xdm_list_add_item(xxx, &item);
}
}
return xxx;
}
/* create xcap-caps context */
/* ATTENTION: use 'xdm_xcap_caps_free' function to free the returned object*/
xcap_caps_t* xdm_xcap_caps_create(const char* buffer, size_t size)
{
xmlNodePtr root = 0;
xmlDocPtr docPtr = 0;
xcap_caps_t* caps = (xcap_caps_t*)malloc(sizeof(xcap_caps_t));
memset(caps, 0, sizeof(xcap_caps_t));
docPtr = xmlParseMemory(buffer, (int)size);
if(docPtr) root = docPtr->children;
if(root)
{
caps->auids = xdm_xcap_caps_xxx(root, "xcap-caps", "auids", "auid");
caps->extensions = xdm_xcap_caps_xxx(root, "xcap-caps", "extensions", "extension");
caps->namespaces = xdm_xcap_caps_xxx(root, "xcap-caps", "namespaces", "namespace");
}
xmlFreeDoc(docPtr);
return caps;
}
/* free data (xcap_caps_t) */
void xdm_xcap_caps_free(xcap_caps_t** caps)
{
if(*caps)
{
XDM_LIST_SAFE_FREE((*caps)->auids);
XDM_LIST_SAFE_FREE((*caps)->namespaces);
XDM_LIST_SAFE_FREE((*caps)->extensions);
free(*caps);
(*caps)=0;
}
}
#undef CAPS_RETURN_IF_INVALID
//xcap_caps_t* xdm_xcap_caps_create()
//{
// int i;
// xdm_xml_element_t *auids = 0, *namespaces = 0, *elt;
//
// xcap_caps_t* caps = (xcap_caps_t*)malloc(sizeof(xcap_caps_t));
// memset(caps, 0, sizeof(xcap_caps_t));
// XDM_LIST_CREATE(caps->root);
//
//
//
//
//
//
//
// //
// // auids
// //
// xdm_xml_element_init_set(&auids, "auids", "", xt_none); /*auids root*/
// for(i=0; i<4;i++)
// {
// switch(i)
// {
// case 0:
// { /* <auid>xcap-caps</auid> */
// xdm_xml_element_init_set(&elt, "auid", "xcap-caps", xt_string);
// xdm_xml_elements_add(auids->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 1:
// { /* <auid>resource-lists</auid> */
// xdm_xml_element_init_set(&elt, "auid", "resource-lists", xt_string);
// xdm_xml_elements_add(auids->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 2:
// { /* <auid>rls-services</auid> */
// xdm_xml_element_init_set(&elt, "auid", "rls-services", xt_string);
// xdm_xml_elements_add(auids->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 3:
// { /* <auid>org.openmobilealliance.xcap-directory</auid> */
// xdm_xml_element_init_set(&elt, "auid", "org.openmobilealliance.xcap-directory", xt_string);
// xdm_xml_elements_add(auids->elements, &elt, xdm_xml_element_free);
// break;
// }
// }
// }
//
// //
// // namespaces
// //
// xdm_xml_element_init_set(&namespaces, "namespaces", "", xt_none); /*namespaces root*/
// for(i=0; i<5;i++)
// {
// switch(i)
// {
// case 0:
// { /* <namespace>urn:ietf:params:xml:ns:xcap-caps</namespace> */
// xdm_xml_element_init_set(&elt, "namespace", "<namespace>urn:ietf:params:xml:ns:xcap-caps</namespace>", xt_string);
// xdm_xml_elements_add(namespaces->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 1:
// { /* <namespace>urn:ietf:params:xml:ns:xcap-error</namespace> */
// xdm_xml_element_init_set(&elt, "namespace", "<namespace>urn:ietf:params:xml:ns:xcap-error</namespace>", xt_string);
// xdm_xml_elements_add(namespaces->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 2:
// { /* <namespace>urn:ietf:params:xml:ns:resource-lists</namespace> */
// xdm_xml_element_init_set(&elt, "namespace", "<namespace>urn:ietf:params:xml:ns:resource-lists</namespace>", xt_string);
// xdm_xml_elements_add(namespaces->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 3:
// { /* <namespace>urn:ietf:params:xml:ns:rls-services</namespace> */
// xdm_xml_element_init_set(&elt, "namespace", "<namespace>urn:ietf:params:xml:ns:rls-services</namespace>", xt_string);
// xdm_xml_elements_add(namespaces->elements, &elt, xdm_xml_element_free);
// break;
// }
//
// case 4:
// { /* <namespace>urn:oma:params:ns:resource-list:oma-uriusage</namespace> */
// xdm_xml_element_init_set(&elt, "namespace", "urn:oma:params:ns:resource-list:oma-uriusage</namespace>", xt_string);
// xdm_xml_elements_add(namespaces->elements, &elt, xdm_xml_element_free);
// break;
// }
// }
// }
//
// /* add auids */
// xdm_list_add_data(caps->root, ((void**) &auids), xdm_xml_element_free);
//
// /* add namespaces */
// xdm_list_add_data(caps->root, ((void**) &namespaces), xdm_xml_element_free);
//
// return caps;
//}