📄 xltenc.c
字号:
/*************************************************************************//* module: Encoder source file *//* file: xltenc.c *//* target system: All *//* target OS: All */ /*************************************************************************//* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * *//*************************************************************************//* Definitions *//*************************************************************************/#include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++#include <xltenc.h>#ifdef __SML_WBXML__ #include "xltencwbxml.h"#endif#ifdef __SML_XML__ #include "xltencxml.h"#endif#include "xlttags.h"#include "xltmetinf.h"#include "xltdevinf.h"#include "smlmetinfdtd.h"#include "smldevinfdtd.h"#include <libstr.h>#include <libmem.h>#include <smldtd.h>Ret_t getTNbyPE(SmlProtoElement_t, XltTagID_t*);Ret_t xltEncBlock(XltTagID_t, XltRO_t, const VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t, SmlPcdataExtension_t);Ret_t xltEncList(XltListType_t, XltRO_t, VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t, SmlPcdataExtension_t);#ifndef __SML_LITE__Ret_t xltBuildExtention(SmlPcdataExtension_t, XltRO_t, VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t);#endiftypedef struct PEEnc_s{ XltTagID_t tagid; SmlProtoElement_t type;} PEEnc_t, *PEEncPtr_t;PEEncPtr_t getPEEncTable(void);PEEncPtr_t getPEEncTable(void){ PEEncPtr_t _tmpPEEncPtr; PEEnc_t const PE[] = { { TN_ADD, SML_PE_ADD }, { TN_ALERT, SML_PE_ALERT }, { TN_ATOMIC, SML_PE_ATOMIC_START }, { TN_ATOMIC_END, SML_PE_ATOMIC_END }, { TN_COPY, SML_PE_COPY }, { TN_DELETE, SML_PE_DELETE }, { TN_EXEC, SML_PE_EXEC }, { TN_GET, SML_PE_GET }, { TN_MAP, SML_PE_MAP }, { TN_PUT, SML_PE_PUT }, { TN_RESULTS, SML_PE_RESULTS }, { TN_SEARCH, SML_PE_SEARCH }, { TN_SEQUENCE, SML_PE_SEQUENCE_START }, { TN_SEQUENCE_END, SML_PE_SEQUENCE_END }, { TN_STATUS, SML_PE_STATUS }, { TN_SYNC, SML_PE_SYNC_START }, { TN_SYNC_END, SML_PE_SYNC_END }, { TN_REPLACE, SML_PE_REPLACE }, { TN_UNDEF, SML_PE_UNDEF } }; _tmpPEEncPtr = (PEEncPtr_t)smlLibMalloc(sizeof(PE)); if (_tmpPEEncPtr == NULL) return NULL; smlLibMemcpy(_tmpPEEncPtr, &PE, sizeof(PE)); return _tmpPEEncPtr; }Ret_t getTNbyPE(SmlProtoElement_t pE, XltTagID_t *tagID){ int i = 0; PEEncPtr_t pPETbl = getPEEncTable(); if (pPETbl == NULL) { smlLibFree(pPETbl); return SML_ERR_NOT_ENOUGH_SPACE; } while (((pPETbl+i)->type) != SML_PE_UNDEF) { if (((pPETbl+i)->type) == pE) { *tagID = (pPETbl+i)->tagid; smlLibFree(pPETbl); return SML_ERR_OK; } i++; } smlLibFree(pPETbl); *tagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM;}// %%% luz:2003-07-31: added SyncML FPI (formal public identifier) tablesconst char * const SyncMLFPI[SML_NUM_VERS] = { "???", "-//SYNCML//DTD SyncML 1.0//EN", "-//SYNCML//DTD SyncML 1.1//EN"};const char * const SyncMLDevInfFPI[SML_NUM_VERS] = { "???", "-//SYNCML//DTD DevInf 1.0//EN", "-//SYNCML//DTD DevInf 1.1//EN"};/** * FUNCTION: smlXltEncInit * * Initializes an XML buffer; Creates XML code for the SyncHdr * and appends it to the buffer. * Returns 0 if operation was successful. * * PRE-Condition: no memory should be allocated for ppEncoder (should be NULL) * pHeader has to contain a valid SyncHdr structure * pBufEnd must point to the end of the (WB)XML buffer * ppBufPos has to be initialized to the start point of the * (WB)XML buffer. * * * POST-Condition: After the function call ppBufPos points to the * first free byte in the buffer behind the (WB)XML document * * IN: enc, the encoding constant (SML_WBXML or SML_XML) * pHeader, the SyncML header structure * pBufEnd, pointer to the end of the buffer to write on * * IN/OUT: ppBufPos, current position of the bufferpointer * ppEncoder, the encoder object * * RETURN: shows error codes of function, * 0, if OK * Possible Error Codes: * SML_ERR_XLT_MISSING_CONT * SML_ERR_XLT_BUF_ERR * SML_ERR_XLT_INVAL_ELEM_TYPE * SML_ERR_XLT_INVAL_LIST_TYPE * SML_ERR_XLT_INVAL_TAG_TYPE * SML_ERR_XLT_ENC_UNK * SML_ERR_XLT_INVAL_PROTO_ELEM */Ret_t xltEncInit(SmlEncoding_t enc, const SmlSyncHdrPtr_t pHeader, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltEncoderPtr_t *ppEncoder, SmlVersion_t vers){ // Return variable Ret_t _err; XltEncoderPtr_t _pEncoder; //Structure containing buffer pointers, length and written bytes BufferMgmtPtr_t _pBufMgr;#ifdef __SML_WBXML__ MemByte_t _stablen = 0x1D; //XLT_STABLEN; MemByte_t _wbxmlver = XLT_WBXMLVER; MemByte_t _charset = XLT_CHARSET; MemByte_t _pubident1 = XLT_PUBIDENT1; MemByte_t _pubident2 = XLT_PUBIDENT2; // %%% luz:2003-07-31: now uses FPI according to syncml version const char *_syncmldtd = SyncMLFPI[vers];#endif#ifdef __SML_XML__ MemPtr_t _tmpStr; MemPtr_t _xmlver = (MemPtr_t)XML_VERSION; MemPtr_t _xmlenc = (MemPtr_t)XML_ENCODING; MemByte_t _begpar = XML_BEGPAR; MemByte_t _endpar = XML_ENDPAR;#endif //MemByte_t _tmp = 0x00;CURRENTLY NOT USED if ((_pEncoder = (XltEncoderPtr_t)smlLibMalloc(sizeof(XltEncoder_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; if ((_pBufMgr = (BufferMgmtPtr_t)smlLibMalloc(sizeof(BufferMgmt_t))) == NULL) { smlLibFree(_pEncoder); return SML_ERR_NOT_ENOUGH_SPACE; } //set the encoding _pEncoder->enc = enc; // %%% luz:2003-07-31: added version _pEncoder->vers = vers; _pEncoder->cur_ext = (SmlPcdataExtension_t)SML_EXT_UNDEFINED; _pEncoder->last_ext = (SmlPcdataExtension_t)SML_EXT_UNDEFINED; _pEncoder->end_tag_size = 0; _pEncoder->space_evaluation = NULL; _pBufMgr->smlXltBufferP = *ppBufPos; _pBufMgr->smlXltBufferLen = pBufEnd - *ppBufPos; _pBufMgr->smlXltStoreBufP = _pBufMgr->smlXltBufferP; _pBufMgr->smlXltWrittenBytes = 0; _pBufMgr->smlCurExt = _pEncoder->cur_ext; _pBufMgr->smlLastExt = _pEncoder->last_ext; _pBufMgr->smlActiveExt = SML_EXT_UNDEFINED; _pBufMgr->switchExtTag = TN_UNDEF; _pBufMgr->spaceEvaluation = 0; _pBufMgr->vers = vers; _pBufMgr->endTagSize = 0; switch (enc) {#ifdef __SML_WBXML__ case SML_WBXML: { // Set the WBXML Header Values // WBXML Version if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_wbxmlver), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // Public Idetifier - default unknown if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_pubident1), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_pubident2), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // Character set - not yet implemented if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_charset), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // Sting table length - not yet implemented if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_stablen), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // FPI - %%% luz:2003-07-31: not constant any more, varies according to SyncML version if ((_err = xltAddToBuffer((MemPtr_t) (_syncmldtd) , smlLibStrlen((String_t)_syncmldtd), _pBufMgr)) != SML_ERR_OK) break; break; }#endif#ifdef __SML_XML__ case SML_XML: { if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"?xml version=\""; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = _xmlver; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"\" encoding=\""; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = _xmlenc; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"\"?"; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, _pBufMgr)) != SML_ERR_OK) break; break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -