--- /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 <apgtask.h>
+#include <eikenv.h>
+
+// 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 ) );
+ }
+ }
+ }