diff -r 000000000000 -r dd21522fd290 codhandler/codeng/src/RoapSaver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codhandler/codeng/src/RoapSaver.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,480 @@ +/* +* Copyright (c) 2005 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 CRoapSaver. +* +*/ + + +// INCLUDE FILES + +#include +#include +#include "RoapSaver.h" +#include "RoapData.h" +#include "CodLoadObserver.h" +#include "CodLogger.h" +#include "CodError.h" +#include "CodPanic.h" +#include "CodProgress.h" +#include "CodData.h" +#include + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CRoapSaver::NewL() +// --------------------------------------------------------- +// +CRoapSaver* CRoapSaver::NewL + ( + const TDesC8& aType, + CRoapData*& aData, + TCodProgress* aProgress, + TInt aProgressBytes, + const TFileName& aTempPath, + const TFileName& aRootPath, + const TFileName& aFname + ) + { + CRoapSaver* saver = new (ELeave) CRoapSaver + ( aType, aData, aProgress, aProgressBytes, aTempPath, aRootPath, aFname ); + CleanupStack::PushL( saver ); + saver->ConstructL(); + CleanupStack::Pop( saver ); + return saver; + } + +// --------------------------------------------------------- +// CRoapSaver::~CRoapSaver() +// --------------------------------------------------------- +// +CRoapSaver::~CRoapSaver() + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::~CRoapSaver") )); + delete iEng; + delete iBuf; + CLOG(( ECodEng, 2, _L("<- CRoapSaver::~CRoapSaver") )); + } + +// --------------------------------------------------------- +// CRoapSaver::OpenStoreL() +// --------------------------------------------------------- +// +void CRoapSaver::OpenStoreL() + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::OpenStoreL") )); + __ASSERT_DEBUG( iState == EInit, CodPanic( ECodInternal ) ); + __ASSERT_DEBUG( !iBuf, CodPanic( ECodInternal ) ); + iSize = 0; + iState = EStoreOpen; + CLOG(( ECodEng, 2, _L("<- CRoapSaver::OpenStoreL") )); + } + +// --------------------------------------------------------- +// CRoapSaver::AppendData() +// --------------------------------------------------------- +// +TInt CRoapSaver::AppendData( const TDesC8& aData ) + { + CLOG(( ECodEng, 4, \ + _L("-> CRoapSaver::AppendData (%d) bytes"), aData.Length() )); +//TODO: iState = EInstalling for dd2 __ASSERT_DEBUG( iState == EStoreOpen, CodPanic( ECodInternal ) ); + TInt err = CheckMaxSize( aData.Size() ); + if ( !err ) + { + TInt needed = iSize + aData.Length(); + if ( !iBuf ) + { + iBuf = HBufC8::New( needed ); + if ( !iBuf ) + { + err = KErrNoMemory; + } + } + if ( !err && needed > iBuf->Des().MaxLength() ) + { + HBufC8* buf = iBuf->ReAlloc( needed ); + if ( buf ) + { + iBuf = buf; + } + else + { + err = KErrNoMemory; + } + } + if ( !err ) + { + iBuf->Des().Append( aData ); + iSize += aData.Length(); + } + } + CLOG(( EHttpLoad, 2, _L("<- CFileSaver::AppendData returns (%d)"), err )); + return err; + } + +// --------------------------------------------------------- +// CRoapSaver::CloseStore() +// --------------------------------------------------------- +// +void CRoapSaver::CloseStore() + { + CLOG(( ECodEng, 2, _L("CRoapSaver::CloseStore") )); + iState = EStoreClosed; + } + +// --------------------------------------------------------- +// CRoapSaver::CheckResponseAttributesL() +// --------------------------------------------------------- +// +void CRoapSaver::CheckResponseAttributesL( const CCodData& /*aData*/ ) + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::CheckResponseAttributesL") )); +//TODO: tmp EInstalling for dd2 __ASSERT_DEBUG( iState == EStoreClosed, CodPanic( ECodInternal ) ); +#ifdef __TEST_COD_LOG + TPtrC8 mime( iType.Des8() ); + CLOG(( ECodEng, 4, _L8(" MIME==<%S>, size(%d)"), &mime, iSize )); +#endif /* def __TEST_COD_LOG */ + + if ( !iSize ) + { + CLOG(( ECodEng, 4, _L(" 0 bytes data") )); + User::Leave( KErrCodAttributeMismatch ); + } + + // Compare content MIME type against descriptor. + + // Size is not checked, no exact match is required. Quote form spec: + // "The storage size and the execution size are dependent on the + // environment and may be different from the value of the size attribute. + // The transport size may also be different, if compression or some + // packaging format is used." + // + // There is a safety upper bound on the transaction size, that is already + // applied. See SetMaxSize(). + + +// TODO (??) type not checked, ROAP Trigger is always accepted. +// HACK HACK DRM HACK +// if( iType != TDataType( aData.Type() ) ) +// { +// CLOG(( ECodEng, 4, _L(" mismatch") )); +// User::Leave( KErrCodAttributeMismatch ); +// } + + iState = ERespChecked; + CLOG(( ECodEng, 2, _L("<- CRoapSaver::CheckResponseAttributesL (match)") )); + } + +// --------------------------------------------------------- +// CRoapSaver::InstallL() +// --------------------------------------------------------- +// +void CRoapSaver::InstallL( TRequestStatus* aStatus, const TDesC& aName, const TBool /*aAttached*/ ) + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::InstallL") )); +//TODO: __ASSERT_DEBUG( iState == ERespChecked, CodPanic( ECodInternal ) ); + __ASSERT_ALWAYS( aStatus, CodPanic( ECodInternal ) ); + __ASSERT_DEBUG( iBuf, CodPanic( ECodInternal ) ); +//TODO: __ASSERT_DEBUG( iType == TDataType( KOma2TriggerContentType ), \ +// CodPanic( ECodInternal ) ); + +#ifdef __TEST_COD_LOG + TPtrC8 ptr( iBuf->Des() ); + CDUMP(( ECodEng, 2, _S("Trigger:"), _S(" "), \ + (const TUint8*)ptr.Ptr(), ptr.Size() )); +#endif /* def __TEST_COD_LOG */ + + iContentName.Set( aName ); // TODO, must presist - use CodData instead? + __ASSERT_DEBUG( !iEng, CodPanic( ECodInternal ) ); + iEng = Roap::CRoapEng::NewL(); + if ( iData ) + { + iData->Reset(); + } + else + { + iData = CRoapData::NewL(); + } + iEng->SetTriggerL + ( + *iBuf, + iParams, + iData->iType, + iData->iContextStatus, + iData->iDomainOperation, + iData->iContentIdList + ); + +//TODO: __ASSERT_DEBUG( !iData->iRiAlias, CodPanic( ECodInternal ) ); + if ( iEng->Trigger().iRiAlias ) + { + iData->iRiAlias = iEng->Trigger().iRiAlias->AllocL(); + } + +#ifdef __TEST_COD_LOG + CLOG(( ECodEng, 3, _L(" Type(%d)"), iData->iType )); + CLOG(( ECodEng, 3, _L(" ContextStatus(%d)"), iData->iContextStatus )); + CLOG(( ECodEng, 3, _L(" DomainOp(%d)"), iData->iDomainOperation )); + for ( TInt i = 0; i < iData->iContentIdList.Count(); i++ ) + { + ptr.Set( iData->iContentIdList[i]->Des() ); + CLOG(( ECodEng, 3, _L8(" ContentId #%d <%S>"), i, &ptr )); + } + if ( iData->iRiAlias ) + { + ptr.Set( iData->iRiAlias->Des() ); + CLOG(( ECodEng, 3, _L8(" RiAlias <%S>"), &ptr )); + } + else + { + CLOG(( ECodEng, 3, _L8(" RiAlias NULL") )); + } +#endif /* def __TEST_COD_LOG */ + + if ( iObserver ) + { + CLOG(( ECodEng, 3, \ + _L("CRoapSaver::StartRoapL notify RoapTriggerParsedL") )); + iObserver->RoapTriggerParsedL( *iData ); + } + + // CodHandler implements 'auto-accept' for ROAP Trigger. + // ROAP is initiated without user interaction. + iEng->AcceptL( this, aStatus ); + iState = EInstalling; + + CLOG(( ECodEng, 2, _L("<- CRoapSaver::InstallL") )); + } + +// --------------------------------------------------------- +// CRoapSaver::CancelInstall() +// --------------------------------------------------------- +// +void CRoapSaver::CancelInstall() + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::CancelInstall") )); + if ( iEng ) + { + iEng->Cancel(); + } + CLOG(( ECodEng, 2, _L("<- CRoapSaver::CancelInstall") )); + } + +// --------------------------------------------------------- +// CRoapSaver::ReleaseContent() +// --------------------------------------------------------- +// +void CRoapSaver::ReleaseContent( TFileName& aFname, TUid& aHandler ) + { + CLOG(( ECodEng, 2, _L("CRoapSaver::ReleaseContent") )); + // Note: assert EInstalling state, not EInstalled. This object never gets + // EInstalled as the request status is not ours -> it does not know + // when installing is completed. +//TODO: EStoreClose for dd2 __ASSERT_DEBUG( iState == EInstalling, CodPanic( ECodInternal ) ); + aFname = iFname; + aHandler = iHandler; + iFname = KNullDesC; + iHandler = KNullUid; + iContentName.Set( KNullDesC ); + delete iEng; + iEng = NULL; + iState = EInit; + } + +// --------------------------------------------------------- +// CRoapSaver::ReleaseFileName() +// --------------------------------------------------------- +// +void CRoapSaver::ReleaseFileName( TFileName& /*aFname*/) +{ +} + +// --------------------------------------------------------- +// CRoapSaver::Cleanup() +// --------------------------------------------------------- +// +void CRoapSaver::Cleanup( TBool /* aDeleteFile */) + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::Cleanup") )); + if ( iEng ) + { + iEng->Cancel(); +#ifdef __TEST_COD_LOG + TInt err = // ('Log-only' variable.) +#endif /* def __TEST_COD_LOG */ + iEng->DoCleanup(); + CLOG(( ECodEng, 2, _L(" CRoapSaver::Cleanup err(%d)"), err )); + delete iEng; + iEng = NULL; + } + iContentName.Set( KNullDesC ); + iState = EInit; + CLOG(( ECodEng, 2, _L("<- CRoapSaver::Cleanup") )); + } + +// --------------------------------------------------------- +// CRoapSaver::CRoapSaver() +// --------------------------------------------------------- +// +CRoapSaver::CRoapSaver + ( + const TDesC8& aType, + CRoapData*& aData, + TCodProgress* aProgress, + TInt aProgressBytes, + const TFileName& aTempPath, + const TFileName& aRootPath, + const TFileName& aFname + ) +: CCodSaver( aType ), + iData( aData ), + iProgress( aProgress ), + iProgressBytes( aProgressBytes ), + iTempPath( aTempPath ), + iRootPath( aRootPath ), + iFname( aFname) + { + CLOG(( ECodEng, 2, _L("*** CRoapSaver::CRoapSaver") )); + } + +// ---------------------------------------------------------- +// CRoapSaver::ConnectionConfL() +// ---------------------------------------------------------- +// +TBool CRoapSaver::ConnectionConfL() + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::ConnectionConfL") )); + TBool conf( EFalse ); + if ( iObserver ) + { + CLOG(( ECodEng, 3, \ + _L("CRoapSaver::ConnectionConfL notify ConnectionConfL") )); + conf = iObserver->ConfirmConnectL(); + } + CLOG(( ECodEng, 2, _L("<- CRoapSaver::ConnectionConfL (%d)"), conf )); + return conf; + } + +// ---------------------------------------------------------- +// CRoapSaver::ContactRiConfL() +// ---------------------------------------------------------- +// +TBool CRoapSaver::ContactRiConfL() + { + CLOG(( ECodEng, 2, _L("CRoapSaver::ContactRiConfL") )); + // CodHandler implements 'auto-accept' for ROAP Trigger. + return ETrue; + } + +// ---------------------------------------------------------- +// CRoapSaver::TransIdConfL() +// ---------------------------------------------------------- +// +TBool CRoapSaver::TransIdConfL() + { + CLOG(( ECodEng, 2, _L("CRoapSaver::TransIdConfL") )); + return EFalse; + } + +// ---------------------------------------------------------- +// CRoapSaver::RightsObjectDetailsL() +// ---------------------------------------------------------- +// +void CRoapSaver::RightsObjectDetailsL +( const RPointerArray& /*aRightsList*/ ) + { + CLOG(( ECodEng, 2, _L("CRoapSaver::RightsObjectDetailsL") )); + } + +// ---------------------------------------------------------- +// CRoapSaver::ContentDownloadInfoL() +// ---------------------------------------------------------- +// +void CRoapSaver::ContentDownloadInfoL +( TPath& aTempFolder, TFileName& aContentName, TInt& aMaxSize ) + { + aTempFolder = iTempPath; + aContentName = iContentName; + aMaxSize = iMaxSize; // TODO must to be set. + } + +// ---------------------------------------------------------- +// CRoapSaver::ContentDetailsL() +// ---------------------------------------------------------- +// +void CRoapSaver::ContentDetailsL +( const TDesC& aPath, const TDesC8& aType, const TUid& aAppUid ) + { + iFname = aPath; + iType = aType; + iHandler = aAppUid; + } + +// ---------------------------------------------------------- +// CRoapSaver::HandleDCFPartL() +// ---------------------------------------------------------- +// +void CRoapSaver::HandleDCFPartL( const TDesC8& /*aFilename*/ ) + { + CLOG(( ECodEng, 2, _L("CRoapSaver::HandleDCFPartL") )); + // DRM Engine does not support multipart ROAP response yet. + // This method will never be called. + User::Leave( KErrNotSupported ); + } + +// ---------------------------------------------------------- +// CRoapSaver::RoapProgressInfoL() +// ---------------------------------------------------------- +// +void CRoapSaver::RoapProgressInfoL( const TInt aProgressInfo ) + { + CLOG(( ECodEng, 2, _L("CRoapSaver::RoapProgressInfoL (%d)"), \ + aProgressInfo )); + if ( iProgress ) + { + iProgress->SetAmountL( aProgressInfo ); + } + } + + +// ---------------------------------------------------------- +// CRoapSaver::ErrorUrlL() +// ---------------------------------------------------------- +// +void CRoapSaver::ErrorUrlL( const TDesC8& /* aErrorUrl */) +{ + +} +// ---------------------------------------------------------- +// CRoapSaver::PostResponseUrlL() +// ---------------------------------------------------------- +// +void CRoapSaver::PostResponseUrlL( const TDesC8& aPrUrl ) + { + CLOG(( ECodEng, 2, _L("-> CRoapSaver::PostResponseUrlL") )); + CLOG(( ECodEng, 2, _L("aPrUrl = '%S'"), &aPrUrl )); + + //Send an event to MCodLoadObserver which sends an event to DownloadMgr, which handles the + // PostResponse URL like NextUriL. + if ( iObserver ) + { + iObserver->HandleRoapPostResponseUrlL( aPrUrl ); + } + + CLOG(( ECodEng, 2, _L("<- CRoapSaver::PostResponseUrlL") )); + + } + +