00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00030
00031
00036 #ifndef _ASN1XERCPPTYPES_H_
00037 #define _ASN1XERCPPTYPES_H_
00038
00039 #include "rtxersrc/saxParser.h"
00040 #include "rtsrc/asn1CppTypes.h"
00041 #include "rtsrc/OSCInputStream.h"
00042 #include "rtxersrc/asn1xer.h"
00043
00048 #ifndef _NO_EXCEPTIONS
00049 #ifdef _TRACE
00050
00051 #define ASN1SAXTHROW(stat) throwSAXException (stat, __FILE__, __LINE__);
00052
00053 #define ASN1SAXCATCH0(toCatch,stat) \
00054 catch (OSRTSAXException& toCatch) { \
00055 cerr << "ASN1XERSAX ERROR: "; \
00056 if (toCatch.getMessage()) \
00057 cerr << StrX (toCatch.getMessage()); \
00058 stat = toCatch.getStatus(); \
00059 if (stat) \
00060 cerr << "\n" << "Status: " << stat << endl; \
00061 if (toCatch.getSrcFileName ()) {\
00062 cerr << "File: " << StrX (toCatch.getSrcFileName ()); \
00063 cerr << " Line: " << toCatch.getSrcLineNum () << endl; \
00064 } \
00065 }
00066 #else
00067
00068 #define ASN1SAXTHROW(stat) throwSAXException (stat);
00069
00070 #define ASN1SAXCATCH0(toCatch,stat) \
00071 catch (OSRTSAXException& toCatch) { \
00072 cerr << "ASN1XERSAX ERROR: "; \
00073 if (toCatch.getMessage()) \
00074 cerr << StrX (toCatch.getMessage()); \
00075 stat = toCatch.getStatus(); \
00076 if (stat) \
00077 cerr << "\n" << "Status: " << stat << endl; \
00078 }
00079 #endif
00080
00081 #define ASN1SAXCATCH(toCatch,stat) \
00082 ASN1SAXCATCH0(toCatch,stat) \
00083 catch (const ASN1MessageBuffer::RTLError& toCatch) { \
00084 cerr << "ASN.1 RTL ERROR: " << toCatch.getStatus() << endl; \
00085 stat = toCatch.getStatus(); \
00086 }
00087 #else
00088 #define ASN1SAXTHROW(stat) { \
00089 fprintf (stderr, "Fatal Error %i in %s at %i\n", stat, __FILE__, __LINE__); \
00090 exit (-1); \
00091 }
00092 #define ASN1SAXCATCH(toCatch,stat)
00093 #endif
00094
00101
00102
00113 class EXTERNXER ASN1XERMessageBuffer : public ASN1MessageBuffer {
00114 protected:
00123 ASN1XERMessageBuffer (Type bufferType) : ASN1MessageBuffer(bufferType) {}
00124 public:
00125 } ;
00126
00127
00136 class EXTERNXER ASN1XEREncodeBuffer : public ASN1XERMessageBuffer {
00137 public:
00142 ASN1XEREncodeBuffer ();
00143
00150 ASN1XEREncodeBuffer (ASN1BOOL canonical);
00151
00160 ASN1XEREncodeBuffer (ASN1BOOL canonical, ASN1CTXT* pSrcCtxt,
00161 size_t initBufSize = 0);
00162
00171 ASN1XEREncodeBuffer (ASN1OCTET* pMsgBuf, size_t msgBufLen);
00172
00185 ASN1XEREncodeBuffer (ASN1OCTET* pMsgBuf, size_t msgBufLen,
00186 ASN1BOOL canonical, ASN1BOOL openType = FALSE);
00193 inline size_t getMsgLen () {
00194 return (getCtxtPtr()->buffer.byteIndex);
00195 }
00196
00208 int init ();
00209
00219 virtual ASN1BOOL isA (Type bufferType) {
00220 return bufferType == XEREncode;
00221 }
00227 inline void setCanonical() { rtCtxtSetFlag (getCtxtPtr(), ASN1CANXER); }
00228
00236 inline void setOpenType () { rtCtxtSetFlag (getCtxtPtr(), ASN1OPENTYPE); }
00237
00248 long write (const char* filename);
00249
00258 long write (FILE* fp);
00259 } ;
00260
00261
00271 class EXTERNXER ASN1XERSAXDecodeHandler :
00272 public OSXMLContentHandler, public OSXMLErrorInfo
00273 {
00274 protected:
00275 ASN1XERState mCurrState;
00276 int mCurrElemID;
00277 int mLevel, mStartLevel;
00278 const char* mpTypeName;
00279 struct ErrorInfo {
00280 int stat;
00281 const char* file;
00282 int line;
00283 } errorInfo;
00284 public:
00285
00289 ASN1XERSAXDecodeHandler () :
00290 mCurrState(XERINIT), mCurrElemID(0), mLevel(0), mpTypeName(0) {}
00291
00292 virtual void startElement
00293 (const XMLCHAR* const uri,
00294 const XMLCHAR* const localname,
00295 const XMLCHAR* const qname,
00296 const XMLCHAR* const* attrs);
00297
00298 virtual void characters
00299 (const XMLCHAR* const chars, const unsigned int length);
00300
00301 virtual void endElement
00302 (const XMLCHAR* const uri,
00303 const XMLCHAR* const localname,
00304 const XMLCHAR* const qname);
00305
00306 virtual void startDocument();
00307 virtual void endDocument ();
00308
00309
00310 virtual void resetErrorInfo ();
00311 virtual void setErrorInfo (int status, const char* file = 0, int line = 0);
00312 virtual int getErrorInfo (int* status, const char** file, int* line);
00313
00314
00315
00316
00317
00318
00319
00320
00328 inline ASN1XERState getState() { return mCurrState; }
00329 virtual void finalize() {}
00330 ASN1CTXT* finalizeMemBuf(ASN1MessageBufferIF* msgBuf, ASN1MemBuf& memBuf);
00331 virtual void init (int level = 0) {
00332 mCurrState = XERINIT; mStartLevel = mLevel = level;
00333 }
00334
00342 inline ASN1BOOL isComplete () { return mLevel == mStartLevel; }
00343 void setTypeName (const char* typeName) {
00344 mpTypeName = typeName;
00345 }
00346 virtual void throwSAXException (int stat, const char* file = 0,
00347 int line = 0);
00348 } ;
00349
00350
00351
00363 class EXTERNXER ASN1XERDecodeBuffer : public ASN1XERMessageBuffer {
00364 protected:
00365 union {
00366 const char* fileName;
00367 OSCInputStream* pInputStream;
00368 struct {
00369 const ASN1OCTET* pMemBuf;
00370 int bufSize;
00371 } memBuf;
00372 } mInput;
00373 enum {
00374 INPUT_FILE,
00375 INPUT_STREAM,
00376 INPUT_STREAM_ATTACHED,
00377 INPUT_MEMORY
00378 } mInputId;
00379 public:
00380
00390 ASN1XERDecodeBuffer (const char* xmlFile);
00391
00404 ASN1XERDecodeBuffer (const ASN1OCTET* msgbuf,
00405 size_t numocts,
00406 ASN1BOOL openType = FALSE);
00407
00417 ASN1XERDecodeBuffer (OSCInputStream& inputStream,
00418 ASN1BOOL openType = FALSE);
00419
00420 ~ASN1XERDecodeBuffer ();
00421
00431 int decodeXML (OSXMLReader* pReader);
00432
00440 inline const char* getXmlFileName() {
00441 return (mInputId == INPUT_FILE) ? mInput.fileName : 0;
00442 }
00443
00455 int initBuffer (ASN1MemBuf& membuf) {
00456 return ASN1XERMessageBuffer::initBuffer (membuf);
00457 }
00458
00459 int initBuffer (char* str);
00460 int initBuffer (ASN116BITCHAR* str) { return ASN_E_NOTSUPP; }
00461
00462 virtual ASN1BOOL isA (Type bufferType) {
00463 return bufferType == XERDecode;
00464 }
00465 virtual void throwSAXException (int stat, const char* file = 0,
00466 int line = 0);
00467
00468 inline void setOpenType () { rtCtxtSetFlag (getCtxtPtr(), ASN1OPENTYPE); }
00469 } ;
00470
00480 #endif // _ASN1XERCPPTYPES_H_
00481
00482
00483
00484