/** Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).* All rights reserved.* This component and the accompanying materials are made available* under the terms of the License "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: * This file contains the implementation of the directory string ASN1 object**/#include "X500dec.h"/* This file contains the implementation of the following ASN1 data structures: DirectoryString ::= CHOICE { teletexString TeletexString (SIZE (1..MAX)), printableString PrintableString (SIZE (1..MAX)), universalString UniversalString (SIZE (1..MAX)), utf8String UTF8String (SIZE (1..MAX)), bmpString BMPString (SIZE(1..MAX)) }*/TASN1DecX500DirectoryString::TASN1DecX500DirectoryString(void):iMaxLength(KMaxTInt) { }HBufC* TASN1DecX500DirectoryString::DecodeDERL(const TDesC8& aSource,TInt& aPos, TInt aMaxLength) { TPtrC8 Ptr=aSource.Right(aSource.Length()-aPos); TASN1DecGeneric gen(Ptr); gen.InitL(); aPos+=gen.LengthDER(); HBufC* Object=DecodeContentsL(gen, aMaxLength); return Object; }HBufC* TASN1DecX500DirectoryString::DecodeDERL(const TASN1DecGeneric& aSource, TInt aMaxLength) { return DecodeContentsL(aSource, aMaxLength); }HBufC* TASN1DecX500DirectoryString::DecodeContentsL(const TASN1DecGeneric& aSource, TInt aMaxLength) { HBufC* res = NULL; switch (aSource.Tag()) { case EASN1TeletexString: { TASN1DecTeletexString tStr; res = tStr.DecodeDERL(aSource); break; } case EASN1PrintableString: { TASN1DecPrintableString pStr; res = pStr.DecodeDERL(aSource); break; } case EASN1IA5String: { TASN1DecIA5String pStr; res = pStr.DecodeDERL(aSource); break; } case EASN1UTF8String: { TASN1DecUTF8String pStr; res = pStr.DecodeDERL(aSource); break; } case EASN1BMPString: { TASN1DecBMPString pStr; res = pStr.DecodeDERL(aSource); break; } default: { User::Leave(KErrNotSupported); break; } } if (res->Length() > aMaxLength) { delete res; User::Leave(KErrArgument); } return res; }void TASN1DecX500DirectoryString::SetMaxLength(TInt aLength)// perhaps this should have some kind of testing to make sure the current // contents are valid...this is not as easy as it might first appear, the // contents might be eight or sixteen bits. { iMaxLength=aLength; }