--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/enhancedmediaclient/Client/src/Components/ClientProgDLSource/ClientProgDLSource.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,569 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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 the ClientProgDLSource class.
+*
+*/
+
+
+#include <e32std.h>
+#include <MCustomCommand.h>
+#include <SourceControlObserver.h>
+#include "ClientProgDLSource.h"
+#include "EventNotifier.h"
+#include "EventAO.h"
+#include "ErrorCode.h"
+#include "ProgDLSourceUid.h"
+
+#define RETURN_IF_ERROR(x) if(x != KErrNone) return x
+
+// CONSTANTS
+const TInt KLocalFile = -1;
+const TInt KTranferRateMonitorFrequency = 2;
+const TInt KFileSizeChangeDelta = 10000;
+const TInt KNofityAfterPercentage = 5;
+
+using namespace multimedia;
+
+CClientProgDLSource::CClientProgDLSource()
+ {
+ iSourceState = CMultimediaDataSource::ECLOSED;
+ isDownloadComplete = false;
+ iProgressiveMode = false;
+ }
+
+CClientProgDLSource::~CClientProgDLSource()
+ {
+ delete iEventNotifier;
+ delete iMonitor;
+ delete iFileName;
+
+ if(iStateEvent->IsActive())
+ {
+ iStateEvent->Cancel();
+ }
+
+ delete iStateEvent;
+ }
+
+TInt CClientProgDLSource::PostConstructor()
+ {
+ TInt status(KErrNone);
+ // Make sure this doesn't get called second time around.
+ if ( !iEventNotifier )
+ {
+ TRAP(status, iEventNotifier = CEventNotifier::NewL());
+ }
+
+ RETURN_IF_ERROR(status);
+
+ TRAP(status, iStateEvent = CEventAO::NewL(*this));
+
+ return status;
+ }
+
+TInt CClientProgDLSource::AddObserver( MControlObserver& aObserver )
+ {
+ return iEventNotifier->AddObserver( aObserver );
+ }
+
+TInt CClientProgDLSource::RemoveObserver( MControlObserver& aObserver )
+ {
+ return iEventNotifier->RemoveObserver( aObserver );
+ }
+
+TUid CClientProgDLSource::Type()
+ {
+ return KProgDLSourceControl;
+ }
+
+TControlType CClientProgDLSource::ControlType()
+ {
+ return ESourceControl;
+ }
+
+TInt CClientProgDLSource::GetSize( TUint& aSize )
+ {
+ TInt status(KErrNone);
+ aSize = iSourceSize;
+ return status;
+ }
+
+TInt CClientProgDLSource::GetMimeType( TDes8& aMimeType )
+ {
+ TInt status = iDownloadGateway->GetMimeType(iDownloadId,aMimeType);
+ return status;
+ }
+
+TInt CClientProgDLSource::Close()
+ {
+ TInt status(KErrNone);
+ if(iMonitor)
+ {
+ iMonitor->Stop();
+ }
+ // Reset the Progressive Mode flag always
+ iDownloadGateway->SetProgressiveMode(iDownloadId,EFalse);
+ iProgressiveMode = EFalse;
+ iDownloadId = 0;
+ iCurrentBytes = 0;
+ isDownloadPaused = EFalse;
+ isDownloadComplete = EFalse;
+ iCurrentSize = 0;
+ iSourceSize = 0;
+ iServerSourceExists = EFalse;
+ return status;
+ }
+
+TInt CClientProgDLSource::SetDownloadGateway(CDownloadGateway* aDownloadGateway)
+ {
+ iDownloadGateway = aDownloadGateway;
+ return KErrNone;
+ }
+
+
+TInt CClientProgDLSource::Open(const TDesC& aFileName,TInt32 aDLTxId )
+ {
+ TInt status(KErrNone);
+ if(aDLTxId != KLocalFile)
+ {
+ status = iDownloadGateway->ConnectToDownload(aDLTxId,*this,KNullUid);
+ if(status == KErrNone)
+ {
+ iDownloadId = aDLTxId;
+ isDownloadComplete = EFalse;
+ //Gets current downloaded size
+ status = iDownloadGateway->GetDownloadSize(iDownloadId,iSourceSize);
+ RETURN_IF_ERROR(status);
+ }
+ else
+ {
+ iDownloadId = 0;
+ return status;
+ }
+ }
+ else
+ {
+ isDownloadComplete = ETrue;
+ }
+
+ if(iFileName)
+ {
+ delete iFileName;
+ iFileName = NULL;
+ }
+
+ TRAP(status,iFileName = HBufC::NewL(aFileName.Size()));
+
+ if(!status)
+ {
+ TPtr des = iFileName->Des();
+ des.Copy(aFileName);
+ }
+
+ return status;
+ }
+
+TInt CClientProgDLSource::MoveFile(const TDesC& aDestFileName )
+ {
+ TInt status(KErrNone);
+ iDestFileName.Copy(aDestFileName);
+ status = iDownloadGateway->MoveFile(iDownloadId,aDestFileName);
+ return status;
+ }
+
+TInt CClientProgDLSource::IsDownloadComplete(TBool& aBool)
+ {
+ TInt status(KErrNone);
+
+ TDownloadStatus dlStatus;
+ status = iDownloadGateway->GetDownloadStatus(iDownloadId,dlStatus);
+ if(dlStatus == ECompleted)
+ {
+ aBool = true;
+ }
+ else
+ {
+ aBool = false;
+ }
+
+ return status;
+ }
+
+TInt CClientProgDLSource::GetPercentageDownloaded(TUint& aPercent)
+ {
+ TInt status(KErrNone);
+ TUint curSize;
+ TUint fullSize;
+ if(!isDownloadComplete)
+ {
+ status = iDownloadGateway->GetCurrentSize(iDownloadId,curSize);
+ RETURN_IF_ERROR(status);
+ status = iDownloadGateway->GetDownloadSize(iDownloadId,fullSize);
+ RETURN_IF_ERROR(status);
+ }
+ else
+ {
+ curSize = iCurrentSize;
+ fullSize = iSourceSize;
+ }
+
+ if(fullSize)
+ {
+ aPercent = (curSize*100/fullSize);
+ }
+ else
+ {
+ aPercent = 0;
+ }
+ return status;
+ }
+
+TInt CClientProgDLSource::GetDownloadingRate(TUint& aRate)
+ {
+ TInt status(KErrNone);
+ if(iMonitor)
+ {
+ aRate = iMonitor->TransferRate();
+ }
+ else
+ {
+ status = KErrNotFound;
+ }
+ return status;
+ }
+
+TInt CClientProgDLSource::GetCurrentFileSize( TUint& aSize )
+ {
+ TInt status(KErrNotFound);
+ if(!isDownloadComplete)
+ {
+ status = iDownloadGateway->GetCurrentSize(iDownloadId,aSize);
+ }
+ else
+ {
+ iCurrentSize = iSourceSize;
+ status = KErrNone;
+ }
+ return status;
+ }
+
+TInt CClientProgDLSource::GetExpectedFileSize( TUint& aSize )
+ {
+ TInt status(KErrNotFound);
+ if(!isDownloadComplete)
+ {
+ status = iDownloadGateway->GetDownloadSize(iDownloadId,aSize);
+ }
+ else
+ {
+ aSize = iSourceSize;
+ status = KErrNone;
+ }
+ return status;
+ }
+
+MProgDLSource::TDownloadStatus CClientProgDLSource::GetDownloadStatus()
+ {
+ MProgDLSource::TDownloadStatus dlStatus;
+ iDownloadGateway->GetDownloadStatus(iDownloadId,dlStatus);
+ return dlStatus;
+ }
+
+
+TInt CClientProgDLSource::GetPercentageBuffered(TUint& aPercent)
+ {
+ //Source Custom Command
+ TPckgBuf<TUint> pckg;
+ if(iServerSourceExists)
+ {
+ iCustomCommand->CustomCommandSync( iSourceHandle, EGetPercentageBuffered, KNullDesC8, KNullDesC8, pckg );
+ aPercent = pckg();
+ return KErrNone;
+ }
+ else
+ {
+ aPercent = 0;
+ return KErrNotFound;
+ }
+ }
+
+TInt CClientProgDLSource::GetBitRate(TUint& aRate)
+ {
+ //Source Custom Command
+ TPckgBuf<TUint> pckg;
+ if(iServerSourceExists)
+ {
+ iCustomCommand->CustomCommandSync( iSourceHandle, EGetBitRate, KNullDesC8, KNullDesC8, pckg );
+ aRate = pckg();
+ return KErrNone;
+ }
+ else
+ {
+ aRate = 0;
+ return KErrNotFound;
+ }
+ }
+
+TInt CClientProgDLSource::FileName(TPtr& aFileName)
+ {
+ TInt status(KErrNone);
+ aFileName.Set(iFileName->Des());
+ return status;
+ }
+
+
+TInt CClientProgDLSource::CancelDownload()
+ {
+ TInt status(KErrNone);
+ status = iDownloadGateway->DeleteDownload(iDownloadId);
+ return status;
+ }
+
+TInt CClientProgDLSource::ResumeDownload()
+ {
+ TInt status(KErrNone);
+ if(isDownloadPaused)
+ {
+ iDownloadGateway->ResumeDownload(iDownloadId);
+ }
+ return status;
+ }
+
+void CClientProgDLSource::ServerSourceCreated( MCustomCommand& aCustomCommand,
+ TMMFMessageDestination& aSourceHandle )
+ {
+ iServerSourceExists = ETrue;
+ iCustomCommand = &aCustomCommand;
+ iSourceHandle = aSourceHandle;
+
+ if(!isDownloadComplete)
+ {
+ TRAPD(err1,iMonitor = CTransferRateMonitor::NewL(*this, KTranferRateMonitorFrequency, KFileSizeChangeDelta));
+ if(!err1)
+ {
+ iMonitor->Start();
+ }
+
+ // Send data to server source
+ TPckgBuf<TInt> pckg(iSourceSize);
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetActualSize, pckg, KNullDesC8 );
+
+ iStateEvent->SetActive();
+ iStatePckg() = iSourceState;
+ iCustomCommand->CustomCommandAsync(
+ iSourceHandle,
+ (TInt)EGetSourceState,
+ iStatePckg,
+ KNullDesC8,
+ iStatePckg,
+ iStateEvent->iStatus);
+
+ }
+ else
+ {
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetDownloadState, KNullDesC8, KNullDesC8 );
+ }
+ }
+
+void CClientProgDLSource::ServerSourceDeleted()
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CClientProgDLSource::ServerSourceDeleted()"));
+#endif
+ iServerSourceExists = EFalse;
+ iCustomCommand = NULL;
+
+ if(iMonitor)
+ {
+ iMonitor->Stop();
+ }
+ }
+
+TBool CClientProgDLSource::IsEncrypted()
+ {
+ return EFalse;
+ }
+
+TUid CClientProgDLSource::GetSourceUid()
+ {
+ return KMmfProgDLSource;
+ }
+
+TInt CClientProgDLSource::GetHeaderData(TPtr& /*aPtr*/)
+ {
+ return KErrNotSupported;
+ }
+
+void CClientProgDLSource::MoveFileComplete(TInt aError)
+ {
+ if(iServerSourceExists)
+ {
+ TPtr des = iFileName->Des();
+ if(aError == KErrNone)
+ {
+ des.Copy(iDestFileName);
+ }
+ else
+ {
+ iDownloadGateway->GetLocalFileName(iDownloadId,des);
+ }
+ TPckgBuf<TFileName> pckg(iDestFileName);
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetUpdateFileName, pckg, KNullDesC8 );
+ }
+
+ CErrorCode* event1 = new CErrorCode( aError );
+ iEventNotifier->Event(this,MSourceControlObserver::KFileMoveCompleteEvent,event1);
+ }
+
+void CClientProgDLSource::Event(TDownloadStatus aStatus)
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CClientProgDLSource::Event DownloadStatus[%d]"),aStatus);
+#endif
+
+ switch(aStatus)
+ {
+ case ECompleted:
+ {
+ if(iMonitor)
+ {
+ iMonitor->Stop();
+ }
+ TUint size(0);
+ GetCurrentFileSize(size);
+ TInt value = size;
+ TPckgBuf<TInt> pckg(value);
+ if(iServerSourceExists)
+ {
+ if (iSourceState != CMultimediaDataSource::ESTOPPED)
+ {
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetDownloadSize, pckg, KNullDesC8 );
+ }
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetDownloadState, KNullDesC8, KNullDesC8 );
+ }
+ isDownloadComplete = ETrue;
+ break;
+ }
+ case EStarted:
+ {
+ isDownloadPaused = EFalse;
+ break;
+ }
+ case EPaused:
+ {
+ isDownloadPaused = ETrue;
+ break;
+ }
+ case EDeleted:
+ {
+ if(iMonitor)
+ {
+ iMonitor->Stop();
+ }
+ break;
+ }
+
+ case EUnknown:
+ break;
+
+ }
+ //Send only Known Events
+ if(aStatus != EUnknown)
+ {
+ CErrorCode* event1 = new CErrorCode( KErrNone );
+ iEventNotifier->Event(this,MSourceControlObserver::KDownloadStatusChangedEvent,event1);
+ }
+ }
+
+TInt CClientProgDLSource::GetCurrentSize( TUint& aCurrentSize )
+ {
+ //RDebug::Print(_L("CClientProgDLSource::GetCurrentSize"));
+ TUint value(0);
+ GetExpectedFileSize(value);
+
+ GetCurrentFileSize(aCurrentSize);
+
+ if(aCurrentSize - iCurrentBytes > ((KNofityAfterPercentage/100) * value)) //Currently checking for 5%
+ {
+ iCurrentBytes = aCurrentSize;
+ CErrorCode* event1 = new CErrorCode( KErrNone );
+ iEventNotifier->Event(this,MSourceControlObserver::KPercentageDownloadedChangedEvent,event1);
+ }
+
+ iCurrentSize = aCurrentSize;
+
+ if ( iServerSourceExists && iSourceState != CMultimediaDataSource::ESTOPPED)
+ {
+ // Send data to server source
+
+ TPckgBuf<TInt> pckg(iCurrentSize);
+ iCustomCommand->CustomCommandSync( iSourceHandle, ESetDownloadSize, pckg, KNullDesC8 );
+
+ }
+#ifdef _DEBUG
+ RDebug::Print(_L("CClientProgDLSource::GetCurrentSize:[%d]"), aCurrentSize);
+#endif
+
+ return KErrNone;
+ }
+
+void CClientProgDLSource::TransferRateChanged()
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CClientProgDLSource::TransferRateChanged:[%d]"), iMonitor->TransferRate());
+#endif
+ if ( iServerSourceExists && !isDownloadComplete && iSourceState != CMultimediaDataSource::ESTOPPED)
+ {
+ // Send data to server source
+
+ TPckgBuf<TUint> pckg1(iMonitor->TransferRate());
+ iCustomCommand->CustomCommandSync( iSourceHandle, EDownloadRate, pckg1, KNullDesC8 );
+
+ }
+ }
+
+void CClientProgDLSource::SourceStateChanged()
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CClientProgDLSource::SourceStateChanged() :PrevState[%d] NewState[%d]"), iSourceState,iStatePckg());
+#endif
+ iSourceState = iStatePckg();
+
+ if(iSourceState == CMultimediaDataSource::ESTOPPED || iSourceState == CMultimediaDataSource::ECLOSED)
+ {
+ //iDownloadGateway->SetProgressiveMode(iDownloadId,EFalse);
+ iProgressiveMode = EFalse;
+ }
+ else if(!iProgressiveMode && !isDownloadComplete)
+ {
+ iDownloadGateway->SetProgressiveMode(iDownloadId,ETrue);
+ TPtr ptrFileName = iFileName->Des();
+ iDownloadGateway->SetLocalFileName( iDownloadId, ptrFileName );
+ iProgressiveMode = ETrue;
+ }
+
+
+ if(iStateEvent->Error() != KErrDied && iServerSourceExists)
+ {
+ iStateEvent->SetActive();
+ iCustomCommand->CustomCommandAsync(
+ iSourceHandle,
+ (TInt)EGetSourceState,
+ iStatePckg,
+ KNullDesC8,
+ iStatePckg,
+ iStateEvent->iStatus);
+ }
+ }
+// End of file