diff -r 000000000000 -r dd21522fd290 codhandler/codeng/src/DdEng.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codhandler/codeng/src/DdEng.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,331 @@ +/* +* 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 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: +* Implementation of class CDdEng. +* +* +*/ + + +// INCLUDE FILES + +#include "DdEng.h" +#include "CodData.h" +#include "CodError.h" +#include "CodPanic.h" +#include "CodStatus.h" +#include "DdParser.h" +#include "CodLogger.h" +#include "CodSaver.h" +#include "CodUtil.h" +#include "CodDefs.h" +#include +#include +#include + +// CONSTANTS + +_LIT8( KLicenseStartTag, "" ); + +const TInt KElementEnd( '>' ); + +/// Supported DD major version (only major number needs to be checked, 1.0) +LOCAL_D const TUint32 KDdSupportedMajorVersion = 2; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CDdEng::NewL() +// --------------------------------------------------------- +// +EXPORT_C CDdEng* CDdEng::NewL +( CEikProcess* aProcess, MCodLoadObserver* aObserver ) + { + CDdEng* model = new (ELeave) CDdEng( aObserver ); + CleanupStack::PushL( model ); + model->ConstructL( aProcess ); + CleanupStack::Pop( model ); + return model; + } + +// --------------------------------------------------------- +// CDdEng::~CDdEng() +// --------------------------------------------------------- +// +EXPORT_C CDdEng::~CDdEng() + { + CLOG(( ECodEng, 2, _L("CDdEng::~CDdEng") )); + } + +// --------------------------------------------------------- +// CDdEng::CDdEng() +// --------------------------------------------------------- +// +CDdEng::CDdEng( MCodLoadObserver* aObserver ): CCodEngBase( aObserver ) + { + CLOG(( ECodEng, 2, _L("CDdEng::CDdEng") )); + } + +// --------------------------------------------------------- +// CDdEng::CheckDataL() +// --------------------------------------------------------- +// +void CDdEng::CheckDataL() + { + CLOG(( ECodEng, 2, _L("-> CDdEng::CheckDataL") )); + if( !iData->IsValid() ) + { + // Syntactically OK, but mandatory attributes are missing. + User::Leave( KErrCodInvalidDescriptor ); + } + CLOG(( ECodEng, 4, _L("CDdEng::CheckDataL: data valid") )); + CheckVersionL( iData->Version() ); + CLOG(( ECodEng, 4, _L("CDdEng::CheckDataL: version OK") )); + CLOG(( ECodEng, 2, _L("<- CDdEng::CheckDataL") )); + } + +// --------------------------------------------------------- +// CDdEng::ParseDataL() +// --------------------------------------------------------- +// +void CDdEng::ParseDataL() + { + CLOG(( ECodEng, 2, _L("-> CDdEng::ParseDataL") )); + + __ASSERT_DEBUG( iCodBuf, CodPanic( ECodInternal ) ); + __ASSERT_DEBUG( iData, CodPanic( ECodInternal ) ); + + TDdParser parser; + TBool isLicenseTag (EFalse); + parser.ParseL( *iCodBuf, *iData, iIsDd2, isLicenseTag ); + if (isLicenseTag && iIsDd2) + { + iIsLicense = ETrue; + CreateSaverL(KDd2DataType); + ParseLicenseL(); + } + CLOG(( ECodEng, 4, _L("CDdEng::SetL: parsed OK") )); + CLOG(( ECodEng, 2, _L("<- CDdEng::ParseDataL") )); + } + +// --------------------------------------------------------- +// CDdEng::StatusCode +// --------------------------------------------------------- +// +TInt CDdEng::StatusCode( TInt aError, TState aState ) const + { + // Meaningless to fiddle with statuses after we are done. + __ASSERT_DEBUG( aState <= ENotify, CodPanic( ECodInternal ) ); + + TInt code( KHttp954LoaderError ); + + switch( aError ) + { + case KErrNone: + { + code = KHttp900Success; + break; + } + + case KErrNoMemory: + case KErrDiskFull: + { + code = KHttp910NoMemory; + break; + } + + case KErrCodInsufficientSpace: + { + code = KHttp901InsufficientMemory; + break; + } + + case KErrCancel: + case KErrAbort: + { + code = KHttp902UserCancelled; + break; + } + + case KErrCodInvalidDescriptor: + { + code = KHttp906InvalidDescriptor; + break; + } + + case KErrCodInvalidType: + { + code = KHttp907InvalidType; + break; + } + + case KErrCodUnsupportedVersion: + { + code = KHttp951InvalidDdVersion; + break; + } + + case KErrCodAttributeMismatch: + { + code = KHttp905AttributeMismatch; + break; + } + + case KBadMimeType: + case KMimeNotSupported: + { + code = aState == ESet ? + KHttp952DeviceAborted : // ESet -> COD MIME bad. + KHttp953NonAcceptableContent;// EFetch -> content MIME bad. + break; + } + case KErrCodHttpLicenseFailed: + case KErrRoapGeneral: + case KErrRoapUnsupported: + case KErrRoapServer: + case KErrRoapServerFatal: + case KErrRoapDevice: + case KErrRoapInvalidDomain: + case KErrRoapDomainFull: + case KErrRoapNotRegistered: + { + code = KHttp957LicenseFailed; + break; + } + + case KErrTimedOut: + case KErrCodHttpCommsFailed: + case KErrCodHttpNoResponse: + { + code = KHttp903LossOfService; + break; + } + + case KErrCodHttpRequestedRangeNotSatisfiable: + { + code = KHttp909RequestedRangeNotSatisfiable; + break; + } + + case KErrCodHttpPreconditionFailed: + { + code = KHttp955PreconditionFailed; + break; + } + + case KErrCodHttpBadUrl: + default: + { + code = KHttp954LoaderError; + break; + } + } + return code; + } + +// --------------------------------------------------------- +// CDdEng::StatusText() +// --------------------------------------------------------- +// +const TDesC8& CDdEng::StatusText( TInt aCode ) const + { + switch ( aCode ) + { + case KHttp900Success: return KText900Success; + case KHttp901InsufficientMemory: return KText901InsufficientMemory; + case KHttp902UserCancelled: return KText902UserCancelled; + case KHttp903LossOfService: return KText903LossOfService; + case KHttp905AttributeMismatch: return KText905AttributeMismatch; + case KHttp906InvalidDescriptor: return KText906InvalidDescriptor; + case KHttp907InvalidType: return KText907InvalidType; + case KHttp951InvalidDdVersion: return KText951InvalidDdVersion; + case KHttp952DeviceAborted: return KText952DeviceAborted; + case KHttp953NonAcceptableContent: return KText953NonAcceptableContent; + case KHttp954LoaderError: return KText954LoaderError; + case KHttp956LicenseSuccess: return KText956LicenseSuccess; + case KHttp957LicenseFailed: return KText957LicenseFailed; + case KHttp910NoMemory: return KText910NoMemory; + case KHttp955PreconditionFailed: return KText955MediaObjectUpdated; + case KHttp970MixedStatus: return KText970MixedStatus; + case KHttp981DownloadCompletion: return KText981DownloadCompletion; + default: CodPanic( ECodInternal ); + } + return KNullDesC8; /* NOTREACHED */ + } + +// --------------------------------------------------------- +// CDdEng::CheckVersionL() +// --------------------------------------------------------- +// +void CDdEng::CheckVersionL( const TDesC& aVersion ) const + { + TUint32 majorVer = 1; // If version is not specified, it defaults to 1.0. + + if( aVersion.Length() ) + { + // Version is specified, parse it to get get major version. + TLex lex( aVersion ); + TReal realVer; + TInt32 intVer; + if( lex.Val( realVer ) != KErrNone ) + { + // Could not parse version as a real number, this indicates that + // the DD-Version is some rubbish string. + User::Leave( KErrCodInvalidDescriptor ); + } + User::LeaveIfError( Math::Int( intVer, realVer ) ); + if( intVer < 0 ) + { + // Negative DD-Version? + User::Leave( KErrCodInvalidDescriptor ); + } + majorVer = STATIC_CAST( TUint32, intVer ); + } + + // For code clarity, we always check major version (even if not given and + // defaults to supported 1.0). + if( majorVer > KDdSupportedMajorVersion ) + { + User::Leave( KErrCodUnsupportedVersion ); + } + } + +// --------------------------------------------------------- +// CDdEng::ParseLicenseL() +// --------------------------------------------------------- +// +void CDdEng::ParseLicenseL() +{ + HBufC8* descriptorBuf = CodUtil::ConvertLC( iCodBuf->Des()); + TPtrC8 license; + TPtrC8 descriptor (descriptorBuf->Ptr()); + TInt startTag = descriptor.Find(KLicenseStartTag); // "' + if (endTag != KErrNotFound) + { + license.Set(descriptor.Right(descriptor.Length()-endTag-1)); + TInt licenseTagEnd = license.Find(KLicenseEndTag); // "AppendData( license ); + CleanupStack::PopAndDestroy( descriptorBuf ); +}