00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00028 #ifndef _RTXCONTEXT_H_
00029 #define _RTXCONTEXT_H_
00030
00031 #include "rtxsrc/rtxDList.h"
00032 #include "rtxsrc/rtxStack.h"
00033
00034 #define OSRTENCBUFSIZ 1024
00035
00040
00041
00042 #define OSRTERRSTKSIZ 8
00043 #define OSRTMAXERRPRM 5
00044
00052 typedef struct {
00053 const OSUTF8CHAR* module;
00054 OSINT32 lineno;
00055 } OSRTErrLocn;
00056
00067 typedef struct {
00068 OSRTErrLocn stack[OSRTERRSTKSIZ];
00069 OSINT16 status;
00070 OSUINT8 stkx;
00071 OSUINT8 parmcnt;
00072 OSUTF8CHAR* parms[OSRTMAXERRPRM];
00073 OSUTF8CHAR* elemName;
00074 } OSRTErrInfo;
00075
00076 typedef struct {
00077 OSRTDList list;
00078 OSRTErrInfo reserved;
00079 OSRTDListNode reservedNode;
00080 } OSRTErrInfoList;
00081
00090 typedef struct {
00091 OSOCTET* data;
00092 OSSIZE byteIndex;
00093 OSSIZE size;
00094 OSINT16 bitOffset;
00095 OSBOOL dynamic;
00096 OSBOOL aligned;
00097 } OSRTBuffer;
00098
00099 typedef OSUINT32 OSRTFLAGS;
00100
00107 typedef struct {
00108 OSSIZE byteIndex;
00109 OSINT16 bitOffset;
00110 OSRTFLAGS flags;
00111 } OSRTBufSave;
00112
00113
00117 typedef struct {
00118 OSSIZE byteIndex;
00119 OSINT16 bitOffset;
00120 } OSBufferIndex;
00121
00122
00123
00124
00125
00126 #define OSDIAG 0x80000000
00127 #define OSTRACE 0x40000000
00128 #define OSDISSTRM 0x20000000
00129 #define OSNOSTRMBACKOFF 0x08000000
00130 #define OS3GMOBORIG 0x04000000
00131
00132
00133
00134
00135
00136
00137 #define OSCONTCLOSED 0x02000000
00138 #define OSRESERVED1 0x01000000
00139 #define OSBUFSYSALLOC 0x00800000
00140
00141 struct OSCTXT;
00148 typedef int (*OSFreeCtxtAppInfoPtr)(struct OSCTXT* pctxt);
00149
00156 typedef int (*OSResetCtxtAppInfoPtr)(struct OSCTXT* pctxt);
00157
00165 typedef void (*OSFreeCtxtGlobalPtr)(struct OSCTXT* pctxt);
00166
00167
00168
00169
00170 #if !defined(OSCDECL)
00171 #if defined(_MSC_VER) || defined(__BORLANDC__)
00172 #define OSCDECL __cdecl
00173 #else
00174 #define OSCDECL
00175 #endif
00176 #endif
00177
00185 typedef struct OSCTXT {
00186 void* pMemHeap;
00187 OSRTBuffer buffer;
00188 OSRTBufSave savedInfo;
00189 OSRTErrInfoList errInfo;
00190 OSUINT32 initCode;
00191 OSRTFLAGS flags;
00192 OSOCTET level;
00193 OSOCTET state;
00194 OSOCTET diagLevel;
00195 OSOCTET lastChar;
00196 #ifndef _NO_STREAM
00197 struct OSRTSTREAM* pStream;
00198 struct OSRTPrintStream *pPrintStrm;
00199 #endif
00200 OSRTDList elemNameStack;
00201 OSRTDList regExpCache;
00202
00211 OSRTStack containerEndIndexStack;
00212
00213 const OSOCTET* key;
00214 OSSIZE keylen;
00215 OSVoidPtr pXMLInfo;
00216 OSVoidPtr pASN1Info;
00217 OSVoidPtr pLicInfo;
00218 OSVoidPtr pUserData;
00219 OSVoidPtr pGlobalData;
00220 struct OS3GPPSecParams* p3gppSec;
00221 OSFreeCtxtGlobalPtr gblFreeFunc;
00222 OSVoidPtr ssl;
00223 struct OSRTDiagBitFieldList* pBitFldList;
00224 OSUINT16 indent;
00225 OSUINT16 version;
00226 } OSCTXT;
00227
00228 #define OSRT_GET_FIRST_ERROR_INFO(pctxt) \
00229 (((pctxt)->errInfo.list.head == 0) ? (OSRTErrInfo*)0 : \
00230 (OSRTErrInfo*)((pctxt)->errInfo.list.head->data))
00231
00232 #define OSRT_GET_LAST_ERROR_INFO(pctxt) \
00233 (((pctxt)->errInfo.list.tail == 0) ? (OSRTErrInfo*)0 : \
00234 (OSRTErrInfo*)((pctxt)->errInfo.list.tail->data))
00235
00239 #ifndef _NO_STREAM
00240
00241 #define OSRTISSTREAM(pctxt) \
00242 ((pctxt)->pStream != 0 && !((pctxt)->flags & OSDISSTRM))
00243
00244 #else
00245
00246 #define OSRTISSTREAM(pctxt) FALSE
00247
00248 #endif
00249
00250 #define OSRTBUFCUR(pctxt) (pctxt)->buffer.data[(pctxt)->buffer.byteIndex]
00251 #define OSRTBUFPTR(pctxt) &(pctxt)->buffer.data[(pctxt)->buffer.byteIndex]
00252 #define OSRTBUFFER(pctxt) (pctxt)->buffer.data
00253 #define OSRTBUFSIZE(pctxt) (pctxt)->buffer.size
00254
00255 #define OSRTBUFSAVE(pctxt) { \
00256 (pctxt)->savedInfo.byteIndex = (pctxt)->buffer.byteIndex; \
00257 (pctxt)->savedInfo.flags = (pctxt)->flags; }
00258
00259 #define OSRTBUFSAVE2(pctxt,pSavedBuf) { \
00260 (pSavedBuf)->byteIndex = (pctxt)->buffer.byteIndex; \
00261 (pSavedBuf)->bitOffset = (pctxt)->buffer.bitOffset; \
00262 (pSavedBuf)->flags = (pctxt)->flags; }
00263
00264 #define OSRTBUFRESTORE(pctxt) { \
00265 (pctxt)->buffer.byteIndex = (pctxt)->savedInfo.byteIndex; \
00266 (pctxt)->flags = (pctxt)->savedInfo.flags; }
00267
00268 #define OSRTBUFRESTORE2(pctxt,pSavedBuf) { \
00269 (pctxt)->buffer.byteIndex = (pSavedBuf)->byteIndex; \
00270 (pctxt)->buffer.bitOffset = (pSavedBuf)->bitOffset; \
00271 (pctxt)->flags = (pSavedBuf)->flags; }
00272
00273 #define OSRTBYTEALIGNED(pctxt) \
00274 ((pctxt)->buffer.bitOffset == 8 || (pctxt)->buffer.bitOffset == 0)
00275
00276
00277
00278 typedef void *(OSCDECL *OSMallocFunc ) (OSSIZE size);
00279 typedef void *(OSCDECL *OSReallocFunc) (void *ptr, OSSIZE size);
00280 typedef void (OSCDECL *OSFreeFunc ) (void *ptr);
00281
00282 #ifdef __cplusplus
00283 extern "C" {
00284 #endif
00285
00310 #ifndef rtxInitContext
00311 EXTERNRT int rtxInitContext (OSCTXT* pctxt);
00312 #endif
00313
00328 EXTERNRT int rtxInitContextExt (OSCTXT* pctxt,
00329 OSMallocFunc malloc_func,
00330 OSReallocFunc realloc_func,
00331 OSFreeFunc free_func);
00332
00353 EXTERNRT int rtxInitThreadContext (OSCTXT* pctxt, const OSCTXT* pSrcCtxt);
00354
00369 EXTERNRT int rtxInitContextUsingKey
00370 (OSCTXT* pctxt, const OSOCTET* key, OSSIZE keylen);
00371
00390 EXTERNRT int rtxInitContextBuffer
00391 (OSCTXT* pctxt, OSOCTET* bufaddr, OSSIZE bufsiz);
00392
00416 EXTERNRT int rtxCtxtSetBufPtr
00417 (OSCTXT* pctxt, OSOCTET* bufaddr, OSSIZE bufsiz);
00418
00430 #define rtxCtxtGetMsgPtr(pctxt) (pctxt)->buffer.data
00431
00441 #define rtxCtxtGetMsgLen(pctxt) (pctxt)->buffer.byteIndex
00442
00450 EXTERNRT OSSIZE rtxCtxtGetBitOffset (OSCTXT* pctxt);
00451
00461 EXTERNRT int rtxCtxtSetBitOffset (OSCTXT* pctxt, OSSIZE offset);
00462
00470 EXTERNRT OSSIZE rtxCtxtGetIOByteCount (OSCTXT* pctxt);
00471
00481 EXTERNRT int rtxCheckContext (OSCTXT* pctxt);
00482
00490 EXTERNRT void rtxFreeContext (OSCTXT* pctxt);
00491
00501 EXTERNRT void rtxCopyContext (OSCTXT* pdest, OSCTXT* psrc);
00502
00509 EXTERNRT void rtxCtxtSetFlag (OSCTXT* pctxt, OSUINT32 mask);
00510
00518 EXTERNRT void rtxCtxtClearFlag (OSCTXT* pctxt, OSUINT32 mask);
00519
00526 #define rtxCtxtTestFlag(pctxt,mask) (((pctxt)->flags & mask) != 0)
00527
00542 EXTERNRT int rtxCtxtPushArrayElemName
00543 (OSCTXT* pctxt, const OSUTF8CHAR* elemName, OSSIZE idx);
00544
00557 EXTERNRT int rtxCtxtPushElemName (OSCTXT* pctxt, const OSUTF8CHAR* elemName);
00558
00573 EXTERNRT int rtxCtxtPushTypeName (OSCTXT* pctxt, const OSUTF8CHAR* typeName);
00574
00585 EXTERNRT OSBOOL rtxCtxtPopArrayElemName (OSCTXT* pctxt);
00586
00594 EXTERNRT const OSUTF8CHAR* rtxCtxtPopElemName (OSCTXT* pctxt);
00595
00604 EXTERNRT const OSUTF8CHAR* rtxCtxtPopTypeName (OSCTXT* pctxt);
00605
00613 #define rtxCtxtPeekElemName(pctxt) \
00614 (((pctxt)->elemNameStack.count > 0) ? \
00615 (const OSUTF8CHAR*)(pctxt)->elemNameStack.tail->data : (const OSUTF8CHAR*)0)
00616
00617
00626 EXTERNRT OSBOOL rtxCtxtContainerHasRemBits(OSCTXT* pctxt);
00627
00636 EXTERNRT OSSIZE rtxCtxtGetContainerRemBits(OSCTXT* pctxt);
00637
00651 EXTERNRT int rtxCtxtPushContainerBytes(OSCTXT* pctxt, OSSIZE bytes);
00652
00666 EXTERNRT int rtxCtxtPushContainerBits(OSCTXT* pctxt, OSSIZE bits);
00667
00668
00678 EXTERNRT void rtxCtxtPopContainer(OSCTXT* pctxt);
00679
00687 EXTERNRT void rtxCtxtPopAllContainers(OSCTXT* pctxt);
00688
00689
00690 EXTERNRT int rtxPreInitContext (OSCTXT* pctxt);
00691
00701 EXTERNRT void rtxMemHeapSetFlags (OSCTXT* pctxt, OSUINT32 flags);
00702
00711 EXTERNRT void rtxMemHeapClearFlags (OSCTXT* pctxt, OSUINT32 flags);
00712
00716 #define rtxByteAlign(pctxt) \
00717 if ((pctxt)->buffer.bitOffset != 8) { \
00718 (pctxt)->buffer.byteIndex++; (pctxt)->buffer.bitOffset = 8; }
00719
00729 EXTERNRT int rtxMarkPos (OSCTXT* pctxt, OSSIZE* ppos);
00730
00740 EXTERNRT int rtxResetToPos (OSCTXT* pctxt, OSSIZE pos);
00741
00755 #define rtxCtxtSetProtocolVersion(pctxt,value) (pctxt)->version = value
00756
00757 #define rtxMarkBitPos(pctxt,ppos,pbitoff) \
00758 (*(pbitoff) = (OSUINT8) (pctxt)->buffer.bitOffset, rtxMarkPos (pctxt, ppos))
00759
00760 #define rtxResetToBitPos(pctxt,pos,bitoff) \
00761 ((pctxt)->buffer.bitOffset = (OSUINT8) bitoff, rtxResetToPos (pctxt, pos))
00762
00763 #ifndef _COMPACT
00764 #define RTXCTXTPUSHARRAYELEMNAME(pctxt,name,idx) \
00765 rtxCtxtPushArrayElemName(pctxt,OSUTF8(name),idx)
00766
00767 #define RTXCTXTPOPARRAYELEMNAME(pctxt) \
00768 rtxCtxtPopArrayElemName(pctxt)
00769
00770 #define RTXCTXTPUSHELEMNAME(pctxt,name) \
00771 rtxCtxtPushElemName(pctxt,OSUTF8(name))
00772
00773 #define RTXCTXTPOPELEMNAME(pctxt) \
00774 rtxCtxtPopElemName(pctxt)
00775
00776 #define RTXCTXTPUSHTYPENAME(pctxt,name) \
00777 rtxCtxtPushTypeName(pctxt,OSUTF8(name))
00778
00779 #define RTXCTXTPOPTYPENAME(pctxt) \
00780 rtxCtxtPopTypeName(pctxt)
00781 #else
00782 #define RTXCTXTPUSHARRAYELEMNAME(pctxt,name,idx)
00783 #define RTXCTXTPOPARRAYELEMNAME(pctxt)
00784 #define RTXCTXTPUSHELEMNAME(pctxt,name)
00785 #define RTXCTXTPOPELEMNAME(pctxt)
00786 #define RTXCTXTPUSHTYPENAME(pctxt,name)
00787 #define RTXCTXTPOPTYPENAME(pctxt)
00788 #endif
00789
00790 #ifdef __cplusplus
00791 }
00792 #endif
00793
00796 #endif