doubango/tinyXCAP/src/txcap_selector.c
c732d49e
 #if HAVE_CRT
 #define _CRTDBG_MAP_ALLOC 
 #include <stdlib.h> 
 #include <crtdbg.h>
 #endif //HAVE_CRT
 /*
74ca6d11
 * Copyright (C) 2020, University of the Basque Country (UPV/EHU)
c732d49e
 * Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
 *
 * The original file was part of Open Source Doubango Framework
 * Copyright (C) 2010-2011 Mamadou Diop.
 * Copyright (C) 2012 Doubango Telecom <http://doubango.org>
 *
 * This file is part of Open Source Doubango Framework.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with DOUBANGO.
 *
 */
 /**@file txcap_selector.c
  * @brief XCAP selector.
  *
  * @author Mamadou Diop <diopmamadou(at)doubango.org>
  *
 
  */
 #include "tinyxcap/txcap_selector.h"
 
 #include "tinyxcap/txcap_document.h"
 #include "tinyxcap/txcap_node.h"
 
 /**@defgroup txcap_selector_group XCAP URL selector
 */
 
 /** Internal function
  */
 char* __txcap_selector_get_url(const txcap_stack_handle_t* stack, const char* auid_id, va_list* app)
 {
 	char* ret = tsk_null;
 	char* node = tsk_null;
 	if(!stack && !auid_id){
 		goto bail;
 	}
     
 	/* ==document== */
 	if(!(ret = txcap_selector_get_document(stack, auid_id))){
 		TSK_DEBUG_ERROR("Failed to compute XCAP document URL.");
 		goto bail;
 	}
     
 	/* ==node== */
 	if((node = txcap_selector_get_node_2(auid_id, app))){
 		/* append node root */
 		char* temp = tsk_null;
 		tsk_sprintf(&temp, "/~~/%s", auid_id);
 		tsk_strcat(&ret, temp);
 		/* append node */
 		tsk_strcat(&ret, node);
 		/* free */
 		TSK_FREE(temp);
 		TSK_FREE(node);
 	}
 	
 bail:
 	return ret;
 }
 
175b478c
 char* __txcap_selector_get_url_no_auid(const txcap_stack_handle_t* stack, const char* auid_id, va_list* app)
