Home | History | Annotate | Download | only in src
      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