blob: 9ab515198d34a2ceca1263a10d0f253bdcf8ac54 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef GENERICPER
#define GENERICPER
#include "oscl_base.h"
#include "per_common.h"
/*========================================*/
/*========== MISCELLANEOUS DEFS ==========*/
/*========================================*/
#define EPASS (void (*)(uint8*,PS_OutStream))
/*=========================================================*/
/*========== STRUCTURE DEFINITIONS (Generic PER) ==========*/
/*=========================================================*/
typedef struct _OCTETSTRING /* ASN OCTET STRING */
{
uint16 size;
uint8* data;
} S_OCTETSTRING;
typedef S_OCTETSTRING *PS_OCTETSTRING;
typedef struct _BITSTRING /* ASN BIT STRING */
{
uint16 size;
uint8* data;
} S_BITSTRING;
typedef S_BITSTRING *PS_BITSTRING;
typedef struct _int8STRING /* ASN int8 STRING */
{
uint16 size;
uint8* data;
} S_int8STRING;
typedef S_int8STRING *PS_int8STRING;
typedef struct _OBJECTIDENT /* ASN OBJECT IDENTIFIER */
{
uint16 size;
uint8* data;
} S_OBJECTIDENT;
typedef S_OBJECTIDENT *PS_OBJECTIDENT;
typedef struct _UnknownSigMap /* Unknown SigMap */
{
uint16 size;
uint8* optionFlags;
uint16 extensionsRead;
} S_UnknownSigMap;
typedef S_UnknownSigMap *PS_UnknownSigMap;
typedef struct _InStream /* Input Stream */
{
uint8* data; /* Current byte in stream */
uint8 bitIndex; /* Next bit within the byte */
} S_InStream;
typedef S_InStream *PS_InStream;
typedef struct _OutStream /* Output Stream */
{
uint8* data; /* Start of allocated space */
uint16 size; /* Size of allocated space */
uint16 byteIndex; /* Index: next byte to write */
uint16 bitIndex; /* Index: next bit to write */
uint8 buildByte; /* Next byte, under construction */
} S_OutStream;
typedef S_OutStream *PS_OutStream;
/*=========================================================*/
/*============ DECODING ROUTINES (Generic PER) ============*/
/*=========================================================*/
/* ------------- LOW LEVEL STREAM -------------- */
uint8 ReadBits(uint32 number, PS_InStream stream);
void ReadRemainingBits(PS_InStream stream);
void ReadOctets(uint32 number, uint8* octets, uint8 reorder, PS_InStream stream);
/* ------------- HIGH LEVEL ASN DATA ------------- */
uint8 GetBoolean(PS_InStream stream);
uint32 GetInteger(uint32 lower, uint32 upper, PS_InStream stream);
int32 GetSignedInteger(int32 lower, int32 upper, PS_InStream stream);
uint32 GetUnboundedInteger(PS_InStream stream);
uint32 GetExtendedInteger(uint32 lower, uint32 upper, PS_InStream stream);
void GetOctetString(uint8 unbounded, uint32 min, uint32 max,
PS_OCTETSTRING x, PS_InStream stream);
void GetBitString(uint8 unbounded, uint32 min, uint32 max,
PS_BITSTRING x, PS_InStream stream);
void GetCharString(const char *stringName,
uint8 unbounded, uint32 min, uint32 max, const char *from,
PS_int8STRING x, PS_InStream stream);
void GetObjectID(PS_OBJECTIDENT x, PS_InStream stream);
/* ------------- OTHER CALLS ----------------*/
uint32 GetLengthDet(PS_InStream stream);
/* General length det, e.g. for extension wrapper */
uint32 GetNormSmallLength(PS_InStream stream);
/* e.g. for length of extensions SigMap */
uint32 GetNormSmallValue(PS_InStream stream);
/* e.g. for choice index when extension is ON */
void SkipOneExtension(PS_InStream stream);
/* Reads a General Length Det, skips that many octets. */
void SkipAllExtensions(PS_InStream stream);
/* Reads SigMap including length. Skips each */
/* extension which SigMap says is present. */
/* NOTE: Not generated by MiniParser. Delete? */
uint16 GetChoiceIndex(uint32 rootnum, uint8 extmarker, PS_InStream stream);
/* Gets (possibly extended) choice index */
PS_UnknownSigMap GetUnknownSigMap(PS_InStream stream);
/* Gets the unknown sig-map for SEQUENCE extensions */
uint8 SigMapValue(uint32 index, PS_UnknownSigMap map);
/* Reads a value from the unknown sig-map */
void ExtensionPrep(PS_UnknownSigMap map, PS_InStream stream);
/* Does ++map->extensionsRead */
/* Also calls GetLengthDet(stream) to skip wrapper */
uint32 SkipUnreadExtensions(PS_UnknownSigMap, PS_InStream stream);
/* Use map->extensionsRead to determine how many have */
/* been read, and how many are left to be read. */
/* Skips unread exts via calls to SkipOneExtension() */
/* Frees the map */
/* Returns the number of exts skipped. */
void SkipOneOctet(PS_InStream stream);
/*=========================================================*/
/*============ ENCODING ROUTINES (Generic PER) ============*/
/*=========================================================*/
/* ------------- LOW LEVEL STREAM -------------- */
void WriteBits(uint32 number, uint8 bits, PS_OutStream stream);
void WriteRemainingBits(PS_OutStream stream);
void WriteOctets(uint32 number, uint8* octets, uint8 reorder, PS_OutStream stream);
PS_OutStream NewOutStream(void);
void ExpandOutStream(PS_OutStream x);
void FreeOutStream(PS_OutStream x);
/* ------------- HIGH LEVEL ASN DATA ------------- */
void PutBoolean(uint32 value, PS_OutStream stream);
void PutInteger(uint32 lower, uint32 upper, uint32 value, PS_OutStream stream);
void PutSignedInteger(int32 lower, int32 upper, int32 value, PS_OutStream stream);
void PutUnboundedInteger(uint32 value, PS_OutStream stream);
void PutExtendedInteger(uint32 lower, uint32 upper, uint32 value, PS_OutStream stream);
void PutOctetString(uint8 unbounded,
uint32 min, uint32 max, PS_OCTETSTRING x, PS_OutStream stream);
void PutBitString(uint8 unbounded,
uint32 min, uint32 max, PS_BITSTRING x, PS_OutStream stream);
void PutCharString(const char *stringName,
uint8 unbounded, uint32 min, uint32 max, const char *from,
PS_int8STRING x, PS_OutStream stream);
void PutObjectID(PS_OBJECTIDENT x, PS_OutStream stream);
void PutExtensionNull(PS_OutStream stream);
void PutExtensionBoolean(uint32 value, PS_OutStream stream);
void PutExtensionInteger(uint32 lower, uint32 upper, uint32 value, PS_OutStream stream);
void PutExtensionOctetString(uint8 unbounded,
uint32 min, uint32 max, PS_OCTETSTRING x, PS_OutStream stream);
/* ------------- OTHER CALLS ----------------*/
void PutNormSmallValue(uint32 value, PS_OutStream stream);
/* e.g. for choice index when extension is ON */
void PutChoiceIndex(uint32 rootnum, uint8 extmarker, uint32 index, PS_OutStream stream);
/* Writes extension bit, choice index */
void PutNormSmallLength(uint32 value, PS_OutStream stream);
/* e.g. for length of extensions SigMap */
void PutLengthDet(uint32 value, PS_OutStream stream);
/* General length det, e.g. for extension wrapper */
void PutExtensionItem(
void (*Func)(uint8* x, PS_OutStream stream),
uint8* x, PS_OutStream stream);
/* Write extension item, including length det */
void PutTempStream(PS_OutStream tempStream, PS_OutStream stream);
/* Copy contents of tempStream to the real one */
/*======================================================*/
/*============ OTHER ROUTINES (Generic PER) ============*/
/*======================================================*/
void ErrorMessage(const char *msg);
void ErrorMessageAndLeave(const char *msg);
/* Generic error call. Just print it for now */
PS_InStream ConvertOutstreamToInstream(PS_OutStream outstream);
PS_OCTETSTRING NewOctetString(void);
PS_BITSTRING NewBitString(void);
PS_int8STRING NewCharString(void);
PS_OBJECTIDENT NewObjectID(void);
void InitOctetString(PS_OCTETSTRING x);
void InitBitString(PS_BITSTRING x);
void InitCharString(PS_int8STRING x);
void InitObjectid(PS_OBJECTIDENT x);
void FreeOctetString(PS_OCTETSTRING x);
void FreeBitString(PS_BITSTRING x);
void FreeCharString(PS_int8STRING x);
void FreeObjectID(PS_OBJECTIDENT x);
#endif