c732d49e
 {
 	char* ret = tsk_null;
 	char* node = tsk_null;
 	if(!stack && !auid_id){
 		goto bail;
 	}
     
 	/* ==document== */
 	if(!(ret = txcap_selector_get_document(stack, auid_id))){
 		TSK_DEBUG_ERROR("Failed to compute XCAP document URL.");
 		goto bail;
 	}
     
 	/* ==node== */
 	if((node = txcap_selector_get_node_2(auid_id, app))){
 		/* append node root */
 		char* temp = tsk_null;
 		tsk_sprintf(&temp, "/~~");
 		tsk_strcat(&ret, temp);
 		/* append node */
 		tsk_strcat(&ret, node);
 		/* free */
 		TSK_FREE(temp);
 		TSK_FREE(node);
 	}
 	
 bail:
 	return ret;
 }
 
 /** Internal function
  */
 char* __txcap_selector_get_url_2(const char* xcap_root, const char* auid_id, const char* xui, const char* doc_name, va_list* app)
 {
 	char* ret = tsk_null;
 	char* node = tsk_null;
 	if(!xcap_root && !auid_id){
 		goto bail;
 	}
     
 	/* ==document== */
 	if(!(ret = txcap_selector_get_document_2(xcap_root, auid_id, xui, doc_name))){
 		TSK_DEBUG_ERROR("Failed to compute XCAP document URL.");
 		goto bail;
 	}
     
 	/* ==node== */
 	if((node = txcap_selector_get_node_2(auid_id, app))){
 		/* append node root */
 		char* temp = tsk_null;
 		tsk_sprintf(&temp, "/~~/%s", auid_id);
 		tsk_strcat(&ret, temp);
 		/* append node */
 		tsk_strcat(&ret, node);
 		/* free */
 		TSK_FREE(temp);
 		TSK_FREE(node);
 	}
 	
 bail:
 	return ret;
 }
 
 /**@ingroup txcap_selector_group
 * Gets the full XCAP URL with both the document and node selector parts.
 * @param stack The XCAP stack from which to load the user's preference (xcap-root, AUIDs, XUI, name of the document, ...).
 * Should be created using @ref txcap_stack_create().
 * @param auid_id The Application Unique ID.  Unique identifier within the namespace of application unique IDs created by this specification (RFC 4825)
 * that differentiates XCAP resources accessed by one application from XCAP resources accessed by another.
 * For more information see <a href="http://tools.ietf.org/html/rfc4825#section-4">RFC 4825 subclause 4</a>.
 * @param ... Any @a TXCAP_SELECTOR_NODE_SET*() macros. MUST ends with @ref TXCAP_SELECTOR_NODE_SET_NULL().
 * @retval A well-formed (already escaped) HTTP/HTTPS URL which can be used as Request-Uri (e.g. GET, PUT or DELETE). As a
 *  result, performing a GET against the return URL would retrieve a document, element or attribute.
 *
 * @code
 // Retrieve the entry with: uri='sip:bob@example.com' and list='rcs'
 // Expected node: /resource-lists/list[@name="rcs"]/entry[@uri="sip:bob@example.com"]
 char* urlstring = txcap_selector_get_url(stack, "resource-lists",
 	TXCAP_SELECTOR_NODE_SET_ATTRIBUTE("list", "name", "rcs"),
 	TXCAP_SELECTOR_NODE_SET_ATTRIBUTE("entry", "uri", "sip:bob@example.com"),
 	TXCAP_SELECTOR_NODE_SET_NULL());
 TSK_DEBUG_INFO("%s\n", urlstring);
 TSK_FREE(urlstring);
 * @endcode
 *
 * @sa @ref txcap_selector_get_node<br>@ref txcap_selector_get_document<br> @ref txcap_selector_get_document_2
 */
 char* txcap_selector_get_url(const txcap_stack_handle_t* stack, const char* auid_id, ...)
 {
 	char* ret;
 	va_list ap;
 	
 	va_start(ap, auid_id);
 	ret = __txcap_selector_get_url(stack, auid_id, &ap);
 	va_end(ap);
 
 	return ret;
 }
 
 /**@ingroup txcap_selector_group
 * Gets the full XCAP URL with both the document and node selector parts.
 * @param xcap_root The XCAP Root URI (valid HTTP/HTTPS URL). A context that contains all the documents across all
 * application usages and users that are managed by the server. For more information see <a href="http://tools.ietf.org/html/rfc4825#section-4">RFC 4825 subclause 4</a>.
 * @param auid_id The Application Unique ID.  Unique identifier within the namespace of application unique IDs created by this specification (RFC 4825)
 * that differentiates XCAP resources accessed by one application from XCAP resources accessed by another.
 * For more information see <a href="http://tools.ietf.org/html/rfc4825#section-4">RFC 4825 subclause 4</a>.
 * @param xui The XCAP User Identifier. The XUI is a string, valid as a path element in an HTTP URI, that is associated with each user served
 *  by the XCAP server. For more information see <a href="http://tools.ietf.org/html/rfc4825#section-4">RFC 4825 subclause 4</a>.
 * For global document, this parameter should be NULL or equal to "global".
 * @param doc_name The name of the document (e.g. index).
 * @retval A well-formed HTTP/HTTPS URL which can be used as Request-Uri (e.g. GET, PUT or DELETE). As a
 *  result, performing a GET against the return URL would retrieve a document, element or attribute.
 * @code
 * @endcode
 *
 * @sa @ref txcap_selector_get_url<br>@ref txcap_selector_get_node<br>@ref txcap_selector_get_document<br> @ref txcap_selector_get_document_2
 */
 char* txcap_selector_get_url_2(const char* xcap_root, const char* auid_id, const char* xui, const char* doc_name, ...)
 {
 	char* ret;
 	va_list ap;
 	
 	va_start(ap, doc_name);
 	ret = __txcap_selector_get_url_2(xcap_root, auid_id, xui, doc_name, &ap);
 	va_end(ap);
     
 	return ret;    
 }