diff -r 000000000000 -r 164170e6151a cms/src/CCMSEncapsulatedContentInfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/src/CCMSEncapsulatedContentInfo.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDE FILES +#include "CCMSEncapsulatedContentInfo.h" +#include +#include + +// CONSTANTS +const TInt KMinNumberOfSubModules = 1; +const TInt KMaxNumberOfSubModules = 2; +const TUint8 KContentTag = 0; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::CCMSEncapsulatedContentInfo +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSEncapsulatedContentInfo::CCMSEncapsulatedContentInfo() + { + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSEncapsulatedContentInfo::ConstructL() + { + // creating with empty values + CCMSContentInfo::ConstructL(); + SetContentL( NULL ); + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSEncapsulatedContentInfo::ConstructL( + const TDesC& aContentType, + const TDesC8* aContent ) + { + CCMSContentInfo::ConstructL( aContentType ); + SetContentL( aContent ); + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSEncapsulatedContentInfo* CCMSEncapsulatedContentInfo::NewL() + { + CCMSEncapsulatedContentInfo* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSEncapsulatedContentInfo* CCMSEncapsulatedContentInfo::NewLC() + { + CCMSEncapsulatedContentInfo* self = new( ELeave ) CCMSEncapsulatedContentInfo(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSEncapsulatedContentInfo* CCMSEncapsulatedContentInfo::NewL( + const TDesC& aContentType, + const TDesC8* aContent ) + { + CCMSEncapsulatedContentInfo* self = NewLC( aContentType, aContent ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSEncapsulatedContentInfo* CCMSEncapsulatedContentInfo::NewLC( + const TDesC& aContentType, + const TDesC8* aContent ) + { + CCMSEncapsulatedContentInfo* self = new( ELeave ) CCMSEncapsulatedContentInfo(); + CleanupStack::PushL( self ); + self->ConstructL( aContentType, aContent ); + return self; + } + +// Destructor +CCMSEncapsulatedContentInfo::~CCMSEncapsulatedContentInfo() + { + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::DecodeL +// Decrypts raw data to this instance +// ----------------------------------------------------------------------------- +void CCMSEncapsulatedContentInfo::DecodeL( const TDesC8& aRawData ) + { + CArrayPtr* itemsData = DecodeSequenceLC( aRawData, + KMinNumberOfSubModules, + KMaxNumberOfSubModules ); + // we would not get this far if there is not atleast one + // decoding attribute type + TASN1DecObjectIdentifier decOid; + HBufC* oid = decOid.DecodeDERL( *itemsData->At( 0 ) ); + delete iContentType; + iContentType = oid; + + // decoding possible content + HBufC8* contDesc = NULL; + if( itemsData->Count() > 1 ) + { + TASN1DecGeneric taggedContent( *itemsData->At( 1 ) ); + if( taggedContent.Tag() != KContentTag ) + { + User::Leave( KErrArgument ); + } + TASN1DecOctetString content; + TInt pos = 0; + contDesc = content.DecodeDERL( taggedContent.GetContentDER(), pos ); + } + delete iContent; + iContent = contDesc; + CleanupStack::PopAndDestroy( itemsData ); + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::EncoderLC +// Returns ASN1 encoder for this instance +// ----------------------------------------------------------------------------- + +CASN1EncBase* CCMSEncapsulatedContentInfo::EncoderLC() const + { + CASN1EncSequence* root = CASN1EncSequence::NewLC(); + + // add attribute type + CASN1EncObjectIdentifier* oid = CASN1EncObjectIdentifier::NewLC( *iContentType ); + root->AddAndPopChildL( oid ); + + // add possible content + if( iContent ) + { + CASN1EncOctetString* content = CASN1EncOctetString::NewL( *iContent ); + // explicitly tagged to 0 + // Takes ownership of the encoder, *including* the case when + // this method leaves. + CASN1EncExplicitTag* explicitTag = + CASN1EncExplicitTag::NewLC( content, KContentTag ); + root->AddAndPopChildL( explicitTag ); + } + return root; + } +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::Content +// Getter for content +// ----------------------------------------------------------------------------- +EXPORT_C const TDesC8* CCMSEncapsulatedContentInfo::Content() const + { + return iContent; + } + +// ----------------------------------------------------------------------------- +// CCMSEncapsulatedContentInfo::SetContentL +// Setter for content, takes copy +// ----------------------------------------------------------------------------- +EXPORT_C void CCMSEncapsulatedContentInfo::SetContentL( const TDesC8* aContent ) + { + HBufC8* tmp = NULL; + if( aContent ) + { + tmp = aContent->AllocL(); + } + delete iContent; + iContent = tmp; + } + +// End of File