1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Canonical XML" implementation 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/xml-c14n 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Exclusive XML Canonicalization" implementation 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/xml-exc-c14n 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Author: Aleksey Sanin <aleksey@aleksey.com> 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_C14N_ENABLED 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/c14n.h> 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some declaration better left private ATM * 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_BEFORE_DOCUMENT_ELEMENT = 0, 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_INSIDE_DOCUMENT_ELEMENT = 1, 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_AFTER_DOCUMENT_ELEMENT = 2 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlC14NPosition; 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlC14NVisibleNsStack { 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nsCurEnd; /* number of nodes in the set */ 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nsPrevStart; /* the begginning of the stack for previous visible node */ 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nsPrevEnd; /* the end of the stack for previous visible node */ 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nsMax; /* size of the array as allocated */ 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr *nsTab; /* array of ns in no particular order */ 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *nodeTab; /* array of nodes in no particular order */ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlC14NVisibleNsStack, *xmlC14NVisibleNsStackPtr; 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlC14NCtx { 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* input parameters */ 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NIsVisibleCallback is_visible_callback; 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void* user_data; 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments; 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* position in the XML document */ 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NPosition pos; 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int parent_is_doc; 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackPtr ns_rendered; 63df143a5041f03a22808b59c76698770b74692815Selim Gurun 64df143a5041f03a22808b59c76698770b74692815Selim Gurun /* C14N mode */ 65df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NMode mode; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* exclusive canonicalization */ 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **inclusive_ns_prefixes; 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* error number */ 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int error; 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlC14NCtx, *xmlC14NCtxPtr; 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlC14NVisibleNsStackPtr xmlC14NVisibleNsStackCreate (void); 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlC14NVisibleNsStackDestroy (xmlC14NVisibleNsStackPtr cur); 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlC14NVisibleNsStackAdd (xmlC14NVisibleNsStackPtr cur, 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns, 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node); 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlC14NVisibleNsStackSave (xmlC14NVisibleNsStackPtr cur, 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackPtr state); 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlC14NVisibleNsStackRestore (xmlC14NVisibleNsStackPtr cur, 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackPtr state); 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlC14NVisibleNsStackShift (xmlC14NVisibleNsStackPtr cur); 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns); 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlExcC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns, 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NCtxPtr ctx); 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlC14NIsNodeInNodeset (xmlNodeSetPtr nodes, 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr parent); 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur); 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur); 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_NORMALIZE_ATTR = 0, 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_NORMALIZE_COMMENT = 1, 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_NORMALIZE_PI = 2, 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XMLC14N_NORMALIZE_TEXT = 3 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlC14NNormalizationMode; 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *xmlC11NNormalizeString(const xmlChar * input, 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NNormalizationMode mode); 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlC11NNormalizeAttr( a ) \ 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_ATTR) 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlC11NNormalizeComment( a ) \ 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_COMMENT) 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlC11NNormalizePI( a ) \ 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_PI) 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlC11NNormalizeText( a ) \ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_TEXT) 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlC14NIsVisible( ctx, node, parent ) \ 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((ctx)->is_visible_callback != NULL) ? \ 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctx)->is_visible_callback((ctx)->user_data, \ 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr)(node), (xmlNodePtr)(parent)) : 1) 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 122df143a5041f03a22808b59c76698770b74692815Selim Gurun#define xmlC14NIsExclusive( ctx ) \ 123df143a5041f03a22808b59c76698770b74692815Selim Gurun ( (ctx)->mode == XML_C14N_EXCLUSIVE_1_0 ) 124df143a5041f03a22808b59c76698770b74692815Selim Gurun 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some factorized error routines * 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrMemory: 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of memory error 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrMemory(const char *extra) 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrParam: 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of param error 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrParam(const char *extra) 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid parameter : %s\n", extra); 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrInternal: 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of internal error 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrInternal(const char *extra) 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error : %s\n", extra); 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrInvalidNode: 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of invalid node error 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrInvalidNode(const char *node_type, const char *extra) 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_C14N_INVALID_NODE, XML_ERR_ERROR, NULL, 0, extra, 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Node %s is invalid here : %s\n", node_type, extra); 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrUnknownNode: 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of unknown node error 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrUnknownNode(int node_type, const char *extra) 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_C14N_UNKNOW_NODE, XML_ERR_ERROR, NULL, 0, extra, 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unknown node type %d found : %s\n", node_type, extra); 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErrRelativeNamespace: 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of relative namespace error 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErrRelativeNamespace(const char *ns_uri) 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_C14N_RELATIVE_NAMESPACE, XML_ERR_ERROR, NULL, 0, NULL, 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Relative namespace UR is invalid here : %s\n", ns_uri); 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NErr: 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a C14N evaluation context 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the erorr code 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NErr(xmlC14NCtxPtr ctxt, xmlNodePtr node, int error, 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char * msg) 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = error; 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, node, XML_FROM_C14N, error, 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 24243ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich NULL, NULL, NULL, 0, 0, "%s", msg); 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The implementation internals * 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NAMESPACES_DEFAULT 16 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NIsNodeInNodeset(xmlNodeSetPtr nodes, xmlNodePtr node, xmlNodePtr parent) { 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((nodes != NULL) && (node != NULL)) { 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(node->type != XML_NAMESPACE_DECL) { 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetContains(nodes, node)); 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNs ns; 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&ns, node, sizeof(ns)); 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* this is a libxml hack! check xpath.c for details */ 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((parent != NULL) && (parent->type == XML_ATTRIBUTE_NODE)) { 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.next = (xmlNsPtr)parent->parent; 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns.next = (xmlNsPtr)parent; 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the input is an XPath node-set, then the node-set must explicitly 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contain every node to be rendered to the canonical form. 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetContains(nodes, (xmlNodePtr)&ns)); 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlC14NVisibleNsStackPtr 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackCreate(void) { 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackPtr ret; 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlC14NVisibleNsStackPtr) xmlMalloc(sizeof(xmlC14NVisibleNsStack)); 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("creating namespaces stack"); 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlC14NVisibleNsStack)); 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackDestroy(xmlC14NVisibleNsStackPtr cur) { 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur == NULL) { 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("destroying namespaces stack"); 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur->nsTab != NULL) { 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nsTab, 0, cur->nsMax * sizeof(xmlNsPtr)); 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur->nsTab); 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur->nodeTab != NULL) { 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0, cur->nsMax * sizeof(xmlNodePtr)); 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur->nodeTab); 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlC14NVisibleNsStack)); 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackAdd(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlNodePtr node) { 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((cur == NULL) || 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->nsTab == NULL) && (cur->nodeTab != NULL)) || 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->nsTab != NULL) && (cur->nodeTab == NULL))) { 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("adding namespace to stack"); 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nsTab == NULL) && (cur->nodeTab == NULL)) { 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsTab = (xmlNsPtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nsTab == NULL) || (cur->nodeTab == NULL)) { 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("adding node to stack"); 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nsTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsMax = XML_NAMESPACES_DEFAULT; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if(cur->nsMax == cur->nsCurEnd) { 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *tmp; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmpSize; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmpSize = 2 * cur->nsMax; 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRealloc(cur->nsTab, tmpSize * sizeof(xmlNsPtr)); 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("adding node to stack"); 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsTab = (xmlNsPtr*)tmp; 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlRealloc(cur->nodeTab, tmpSize * sizeof(xmlNodePtr)); 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("adding node to stack"); 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr*)tmp; 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsMax = tmpSize; 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsTab[cur->nsCurEnd] = ns; 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nsCurEnd] = node; 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ++cur->nsCurEnd; 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackSave(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((cur == NULL) || (state == NULL)) { 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("saving namespaces stack"); 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nsCurEnd = cur->nsCurEnd; 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nsPrevStart = cur->nsPrevStart; 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nsPrevEnd = cur->nsPrevEnd; 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackRestore(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((cur == NULL) || (state == NULL)) { 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("restoring namespaces stack"); 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsCurEnd = state->nsCurEnd; 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsPrevStart = state->nsPrevStart; 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsPrevEnd = state->nsPrevEnd; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackShift(xmlC14NVisibleNsStackPtr cur) { 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur == NULL) { 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("shifting namespaces stack"); 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsPrevStart = cur->nsPrevEnd; 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nsPrevEnd = cur->nsCurEnd; 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NStrEqual(const xmlChar *str1, const xmlChar *str2) { 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str1 == str2) return(1); 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str1 == NULL) return((*str2) == '\0'); 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 == NULL) return((*str1) == '\0'); 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*str1++ != *str2) return(0); 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*str2++); 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NVisibleNsStackFind: 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace to check 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the given namespace was already rendered or not 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if we already wrote this namespace or 0 otherwise 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns) 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix; 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *href; 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_empty_ns; 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur == NULL) { 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("searching namespaces stack (c14n)"); 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the default namespace xmlns="" is not defined yet then 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we do not want to print it out 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nsTab != NULL) { 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start = (has_empty_ns) ? 0 : cur->nsPrevStart; 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = cur->nsCurEnd - 1; i >= start; --i) { 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns1 = cur->nsTab[i]; 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)); 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(has_empty_ns); 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExcC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlC14NCtxPtr ctx) { 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *href; 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_empty_ns; 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur == NULL) { 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("searching namespaces stack (exc c14n)"); 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the default namespace xmlns="" is not defined yet then 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we do not want to print it out 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nsTab != NULL) { 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start = 0; 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = cur->nsCurEnd - 1; i >= start; --i) { 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns1 = cur->nsTab[i]; 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)) { 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlC14NIsVisible(ctx, ns1, cur->nodeTab[i])); 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(has_empty_ns); 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NIsXmlNs: 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace to check 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the given namespace is a default "xml:" namespace 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with href="http://www.w3.org/XML/1998/namespace" 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the node is default or 0 otherwise 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* todo: make it a define? */ 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NIsXmlNs(xmlNsPtr ns) 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ((ns != NULL) && 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ns->prefix, BAD_CAST "xml")) && 500df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlStrEqual(ns->href, XML_XML_NAMESPACE))); 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NNsCompare: 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns1: the pointer to first namespace 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns2: the pointer to second namespace 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares the namespaces by names (prefixes). 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if ns1 < ns2, 0 if ns1 == ns2 or 1 if ns1 > ns2. 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NNsCompare(xmlNsPtr ns1, xmlNsPtr ns2) 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1 == ns2) 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1 == NULL) 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns2 == NULL) 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStrcmp(ns1->prefix, ns2->prefix)); 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NPrintNamespaces: 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the pointer to namespace 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints the given namespace to the output buffer from C14N context. 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 on success or 0 on fail. 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NPrintNamespaces(const xmlNsPtr ns, xmlC14NCtxPtr ctx) 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ctx == NULL)) { 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("writing namespaces"); 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0; 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) { 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, " xmlns:"); 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) ns->prefix); 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "=\""); 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, " xmlns=\""); 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(ns->href != NULL) { 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) ns->href); 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "\""); 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NProcessNamespacesAxis: 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints out canonical namespace axis of the current node to the 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer from C14N context as follows 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace Axis 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Consider a list L containing only namespace nodes in the 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis and in the node-set in lexicographic order (ascending). To begin 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing L, if the first node is not the default namespace node (a node 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with no namespace URI and no local name), then generate a space followed 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by xmlns="" if and only if the following conditions are met: 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the element E that owns the axis is in the node-set 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The nearest ancestor element of E in the node-set has a default 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace node in the node-set (default namespace nodes always 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have non-empty values in XPath) 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The latter condition eliminates unnecessary occurrences of xmlns="" in 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the canonical form since an element only receives an xmlns="" if its 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * default namespace is empty and if it has an immediate parent in the 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonical form that has a non-empty default namespace. To finish 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing L, simply process every namespace node in L, except omit 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace node with local name xml, which defines the xml prefix, 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if its string value is http://www.w3.org/XML/1998/namespace. 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML applied to a document subset requires the search of the 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestor nodes of each orphan element node for attributes in the xml 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace, such as xml:lang and xml:space. These are copied into the 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element node except if a declaration of the same attribute is already 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the attribute axis of the element (whether or not it is included in 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the document subset). This search and copying are omitted from the 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Exclusive XML Canonicalization method. 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success or -1 on fail. 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n; 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns, tmp; 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr list; 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int already_rendered; 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_empty_ns = 0; 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing namespaces axis (c14n)"); 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a sorted list to store element namespaces 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("creating namespaces list (c14n)"); 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* check all namespaces */ 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(n = cur; n != NULL; n = n->parent) { 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(ns = n->nsDef; ns != NULL; ns = ns->next) { 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlSearchNs(cur->doc, cur, ns->prefix); 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((tmp == ns) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible) { 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!already_rendered) { 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListInsert(list, ns); 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlStrlen(ns->prefix) == 0) { 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = 1; 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /** 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first node is not the default namespace node (a node with no 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace URI and no local name), then generate a space followed by 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlns="" if and only if the following conditions are met: 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the element E that owns the axis is in the node-set 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the nearest ancestor element of E in the node-set has a default 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace node in the node-set (default namespace nodes always 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have non-empty values in XPath) 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible && !has_empty_ns) { 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static xmlNs ns_default; 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&ns_default, 0, sizeof(ns_default)); 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NPrintNamespaces(&ns_default, ctx); 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * print out all elements from list 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListDelete(list); 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExcC14NProcessNamespacesAxis: 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints out exclusive canonical namespace axis of the current node to the 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer from C14N context as follows 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Exclusive XML Canonicalization 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/xml-exc-c14n 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the element node is in the XPath subset then output the node in 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * accordance with Canonical XML except for namespace nodes which are 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * rendered as follows: 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1. Render each namespace node iff: 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * it is visibly utilized by the immediate parent element or one of 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * its attributes, or is present in InclusiveNamespaces PrefixList, and 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * its prefix and value do not appear in ns_rendered. ns_rendered is 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * obtained by popping the state stack in order to obtain a list of 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prefixes and their values which have already been rendered by 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an output ancestor of the namespace node's parent element. 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2. Append the rendered namespace node to the list ns_rendered of namespace 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nodes rendered by output ancestors. Push ns_rendered on state stack and 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * recurse. 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3. After the recursion returns, pop thestate stack. 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success or -1 on fail. 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExcC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListPtr list; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int already_rendered; 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_empty_ns = 0; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_visibly_utilized_empty_ns = 0; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_empty_ns_in_inclusive_list = 0; 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing namespaces axis (exc c14n)"); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 719df143a5041f03a22808b59c76698770b74692815Selim Gurun if(!xmlC14NIsExclusive(ctx)) { 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing namespaces axis (exc c14n)"); 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a sorted list to store element namespaces 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("creating namespaces list (exc c14n)"); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * process inclusive namespaces: 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All namespace nodes appearing on inclusive ns list are 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * handled as provided in Canonical XML 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(ctx->inclusive_ns_prefixes != NULL) { 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix; 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; ctx->inclusive_ns_prefixes[i] != NULL; ++i) { 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix = ctx->inclusive_ns_prefixes[i]; 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Special values for namespace with empty prefix 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(prefix, BAD_CAST "#default") 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project || xmlStrEqual(prefix, BAD_CAST "")) { 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix = NULL; 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns_in_inclusive_list = 1; 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlSearchNs(cur->doc, cur, prefix); 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((ns != NULL) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible) { 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!already_rendered) { 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListInsert(list, ns); 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlStrlen(ns->prefix) == 0) { 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = 1; 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add node namespace */ 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(cur->ns != NULL) { 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = cur->ns; 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlSearchNs(cur->doc, cur, NULL); 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_visibly_utilized_empty_ns = 1; 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((ns != NULL) && !xmlC14NIsXmlNs(ns)) { 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible && xmlC14NIsVisible(ctx, ns, cur)) { 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, ns, ctx)) { 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListInsert(list, ns); 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlStrlen(ns->prefix) == 0) { 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = 1; 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* add attributes */ 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(attr = cur->properties; attr != NULL; attr = attr->next) { 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we need to check that attribute is visible and has non 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * default namespace (XML Namespaces: "default namespaces 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * do not apply directly to attributes") 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((attr->ns != NULL) && !xmlC14NIsXmlNs(attr->ns) && xmlC14NIsVisible(ctx, attr, cur)) { 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, attr->ns, ctx); 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackAdd(ctx->ns_rendered, attr->ns, cur); 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!already_rendered && visible) { 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListInsert(list, attr->ns); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(xmlStrlen(attr->ns->prefix) == 0) { 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_empty_ns = 1; 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if((attr->ns != NULL) && (xmlStrlen(attr->ns->prefix) == 0) && (xmlStrlen(attr->ns->href) == 0)) { 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_visibly_utilized_empty_ns = 1; 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process xmlns="" 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible && has_visibly_utilized_empty_ns && 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project !has_empty_ns && !has_empty_ns_in_inclusive_list) { 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static xmlNs ns_default; 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&ns_default, 0, sizeof(ns_default)); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default, ctx); 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!already_rendered) { 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NPrintNamespaces(&ns_default, ctx); 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if(visible && !has_empty_ns && has_empty_ns_in_inclusive_list) { 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static xmlNs ns_default; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&ns_default, 0, sizeof(ns_default)); 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NPrintNamespaces(&ns_default, ctx); 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * print out all elements from list 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListDelete(list); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 851df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlC14NIsXmlAttr: 852df143a5041f03a22808b59c76698770b74692815Selim Gurun * @attr: the attr to check 853df143a5041f03a22808b59c76698770b74692815Selim Gurun * 854df143a5041f03a22808b59c76698770b74692815Selim Gurun * Checks whether the given attribute is a default "xml:" namespace 855df143a5041f03a22808b59c76698770b74692815Selim Gurun * with href="http://www.w3.org/XML/1998/namespace" 856df143a5041f03a22808b59c76698770b74692815Selim Gurun * 857df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if the node is default or 0 otherwise 858df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 859df143a5041f03a22808b59c76698770b74692815Selim Gurun 860df143a5041f03a22808b59c76698770b74692815Selim Gurun/* todo: make it a define? */ 861df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 862df143a5041f03a22808b59c76698770b74692815Selim GurunxmlC14NIsXmlAttr(xmlAttrPtr attr) 863df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 864df143a5041f03a22808b59c76698770b74692815Selim Gurun return ((attr->ns != NULL) && 865df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlC14NIsXmlNs(attr->ns) != 0)); 866df143a5041f03a22808b59c76698770b74692815Selim Gurun} 867df143a5041f03a22808b59c76698770b74692815Selim Gurun 868df143a5041f03a22808b59c76698770b74692815Selim Gurun 869df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NAttrsCompare: 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr1: the pointer tls o first attr 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr2: the pointer to second attr 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints the given attribute to the output buffer from C14N context. 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if attr1 < attr2, 0 if attr1 == attr2 or 1 if attr1 > attr2. 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NAttrsCompare(xmlAttrPtr attr1, xmlAttrPtr attr2) 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Simple cases 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 == attr2) 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 == NULL) 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr2 == NULL) 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1->ns == attr2->ns) { 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStrcmp(attr1->name, attr2->name)); 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attributes in the default namespace are first 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * because the default namespace is not applied to 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * unqualified attributes 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1->ns == NULL) 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr2->ns == NULL) 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1->ns->prefix == NULL) 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr2->ns->prefix == NULL) 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcmp(attr1->ns->href, attr2->ns->href); 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcmp(attr1->name, attr2->name); 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NPrintAttrs: 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the pointer to attr 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints out canonical attribute urrent node to the 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer from C14N context as follows 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 on success or 0 on fail. 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NPrintAttrs(const xmlAttrPtr attr, xmlC14NCtxPtr ctx) 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr == NULL) || (ctx == NULL)) { 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("writing attributes"); 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, " "); 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->ns != NULL && xmlStrlen(attr->ns->prefix) > 0) { 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) attr->ns->prefix); 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, ":"); 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) attr->name); 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "=\""); 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 950df143a5041f03a22808b59c76698770b74692815Selim Gurun value = xmlNodeListGetString(ctx->doc, attr->children, 1); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* todo: should we log an error if value==NULL ? */ 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value != NULL) { 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = xmlC11NNormalizeAttr(value); 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer != NULL) { 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) buffer); 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("normalizing attributes axis"); 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "\""); 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 968df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlC14NFindHiddenParentAttr: 969df143a5041f03a22808b59c76698770b74692815Selim Gurun * 970df143a5041f03a22808b59c76698770b74692815Selim Gurun * Finds an attribute in a hidden parent node. 971df143a5041f03a22808b59c76698770b74692815Selim Gurun * 972df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns a pointer to the attribute node (if found) or NULL otherwise. 973df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 974df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic xmlAttrPtr 975df143a5041f03a22808b59c76698770b74692815Selim GurunxmlC14NFindHiddenParentAttr(xmlC14NCtxPtr ctx, xmlNodePtr cur, const xmlChar * name, const xmlChar * ns) 976df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 977df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr res; 978df143a5041f03a22808b59c76698770b74692815Selim Gurun while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) { 979df143a5041f03a22808b59c76698770b74692815Selim Gurun res = xmlHasNsProp(cur, name, ns); 980df143a5041f03a22808b59c76698770b74692815Selim Gurun if(res != NULL) { 981df143a5041f03a22808b59c76698770b74692815Selim Gurun return res; 982df143a5041f03a22808b59c76698770b74692815Selim Gurun } 983df143a5041f03a22808b59c76698770b74692815Selim Gurun 984df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->parent; 985df143a5041f03a22808b59c76698770b74692815Selim Gurun } 986df143a5041f03a22808b59c76698770b74692815Selim Gurun 987df143a5041f03a22808b59c76698770b74692815Selim Gurun return NULL; 988df143a5041f03a22808b59c76698770b74692815Selim Gurun} 989df143a5041f03a22808b59c76698770b74692815Selim Gurun 990df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 991df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlC14NFixupBaseAttr: 992df143a5041f03a22808b59c76698770b74692815Selim Gurun * 993df143a5041f03a22808b59c76698770b74692815Selim Gurun * Fixes up the xml:base attribute 994df143a5041f03a22808b59c76698770b74692815Selim Gurun * 995df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the newly created attribute or NULL 996df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 997df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic xmlAttrPtr 998df143a5041f03a22808b59c76698770b74692815Selim GurunxmlC14NFixupBaseAttr(xmlC14NCtxPtr ctx, xmlAttrPtr xml_base_attr) 999df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 1000df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar * res = NULL; 1001df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNodePtr cur; 1002df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr attr; 1003df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar * tmp_str; 1004df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar * tmp_str2; 1005df143a5041f03a22808b59c76698770b74692815Selim Gurun int tmp_str_len; 1006df143a5041f03a22808b59c76698770b74692815Selim Gurun 1007df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctx == NULL) || (xml_base_attr == NULL) || (xml_base_attr->parent == NULL)) { 1008df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrParam("processing xml:base attribute"); 1009df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1010df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1011df143a5041f03a22808b59c76698770b74692815Selim Gurun 1012df143a5041f03a22808b59c76698770b74692815Selim Gurun /* start from current value */ 1013df143a5041f03a22808b59c76698770b74692815Selim Gurun res = xmlNodeListGetString(ctx->doc, xml_base_attr->children, 1); 1014df143a5041f03a22808b59c76698770b74692815Selim Gurun if(res == NULL) { 1015df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrInternal("processing xml:base attribute - can't get attr value"); 1016df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1017df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1018df143a5041f03a22808b59c76698770b74692815Selim Gurun 1019df143a5041f03a22808b59c76698770b74692815Selim Gurun /* go up the stack until we find a node that we rendered already */ 1020df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = xml_base_attr->parent->parent; 1021df143a5041f03a22808b59c76698770b74692815Selim Gurun while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) { 1022df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = xmlHasNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); 1023df143a5041f03a22808b59c76698770b74692815Selim Gurun if(attr != NULL) { 1024df143a5041f03a22808b59c76698770b74692815Selim Gurun /* get attr value */ 1025df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp_str = xmlNodeListGetString(ctx->doc, attr->children, 1); 1026df143a5041f03a22808b59c76698770b74692815Selim Gurun if(tmp_str == NULL) { 1027df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1028df143a5041f03a22808b59c76698770b74692815Selim Gurun 1029df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrInternal("processing xml:base attribute - can't get attr value"); 1030df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1031df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1032df143a5041f03a22808b59c76698770b74692815Selim Gurun 1033df143a5041f03a22808b59c76698770b74692815Selim Gurun /* we need to add '/' if our current base uri ends with '..' or '.' 1034df143a5041f03a22808b59c76698770b74692815Selim Gurun to ensure that we are forced to go "up" all the time */ 1035df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp_str_len = xmlStrlen(tmp_str); 1036df143a5041f03a22808b59c76698770b74692815Selim Gurun if(tmp_str_len > 1 && tmp_str[tmp_str_len - 2] == '.') { 1037df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp_str2 = xmlStrcat(tmp_str, BAD_CAST "/"); 1038df143a5041f03a22808b59c76698770b74692815Selim Gurun if(tmp_str2 == NULL) { 1039df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(tmp_str); 1040df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1041df143a5041f03a22808b59c76698770b74692815Selim Gurun 1042df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrInternal("processing xml:base attribute - can't modify uri"); 1043df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1044df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1045df143a5041f03a22808b59c76698770b74692815Selim Gurun 1046df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp_str = tmp_str2; 1047df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1048df143a5041f03a22808b59c76698770b74692815Selim Gurun 1049df143a5041f03a22808b59c76698770b74692815Selim Gurun /* build uri */ 1050df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp_str2 = xmlBuildURI(res, tmp_str); 1051df143a5041f03a22808b59c76698770b74692815Selim Gurun if(tmp_str2 == NULL) { 1052df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(tmp_str); 1053df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1054df143a5041f03a22808b59c76698770b74692815Selim Gurun 1055df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrInternal("processing xml:base attribute - can't construct uri"); 1056df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1057df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1058df143a5041f03a22808b59c76698770b74692815Selim Gurun 1059df143a5041f03a22808b59c76698770b74692815Selim Gurun /* cleanup and set the new res */ 1060df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(tmp_str); 1061df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1062df143a5041f03a22808b59c76698770b74692815Selim Gurun res = tmp_str2; 1063df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1064df143a5041f03a22808b59c76698770b74692815Selim Gurun 1065df143a5041f03a22808b59c76698770b74692815Selim Gurun /* next */ 1066df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = cur->parent; 1067df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1068df143a5041f03a22808b59c76698770b74692815Selim Gurun 1069df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check if result uri is empty or not */ 1070df143a5041f03a22808b59c76698770b74692815Selim Gurun if((res == NULL) || xmlStrEqual(res, BAD_CAST "")) { 1071df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1072df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1073df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1074df143a5041f03a22808b59c76698770b74692815Selim Gurun 1075df143a5041f03a22808b59c76698770b74692815Selim Gurun /* create and return the new attribute node */ 1076df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = xmlNewNsProp(NULL, xml_base_attr->ns, BAD_CAST "base", res); 1077df143a5041f03a22808b59c76698770b74692815Selim Gurun if(attr == NULL) { 1078df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1079df143a5041f03a22808b59c76698770b74692815Selim Gurun 1080df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrInternal("processing xml:base attribute - can't construct attribute"); 1081df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 1082df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1083df143a5041f03a22808b59c76698770b74692815Selim Gurun 1084df143a5041f03a22808b59c76698770b74692815Selim Gurun /* done */ 1085df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(res); 1086df143a5041f03a22808b59c76698770b74692815Selim Gurun return (attr); 1087df143a5041f03a22808b59c76698770b74692815Selim Gurun} 1088df143a5041f03a22808b59c76698770b74692815Selim Gurun 1089df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NProcessAttrsAxis: 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent_visible: the visibility of parent node 1094df143a5041f03a22808b59c76698770b74692815Selim Gurun * @all_parents_visible: the visibility of all parent nodes 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Prints out canonical attribute axis of the current node to the 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer from C14N context as follows 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute Axis 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In lexicographic order (ascending), process each node that 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is in the element's attribute axis and in the node-set. 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The processing of an element node E MUST be modified slightly 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when an XPath node-set is given as input and the element's 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent is omitted from the node-set. 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML applied to a document subset requires the search of the 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestor nodes of each orphan element node for attributes in the xml 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace, such as xml:lang and xml:space. These are copied into the 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element node except if a declaration of the same attribute is already 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the attribute axis of the element (whether or not it is included in 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the document subset). This search and copying are omitted from the 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Exclusive XML Canonicalization method. 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success or -1 on fail. 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible) 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 1126df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListPtr list; 1127df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr attrs_to_delete = NULL; 1128df143a5041f03a22808b59c76698770b74692815Selim Gurun 1129df143a5041f03a22808b59c76698770b74692815Selim Gurun /* special processing for 1.1 spec */ 1130df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr xml_base_attr = NULL; 1131df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr xml_lang_attr = NULL; 1132df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAttrPtr xml_space_attr = NULL; 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing attributes axis"); 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a sorted list to store element attributes 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NAttrsCompare); 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) { 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("creating attributes list"); 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1148df143a5041f03a22808b59c76698770b74692815Selim Gurun switch(ctx->mode) { 1149df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_1_0: 1150df143a5041f03a22808b59c76698770b74692815Selim Gurun /* The processing of an element node E MUST be modified slightly when an XPath node-set is 1151df143a5041f03a22808b59c76698770b74692815Selim Gurun * given as input and the element's parent is omitted from the node-set. The method for processing 1152df143a5041f03a22808b59c76698770b74692815Selim Gurun * the attribute axis of an element E in the node-set is enhanced. All element nodes along E's 1153df143a5041f03a22808b59c76698770b74692815Selim Gurun * ancestor axis are examined for nearest occurrences of attributes in the xml namespace, such 1154df143a5041f03a22808b59c76698770b74692815Selim Gurun * as xml:lang and xml:space (whether or not they are in the node-set). From this list of attributes, 1155df143a5041f03a22808b59c76698770b74692815Selim Gurun * remove any that are in E's attribute axis (whether or not they are in the node-set). Then, 1156df143a5041f03a22808b59c76698770b74692815Selim Gurun * lexicographically merge this attribute list with the nodes of E's attribute axis that are in 1157df143a5041f03a22808b59c76698770b74692815Selim Gurun * the node-set. The result of visiting the attribute axis is computed by processing the attribute 1158df143a5041f03a22808b59c76698770b74692815Selim Gurun * nodes in this merged attribute list. 1159df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1160df143a5041f03a22808b59c76698770b74692815Selim Gurun 1161df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1162df143a5041f03a22808b59c76698770b74692815Selim Gurun * Add all visible attributes from current node. 1163df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1164df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = cur->properties; 1165df143a5041f03a22808b59c76698770b74692815Selim Gurun while (attr != NULL) { 1166df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check that attribute is visible */ 1167df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlC14NIsVisible(ctx, attr, cur)) { 1168df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, attr); 1169df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1170df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = attr->next; 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1173df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1174df143a5041f03a22808b59c76698770b74692815Selim Gurun * Handle xml attributes 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1176df143a5041f03a22808b59c76698770b74692815Selim Gurun if (parent_visible && (cur->parent != NULL) && 1177df143a5041f03a22808b59c76698770b74692815Selim Gurun (!xmlC14NIsVisible(ctx, cur->parent, cur->parent->parent))) 1178df143a5041f03a22808b59c76698770b74692815Selim Gurun { 1179df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNodePtr tmp; 1180df143a5041f03a22808b59c76698770b74692815Selim Gurun 1181df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1182df143a5041f03a22808b59c76698770b74692815Selim Gurun * If XPath node-set is not specified then the parent is always 1183df143a5041f03a22808b59c76698770b74692815Selim Gurun * visible! 1184df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1185df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = cur->parent; 1186df143a5041f03a22808b59c76698770b74692815Selim Gurun while (tmp != NULL) { 1187df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = tmp->properties; 1188df143a5041f03a22808b59c76698770b74692815Selim Gurun while (attr != NULL) { 1189df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlC14NIsXmlAttr(attr) != 0) { 1190df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlListSearch(list, attr) == NULL) { 1191df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, attr); 1192df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1194df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = attr->next; 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1196df143a5041f03a22808b59c76698770b74692815Selim Gurun tmp = tmp->parent; 1197df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1198df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1199df143a5041f03a22808b59c76698770b74692815Selim Gurun 1200df143a5041f03a22808b59c76698770b74692815Selim Gurun /* done */ 1201df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1202df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_EXCLUSIVE_1_0: 1203df143a5041f03a22808b59c76698770b74692815Selim Gurun /* attributes in the XML namespace, such as xml:lang and xml:space 1204df143a5041f03a22808b59c76698770b74692815Selim Gurun * are not imported into orphan nodes of the document subset 1205df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1206df143a5041f03a22808b59c76698770b74692815Selim Gurun 1207df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1208df143a5041f03a22808b59c76698770b74692815Selim Gurun * Add all visible attributes from current node. 1209df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1210df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = cur->properties; 1211df143a5041f03a22808b59c76698770b74692815Selim Gurun while (attr != NULL) { 1212df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check that attribute is visible */ 1213df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlC14NIsVisible(ctx, attr, cur)) { 1214df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, attr); 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1216df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = attr->next; 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1218df143a5041f03a22808b59c76698770b74692815Selim Gurun 1219df143a5041f03a22808b59c76698770b74692815Selim Gurun /* do nothing special for xml attributes */ 1220df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1221df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_1_1: 1222df143a5041f03a22808b59c76698770b74692815Selim Gurun /* The processing of an element node E MUST be modified slightly when an XPath node-set is 1223df143a5041f03a22808b59c76698770b74692815Selim Gurun * given as input and some of the element's ancestors are omitted from the node-set. 1224df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1225df143a5041f03a22808b59c76698770b74692815Selim Gurun * Simple inheritable attributes are attributes that have a value that requires at most a simple 1226df143a5041f03a22808b59c76698770b74692815Selim Gurun * redeclaration. This redeclaration is done by supplying a new value in the child axis. The 1227df143a5041f03a22808b59c76698770b74692815Selim Gurun * redeclaration of a simple inheritable attribute A contained in one of E's ancestors is done 1228df143a5041f03a22808b59c76698770b74692815Selim Gurun * by supplying a value to an attribute Ae inside E with the same name. Simple inheritable attributes 1229df143a5041f03a22808b59c76698770b74692815Selim Gurun * are xml:lang and xml:space. 1230df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1231df143a5041f03a22808b59c76698770b74692815Selim Gurun * The method for processing the attribute axis of an element E in the node-set is hence enhanced. 1232df143a5041f03a22808b59c76698770b74692815Selim Gurun * All element nodes along E's ancestor axis are examined for the nearest occurrences of simple 1233df143a5041f03a22808b59c76698770b74692815Selim Gurun * inheritable attributes in the xml namespace, such as xml:lang and xml:space (whether or not they 1234df143a5041f03a22808b59c76698770b74692815Selim Gurun * are in the node-set). From this list of attributes, any simple inheritable attributes that are 1235df143a5041f03a22808b59c76698770b74692815Selim Gurun * already in E's attribute axis (whether or not they are in the node-set) are removed. Then, 1236df143a5041f03a22808b59c76698770b74692815Selim Gurun * lexicographically merge this attribute list with the nodes of E's attribute axis that are in 1237df143a5041f03a22808b59c76698770b74692815Selim Gurun * the node-set. The result of visiting the attribute axis is computed by processing the attribute 1238df143a5041f03a22808b59c76698770b74692815Selim Gurun * nodes in this merged attribute list. 1239df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1240df143a5041f03a22808b59c76698770b74692815Selim Gurun * The xml:id attribute is not a simple inheritable attribute and no processing of these attributes is 1241df143a5041f03a22808b59c76698770b74692815Selim Gurun * performed. 1242df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1243df143a5041f03a22808b59c76698770b74692815Selim Gurun * The xml:base attribute is not a simple inheritable attribute and requires special processing beyond 1244df143a5041f03a22808b59c76698770b74692815Selim Gurun * a simple redeclaration. 1245df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1246df143a5041f03a22808b59c76698770b74692815Selim Gurun * Attributes in the XML namespace other than xml:base, xml:id, xml:lang, and xml:space MUST be processed 1247df143a5041f03a22808b59c76698770b74692815Selim Gurun * as ordinary attributes. 1248df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1249df143a5041f03a22808b59c76698770b74692815Selim Gurun 1250df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1251df143a5041f03a22808b59c76698770b74692815Selim Gurun * Add all visible attributes from current node. 1252df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1253df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = cur->properties; 1254df143a5041f03a22808b59c76698770b74692815Selim Gurun while (attr != NULL) { 1255df143a5041f03a22808b59c76698770b74692815Selim Gurun /* special processing for XML attribute kiks in only when we have invisible parents */ 1256df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((!parent_visible) || (xmlC14NIsXmlAttr(attr) == 0)) { 1257df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check that attribute is visible */ 1258df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlC14NIsVisible(ctx, attr, cur)) { 1259df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, attr); 1260df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1261df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 1262df143a5041f03a22808b59c76698770b74692815Selim Gurun int matched = 0; 1263df143a5041f03a22808b59c76698770b74692815Selim Gurun 1264df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check for simple inheritance attributes */ 1265df143a5041f03a22808b59c76698770b74692815Selim Gurun if((!matched) && (xml_lang_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "lang")) { 1266df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_lang_attr = attr; 1267df143a5041f03a22808b59c76698770b74692815Selim Gurun matched = 1; 1268df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1269df143a5041f03a22808b59c76698770b74692815Selim Gurun if((!matched) && (xml_space_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "space")) { 1270df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_space_attr = attr; 1271df143a5041f03a22808b59c76698770b74692815Selim Gurun matched = 1; 1272df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1273df143a5041f03a22808b59c76698770b74692815Selim Gurun 1274df143a5041f03a22808b59c76698770b74692815Selim Gurun /* check for base attr */ 1275df143a5041f03a22808b59c76698770b74692815Selim Gurun if((!matched) && (xml_base_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "base")) { 1276df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_base_attr = attr; 1277df143a5041f03a22808b59c76698770b74692815Selim Gurun matched = 1; 1278df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1279df143a5041f03a22808b59c76698770b74692815Selim Gurun 1280df143a5041f03a22808b59c76698770b74692815Selim Gurun /* otherwise, it is a normal attribute, so just check if it is visible */ 1281df143a5041f03a22808b59c76698770b74692815Selim Gurun if((!matched) && xmlC14NIsVisible(ctx, attr, cur)) { 1282df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, attr); 1283df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1284df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1285df143a5041f03a22808b59c76698770b74692815Selim Gurun 1286df143a5041f03a22808b59c76698770b74692815Selim Gurun /* move to the next one */ 1287df143a5041f03a22808b59c76698770b74692815Selim Gurun attr = attr->next; 1288df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1289df143a5041f03a22808b59c76698770b74692815Selim Gurun 1290df143a5041f03a22808b59c76698770b74692815Selim Gurun /* special processing for XML attribute kiks in only when we have invisible parents */ 1291df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((parent_visible)) { 1292df143a5041f03a22808b59c76698770b74692815Selim Gurun 1293df143a5041f03a22808b59c76698770b74692815Selim Gurun /* simple inheritance attributes - copy */ 1294df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_lang_attr == NULL) { 1295df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_lang_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "lang", XML_XML_NAMESPACE); 1296df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1297df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_lang_attr != NULL) { 1298df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, xml_lang_attr); 1299df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1300df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_space_attr == NULL) { 1301df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_space_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "space", XML_XML_NAMESPACE); 1302df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1303df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_space_attr != NULL) { 1304df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, xml_space_attr); 1305df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1306df143a5041f03a22808b59c76698770b74692815Selim Gurun 1307df143a5041f03a22808b59c76698770b74692815Selim Gurun /* base uri attribute - fix up */ 1308df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_base_attr == NULL) { 1309df143a5041f03a22808b59c76698770b74692815Selim Gurun /* if we don't have base uri attribute, check if we have a "hidden" one above */ 1310df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_base_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "base", XML_XML_NAMESPACE); 1311df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1312df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_base_attr != NULL) { 1313df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_base_attr = xmlC14NFixupBaseAttr(ctx, xml_base_attr); 1314df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xml_base_attr != NULL) { 1315df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlListInsert(list, xml_base_attr); 1316df143a5041f03a22808b59c76698770b74692815Selim Gurun 1317df143a5041f03a22808b59c76698770b74692815Selim Gurun /* note that we MUST delete returned attr node ourselves! */ 1318df143a5041f03a22808b59c76698770b74692815Selim Gurun xml_base_attr->next = attrs_to_delete; 1319df143a5041f03a22808b59c76698770b74692815Selim Gurun attrs_to_delete = xml_base_attr; 1320df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1321df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1322df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1323df143a5041f03a22808b59c76698770b74692815Selim Gurun 1324df143a5041f03a22808b59c76698770b74692815Selim Gurun /* done */ 1325df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * print out all elements from list 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListWalk(list, (xmlListWalker) xmlC14NPrintAttrs, (const void *) ctx); 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1336df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFreePropList(attrs_to_delete); 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlListDelete(list); 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NCheckForRelativeNamespaces: 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the C14N context 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current element node 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks that current element node has no relative namespaces defined 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the node has no relative namespaces or -1 otherwise. 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NCheckForRelativeNamespaces(xmlC14NCtxPtr ctx, xmlNodePtr cur) 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("checking for relative namespaces"); 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = cur->nsDef; 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ns != NULL) { 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrlen(ns->href) > 0) { 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlURIPtr uri; 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uri = xmlParseURI((const char *) ns->href); 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri == NULL) { 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("parsing namespace uri"); 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrlen((const xmlChar *) uri->scheme) == 0) { 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrRelativeNamespace(uri->scheme); 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "urn") != 0) 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "dav") !=0) 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrlen((const xmlChar *) uri->server) == 0)) { 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrRelativeNamespace(uri->scheme); 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeURI(uri); 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ns->next; 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NProcessElementNode: 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the pointer to C14N context object 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the node to process 1393df143a5041f03a22808b59c76698770b74692815Selim Gurun * @visible: this node is visible 1394df143a5041f03a22808b59c76698770b74692815Selim Gurun * @all_parents_visible: whether all the parents of this node are visible 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Element Nodes 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the element is not in the node-set, then the result is obtained 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by processing the namespace axis, then the attribute axis, then 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing the child nodes of the element that are in the node-set 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (in document order). If the element is in the node-set, then the result 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is an open angle bracket (<), the element QName, the result of 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing the namespace axis, the result of processing the attribute 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis, a close angle bracket (>), the result of processing the child 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nodes of the element that are in the node-set (in document order), an 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * open angle bracket, a forward slash (/), the element QName, and a close 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * angle bracket. 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns non-negative value on success or negative value on fail 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NProcessElementNode(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStack state; 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int parent_is_doc = 0; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing element node"); 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check relative relative namespaces: 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementations of XML canonicalization MUST report an operation 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * failure on documents containing relative namespace URIs. 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlC14NCheckForRelativeNamespaces(ctx, cur) < 0) { 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("checking for relative namespaces"); 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Save ns_rendered stack position 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(&state, 0, sizeof(state)); 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackSave(ctx->ns_rendered, &state); 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (visible) { 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->parent_is_doc) { 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* save this flag into the stack */ 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project parent_is_doc = ctx->parent_is_doc; 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->parent_is_doc = 0; 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->pos = XMLC14N_INSIDE_DOCUMENT_ELEMENT; 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "<"); 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) cur->ns->prefix); 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, ":"); 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1458df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!xmlC14NIsExclusive(ctx)) { 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessNamespacesAxis(ctx, cur, visible); 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExcC14NProcessNamespacesAxis(ctx, cur, visible); 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("processing namespaces axis"); 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* todo: shouldn't this go to "visible only"? */ 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(visible) { 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackShift(ctx->ns_rendered); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessAttrsAxis(ctx, cur, visible); 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("processing attributes axis"); 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (visible) { 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, ">"); 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessNodeList(ctx, cur->children); 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("processing childrens list"); 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (visible) { 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "</"); 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) cur->ns->prefix); 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, ":"); 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, ">"); 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (parent_is_doc) { 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* restore this flag from the stack for next node */ 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->parent_is_doc = parent_is_doc; 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->pos = XMLC14N_AFTER_DOCUMENT_ELEMENT; 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Restore ns_rendered stack position 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackRestore(ctx->ns_rendered, &state); 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NProcessNode: 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the pointer to C14N context object 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the node to process 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Processes the given node 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns non-negative value on success or negative value on fail 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur) 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int visible; 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (cur == NULL)) { 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing node"); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project visible = xmlC14NIsVisible(ctx, cur, cur->parent); 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessElementNode(ctx, cur, visible); 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Text Nodes 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the string value, except all ampersands are replaced 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by &, all open angle brackets (<) are replaced by <, all closing 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * angle brackets (>) are replaced by >, and all #xD characters are 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * replaced by 
. 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* cdata sections are processed as text nodes */ 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* todo: verify that cdata sections are included in XPath nodes set */ 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((visible) && (cur->content != NULL)) { 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = xmlC11NNormalizeText(cur->content); 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer != NULL) { 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) buffer); 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("normalizing text node"); 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Processing Instruction (PI) Nodes- 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The opening PI symbol (<?), the PI target name of the node, 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a leading space and the string value if it is not empty, and 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the closing PI symbol (?>). If the string value is empty, 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the leading space is not added. Also, a trailing #xA is 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * rendered after the closing PI symbol for PI children of the 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * root node with a lesser document order than the document 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element, and a leading #xA is rendered before the opening PI 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * symbol of PI children of the root node with a greater document 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order than the document element. 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (visible) { 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "\x0A<?"); 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "<?"); 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) cur->name); 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->content != NULL) && (*(cur->content) != '\0')) { 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, " "); 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* todo: do we need to normalize pi? */ 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = xmlC11NNormalizePI(cur->content); 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer != NULL) { 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) buffer); 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("normalizing pi node"); 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) { 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "?>\x0A"); 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "?>"); 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Comment Nodes 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Nothing if generating canonical XML without comments. For 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonical XML with comments, generate the opening comment 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * symbol (<!--), the string value of the node, and the 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * closing comment symbol (-->). Also, a trailing #xA is rendered 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * after the closing comment symbol for comment children of the 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * root node with a lesser document order than the document 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element, and a leading #xA is rendered before the opening 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comment symbol of comment children of the root node with a 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * greater document order than the document element. (Comment 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * children of the root node represent comments outside of the 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * top-level document element and outside of the document type 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration). 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (visible && ctx->with_comments) { 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "\x0A<!--"); 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "<!--"); 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* todo: do we need to normalize comment? */ 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = xmlC11NNormalizeComment(cur->content); 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer != NULL) { 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) buffer); 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("normalizing comment node"); 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) { 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "-->\x0A"); 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(ctx->buf, "-->"); 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: /* should be processed as document? */ 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: /* should be processed as document? */ 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTML_ENABLED 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: /* should be processed as document? */ 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->parent_is_doc = 1; 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessNodeList(ctx, cur->children); 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInvalidNode("XML_ATTRIBUTE_NODE", "processing node"); 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInvalidNode("XML_NAMESPACE_DECL", "processing node"); 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInvalidNode("XML_ENTITY_REF_NODE", "processing node"); 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInvalidNode("XML_ENTITY_NODE", "processing node"); 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XINCLUDE_ENABLED 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be ignored according to "W3C Canonical XML" 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrUnknownNode(cur->type, "processing node"); 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NProcessNodeList: 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the pointer to C14N context object 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the node to start from 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Processes all nodes in the row starting from cur. 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns non-negative value on success or negative value on fail 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur) 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) { 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("processing node list"); 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (ret = 0; cur != NULL && ret >= 0; cur = cur->next) { 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessNode(ctx, cur); 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NFreeCtx: 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the pointer to C14N context object 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanups the C14N context object. 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NFreeCtx(xmlC14NCtxPtr ctx) 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) { 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("freeing context"); 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx->ns_rendered != NULL) { 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NVisibleNsStackDestroy(ctx->ns_rendered); 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctx); 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NNewCtx: 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document for canonization 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @is_visible_callback:the function to use to determine is node visible 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or not 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data: the first parameter for @is_visible_callback function 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (in most cases, it is nodes set) 1756df143a5041f03a22808b59c76698770b74692815Selim Gurun * @mode: the c14n mode (see @xmlC14NMode) 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inclusive_ns_prefixe the list of inclusive namespace prefixes 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ended with a NULL or NULL if there is no 1759df143a5041f03a22808b59c76698770b74692815Selim Gurun * inclusive namespaces (only for ` 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonicalization) 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @with_comments: include comments in the result (!=0) or not (==0) 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the output buffer to store canonical XML; this 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer MUST have encoder==NULL because C14N requires 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 output 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates new C14N context object to store C14N parameters. 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns pointer to newly created object (success) or NULL (fail) 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlC14NCtxPtr 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NNewCtx(xmlDocPtr doc, 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NIsVisibleCallback is_visible_callback, void* user_data, 1773df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NMode mode, xmlChar ** inclusive_ns_prefixes, 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments, xmlOutputBufferPtr buf) 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NCtxPtr ctx = NULL; 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc == NULL) || (buf == NULL)) { 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("creating new context"); 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the encoding output buffer encoding 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf->encoder != NULL) { 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"xmlC14NNewCtx: output buffer encoder != NULL but C14N requires UTF8 output\n"); 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the XML document encoding value, if provided. 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->charset != XML_CHAR_ENCODING_UTF8) { 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlC14NNewCtx: source document not in UTF8\n"); 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new xmlC14NCtxPtr and fill the fields. 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx = (xmlC14NCtxPtr) xmlMalloc(sizeof(xmlC14NCtx)); 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) { 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("creating context"); 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ctx, 0, sizeof(xmlC14NCtx)); 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * initialize C14N context 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->doc = doc; 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->with_comments = with_comments; 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->is_visible_callback = is_visible_callback; 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->user_data = user_data; 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->buf = buf; 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->parent_is_doc = 1; 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->ns_rendered = xmlC14NVisibleNsStackCreate(); 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(ctx->ns_rendered == NULL) { 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_CREATE_STACK, 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlC14NNewCtx: xmlC14NVisibleNsStackCreate failed\n"); 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NFreeCtx(ctx); 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1831df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set "mode" flag and remember list of incluseve prefixes 1832df143a5041f03a22808b59c76698770b74692815Selim Gurun * for exclusive c14n 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1834df143a5041f03a22808b59c76698770b74692815Selim Gurun ctx->mode = mode; 1835df143a5041f03a22808b59c76698770b74692815Selim Gurun if(xmlC14NIsExclusive(ctx)) { 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx->inclusive_ns_prefixes = inclusive_ns_prefixes; 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctx); 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NExecute: 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document for canonization 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @is_visible_callback:the function to use to determine is node visible 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or not 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data: the first parameter for @is_visible_callback function 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (in most cases, it is nodes set) 1848df143a5041f03a22808b59c76698770b74692815Selim Gurun * @mode: the c14n mode (see @xmlC14NMode) 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inclusive_ns_prefixes: the list of inclusive namespace prefixes 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ended with a NULL or NULL if there is no 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inclusive namespaces (only for exclusive 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonicalization, ignored otherwise) 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @with_comments: include comments in the result (!=0) or not (==0) 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the output buffer to store canonical XML; this 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer MUST have encoder==NULL because C14N requires 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 output 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the canonized image of given XML document into the provided buffer. 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns non-negative value on success or a negative value on fail 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback, 1866df143a5041f03a22808b59c76698770b74692815Selim Gurun void* user_data, int mode, xmlChar **inclusive_ns_prefixes, 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments, xmlOutputBufferPtr buf) { 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NCtxPtr ctx; 1870df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NMode c14n_mode = XML_C14N_1_0; 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (doc == NULL)) { 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("executing c14n"); 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1878df143a5041f03a22808b59c76698770b74692815Selim Gurun /* for backward compatibility, we have to have "mode" as "int" 1879df143a5041f03a22808b59c76698770b74692815Selim Gurun and here we check that user gives valid value */ 1880df143a5041f03a22808b59c76698770b74692815Selim Gurun switch(mode) { 1881df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_1_0: 1882df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_EXCLUSIVE_1_0: 1883df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_C14N_1_1: 1884df143a5041f03a22808b59c76698770b74692815Selim Gurun c14n_mode = (xmlC14NMode)mode; 1885df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1886df143a5041f03a22808b59c76698770b74692815Selim Gurun default: 1887df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlC14NErrParam("invalid mode for executing c14n"); 1888df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 1889df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1890df143a5041f03a22808b59c76698770b74692815Selim Gurun 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the encoding output buffer encoding 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf->encoder != NULL) { 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"xmlC14NExecute: output buffer encoder != NULL but C14N requires UTF8 output\n"); 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctx = xmlC14NNewCtx(doc, is_visible_callback, user_data, 1901df143a5041f03a22808b59c76698770b74692815Selim Gurun c14n_mode, inclusive_ns_prefixes, 1902df143a5041f03a22808b59c76698770b74692815Selim Gurun with_comments, buf); 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctx == NULL) { 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_CREATE_CTXT, 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlC14NExecute: unable to create C14N context\n"); 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Root Node 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The root node is the parent of the top-level document element. The 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * result of processing each of its child nodes that is in the node-set 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order. The root node does not generate a byte order mark, 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML declaration, nor anything from within the document type 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration. 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->children != NULL) { 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlC14NProcessNodeList(ctx, doc->children); 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("processing docs children list"); 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NFreeCtx(ctx); 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Flush buffer to get number of bytes written 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferFlush(buf); 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("flushing output buffer"); 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NFreeCtx(ctx); 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NFreeCtx(ctx); 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NDocSaveTo: 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document for canonization 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: the nodes set to be included in the canonized image 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or NULL if all document nodes should be included 1950df143a5041f03a22808b59c76698770b74692815Selim Gurun * @mode: the c14n mode (see @xmlC14NMode) 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inclusive_ns_prefixes: the list of inclusive namespace prefixes 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ended with a NULL or NULL if there is no 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inclusive namespaces (only for exclusive 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonicalization, ignored otherwise) 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @with_comments: include comments in the result (!=0) or not (==0) 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the output buffer to store canonical XML; this 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffer MUST have encoder==NULL because C14N requires 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 output 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the canonized image of given XML document into the provided buffer. 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns non-negative value on success or a negative value on fail 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes, 1968df143a5041f03a22808b59c76698770b74692815Selim Gurun int mode, xmlChar ** inclusive_ns_prefixes, 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments, xmlOutputBufferPtr buf) { 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlC14NExecute(doc, 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlC14NIsVisibleCallback)xmlC14NIsNodeInNodeset, 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodes, 1973df143a5041f03a22808b59c76698770b74692815Selim Gurun mode, 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inclusive_ns_prefixes, 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project with_comments, 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf)); 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NDocDumpMemory: 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document for canonization 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: the nodes set to be included in the canonized image 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or NULL if all document nodes should be included 1985df143a5041f03a22808b59c76698770b74692815Selim Gurun * @mode: the c14n mode (see @xmlC14NMode) 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inclusive_ns_prefixes: the list of inclusive namespace prefixes 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ended with a NULL or NULL if there is no 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inclusive namespaces (only for exclusive 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonicalization, ignored otherwise) 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @with_comments: include comments in the result (!=0) or not (==0) 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc_txt_ptr: the memory pointer for allocated canonical XML text; 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller of this functions is responsible for calling 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFree() to free allocated memory 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the canonized image of given XML document into memory. 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written on success or a negative value on fail 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes, 2003df143a5041f03a22808b59c76698770b74692815Selim Gurun int mode, xmlChar ** inclusive_ns_prefixes, 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments, xmlChar ** doc_txt_ptr) 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc_txt_ptr == NULL) { 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("dumping doc to memory"); 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *doc_txt_ptr = NULL; 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create memory buffer with UTF8 (default) encoding 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlAllocOutputBuffer(NULL); 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("creating output buffer"); 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonize document and write to buffer 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2028df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project with_comments, buf); 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("saving doc to output buffer"); 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) xmlOutputBufferClose(buf); 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = buf->buffer->use; 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret > 0) { 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *doc_txt_ptr = xmlStrndup(buf->buffer->content, ret); 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) xmlOutputBufferClose(buf); 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*doc_txt_ptr == NULL) && (ret > 0)) { 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("coping canonicanized document"); 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC14NDocSave: 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document for canonization 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: the nodes set to be included in the canonized image 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or NULL if all document nodes should be included 2054df143a5041f03a22808b59c76698770b74692815Selim Gurun * @mode: the c14n mode (see @xmlC14NMode) 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inclusive_ns_prefixes: the list of inclusive namespace prefixes 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ended with a NULL or NULL if there is no 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inclusive namespaces (only for exclusive 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonicalization, ignored otherwise) 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @with_comments: include comments in the result (!=0) or not (==0) 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename to store canonical XML image 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compression: the compression level (zlib requred): 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -1 - libxml default, 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 - uncompressed, 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * >0 - compression level 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the canonized image of given XML document into the file. 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written success or a negative value on fail 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC14NDocSave(xmlDocPtr doc, xmlNodeSetPtr nodes, 2074df143a5041f03a22808b59c76698770b74692815Selim Gurun int mode, xmlChar ** inclusive_ns_prefixes, 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int with_comments, const char *filename, int compression) 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) { 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrParam("saving doc"); 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (compression < 0) 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project compression = xmlGetCompressMode(); 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * save the content to a temp buffer, use default UTF8 encoding. 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlOutputBufferCreateFilename(filename, NULL, compression); 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("creating temporary filename"); 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * canonize document and write to buffer 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2101df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project with_comments, buf); 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrInternal("cannicanize document to buffer"); 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) xmlOutputBufferClose(buf); 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * get the numbers of bytes written 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferClose(buf); 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro used to grow the current buffer. 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define growBufferReentrant() { \ 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer_size *= 2; \ 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) \ 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRealloc(buffer, buffer_size * sizeof(xmlChar)); \ 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { \ 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("growing buffer"); \ 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlC11NNormalizeString: 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: the input string 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mode: the normalization mode (attribute, comment, PI or text) 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to a canonical (normalized) format. The code is stolen 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from xmlEncodeEntitiesReentrant(). Added normalization of \x09, \x0a, \x0A 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and the @mode parameter 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a normalized string (caller is responsible for calling xmlFree()) 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or NULL if an error occurs 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlC11NNormalizeString(const xmlChar * input, 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NNormalizationMode mode) 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = input; 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer = NULL; 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *out = NULL; 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int buffer_size = 0; 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate an translation buffer. 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer_size = 1000; 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlC14NErrMemory("allocating buffer"); 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = buffer; 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != '\0') { 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((out - buffer) > (buffer_size - 10)) { 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBufferReentrant(); 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur == '<') && ((mode == XMLC14N_NORMALIZE_ATTR) || 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (mode == XMLC14N_NORMALIZE_TEXT))) { 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'l'; 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '>') && (mode == XMLC14N_NORMALIZE_TEXT)) { 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'g'; 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '&') && ((mode == XMLC14N_NORMALIZE_ATTR) || 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (mode == XMLC14N_NORMALIZE_TEXT))) { 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'a'; 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'm'; 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'p'; 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '"') && (mode == XMLC14N_NORMALIZE_ATTR)) { 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'q'; 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'u'; 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'o'; 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '\x09') && (mode == XMLC14N_NORMALIZE_ATTR)) { 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '#'; 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'x'; 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '9'; 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '\x0A') && (mode == XMLC14N_NORMALIZE_ATTR)) { 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '#'; 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'x'; 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'A'; 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*cur == '\x0D') && ((mode == XMLC14N_NORMALIZE_ATTR) || 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (mode == XMLC14N_NORMALIZE_TEXT) || 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (mode == XMLC14N_NORMALIZE_COMMENT) || 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (mode == XMLC14N_NORMALIZE_PI))) { 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '#'; 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'x'; 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'D'; 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Works because on UTF-8, all extended sequences cannot 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * result in bytes in the ASCII range. 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = *cur; 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2229df143a5041f03a22808b59c76698770b74692815Selim Gurun *out = 0; 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (buffer); 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_c14n 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_C14N_ENABLED */ 2236