localconnectivityservice/obexsendservices/obexserviceirsend/src/IRClient.cpp
branchRCL_3
changeset 40 52a167391590
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/obexsendservices/obexserviceirsend/src/IRClient.cpp	Wed Sep 01 12:20:40 2010 +0100
@@ -0,0 +1,462 @@
+/*
+* Copyright (c) 2002 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:  Obex client implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <obexclient.h>
+#include <Obexutils.rsg>
+#include <obexutilsuilayer.h>
+
+#include "IRClient.h"
+#include "IrSendingServiceDebug.h"
+
+
+const TUint KIRProgressInterval         = 1000000;
+
+_LIT( KTransportTinyTp, "IrTinyTP" );
+_LIT8( KClassNameObex, "OBEX" );
+_LIT8( KAttName, "IrDA:TinyTP:LsapSel" );
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::CBTServiceClient
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIRClient::CIRClient(  ) 
+    : CActive( EPriorityStandard ), 
+      iClientState( EIRCliDisconnected),                             
+      iObjectIndex( 0 )
+    {
+    CActiveScheduler::Add( this );    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIRClient::ConstructL( )
+    {
+    FLOG(_L("[BTSU]\t CBTServiceClient::ConstructL()"));
+
+    User::LeaveIfError( iFileSession.Connect() );
+    
+    iDialog = CObexUtilsDialog::NewL( this );
+    iTotalBytesSent = 0;
+    // Create Obex Client
+    //
+    TObexIrProtocolInfo  info;
+    //info.iTransport = KObexIrTTPProtocol;    
+    
+  //  info.iAddr.SetPort( KDefaultObexPort );//default obex server for now
+    info.iTransport     = KTransportTinyTp;
+    info.iClassName     = KClassNameObex;
+    info.iAttributeName = KAttName;
+
+    
+    iClient = CObexClient::NewL( info );
+    
+
+    // Create Connect-object
+    //
+    iConnectObject = CObexNullObject::NewL();
+
+    //Show note
+    //
+    iDialog->LaunchWaitDialogL( R_IR_CONNECTING_WAIT_NOTE);
+    
+    // Establish client connection
+    //
+    iClient->Connect( /**iConnectObject,*/ iStatus );
+    SetActive();
+    iClientState = EIRCliConnecting;
+
+    FLOG(_L("[BTSU]\t CBTServiceClient::ConstructL() completed"));
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CIRClient* CIRClient::NewL()
+    {
+    CIRClient* self = new( ELeave ) CIRClient( );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop();
+    return self;
+    }
+
+    
+// Destructor
+CIRClient::~CIRClient()
+    { 
+
+    Cancel();
+    if(iClient)
+        {
+        delete iClient;
+        iClient = NULL;        
+        }    
+    
+    iFileSession.Close();    
+    delete iConnectObject;
+    
+    for (TInt index = 0; index < iFileArray.Count(); index++ )
+    	{
+    	if(iFileArray[index].SubSessionHandle())
+    		{
+    		iFileArray[index].Close();
+    		}
+    	}
+    	
+    iFileArray.Close();
+    
+    if ( iPutBufObject )
+        {        
+        delete iPutBufObject;
+        iPutBufObject = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::PutObjectL
+// -----------------------------------------------------------------------------
+//
+void CIRClient::PutObjectL( )
+    {
+    FLOG(_L("[BTSU]\t CBTServiceClient::PutObjectL()"));
+
+    if ( iPutBufObject )
+        {        
+        delete iPutBufObject;
+        iPutBufObject = NULL;
+        }
+
+    // Create object
+    //
+    iPutBufObject = CObexBufObject::NewL(NULL);    
+    
+    RFile file;    
+    file.Duplicate(iFileArray[iObjectIndex]);
+    
+    iBuffer = CBufFlat::NewL(1000);
+    iBuffer ->ResizeL(1000);
+    TObexRFileBackedBuffer bufferdetails(*iBuffer,file,CObexBufObject::ESingleBuffering);
+    iPutBufObject->SetDataBufL(bufferdetails);
+    
+    
+    TFileName filename;    
+    file.Name(filename);
+    
+    TInt size;
+    file.Size(size);
+    iPutBufObject->SetLengthL(size);	
+		
+    iPutBufObject->SetNameL(filename);
+    TTime time;
+	if(file.Modified(time) == KErrNone)
+		iPutBufObject->SetTimeL(time);
+	
+        
+        
+
+    // Send object
+    //
+    iClient->Put( *iPutBufObject, iStatus );    
+	SetActive();
+    iClientState = EIRCliPutting;
+
+    FLOG(_L("[BTSU]\t CBTServiceClient::PutObjectL() completed"));
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::CloseClientConnection
+// -----------------------------------------------------------------------------
+//
+void CIRClient::CloseClientConnection()
+    {    
+
+    iClient->Disconnect( iStatus );
+   	SetActive();
+    iClientState = EIRCliDisconnected;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::GetProgressStatus
+// -----------------------------------------------------------------------------
+//
+TInt CIRClient::GetProgressStatus()
+    {    
+
+    TInt bytesSent = 0;
+    if ( iPutBufObject )
+        {
+        bytesSent = iPutBufObject->BytesSent();
+        }
+        
+    return iTotalBytesSent + bytesSent;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CIRClient::DoCancel()
+    {
+    FLOG(_L("[BTSU]\t CBTServiceClient::DoCancel()"));
+
+    // Sending an error to Obex is the only way to cancel active requests
+    //    
+    if(iClient)
+        {
+        delete iClient;
+        iClient = NULL;        
+        }    
+    
+
+    FLOG(_L("[BTSU]\t CBTServiceClient::DoCancel() completed"));
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::RunL
+// -----------------------------------------------------------------------------
+//
+void CIRClient::RunL()
+    {
+
+
+    switch ( iClientState )
+        {
+        case EIRCliConnecting:
+            {
+               
+            if ( iPutBufObject )
+				{				
+				delete iPutBufObject;
+				iPutBufObject = NULL;
+				}				
+				iObjectIndex=0;		
+				iDialog->CancelWaitDialogL();		
+				iDialog->LaunchProgressDialogL( this, FileListsize(), 
+            									R_IR_SENDING_DATA, KIRProgressInterval );             
+				TRAPD(error,SendL());
+				error=error;         	
+			
+			
+            break;
+            }
+
+        case EIRCliPutting:
+            {
+                     
+			if ( iPutBufObject )
+				{				
+				delete iPutBufObject;
+				iPutBufObject = NULL;
+				}		
+		    if(iBuffer)
+		        {
+		        delete iBuffer;
+		        iBuffer=NULL;
+		        }
+			iObjectIndex++;
+			TRAPD(error,SendL());
+			error=error;         
+          
+            break;
+            }
+
+        case EIRCliDisconnected:
+            {            
+            break;
+            }       
+        default:
+           {
+              
+           break;
+           }
+        }
+
+    FLOG(_L("[BTSU]\t CBTServiceClient::RunL() completed"));
+    }
+    
+ // -----------------------------------------------------------------------------
+// CBTServiceClient::DialogDismissed
+// -----------------------------------------------------------------------------
+//   
+ void CIRClient::DialogDismissed( TInt aButtonId )
+    {
+    
+    if( aButtonId == EAknSoftkeyCancel )
+        {
+        FLOG(_L("[BTSU]\t CBTServiceStarter::DialogDissmissed(), cancelled by user"));
+        Cancel();
+
+        // Cancelled by user, stop service
+        //
+        iClientState = EIRCliDisconnected;
+        TRequestStatus* temp = &iStatus;
+        User::RequestComplete( temp, KErrNone );        
+        SetActive();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::StartSendL
+// -----------------------------------------------------------------------------
+//     
+ void CIRClient::StartSendL(const CAiwGenericParamList& aOutParamList )
+    {
+    
+    if ( iDialog )
+        {
+        iDialog->CancelWaitDialogL();        
+        }
+    
+    for( TInt index = 0; index < aOutParamList.Count(); index++ )
+        {
+        if ( aOutParamList[index].SemanticId() != EGenericParamFile )
+            {
+            FLOG(_L("[BTSS]\t CBTSSProvider::AddParametersL() wrong semantic Id: Leave"));
+            User::Leave( KErrArgument );
+            }
+            // Try to add file as an image
+            //          
+       
+    
+        if(aOutParamList[index].Value().TypeId()== EVariantTypeFileHandle)
+        	{        	        	
+            AddFileHandleL( aOutParamList[index].Value().AsFileHandle() );           
+        	
+        	}
+        else 
+        	{            
+            AddFileL( aOutParamList[index].Value().AsDes() );            
+        	}
+    
+        }      
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTServiceClient::SendL
+// -----------------------------------------------------------------------------
+//     
+ void CIRClient::SendL()
+    {
+    if(iObjectIndex<iFileArray.Count())
+        {        
+        PutObjectL();
+        }
+     else
+        {
+        ShowNote();            
+        iDialog->CancelProgressDialogL();
+        iClient->Disconnect( iStatus );        
+        SetActive();    
+        iClientState=EIRCliDisconnected;        
+        
+        }
+       
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::AddFileHandleL
+// -----------------------------------------------------------------------------
+//      
+    
+    
+ void CIRClient::AddFileHandleL(RFile aFile)
+    {
+    if(!aFile.SubSessionHandle())
+        {
+        User::Leave( KErrArgument );
+        }
+    RFile file;
+    
+    file.Duplicate(aFile);
+
+    iFileArray.AppendL( file );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::AddFileL
+// -----------------------------------------------------------------------------
+//      
+	    
+ void CIRClient::AddFileL(const TDesC& aFilePath)
+    {
+    if ( &aFilePath == NULL || 
+         aFilePath.Length() == 0 ||
+         aFilePath.Length() > KMaxFileName )
+        {
+        User::Leave( KErrArgument );
+        } 
+    RFile file;
+    User::LeaveIfError( file.Open( iFileSession, aFilePath, EFileShareReadersOnly) );
+    AddFileHandleL(file);
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTServiceClient::FileListsize
+// -----------------------------------------------------------------------------
+//      
+ TInt CIRClient::FileListsize()
+    {
+    
+    TInt totalFileSize = 0; 	    
+    for ( TInt index = 0; index < iFileArray.Count(); index++ )
+        {                
+        TInt fileSize = 0;
+        iFileArray[index].Size( fileSize );
+        totalFileSize += fileSize;        
+        }
+    return totalFileSize;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTServiceClient::ShowNote
+// -----------------------------------------------------------------------------
+//      
+void CIRClient::ShowNote()
+    {
+    if(iObjectIndex==iFileArray.Count() && iStatus==KErrNone)
+        {
+        TRAPD(error,TObexUtilsUiLayer::ShowInformationNoteL(R_IR_DATA_SENT));
+        error=error;
+        }
+     else
+     	{
+     	TRAPD(error,TObexUtilsUiLayer::ShowInformationNoteL(R_IR_SENDING_FAILED));
+     	error=error;
+     	}
+    }
+//  End of File