diff -r 491b3ed49290 -r 65326cf895ed filemanager/Engine/src/CFileManagerIRReceiver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/Engine/src/CFileManagerIRReceiver.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,604 @@ +/* +* Copyright (c) 2002-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: Receives obex object via InfraRed, used to receive files +* +*/ + + +// INCLUDE FILES +#include +#include "CFileManagerIRReceiver.h" +#include "MFileManagerProcessObserver.h" +#include "CFileManagerEngine.h" +#include "CFileManagerUtils.h" +#include "CFileManagerCommonDefinitions.h" +#include "FileManagerDebug.h" + + +// CONSTANTS +const TUint KDefaultObexPort = 65; +const TUint KBufferGranularity = 2048; +const TInt KFullPercentage = 100; +const TInt KInactiveTimeout = 60000000; + +// Required for IR +_LIT( KTransportTinyTp, "IrTinyTP" ); +_LIT8( KClassNameObex, "OBEX" ); +_LIT8( KAttName, "IrDA:TinyTP:LsapSel" ); +_LIT( KTemporaryFile, "__FileManagerIrdaReceive.tmp" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CFileManagerEngine::CFileManagerEngine +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CFileManagerIRReceiver::CFileManagerIRReceiver( + MFileManagerProcessObserver& aObserver, + CFileManagerEngine& aEngine, + RFs& aFs ) : + iObserver( aObserver ), + iEngine( aEngine ), + iFs( aFs ) + { + } + +// ----------------------------------------------------------------------------- +// CFileManagerEngine::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CFileManagerIRReceiver* CFileManagerIRReceiver::NewL( + MFileManagerProcessObserver& aObserver, + const TDesC& aPath, + CFileManagerEngine& aEngine ) + { + FUNC_LOG + + CFileManagerIRReceiver* self = new( ELeave ) CFileManagerIRReceiver( + aObserver, + aEngine, + aEngine.Fs() ); + + CleanupStack::PushL( self ); + self->ConstructL( aPath ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::ConstructL( const TDesC& aPath ) + { + TPtrC ptrPath( CFileManagerUtils::StripFinalBackslash( aPath ) ); + TInt len( ptrPath.Length() + + KFmgrBackslashSpace + KTemporaryFile().Length() ); + if ( len > KMaxFileName ) + { + User::Leave( KErrBadName ); + } + iTempFile = HBufC::NewL( len ); + TPtr ptr( iTempFile->Des() ); + ptr.Append( ptrPath ); + CFileManagerUtils::EnsureFinalBackslash( ptr ); + ptr.Append( KTemporaryFile ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ReceiveFileL +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CFileManagerIRReceiver::ReceiveFileL() + { + FUNC_LOG + + ResetInactivityTimer(); + + TObexIrProtocolInfo obexIrInfo; + obexIrInfo.iAddr.SetPort( KDefaultObexPort ); + obexIrInfo.iTransport = KTransportTinyTp; + obexIrInfo.iClassName = KClassNameObex; + obexIrInfo.iAttributeName = KAttName; + + iObexServer = CObexServer::NewL( obexIrInfo ); + + User::LeaveIfError( iObexServer->Start( this ) ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::~CFileManagerIRReceiver +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CFileManagerIRReceiver::~CFileManagerIRReceiver() + { + FUNC_LOG + + if ( iObexServer ) + { + if ( iObexServer->IsStarted() ) + { + iObexServer->Stop(); + } + delete iObexServer; + } + delete iObexBufObject; + + if ( iTempFile ) + { + iFs.Delete( *iTempFile ); + delete iTempFile; + } + delete iBuffer; + delete iInactivityTimer; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::StopReceiving +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CFileManagerIRReceiver::StopReceiving() + { + FUNC_LOG + + iError = KErrCancel; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ErrorIndication +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::ErrorIndication(TInt aError ) + { + ERROR_LOG1( "CFileManagerIRReceiver::ErrorIndication-aError=%d", aError ) + + if ( iError == KErrNone ) + { + iError = aError; + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::TransportUpIndication +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::TransportUpIndication() + { + FUNC_LOG + + StopInactivityTimer(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::TransportDownIndication +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::TransportDownIndication() + { + FUNC_LOG + + TInt err( KErrNone ); + if ( iObexBufObject ) + { + // transfer has been cancelled, set temp buffer so obexobject won't + // create temp file again + delete iBuffer; + iBuffer = NULL; + TRAP( err, iBuffer = CBufFlat::NewL( KBufferGranularity ) ); + if ( err == KErrNone ) + { + TRAP( err, iObexBufObject->SetDataBufL( iBuffer ) ); + } + } + + if ( iTempFile ) + { + iFs.Delete( *iTempFile ); + } + + TRAP( err, iObserver.ProcessFinishedL( iError ) ); + if ( err != KErrNone ) + { + iObserver.Error( err ); + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::TargetHeaderReceived +// +// ----------------------------------------------------------------------------- +// +TBool CFileManagerIRReceiver::TargetHeaderReceived(TDesC8& /* aTargetHeader */ ) + { + FUNC_LOG + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ObexConnectIndication +// +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::ObexConnectIndication + ( const TObexConnectInfo& /* aRemoteInfo */, + const TDesC8& /* aInfo */ ) + { + FUNC_LOG + + if ( iError == KErrCancel ) + { + return KErrCancel; + } + + TRAPD( err, iObserver.ProcessStartedL( + MFileManagerProcessObserver::EIRReceiveProcess ) ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ObexDisconnectIndication +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::ObexDisconnectIndication(const TDesC8& /* aInfo */ ) + { + FUNC_LOG + // from MObexServerNotify + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::PutRequestIndication +// +// ----------------------------------------------------------------------------- +// +CObexBufObject* CFileManagerIRReceiver::PutRequestIndication() + { + FUNC_LOG + + // delete old buffer if it exists + delete iObexBufObject; + iObexBufObject = NULL; + iFs.Delete( *iTempFile ); + + TRAPD( err, iObexBufObject = CObexBufObject::NewL( NULL ) ); + if ( err == KErrNone ) + { + TRAP( err, iObexBufObject->SetDataBufL( *iTempFile ) ); + } + + if ( err != KErrNone ) + { + return NULL; + } + + return iObexBufObject; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::PutPacketIndication +// +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::PutPacketIndication() + { + FUNC_LOG + + if ( iError == KErrCancel ) + { + return KErrCancel; + } + + const TInt size( iObexBufObject->Length() ); + + if ( !iDiskSpaceChecked ) + { + TParsePtrC parse( *iTempFile ); + TRAP( iError, iEnoughSpace = iEngine.EnoughSpaceL( + parse.DriveAndPath(), size, + MFileManagerProcessObserver::EIRReceiveProcess ) ); + iDiskSpaceChecked = ETrue; + } + + if ( iError == KErrNone && iEnoughSpace ) + { + const TInt received( iObexBufObject->BytesReceived()); + TInt percent( 0 ); + if ( size != 0) + { + percent = KFullPercentage * received / size; + } + TRAPD( error, iObserver.ProcessAdvanceL( percent ) ); + if ( iError == KErrNone ) + { + iError = error; + } + } + else if ( !iEnoughSpace ) + { + if ( iError == KErrNone ) + { + iError = KErrDiskFull; + } + } + + return iError; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::PutCompleteIndication +// +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::PutCompleteIndication() + { + FUNC_LOG + + if ( iError == KErrCancel ) + { + iFs.Delete( *iTempFile ); + iDiskSpaceChecked = EFalse; + return KErrNone; + } + + TInt error( KErrNone ); + TFileName fileName; + TParsePtrC parse( *iTempFile ); + fileName.Append( parse.DriveAndPath() ); + TPtrC objName( iObexBufObject->Name() ); + + if ( fileName.Length() + objName.Length() > KMaxFileName ) + { + iFs.Delete( *iTempFile ); + iDiskSpaceChecked = EFalse; + iObserver.Error( KErrBadName ); + return KErrBadName; + } + + fileName.Append( objName ); + delete iObexBufObject; + iObexBufObject = NULL; + TBool nameFound( EFalse ); + TRAP( error, nameFound = iEngine.IsNameFoundL( fileName ) ); + if ( error == KErrNone && nameFound ) + { + TFileName name; + TBool overWrite( ETrue ); + TRAP( error, overWrite = iObserver.ProcessQueryOverWriteL( + fileName, name, + MFileManagerProcessObserver::EIRReceiveProcess ) ); + + if ( error == KErrNone ) + { + if ( overWrite ) + { + error = iFs.Delete( fileName ); + if ( error == KErrNone ) + { + iFs.Rename( *iTempFile, fileName ); + } + if ( error != KErrNone ) + { + iObserver.Error( error ); + } + } + else + { + TBool askAgain( ETrue ); + TRAP( error, nameFound = iEngine.IsNameFoundL( name ) ); + while( error == KErrNone && nameFound && askAgain ) + { + TFileName newName; + TRAP( error, overWrite = + iObserver.ProcessQueryOverWriteL( + name, + newName, + MFileManagerProcessObserver::EIRReceiveProcess + ) ); + if ( error != KErrNone ) + { + iError = error; + askAgain = EFalse; + name.Zero(); + } + else if ( !overWrite ) + { + name.Zero(); + name.Append( newName ); + } + else + { + askAgain = EFalse; + } + } + if ( name.Length() > 0 ) + { + TParsePtrC parse( *iTempFile ); + name.Insert( 0, parse.DriveAndPath() ); + iFs.Rename( *iTempFile, name ); + } + } + } + else + { + iError = error; + } + } + else + { + + iFs.Rename( *iTempFile, fileName ); + } + iFs.Delete( *iTempFile ); + iDiskSpaceChecked = EFalse; + + return error; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::GetRequestIndication +// Empty because needed only for send functionality +// ----------------------------------------------------------------------------- +// +CObexBufObject* CFileManagerIRReceiver::GetRequestIndication + (CObexBaseObject* /* aRequiredObject */) + { + FUNC_LOG + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::GetPacketIndication +// Empty because needed only for send functionality +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::GetPacketIndication() + { + FUNC_LOG + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::GetCompleteIndication +// Empty because needed only for send functionality +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::GetCompleteIndication() + { + FUNC_LOG + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::SetPathIndication +// Empty because setpath not supported +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::SetPathIndication( + const CObex::TSetPathInfo& /* aPathInfo*/ , const TDesC8& /* aInfo */) + { + FUNC_LOG + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::AbortIndication +// Empty because needed only for send functionality +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::AbortIndication() + { + FUNC_LOG + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::ResetInactivityTimer +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::ResetInactivityTimer() + { + FUNC_LOG + + StopInactivityTimer(); + + TRAPD( err, iInactivityTimer = + CPeriodic::NewL( CActive::EPriorityStandard ) ); + if ( err == KErrNone ) + { + iInactivityTimer->Start( + KInactiveTimeout, + KInactiveTimeout, + TCallBack( InactivityTimeout, this ) ); + + INFO_LOG( "CFileManagerIRReceiver::ResetInactivityTimer-Timer started" ) + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::InactivityTimeout +// +// ----------------------------------------------------------------------------- +// +TInt CFileManagerIRReceiver::InactivityTimeout( TAny* aPtr ) + { + FUNC_LOG + + CFileManagerIRReceiver* self = + static_cast< CFileManagerIRReceiver* >( aPtr ); + + self->StopInactivityTimer(); + self->CloseConnection(); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::StopInactivityTimer +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::StopInactivityTimer() + { + FUNC_LOG + + delete iInactivityTimer; + iInactivityTimer = NULL; + } + +// ----------------------------------------------------------------------------- +// CFileManagerIRReceiver::CloseConnection +// +// ----------------------------------------------------------------------------- +// +void CFileManagerIRReceiver::CloseConnection() + { + FUNC_LOG + + StopReceiving(); + + if ( iObexServer ) + { + if ( iObexServer->IsStarted() ) + { + INFO_LOG( "CFileManagerIRReceiver::CloseConnection-Stop server" ) + + iObexServer->Stop(); + } + } + + TRAPD( err, iObserver.ProcessFinishedL( KErrCancel ) ); + if ( err != KErrNone ) + { + iObserver.Error( err ); + } + } + +// End of File