#ifndef _SM_VDASNACC_H_
#define _SM_VDASNACC_H_
#include "asn-incl.h"
#include <stdio.h>
#ifndef SM_SIZE_T
#define SM_SIZE_T size_t
#endif
#ifdef WIN32
#include <stdlib.h>
#define SM_FOPEN_WRITE "wb"
#define SM_FOPEN_READ "rb"
#define SM_FOPEN_APPEND "ab"
#else
#define SM_FOPEN_WRITE "w"
#define SM_FOPEN_READ "r"
#define SM_FOPEN_APPEND "a"
#endif
class CSM_Buffer: public AsnType
{
private:
SM_SIZE_T m_lSize;
char *m_pMemory;
#if !defined(macintosh) && !defined(__APPLE__)
char *m_pszFN;
FILE *m_pFP;
#endif
char *m_pMemFP;
char *m_pCache;
SM_SIZE_T m_lCacheSize;
#if !defined(macintosh) && !defined(__APPLE__)
bool InFile() { if (m_pszFN == NULL) return false; else return true; }
#endif
void AllocMoreMem(SM_SIZE_T lSize);
public:
CSM_Buffer();
CSM_Buffer(size_t lSize);
CSM_Buffer(const char *pBuf, SM_SIZE_T lSize);
CSM_Buffer(const CSM_Buffer &b);
virtual ~CSM_Buffer();
virtual AsnType *Clone() const;
virtual AsnType *Copy() const;
virtual AsnLen BEnc (BUF_TYPE b);
void Print (ostream &os) const;
void Clear();
SM_SIZE_T Length() const;
void Set(const char *psz);
void Set(const char *p, SM_SIZE_T lSize);
void SetLength(SM_SIZE_T lSize) { m_lSize = lSize; }
#if !defined(macintosh) && !defined(__APPLE__)
void SetFileName(char *pszFN)
{
#ifdef HAVE_STRDUP
strdup(pszFN);
#else
m_pszFN = (char *)malloc (strlen (pszFN) + 1);
strcpy (m_pszFN, pszFN);
#endif
}
#endif
char* Alloc(SM_SIZE_T lSize);
long Compare(const CSM_Buffer &b);
long ReSet(const CSM_Buffer &b);
const char* Access() const;
char* Get(SM_SIZE_T &l) const;
char* Get() const { SM_SIZE_T l; return Get(l); }
bool operator == ( CSM_Buffer &b) {
if (Compare(b) == 0) return true; else return false; }
bool operator != ( CSM_Buffer &b) {
if (Compare(b) == 0) return false; else return true; }
CSM_Buffer &operator = ( CSM_Buffer &b) {
ReSet(b); return *this; }
#if !defined(macintosh) && !defined(__APPLE__)
long ConvertFileToMemory();
long ConvertMemoryToFile(char *pszFN);
#endif
long Open(char *pszMode);
long Seek(SM_SIZE_T lOffset, SM_SIZE_T lOrigin);
void Close();
long cRead(char *pBuffer, SM_SIZE_T lSize);
long Write(const char *pBuffer, SM_SIZE_T lSize);
char* nRead(SM_SIZE_T lSize, SM_SIZE_T &lBytesRead);
void Flush();
};
long vdasnacc_sortSet(CSM_Buffer *pEncBuf[], int icount);
long vdasnacc_sortSetOf(CSM_Buffer **&pEncBuf, int icount);
long SM_WriteToAsnBuf(CSM_Buffer *&pCBuf, AsnBuf &SNACCinputBuf);
long SM_WriteToAsnBuf(CSM_Buffer &CBuf, AsnBuf &SNACCoutputBuf);
long SM_ReadFromAsnBuf(CSM_Buffer *&pCBuf, AsnBuf &SNACCinputBuf, long length, CSM_Buffer *preLoad); long SM_ReadFromAsnBuf(
AsnBuf &SNACCinputBuf, CSM_Buffer *pCBuf, long length, CSM_Buffer *preLoad); long SM_AsnBits2Buffer(AsnBits *pBits, CSM_Buffer *pBuffer);
long SM_Buffer2AsnBits(CSM_Buffer *pBuffer, AsnBits *pBits, size_t lBits);
long SM_BufferReverseBits(CSM_Buffer *pBuffer);
class BigIntegerStr;
#define SM_BUF_2_BIG_INT_STR 0
#if SM_BUF_2_BIG_INT_STR
long SM_Buffer2BigIntegerStr( CSM_Buffer *asn1Data,
BigIntegerStr &pSnaccBigIntStr,
bool unsignedFlag);
long SM_Buffer2BigIntegerStr( CSM_Buffer *asn1Data,
BigIntegerStr *&pSnaccBigIntStr,
bool unsignedFlag);
#endif
#define VDASNACC_ENCDEC_BUFSIZE 100000
#define NULL_STR (Str_struct *) NULL
#if SNACC_ENABLE_PDU
#define ENCODE_ANY(encodedData,asnAny)\
{\
CSM_Buffer *blob=new CSM_Buffer;\
\
if ((encodedData) && (asnAny))\
{\
ENCODE_BUF((encodedData), blob)\
(asnAny)->value = (AsnType *)blob;\
}\
}
#define DECODE_ANY(decodeData,asnAny)\
{\
CSM_Buffer *blob;\
if ((asnAny))\
blob=(CSM_Buffer *)(asnAny)->value;\
\
if (blob)\
DECODE_BUF((decodeData), blob)\
}
#define ENCODE_BUF_NO_ALLOC(encodeData, blob)\
{\
char *pchBuffer = (char *)calloc(1, \
VDASNACC_ENCDEC_BUFSIZE);\
size_t encodedLen;\
AsnBuf outputBuf;\
int status=0;\
\
outputBuf.Init(pchBuffer, VDASNACC_ENCDEC_BUFSIZE);\
outputBuf.ResetInWriteRvsMode();\
status = (encodeData)->BEncPdu (outputBuf, encodedLen);\
outputBuf.ResetInReadMode();\
SM_ReadFromAsnBuf(outputBuf, (blob), outputBuf.DataLen(),NULL);\
free(pchBuffer);\
}
#define ENCODE_BUF(encodeData, blob)\
{\
char *pchBuffer = (char *)calloc(1, \
VDASNACC_ENCDEC_BUFSIZE);\
size_t encodedLen;\
AsnBuf outputBuf;\
int status=0;\
\
outputBuf.Init(pchBuffer, VDASNACC_ENCDEC_BUFSIZE);\
outputBuf.ResetInWriteRvsMode();\
if((status = (encodeData)->BEncPdu (outputBuf, encodedLen))==false)\
SME_THROW(33, "BAD SNACC Encode", NULL);\
outputBuf.ResetInReadMode();\
SM_ReadFromAsnBuf((blob), outputBuf, outputBuf.DataLen(),NULL);\
free(pchBuffer);\
}
#define DECODE_BUF(decodeData, blob)\
{\
char *pchBuffer = (char *)calloc(1, \
VDASNACC_ENCDEC_BUFSIZE);\
size_t encodedLen;\
AsnBuf outputBuf;\
int nDecStatus = 0;\
\
outputBuf.Init(pchBuffer, VDASNACC_ENCDEC_BUFSIZE);\
outputBuf.ResetInWriteRvsMode();\
SM_WriteToAsnBuf((blob), outputBuf);\
outputBuf.ResetInReadMode();\
if ((nDecStatus = (decodeData)->BDecPdu(outputBuf, encodedLen)) == false)\
SME_THROW(34, "BAD SNACC Decode", NULL);\
free(pchBuffer);\
}
#endif
#define SNACC_BUFRESET_READ(pSnaccBuf) (pSnaccBuf)->ResetInReadMode();
#define SNACC_BUFRESET_WRITE(pSnaccBuf) (pSnaccBuf)->ResetInWriteRvsMode();
#define SM_ASSIGN_ANYBUF(lpBuf, asnAny)\
{\
(asnAny)->value = (AsnType *)new CSM_Buffer(*(lpBuf));\
}
#define SM_EXTRACT_ANYBUF(pSS, asnAny)\
{\
(pSS) = new CSM_Buffer(*(CSM_Buffer *)(asnAny)->value);\
}
#define ENCODE_BUF1(encodeContent, encodeLen)\
{\
AsnBuf outputBuf;\
char *lpszBuf;\
\
lpszBuf = (char *)calloc(1, VDASNACC_ENCDEC_BUFSIZE/2);\
outputBuf.Init(lpszBuf, VDASNACC_ENCDEC_BUFSIZE/2);\
outputBuf.ResetInWriteRvsMode();\
(encodeLen) = encodeContent(outputBuf);
#define ENCODE_BUF2(blob)\
outputBuf.ResetInReadMode();\
SM_ReadFromAsnBuf((blob), outputBuf, outputBuf.DataLen(),NULL);\
free(lpszBuf);\
}
#if defined(macintosh) || defined(__APPLE__)
#define ENC_LOAD_ANYBUF(asnType, Bbuf, l) \
if ((asnType)->value != NULL)\
{\
l = (asnType)->value->BEnc(Bbuf);\
}
#else
#define ENC_LOAD_ANYBUF(asnType, Bbuf, l) \
if ((CSM_Buffer *)(asnType)->value != NULL)\
{\
SM_WriteToAsnBuf(((CSM_Buffer *&)(asnType)->value), Bbuf);\
l = ((CSM_Buffer *)(asnType)->value)->Length();\
}
#endif
#define DEC_LOAD_ANYBUF(asnType, Bbuf, l, env) \
{\
size_t len = (size_t) 0; \
AsnLen bytesDecoded = 0L; \
size_t elmtLen = (size_t) 0; \
int tag = 0 ; \
char *readloc = NULL; \
CSM_Buffer *blob; \
CSM_Buffer *preLoad;\
\
readloc = Bbuf.GetSeg (&len);\
tag = BDecTag (Bbuf, bytesDecoded, env);\
elmtLen = BDecLen (Bbuf, bytesDecoded, env);\
len = bytesDecoded;\
preLoad = new CSM_Buffer(readloc, len);\
SM_ReadFromAsnBuf(blob, (Bbuf), elmtLen,preLoad);\
(asnType)->value = blob;\
delete preLoad;\
l += len + elmtLen;\
}
#ifdef BOB
#define SNACC_OID_FIX(asnOid, long_arr4) \
{\
unsigned long int a[11];\
int i;\
for (i=0; i < (long_arr4)->lgth; i++) a[i] = (long_arr4)->int_arr[i];\
for (i=(long_arr4)->lgth; i < 11; i++) a[i] = -1;\
(asnOid)->Set(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9],\
a[10]);\
}
#endif
#endif // _SM_VDASNACC_H_