diff -r 000000000000 -r dd21522fd290 browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrCod.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrCod.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,419 @@ +/* +* Copyright (c) 2004 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 declaration of transaction observer of Download Mgr Server. +* +*/ + + +// INCLUDE FILES +#include "DownloadMgrClient.h" +#include "DownloadMgrCod.h" +#include "DownloadMgrLogger.h" +#include +#include + +// CONSTANTS +const TInt KBrowserAppUid = 0x10008D39; +// Enough data retrieved for recogntion of internal type in case of DRM +const TInt KRespSizeForRecognition = 1024; //for THttpProgressState EHttpContTypeRecognitionAvail + +const TInt KDefaultCodDownloadLength = -1; + +// GLOBAL FUNCTIONS + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CCodObserver::NewL +// --------------------------------------------------------- +// +CCodObserver* CCodObserver::NewL( RHttpDownloadMgr* aDownloadMgr ) + { + CLOG_ENTERFN_NULL("CCodObserver::NewL"); + + CCodObserver* self = new( ELeave ) CCodObserver( aDownloadMgr ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// --------------------------------------------------------- +// CCodObserver::CCodObserver +// --------------------------------------------------------- +// +CCodObserver::CCodObserver( RHttpDownloadMgr* aDownloadMgr ) + { + CLOG_CREATE; + CLOG_ENTERFN("CCodObserver::CCodObserver"); + + iDownloadMgr = aDownloadMgr; + + iCodLength = KDefaultCodDownloadLength; + iReadyForPD = EFalse; + } + +// --------------------------------------------------------- +// CCodObserver::ConstructL +// --------------------------------------------------------- +// +void CCodObserver::ConstructL() + { + CLOG_ENTERFN("CCodObserver::ConstructL"); + iFilename = HBufC::NewMaxL( KMaxPath ); + } + +// --------------------------------------------------------- +// CCodObserver::CCodObserver +// --------------------------------------------------------- +// +CCodObserver::~CCodObserver() + { + CLOG_ENTERFN("CCodObserver::~CCodObserver"); + + delete iFilename; + + CLOG_CLOSE; + } + +// --------------------------------------------------------- +// CCodObserver::CodEventL +// --------------------------------------------------------- +// +void CCodObserver::CodEventL( CCodDownload& aDownload, TEvent aEvent ) + { + CLOG_ENTERFN("CCodObserver::CodEventL"); + + TInt handle = + ( (SDMgrCodUserData*)( aDownload.UserData() ) )->iHandle; + RHttpDownload* download = NULL; + // This leaves when there is no download assotiated with handle + TRAPD( err, download = &iDownloadMgr->DownloadFromHandleL( handle ) ); + if( err ) + { + return; + } + + const TCodDownloadProgress& progress = aDownload.Progress(); + SDMgrCodUserData* ptr =(SDMgrCodUserData*)( aDownload.UserData() ); + ptr->iPrevCodEvent = aEvent; + + switch( aEvent ) + { + case EStart: + { + CLOG_WRITE( "TEvent EStart"); + download->SetCodInProgress( RHttpDownload::EInProgress ); + } + break; + + case ENameChanged: + { + CLOG_WRITE( "TEvent ENameChanged"); + + TPtrC ptr = aDownload.Name(); + download->SetStringAttribute( EDlAttrName, ptr ); + } + break; + + case ETypeChanged: + { + CLOG_WRITE( "TEvent ETypeChanged"); + + TPtrC8 ptr = aDownload.Type(); + download->SetStringAttribute( EDlAttrContentType, ptr ); + } + break; + + case EProgressUpdate: + { + CLOG_WRITE( "TEvent EProgressUpdate"); + + + TInt32 bytesCur = progress.iBytesCur; + TInt32 bytesMax = progress.iBytesMax; + + /* + * Update the length and send only if it is changed + */ + if(iCodLength != bytesMax) + { + iCodLength = bytesMax; + download->SetIntAttribute( EDlAttrLength, bytesMax ); + } + + + download->SetIntAttribute( EDlAttrDownloadedSize, bytesCur ); + + TPtrC ptr = aDownload.GetPath(); + + /* + * Store the destination file name and temprory file name so that next time send it only if it is changed + */ + if( 0 != ptr.Compare(iFilename->Des())) + { + iFilename->Des().Copy(ptr); ; + download->SetStringAttribute( EDlAttrDestFilename, ptr ); + download->SetStringAttribute( EDlAttrLocalFileName, ptr ); + } + + + if ( iReadyForPD && iDlAttrCodPdAvailableSet && ( bytesCur >= KRespSizeForRecognition ) ) + { + TInt32 numMediaObjects; + download->GetIntAttribute( EDlAttrNumMediaObjects,numMediaObjects ); + if( numMediaObjects>1 ) + { + //No progressive play for album.So don't set EDlAttrCodPdAvailable to ETrue. + download->SetBoolAttribute( EDlAttrCodPdAvailable, EFalse ); + } + else + { + download->SetBoolAttribute( EDlAttrCodPdAvailable, ETrue ); + } + + iDlAttrCodPdAvailableSet = EFalse; + } + } + break; + + case EAccept: + { + CLOG_WRITE( "TEvent EAccept"); + download->SetBoolAttribute( EDlAttrCodDescriptorAccepted, ETrue ); + TBool removableMedia = aDownload.RemovableMedia(); + download->SetBoolAttribute( EDlAttrDestRemovable, removableMedia ); + download->iASReady = ETrue; + } + break; + + case EEndLoad: + { + CLOG_WRITE( "TEvent EEndLoad"); + download->SetBoolAttribute( EDlAttrCodLoadEnd, ETrue ); + download->StopWaitingAS(); + } + break; + + case EHandlePostResponse: + { + CLOG_WRITE( "TEvent EHandlePostResponse"); + HBufC8* url8 = NULL; + TRAP( err, url8 = aDownload.GetPostResponseUrlL() ); + if( ( KErrNone == err ) && ( NULL != url8 ) ) + { + // Using NextUriOBserver() for initiating the PostResponseURL download + TRAP_IGNORE( iDownloadMgr->NextUriObserver()->NextUriL( *download, *url8 ) ); + } + } + break; + + case EDone: + { + CLOG_WRITE( "TEvent EDone"); + + download->SetCodInProgress( RHttpDownload::ENotActive ); + if ( download->IsDeleteCodWhenDone() ) + { + CLOG_WRITE( "COD done, delete DL"); +// download->Delete(); + download->StopWaitingAS(); + } + else + { + TBool doNextUrl( EFalse ); + switch( progress.iState ) + { + case TCodDownloadProgress::ESucceeded: + { + CLOG_WRITE( "TCodDownloadProgress::ESucceeded"); + + for(TInt32 i=1; ; i++) + { + TPtrC ptr = aDownload.GetDestFilePath(i); + if( ptr.Length() == 0) + { + break; + } + download->SetStringAttribute( EDlAttrDestFilename, i, ptr ); + } + + doNextUrl = ETrue; + TBool isProgressive = EFalse; + download->GetBoolAttribute( EDlAttrProgressive, isProgressive ); + // The browser client should not move the file in case of progressive download. + // It should be done by the MP/VP after the playback we be done. + if (!isProgressive) + { + download->SetIntAttribute( EDlAttrSucceeded, 0 ); + } + else + { + download->SetIntAttribute( EDlAttrSucceeded, 1 ); + } + } + break; + + case TCodDownloadProgress::EFailedTemporary: + case TCodDownloadProgress::EFailedPermanent: + { + CLOG_WRITE_FORMAT( "TCodDownloadProgress::EFailedXXX %d", progress.iError ); + + // bring the error message to forground + if( CEikonEnv::Static() ) + { + TApaTaskList taskList( CEikonEnv::Static()->WsSession() ); + TApaTask task = taskList.FindApp( TUid::Uid( KBrowserAppUid ) ); + if ( task.Exists() ) + { + task.BringToForeground(); + } + + } + + if ( progress.iError <= -1000 ) + { + download->SetOnError( KErrGeneral, (THttpDownloadMgrError)progress.iError ); + } + else + { + download->SetOnError( progress.iError ); + } + + doNextUrl = ETrue; + } + break; + + case TCodDownloadProgress::EPaused: + { + CLOG_WRITE_FORMAT( "TCodDownloadProgress::EPaused %d", progress.iError ); + download->SetCodInProgress( RHttpDownload::EPaused ); + TInt32 dlState; + download->GetIntAttribute( EDlAttrState, dlState ); + if( dlState != EHttpDlPaused) + { + download->Pause(); + + if ( progress.iError <= -1000 ) + { + download->SetOnError( KErrGeneral, (THttpDownloadMgrError)progress.iError ); + } + else + { + download->SetOnError( progress.iError ); + } + } + doNextUrl = EFalse; + } + break; + } + if( doNextUrl ) + { + // follow NextURL + if( NULL != iDownloadMgr->NextUriObserver() ) + { + HBufC8* url8 = NULL; + TRAP( err, url8 = aDownload.NextUrlL() ); + if( ( KErrNone == err ) && ( NULL != url8 ) ) + { + TRAP_IGNORE( + iDownloadMgr->NextUriObserver()->NextUriL( *download, *url8 ) ); + if( url8 ) + { + delete url8; + } + } + } + } + } + } + break; + + case EPdPlayAvailable: + { + CLOG_WRITE( "TEvent EPdPlayAvailable"); + iDlAttrCodPdAvailableSet = ETrue; + } + break; + + case EUpdatedDDURI: + { + CLOG_WRITE( "TEvent EUpdatedDDURI"); + HBufC8* updatedDDUri8 = NULL; + TRAP( err, updatedDDUri8 = aDownload.UpdatedDDUriL() ); + download->SetBoolAttribute( EDlAttrDownloadUpdatedDDUri, ETrue ); + download->SetStringAttribute( EDlAttrUpdatedDDUri, *updatedDDUri8 ); + download->SetBoolAttribute ( EDlAttrCodDownload , EFalse); + download->Start(); + } + break; + + case EResumed: + { + iReadyForPD = ETrue; + iDlAttrCodPdAvailableSet = ETrue; + } + break; + + case EDownloadPausable: + { + download->SetBoolAttribute ( EDlAttrCodPausable , ETrue); + } + break; + + case EDownloadNonPausable: + { + download->SetBoolAttribute ( EDlAttrCodPausable , EFalse); + } + break; + + case EUpdatedMediaInfo: + { + HBufC8* mediaInfo8 = NULL; + TRAP( err, mediaInfo8 = aDownload.UpdatedDownloadDataL() ); + if (mediaInfo8) + { + download->SetDownloadDataAttribute(*mediaInfo8); + delete mediaInfo8; + } + } + break; + + case ESetActiveDownload: + { + download->SetIntAttribute ( EDlAttrActiveDownload , aDownload.ActiveDownload()); + } + break; + + case EUpdatedTrackInfo: + { + HBufC8* trackInfo8 = NULL; + TInt trackIndex = 0; + TRAP( err, trackInfo8 = aDownload.UpdatedTrackDataL(trackIndex) ); + if (trackInfo8) + { + download->SetTrackDataAttribute(trackIndex, *trackInfo8); + delete trackInfo8; + } + } + break; + default: + { + __ASSERT_DEBUG( EFalse , User::Panic( _L( "DMgrServer" ), KErrNotFound ) ); + } + } + }