localconnectivityservice/obexreceiveservices/opp/src/oppcontroller.cpp
branchRCL_3
changeset 40 52a167391590
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/obexreceiveservices/opp/src/oppcontroller.cpp	Wed Sep 01 12:20:40 2010 +0100
@@ -0,0 +1,865 @@
+/*
+* 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 "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 CBtListenActive
+*
+*/
+
+
+// INCLUDE FILES
+#include    <avkon.hrh>                    // AVKON components
+#include    "oppcontroller.h"
+#include    "btengdevman.h"
+#include    <obexutilsmessagehandler.h>
+#include    "debug.h"
+#include    <Obexutils.rsg>
+#include    <bautils.h>
+#include    <UiklafInternalCRKeys.h>
+#include    <obexutilsuilayer.h>
+#include    <btengdomaincrkeys.h>
+#include    <AiwServiceHandler.h> // The AIW service handler
+#include    <sysutil.h>
+#include    <btengdomaincrkeys.h> 
+#include    <msvids.h>
+#include    <driveinfo.h> 
+#include    <es_sock.h>
+#include    <bt_sock.h>
+
+// CONSTANTS
+
+const TInt    KBufferSize = 0x10000;  // 64 kB
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+COPPController* COPPController::NewL()
+    {
+    COPPController* self = new ( ELeave ) COPPController();
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+    }
+    
+COPPController::COPPController()
+	{
+    TRACE_FUNC
+	}
+
+void COPPController::ConstructL()	
+	{
+    TRACE_FUNC
+    iObexTransferState = ETransferIdle;
+    iLowMemoryActiveCDrive = CObexUtilsPropertyNotifier::NewL(this, ECheckPhoneMemory);
+    iLowMemoryActiveMMC = CObexUtilsPropertyNotifier::NewL(this, ECheckMMCMemory);        
+    iDevMan=CBTEngDevMan::NewL(this);  
+    iResultArray = new (ELeave) CBTDeviceArray(1);
+    // Get default folder from CenRep 
+    TObexUtilsMessageHandler::GetCenRepKeyStringValueL(KCRUidBluetoothEngine, 
+                                                       KLCReceiveFolder,
+                                                       iCenRepFolder);
+	} 
+
+COPPController::~COPPController()
+    {
+    TRACE_FUNC
+    delete iObexObject;
+    delete iBuf;
+    delete iLowMemoryActiveCDrive;
+    delete iLowMemoryActiveMMC;
+    delete iProgressDialog;
+    delete iWaitDialog;
+    delete iDevMan;
+    if (iResultArray)
+        {
+        iResultArray->ResetAndDestroy();
+        delete iResultArray;
+        }
+    iFs.Close();
+    }
+
+// ---------------------------------------------------------
+// ErrorIndication()
+// ---------------------------------------------------------
+//
+void COPPController::ErrorIndication( TInt TRACE_ONLY(aError) )
+    {
+    TRACE_FUNC
+    TRACE_ERROR((_L( "[oppreceiveservice] COPPController: ErrorIndication error:\t %d" ),aError));
+    HandleError(EFalse); // false because not explicit abort
+    }
+
+// ---------------------------------------------------------
+// AbortIndication() 
+// ---------------------------------------------------------
+//
+void COPPController::AbortIndication()
+	{
+	TRACE_FUNC
+	HandleError(EFalse); // false because note about receiving failed should appear
+	}
+
+void COPPController::HandleError(TBool aAbort)
+    {
+    TRACE_ERROR((_L( "[oppreceiveservice] COPPController:HandleError" )));
+    if( iObexTransferState == ETransferPut || iObexTransferState == ETransferPutDiskError )
+        {        
+        if(iObexObject)
+            {
+            iObexObject->Reset();
+            }
+        CancelTransfer();
+        if(!aAbort)
+        	{
+			if(iMediaType == ESrcsMediaBT)
+				{
+				TRAP_IGNORE( TObexUtilsUiLayer::ShowGlobalConfirmationQueryL( R_BT_FAILED_TO_RECEIVE ) );
+				}
+			TRACE_ASSERT(iMediaType != ESrcsMediaIrDA, KErrNotSupported)
+        	}
+        }
+    delete iBuf;
+    iBuf = NULL;
+    iObexTransferState = ETransferIdle;
+    TRAP_IGNORE(TObexUtilsMessageHandler::RemoveInboxEntriesL(iObexObject, iMsvIdParent));
+    TRAP_IGNORE(TObexUtilsMessageHandler::RemoveTemporaryRFileL (iFullPathFilename));
+    }
+
+// ---------------------------------------------------------
+// TransportUpIndication()
+// ---------------------------------------------------------
+//
+void COPPController::TransportUpIndication()
+	{
+	TRACE_FUNC    
+    iObexTransferState = ETransferIdle;	
+ 
+	if ( !iFs.Handle() )
+	    {
+	    TRACE_INFO( (_L( "[oppreceiveservice] TransportUpIndication iFs.Connect()" )) ); 
+	    if ( iFs.Connect() )   // error value not preserved, iFs.Handle() checked one more time before first useage
+	        {
+	        TRACE_INFO( (_L( "[oppreceiveservice] TransportUpIndication iFs.Connect() failed" )) ); 
+	        }
+	    }
+
+    iFile = RFile();
+    iFullPathFilename.Zero();
+	}
+
+// ---------------------------------------------------------
+// ObexConnectIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::ObexConnectIndication( const TObexConnectInfo& /*aRemoteInfo*/,
+                                            const TDesC8& /*aInfo*/)
+    {
+    TRACE_FUNC  
+    if ( iMediaType == ESrcsMediaBT )
+        {
+        TRACE_INFO( _L( "[oppreceiveservice] ObexConnectIndication: BT media \t" ) );
+        
+        // Get remote device socket address and bluetooth name
+        // Remote bluetooth name will be displayed in the new message in inbox.
+        //
+        TSockAddr addr;
+        iObexServer->RemoteAddr(addr);
+        TBTDevAddr tBTDevAddr = static_cast<TBTSockAddr>(addr).BTAddr();
+        
+        TBTRegistrySearch nameSearch;
+        nameSearch.FindAddress(tBTDevAddr);
+        
+        iResultArray->Reset();
+        // ignore any errors here, if we don't get the name, we don't get the name
+        static_cast<void>(iDevMan->GetDevices(nameSearch, iResultArray));
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// ObexDisconnectIndication(
+// ---------------------------------------------------------
+//
+void COPPController::ObexDisconnectIndication(const TDesC8& /*aInfo*/)
+    {
+    TRACE_FUNC
+
+    }
+
+// ---------------------------------------------------------
+// TransportDownIndication()
+// ---------------------------------------------------------
+//
+void COPPController::TransportDownIndication()
+    {
+    TRACE_FUNC
+    // Remove receiving buffer and files used during file receiving.
+    //
+    delete iObexObject;
+    iObexObject = NULL;
+    TRAP_IGNORE(TObexUtilsMessageHandler::RemoveTemporaryRFileL (iFullPathFilename)); 
+    iFs.Close();
+    }
+
+// ---------------------------------------------------------
+// PutRequestIndication()
+// ---------------------------------------------------------
+//
+CObexBufObject* COPPController::PutRequestIndication()
+    {
+    TRACE_FUNC
+    iLengthHeaderReceived = EFalse; // New put request so clear header based state
+    iObexTransferState = ETransferPut;
+    
+    // Checking if backup is running now - if backup process is active, then we
+    // need to cancel transfer - otherwise phone will freeze during receiving
+    // data
+    if ( TObexUtilsUiLayer::IsBackupRunning() )
+        {
+        TRACE_INFO ( _L ("Backup in progress! Canceling incoming transfer."));
+        iObexTransferState = ETransferPutInitError;
+        return NULL;
+        }
+    
+    TRAPD(err, HandlePutRequestL());
+    if(err == KErrNone)
+        {
+        return iObexObject;
+        }
+    TRACE_INFO( _L( "[oppreceiveservice] COPPController: PutRequestIndication end\t" ) );
+    if (iObexTransferState != ETransferPutInitError)
+        {
+        iObexTransferState = ETransferPutDiskError;
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// PutPacketIndication()    
+// ---------------------------------------------------------
+//
+TInt COPPController::PutPacketIndication()
+    {
+    TRACE_FUNC
+    if(iObexTransferState == ETransferPutCancel)
+        {
+        // User cancelled the put request, so error the next packet to terminate the put request.
+        // BIP considers the Unauthorized error response suitable for this...
+        HandleError(ETrue); // reset state and clear up
+        return KErrIrObexRespUnauthorized;
+        }
+    
+    iTotalSizeByte = iObexObject->Length();     // get size of receiving file
+    
+    if(iObexObject->Name().Length() > KMaxFileName)
+        {
+        TRACE_INFO( _L( "[oppreceiveservice] COPPController: PutPacketIndication truncating name of file being received\t" ) );
+        TRAPD(err, iObexObject->SetNameL(iObexObject->Name().Left(KMaxFileName)));
+        if(err != KErrNone)
+            {
+            return KErrAccessDenied;
+            }
+        }
+    
+    iReceivingFileName = iObexObject->Name();   // get name of receiving file
+    
+    // Check that capacity is suitable as soon as possible
+    if(!iLengthHeaderReceived && iTotalSizeByte > 0)
+        {
+        iLengthHeaderReceived = ETrue; // total size value is from length header
+        TBool capacity = ETrue;
+        TRAPD(retTrap, capacity = CheckCapacityL());
+        if(retTrap != KErrNone)
+            {
+            return KErrGeneral;
+            }
+        if(!capacity)
+            {
+            TRAP_IGNORE(TObexUtilsUiLayer::ShowGlobalConfirmationQueryL(R_OUT_OF_MEMORY));
+            return KErrDiskFull;
+            }
+        }
+
+    if(iObexTransferState == ETransferPutDiskError)
+        {
+        return KErrDiskFull;
+        }
+    // successfully received put packet if we reached here
+    iObexTransferState = ETransferPut;
+    
+    // Now we need to either create (in the first instance) or update the dialog on the UI.
+    if(ReceivingIndicatorActive())
+        {
+        UpdateReceivingIndicator();
+        }
+    else if(!iNoteDisplayed)
+        {
+        // No note launched yet, so try to launch
+        TRAPD(err, LaunchReceivingIndicatorL());
+        iNoteDisplayed = (err == KErrNone);
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// PutCompleteIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::PutCompleteIndication()
+    {
+    TRACE_FUNC
+    TInt retVal = KErrNone;
+    if(iObexTransferState == ETransferPutCancel)
+        {
+        retVal = KErrIrObexRespUnauthorized;
+        HandleError(ETrue);
+        }
+    else
+        {
+        retVal = HandlePutCompleteIndication();
+        iObexTransferState = ETransferIdle;
+        CloseReceivingIndicator();
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// GetRequestIndication()
+// ---------------------------------------------------------
+//
+CObexBufObject* COPPController::GetRequestIndication( CObexBaseObject* /*aRequiredObject*/)
+    {
+    TRACE_FUNC
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// GetPacketIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::GetPacketIndication()
+    {
+    TRACE_FUNC
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// GetCompleteIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::GetCompleteIndication()
+    {
+    TRACE_FUNC
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// SetPathIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::SetPathIndication( const CObex::TSetPathInfo& /*aPathInfo*/, 
+                                        const TDesC8& /*aInfo*/)
+    {
+    TRACE_FUNC
+    // SetPath is not implemented in OPP - so following IrOBEX guidance, return
+    // the Forbidden response code.
+    return KErrIrObexRespForbidden;
+    }
+
+
+
+// ---------------------------------------------------------
+// HandleNotifyL()
+// ---------------------------------------------------------
+//
+void COPPController::HandleNotifyL( TMemoryPropertyCheckType aCheckType )
+    {    
+    TRACE_FUNC        
+    
+    // Only interested on this notification if we are receiving something
+    if ( iObexTransferState == ETransferPut )
+        {
+        // Check the keys, what has been changed.
+        TRACE_INFO( _L( "[oppreceiveservice] COPPController::HandleNotifyL\t" ) );
+        if ( aCheckType == ECheckPhoneMemory )
+            {            
+            if ( SysUtil::FFSSpaceBelowCriticalLevelL( NULL, 0 ) )
+                {
+                TRACE_INFO( _L( "[oppreceiveservice] COPPController: Obex Server error diskfull\t" ) );
+                iObexTransferState = ETransferPutDiskError;                    
+                }
+            }
+        else if ( aCheckType == ECheckMMCMemory )
+            {                                
+            if ( SysUtil::MMCSpaceBelowCriticalLevelL( NULL, 0 ) )
+                {                        
+                TRACE_INFO( _L( "[oppreceiveservice] COPPController: Obex Server error diskfull\t" ) );
+                iObexTransferState = ETransferPutDiskError;
+                }
+            }            
+        }        
+    }
+// ---------------------------------------------------------
+// HandlePutRequestL()
+// ---------------------------------------------------------
+//
+void COPPController::HandlePutRequestL()
+    {
+    TRACE_FUNC
+    
+    delete iObexObject;
+    iObexObject = NULL;
+    
+    iFile = RFile();
+    
+    if ( !iFs.Handle() )
+        {
+        User::Leave(KErrGeneral);
+        }
+
+    // Assign an initial value to iDrive
+    iDrive = GetDriveWithMaximumFreeSpaceL();    
+     
+    // If iDrive is at critical space level, we immediately show out_of_memory.
+    //
+    if (SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, 0, iDrive ))
+        {
+        TRAP_IGNORE(TObexUtilsUiLayer::ShowGlobalConfirmationQueryL(R_OUT_OF_MEMORY));
+        User::Leave(KErrGeneral);
+        }
+        
+    TRACE_INFO( (_L( "[oppreceiveservice] HandlePutRequestL %d\t" ),iDrive ) ); 
+    
+    iObexObject = CObexBufObject::NewL( NULL );    
+    
+    delete iBuf;
+    iBuf = NULL;
+    
+    TRACE_ASSERT(iMediaType != ESrcsMediaIrDA, KErrNotSupported);
+    if ( iMediaType == ESrcsMediaBT )
+        {
+        TChar driveLetter;
+        iDefaultFolder.Zero();
+        iFs.DriveToChar(iDrive, driveLetter);
+        iDefaultFolder.Append(driveLetter);
+        if ( iDrive == EDriveC )
+            {
+            iDefaultFolder.Append(_L(":\\data\\"));
+            }
+        else
+            {
+            iDefaultFolder.Append(_L(":\\"));
+            }
+        iDefaultFolder.Append(iCenRepFolder);
+        
+        iFile = RFile();
+        iFullPathFilename.Zero();
+        TRAPD(err, TObexUtilsMessageHandler::CreateReceiveBufferAndRFileL(iFile,
+                                                                              iDefaultFolder,
+                                                                              iFullPathFilename,
+                                                                              iBuf,
+                                                                              KBufferSize));
+        if(err != KErrNone)
+            {
+            iObexTransferState = ETransferPutInitError;
+            User::Leave(KErrGeneral);
+            }
+        }
+    else
+        {
+        iObexTransferState = ETransferPutInitError;
+        User::Leave(KErrGeneral);
+        }
+    
+    User::LeaveIfError(iFile.Open(iFs,iFullPathFilename,EFileWrite|EFileShareReadersOrWriters));   
+    TObexRFileBackedBuffer bufferdetails(*iBuf,iFile,CObexBufObject::EDoubleBuffering);    
+    
+    TRAPD(err, iObexObject->SetDataBufL( bufferdetails) );
+    if (err != KErrNone)
+        {
+        iObexTransferState = ETransferPutInitError;
+        User::Leave(KErrGeneral);  // set to != KErrNone
+        }
+    
+    TRACE_INFO( _L( "[oppreceiveservice] COPPController: HandlePutRequestL completed\t" ) );
+    }
+
+
+// ---------------------------------------------------------
+// HandlePutCompleteIndication()
+// ---------------------------------------------------------
+//
+TInt COPPController::HandlePutCompleteIndication()
+	{
+	TRACE_FUNC        
+    TInt retVal = KErrNone;
+
+	TChar driveLetter;
+	iDefaultFolder.Zero();
+	iFs.DriveToChar(iDrive, driveLetter);
+	iDefaultFolder.Append(driveLetter);
+	if ( iDrive == EDriveC )
+	    {
+	    iDefaultFolder.Append(_L(":\\data\\"));
+	    }
+	else
+	    {
+	    iDefaultFolder.Append(_L(":\\"));
+	    }
+	iDefaultFolder.Append(iCenRepFolder);
+	iFullPathFilename.Zero();
+	iFullPathFilename.Append(iDefaultFolder);
+       
+        
+	TRACE_INFO( (_L( "[oppreceiveservice] HandlePutCompleteIndication %d\t" ),iDrive ) ); 
+	
+	if (iMediaType==ESrcsMediaBT)
+	    {
+	    TRAP ( retVal, TObexUtilsMessageHandler::SaveFileToFileSystemL(iObexObject,
+	                                                                   KUidMsgTypeBt,
+	                                                                   iMsvIdParent,
+	                                                                   iFullPathFilename,
+	                                                                   iFile,
+	                                                                   iRemoteDeviceName));
+	    }
+	TRACE_ASSERT( iMediaType!=ESrcsMediaIrDA, KErrNotSupported);
+	if ( retVal == KErrNone)
+	    {
+	    TRAP (retVal, TObexUtilsMessageHandler::AddEntryToInboxL(iMsvIdParent, iFullPathFilename));		    
+                
+    if( retVal != KErrNone )
+        {
+        TRACE_INFO( (_L( "[oppreceiveservice] HandlePutCompleteIndication AddEntryToInboxL() failed  %d \t" ),retVal ) );                 	
+        TRAP_IGNORE(TObexUtilsMessageHandler::RemoveInboxEntriesL(iObexObject, iMsvIdParent));        
+        }
+        }
+	else
+	    {
+	    TRACE_INFO( (_L( "[oppreceiveservice] HandlePutCompleteIndication failed  %d \t" ),retVal ) ); 
+	    }
+	
+
+    delete iObexObject;
+    iObexObject = NULL;
+
+    delete iBuf;
+    iBuf = NULL;
+    
+    iPreviousDefaultFolder = iDefaultFolder;  // save the last file path where file is successfully saved to file system.
+    iMsvIdParent = KMsvNullIndexEntryId; 
+    TRACE_INFO( _L( "[oppreceiveservice] HandlePutCompleteIndication Done\t" ) );    
+    return retVal;
+	}
+
+  
+// ---------------------------------------------------------
+// CheckCapacity()
+// ---------------------------------------------------------
+//	    
+TBool COPPController::CheckCapacityL()
+    {
+    TRACE_FUNC_ENTRY   
+    
+    iDrive = EDriveZ; // Intialize iDrive to Z
+    TInt filesize = iObexObject->Length();
+    
+    RFs rfs ;
+    User::LeaveIfError(rfs.Connect());
+         
+    TInt mmcDrive = KDefaultDrive;   // External memroy card  
+    TInt imsDrive = KDefaultDrive;   // Internal mass storage   
+
+    User::LeaveIfError(DriveInfo::GetDefaultDrive(DriveInfo::EDefaultMassStorage, imsDrive));
+    User::LeaveIfError(DriveInfo::GetDefaultDrive(DriveInfo::EDefaultRemovableMassStorage, mmcDrive));      
+    
+    TRACE_INFO( (_L( "[oppreceiveservice] CheckCapacityL imsDrive=%d; mmcDrive=%d\t" ),imsDrive, mmcDrive ) );
+    
+    TVolumeInfo volumeInfo;
+    TInt err = rfs.Volume(volumeInfo, imsDrive);
+    
+    // If err != KErrNone, Drive is not available.
+    //
+    if ( !err )
+        {
+        // Check capacity on Internal mass storage            
+        TRACE_INFO( (_L( "[oppreceiveservice] CheckCapacityL Internal mass storage\t" )) );
+        if ( !SysUtil::DiskSpaceBelowCriticalLevelL( &rfs, filesize, imsDrive ) )
+            {
+            iDrive = imsDrive;            
+            }
+        }
+    
+    if ( iDrive == EDriveZ)
+        {
+        err = rfs.Volume(volumeInfo, mmcDrive);
+        if ( !err )
+            {
+            // Check capacity on Internal mass storage    
+            TRACE_INFO( (_L( "[oppreceiveservice] CheckCapacityL Checking memory card\t" )) );
+            if ( !SysUtil::DiskSpaceBelowCriticalLevelL( &rfs, filesize, mmcDrive ) )
+                {                    
+                iDrive = mmcDrive;
+                }   
+            }
+        }           
+    if ( iDrive == EDriveZ )
+        {
+        TRACE_INFO( (_L( "[oppreceiveservice] CheckCapacityL Checking phone memory\t" )) );
+        // Phone memory
+        if( !SysUtil::DiskSpaceBelowCriticalLevelL( &rfs, filesize, EDriveC ))
+            {
+            iDrive = EDriveC;
+            }
+        }
+    rfs.Close();
+    TRACE_INFO( (_L( "[oppreceiveservice] CheckCapacityL iDrive = %d\t" ),iDrive ) );
+    TRACE_FUNC_EXIT
+    if (iDrive == EDriveZ)
+        {
+        // If there is no free space for receiving file, we need to set iPreviousDefaultFolder back to iDefaultFolder.
+        // In order to show the file receveing dialog correctly.
+        iDefaultFolder = iPreviousDefaultFolder;
+        return EFalse;
+        }
+    return ETrue;
+    }    
+
+// ---------------------------------------------------------
+// IsOBEXActive()
+// ---------------------------------------------------------
+//	    
+TBool COPPController::IsOBEXActive()
+    {
+    TRACE_FUNC
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// SetMediaType()
+// ---------------------------------------------------------
+//
+void COPPController::SetMediaType( TSrcsMediaType aMediaType ) 
+    {
+    TRACE_FUNC    
+    iMediaType=aMediaType;    
+    }
+    
+// ---------------------------------------------------------
+// SetObexServer()
+// ---------------------------------------------------------
+//
+TInt COPPController::SetObexServer( CObexServer* aServer)
+	{	
+	TInt retVal=KErrNone;    
+	
+	if (aServer)
+	    {  
+	    iObexServer = aServer;
+	    retVal=aServer->Start(this);    
+	    }
+	return retVal;
+	}
+   
+// ---------------------------------------------------------
+// CancelTransfer()
+// ---------------------------------------------------------
+//
+void COPPController::CancelTransfer()
+    {
+    TRACE_FUNC
+    CloseReceivingIndicator();
+    if(iObexTransferState == ETransferPut)
+        {
+        iObexTransferState = ETransferPutCancel;
+        }
+    else // go to idle for all other states
+        {
+        iObexTransferState = ETransferIdle;
+        }
+    }
+
+void COPPController::LaunchReceivingIndicatorL()
+    {
+    if(ReceivingIndicatorActive())
+        {
+        return;
+        }
+    
+    if(iTotalSizeByte > 0)
+        {
+        iProgressDialog = CGlobalProgressDialog::NewL(this);  
+        if(iReceivingFileName.Length() > 0)
+            {
+            iProgressDialog->ShowProgressDialogNameSizeL(iReceivingFileName, iTotalSizeByte);
+            }
+        else
+            {
+            if(iMediaType == ESrcsMediaBT)
+                {
+                iProgressDialog->ShowProgressDialogL(R_BT_RECEIVING_DATA);
+                }
+            TRACE_ASSERT(iMediaType != ESrcsMediaIrDA, KErrNotSupported);
+            }
+        }
+    else
+        {
+        iWaitDialog = CGlobalDialog::NewL(this);
+        if(iMediaType == ESrcsMediaBT)
+            {
+            iWaitDialog->ShowNoteDialogL(R_BT_RECEIVING_DATA, ETrue);
+            }
+        TRACE_ASSERT(iMediaType != ESrcsMediaIrDA, KErrNotSupported);
+        }
+    }
+
+void COPPController::UpdateReceivingIndicator()
+    {
+    if(iProgressDialog)
+        {
+        iProgressDialog->UpdateProgressDialog(iObexObject->BytesReceived(), iTotalSizeByte);
+        }
+    // else we are using a wait note, so no "need" to update
+    }
+
+void COPPController::HandleGlobalProgressDialogL( TInt aSoftkey )
+    {
+    TRACE_FUNC
+    
+    if(aSoftkey == EAknSoftkeyCancel)
+        {
+        CancelTransfer();
+        }
+    else if(aSoftkey == EAknSoftkeyHide)
+        {
+        CloseReceivingIndicator(EFalse); // Don't reset state as only hiding
+        }
+    }
+
+void COPPController::HandleGlobalNoteDialogL( TInt aSoftkey )
+    {
+    TRACE_FUNC
+    
+    if(aSoftkey == EAknSoftkeyCancel)
+        {
+        CancelTransfer();
+        }
+    else if(aSoftkey == EAknSoftkeyHide)
+        {
+        CloseReceivingIndicator(EFalse); // Don't reset state as only hiding
+        }
+    }
+
+void COPPController::CloseReceivingIndicator(TBool aResetDisplayedState)
+    {
+    TRACE_FUNC
+    if(aResetDisplayedState)
+        {
+        iNoteDisplayed = EFalse;
+        }
+    if(iProgressDialog)
+        {
+        iProgressDialog->ProcessFinished();
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+    if(iWaitDialog)
+        {
+        iWaitDialog->ProcessFinished();
+        delete iWaitDialog;
+        iWaitDialog = NULL;
+        }
+    }
+
+ // ---------------------------------------------------------
+  // GetDriveWithMaximumFreeSpace()
+  // ---------------------------------------------------------
+  // 
+  TInt COPPController::GetDriveWithMaximumFreeSpaceL()
+      {
+      // Get drive with maximum freespace among phone memory, MMC, internal mass storage.
+      //
+      TRACE_FUNC   
+      TVolumeInfo volumeInfoC;
+      TVolumeInfo volumeInfoE;
+      TVolumeInfo volumeInfoF;
+      TInt64 max = 0;
+      TInt drive = 0;
+      
+      TInt err = iFs.Volume(volumeInfoC, EDriveC);
+     
+      if ( !err )
+          {
+          // set initial values to max and drive.
+          max = volumeInfoC.iFree;
+          drive = EDriveC;
+          }
+           
+      err = iFs.Volume(volumeInfoE, EDriveE);     
+      if ( !err )
+          {
+          if (volumeInfoE.iFree >= max)
+              {
+              max = volumeInfoE.iFree;
+              drive = EDriveE;             
+              }
+          
+          }
+           
+      err = iFs.Volume(volumeInfoF, EDriveF);
+      if ( !err )
+          {
+          if (volumeInfoF.iFree >= max)
+              {
+              max = volumeInfoF.iFree;
+              drive = EDriveF;             
+              }
+          }
+      
+      max = 0;
+      return drive;
+      }
+ 
+ 
+ // ----------------------------------------------------------
+ // COPPController::HandleGetDevicesComplete
+ // Callback from devman
+ // ----------------------------------------------------------
+ //
+ void COPPController::HandleGetDevicesComplete(TInt aErr, CBTDeviceArray* /*aDeviceArray*/)
+    {
+    TRACE_INFO( _L( "[oppreceiveservice] HandleGetDevicesComplete: enter \t" ) );
+    if ( aErr == KErrNone )
+        {
+        if ( iResultArray->Count())
+            {             
+            iRemoteDeviceName.Zero();
+            if ( iResultArray->At(0)->FriendlyName().Length() > 0 )
+                {
+                TRACE_INFO( _L( "[oppreceiveservice] HandleGetDevicesComplete: got friendly name \t" ) );
+                iRemoteDeviceName.Copy(iResultArray->At(0)->FriendlyName());
+                }
+            else
+                {
+                TRACE_INFO( _L( "[oppreceiveservice] HandleGetDevicesComplete: got devciename name \t" ));
+                TRAP_IGNORE(iRemoteDeviceName.Copy( BTDeviceNameConverter::ToUnicodeL(iResultArray->At(0)->DeviceName())));
+                }
+            }
+        }
+    }
+ 
+//////////////////////////// Global part ////////////////////////////
+
+//  End of File