1 /*************************************************************************/ 2 /* module: The XML Encoder source file */ 3 /* file: xltencxml.c */ 4 /* target system: All */ 5 /* target OS: All */ 6 /*************************************************************************/ 7 8 /* 9 * Copyright Notice 10 * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication 11 * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., 12 * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). 13 * All Rights Reserved. 14 * Implementation of all or part of any Specification may require 15 * licenses under third party intellectual property rights, 16 * including without limitation, patent rights (such a third party 17 * may or may not be a Supporter). The Sponsors of the Specification 18 * are not responsible and shall not be held responsible in any 19 * manner for identifying or failing to identify any or all such 20 * third party intellectual property rights. 21 * 22 * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED 23 * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, 24 * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, 25 * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML 26 * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING 27 * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION 28 * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF 29 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT 30 * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., 31 * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY 32 * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF 33 * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF 34 * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, 35 * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH 36 * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED 37 * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. 38 * 39 * The above notice and this paragraph must be included on all copies 40 * of this document that are made. 41 * 42 */ 43 44 45 #include <define.h> 46 #ifdef __SML_XML__ 47 /*************************************************************************/ 48 /* Definitions */ 49 /*************************************************************************/ 50 51 #include "xltencxml.h" 52 #include <libstr.h> 53 #include "xlttags.h" 54 #include <libmem.h> 55 56 /** 57 * FUNCTION: xmlGenerateTag 58 * 59 * Generates a XML tag 60 * 61 * PRE-Condition: valid parameters 62 * 63 * POST-Condition: the XML tag is written to the XML buffer 64 * 65 * IN: tagId, the ID for the tag to generate (TN_ADD, ...) 66 * tagType, the tag type (e.g. Begin Tag -> TT_BEG, ...) 67 * attFlag, indicates if the encoded tag contain Attributes in namespace extensions 68 * 69 * IN/OUT: pBufMgr, pointer to a structure containing buffer management elements 70 * 71 * RETURN: shows error codes of function, 72 * 0, if OK 73 */ 74 Ret_t xmlGenerateTag(XltTagID_t tagId, XltTagType_t tagType, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) 75 { 76 Ret_t _err; 77 78 MemByte_t _begpar = XML_BEGPAR; 79 MemByte_t _tagdel = XML_TAGDEL; 80 MemByte_t _endpar = XML_ENDPAR; 81 MemByte_t _nstagstart[] = XML_NSSTART; 82 MemByte_t _nstagend[] = XML_NSEND; 83 84 85 String_t _tagstr; 86 String_t _tagnsattr = NULL; 87 88 if ((_tagstr = (String_t)smlLibMalloc(XML_MAX_TAGLEN)) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; 89 90 if ((_err = getTagString(tagId, _tagstr, attFlag)) != SML_ERR_OK) { 91 smlLibFree(_tagstr); 92 return _err; 93 } 94 95 if (!_tagstr) { // check again as _tagstr might be alterd in getTagString 96 smlLibFree(_tagstr); 97 return SML_ERR_XLT_INVAL_TAG_TYPE; 98 } 99 100 /* the <SyncML> tag _must_ have an xmlns attribute */ 101 if (attFlag != pBufMgr->smlActiveExt || tagId == TN_SYNCML) { 102 // %%% luz:2003-07-31: now uses namespace from table according to version 103 if (getExtName(attFlag, &_tagnsattr, pBufMgr->vers) != SML_ERR_OK) { 104 smlLibFree(_tagstr); 105 return SML_ERR_XLT_INVAL_TAG_TYPE; 106 } 107 } 108 pBufMgr->smlActiveExt = attFlag; 109 //check if content byte has to be added to the tag 110 switch (tagType) 111 { 112 // set the end tag 113 case TT_END: 114 { 115 if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; 116 if ((_err = xltAddToBuffer((MemPtr_t)(&_tagdel), 1, pBufMgr)) != SML_ERR_OK) break; 117 if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; 118 if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; 119 if (tagId == pBufMgr->switchExtTag) { 120 pBufMgr->smlActiveExt = pBufMgr->smlLastExt; 121 pBufMgr->smlCurExt = pBufMgr->smlLastExt; 122 pBufMgr->smlLastExt = attFlag; 123 } 124 // just forget the stored number ob bytes for this end-tag since written now 125 pBufMgr->endTagSize -= (3 + smlLibStrlen(_tagstr)); 126 break; 127 } 128 //Empty tag 129 case TT_ALL: 130 { 131 if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; 132 if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; 133 if (_tagnsattr) { 134 if ((_err = xltAddToBuffer((MemPtr_t)(&_nstagstart), 8, pBufMgr)) != SML_ERR_OK) break; 135 if ((_err = xltAddToBuffer((MemPtr_t)_tagnsattr, smlLibStrlen(_tagnsattr), pBufMgr)) != SML_ERR_OK) break; 136 if ((_err = xltAddToBuffer((MemPtr_t)&_nstagend, 1, pBufMgr)) != SML_ERR_OK) break; 137 } 138 if ((_err = xltAddToBuffer((MemPtr_t)(&_tagdel), 1, pBufMgr)) != SML_ERR_OK) break; 139 if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; 140 141 break; 142 } 143 //Only Begin Tag -> content follows -> content byte has to be added 144 case TT_BEG: 145 { 146 if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; 147 if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; 148 if (_tagnsattr) { 149 if ((_err = xltAddToBuffer((MemPtr_t)&_nstagstart, 8, pBufMgr)) != SML_ERR_OK) break; 150 if ((_err = xltAddToBuffer((MemPtr_t)_tagnsattr, smlLibStrlen(_tagnsattr), pBufMgr)) != SML_ERR_OK) break; 151 if ((_err = xltAddToBuffer((MemPtr_t)&_nstagend, 1, pBufMgr)) != SML_ERR_OK) break; 152 } 153 if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; 154 155 // remember the number of byte that must follow for the according end-tag 156 pBufMgr->endTagSize += (3 + smlLibStrlen(_tagstr)); 157 break; 158 } 159 default: 160 { 161 smlLibFree(_tagstr); 162 smlLibFree(_tagnsattr); 163 return SML_ERR_XLT_INVAL_TAG_TYPE; 164 } 165 } 166 smlLibFree(_tagstr); 167 smlLibFree(_tagnsattr); 168 return _err; 169 } 170 #endif 171