00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "OctetString.h"
00019
00020 using namespace CODEX_ASN1;
00021
00022 OctetString::OctetString() :
00023 Base( false ),
00024 m_asn1( 0 )
00025 {
00026 }
00027
00028 OctetString::OctetString( const ustring& value ) :
00029 Base( true ),
00030 m_value( value ),
00031 m_asn1( 0 )
00032 {
00033 m_asn1 = ASN1_OCTET_STRING_new();
00034 ASN1_OCTET_STRING_set( m_asn1,
00035 (unsigned char*)m_value.data(),
00036 m_value.length() );
00037 }
00038
00039 OctetString::OctetString( const ASN1_OCTET_STRING* asn1 ) :
00040 Base( true ),
00041 m_asn1( 0 )
00042 {
00043 m_asn1 = M_ASN1_OCTET_STRING_dup( asn1 );
00044 m_value.assign( m_asn1->data, m_asn1->length );
00045 }
00046
00047 OctetString::OctetString( const OctetString& aOS ) :
00048 Base( aOS.m_initialized ),
00049 m_value( aOS.m_value ),
00050 m_asn1( 0 )
00051 {
00052 if ( 0 != aOS.m_asn1 )
00053 {
00054 m_asn1 = M_ASN1_OCTET_STRING_dup( aOS.m_asn1 );
00055 }
00056 }
00057
00058 OctetString::~OctetString()
00059 {
00060 ASN1_OCTET_STRING_free( m_asn1 );
00061 }
00062
00063 void
00064 OctetString::operator=( const OctetString& aOS )
00065 {
00066 m_initialized = aOS.m_initialized;
00067 m_value = aOS.m_value;
00068 if ( 0 != m_asn1 )
00069 {
00070 M_ASN1_OCTET_STRING_free( m_asn1 );
00071 m_asn1 = 0;
00072 }
00073 if ( 0 != aOS.m_asn1 )
00074 {
00075 m_asn1 = M_ASN1_OCTET_STRING_dup( aOS.m_asn1 );
00076 }
00077 }
00078
00079 int
00080 OctetString::marshal( unsigned char ** pp ) const
00081 {
00082 return i2d_ASN1_OCTET_STRING( m_asn1, pp );
00083 }
00084
00085 void*
00086 OctetString::unmarshal( void* bogus, unsigned char** pp, long length )
00087 {
00088 if ( m_initialized )
00089 {
00090 return NULL;
00091 }
00092 if ( 0 == d2i_ASN1_OCTET_STRING( &m_asn1, (unsigned char**)pp, length ) )
00093 {
00094 return NULL;
00095 }
00096 m_value.assign( m_asn1->data, m_asn1->length );
00097 m_initialized = true;
00098 return this;
00099 }