syncmlfw/common/transport/src/nsmltransport.cpp
changeset 0 b497e44ab2fc
child 25 b183ec05bd8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/transport/src/nsmltransport.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,555 @@
+/*
+* 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:  SyncML transport interface
+*
+*/
+
+
+
+
+#include <CoreApplicationUIsSDKCRKeys.h>
+#include <btengdomaincrkeys.h>
+#include <centralrepository.h>
+#include <ApUtils.h>
+#include "nsmltransport.h"
+#include "nsmlhttp.h"
+#include "NSmlObexClient.h"
+#include "nsmlobexserverbinding.h"
+#include "nsmlerror.h"  
+#include <featmgr.h>
+
+//============================================================
+// CNSmlTransport definition
+//============================================================
+EXPORT_C CNSmlTransport::CNSmlTransport()
+	{
+	}
+//------------------------------------------------------------
+// desctructor
+//------------------------------------------------------------
+EXPORT_C CNSmlTransport::~CNSmlTransport() 
+	{
+	DBG_FILE(_S8("CNSmlTransport::~CNSmlTransport() begin"));
+	if( iObexBinding )
+		{
+		DBG_FILE(_S8("delete iObexBinding"));
+		delete iObexBinding;
+		iObexBinding = NULL;
+		iObexLibrary.Close();
+		}
+	if( iHTTPBinding )
+		{
+		DBG_FILE(_S8("delete iHTTPBinding"));
+		delete iHTTPBinding;
+		iHTTPBinding = NULL;
+		iHTTPLibrary.Close();
+		}
+	if( iObexServerBinding )
+		{
+		DBG_FILE(_S8("delete iObexServerBinding"));
+		delete iObexServerBinding;
+		iObexServerBinding = NULL;
+		iObexServerBindingLib.Close();
+		}
+	DBG_FILE(_S8("CNSmlTransport::~CNSmlTransport() end"));
+	}
+// ---------------------------------------------------------
+// CNSmlTransport::NewL()
+// Creates new instance of CNSmlTransport. 
+// Does not leave instance pointer to CleanupStack.
+// ---------------------------------------------------------
+EXPORT_C CNSmlTransport* CNSmlTransport::NewL()
+	{
+	CNSmlTransport* self = CNSmlTransport::NewLC();
+	CleanupStack::Pop();
+	return( self );
+	}
+// ---------------------------------------------------------
+// CNSmlTransport::NewLC()
+// Creates new instance of CNSmlTransport 
+// Leaves instance pointer to CleanupStack.
+// ---------------------------------------------------------
+EXPORT_C CNSmlTransport* CNSmlTransport::NewLC()
+	{
+	CNSmlTransport* self = new (ELeave) CNSmlTransport();
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return( self );
+	}
+//------------------------------------------------------------
+// 2-phase construct
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::ConstructL() 
+	{
+	iObex = EFalse;
+	iObexServer = EFalse;
+
+	iBTObserver = 0;
+	iBTDevAddr = TBTDevAddr( 0 );
+	iServiceUid = TUUID( 0 );
+		FeatureManager::InitializeLibL();  
+		iWLANBearer = FeatureManager::FeatureSupported( KFeatureIdProtocolWlan );
+		FeatureManager::UnInitializeLib();
+	}
+
+//------------------------------------------------------------
+// CNSmlTransport::LoadObexServerBindingDllL()
+// Loads OBEX client dll.
+//------------------------------------------------------------
+void CNSmlTransport::LoadObexServerBindingDllL()
+	{
+	DBG_FILE(_S8("CNSmlTransport::LoadObexServerBindingDllL()"));
+	// Dynamically load DLL
+	User::LeaveIfError( iObexServerBindingLib.Load( KSmlObexServerBindingLibName ) );
+	if( iObexServerBindingLib.Type()[1] != KSmlTransBindingUid )
+		{
+		DBG_FILE(_S8("KSmlTransBindingUid incorrect..."));
+		iObexServerBindingLib.Close();
+		User::Leave( KErrNotFound );
+		}	
+	TNSmlCreateObexServerBindingFunc CreateCNsmlObexServerBindingL = (TNSmlCreateObexServerBindingFunc)iObexServerBindingLib.Lookup(1);
+	iObexServerBinding =  (CNSmlObexServerBinding*)CreateCNsmlObexServerBindingL();
+	}
+//------------------------------------------------------------
+// CNSmlTransport::LoadObexDllL()
+// Loads OBEX client dll.
+//------------------------------------------------------------
+void CNSmlTransport::LoadObexDllL()
+	{
+	DBG_FILE(_S8("CNSmlTransport::LoadObexDllL()"));
+
+	// Dynamically load DLL
+	// Check what is the used medium type and load the correct DLL
+	//  BT, IR, USB
+	if ( iCurrMedium == KUidNSmlMediumTypeUSB )
+		{
+		User::LeaveIfError( iObexLibrary.Load( KSmlObexUsbClientLibName ) );
+		}
+	else
+		{
+		User::LeaveIfError( iObexLibrary.Load( KSmlObexClientLibName ) );
+		}
+
+	if( iObexLibrary.Type()[1] != KSmlTransBindingUid )
+		{
+		iObexLibrary.Close();
+		User::Leave( KErrNotFound );
+		}	
+	TNSmlCreateObexClientFunc createObexClientL = (TNSmlCreateObexClientFunc)iObexLibrary.Lookup(1);
+	iObexBinding =  (CNsmlObexClient*)createObexClientL();
+	}
+
+//------------------------------------------------------------
+// CNSmlTransport::LoadHTTPDllL()
+// Loads HTTP client dll.
+//------------------------------------------------------------
+void CNSmlTransport::LoadHTTPDllL()
+	{
+	DBG_FILE(_S8("CNSmlTransport::LoadHTTPDllL()"));
+	// Dynamically load DLL
+	User::LeaveIfError( iHTTPLibrary.Load( KSmlHTTPClientLibName ) );
+	if( iHTTPLibrary.Type()[1] != KSmlTransBindingUid )
+		{
+		iHTTPLibrary.Close();
+		User::Leave( KErrNotFound );
+		}
+	TNSmlCreateHTTPFunc createHTTPClientL = (TNSmlCreateHTTPFunc)iHTTPLibrary.Lookup(1);
+	iHTTPBinding =  (CNSmlHTTP*)createHTTPClientL();
+	}
+
+// 1.2 CHANGES: Offline mode
+//------------------------------------------------------------
+// CNSmlTransport::IsInOfflineMode()
+// Checks if device is at offline mode
+//------------------------------------------------------------
+TBool CNSmlTransport::IsInOfflineModeL()
+    {
+    TInt operationsAllowed( ECoreAppUIsNetworkConnectionAllowed );
+	CRepository* rep = CRepository::NewLC( KCRUidCoreApplicationUIs );
+	rep->Get(KCoreAppUIsNetworkConnectionAllowed, operationsAllowed );
+	CleanupStack::PopAndDestroy(); //rep
+	
+    return ( operationsAllowed == ECoreAppUIsNetworkConnectionNotAllowed ) ? ETrue : EFalse;
+    }
+// Changes end
+
+//------------------------------------------------------------
+// CNSmlTransport::Connect
+// Establishes a communication using the protocol service with the given ID.
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::ConnectL( TUid aMediumType, TBool aServerAlerted, CArrayFixFlat<TUint32>* aIAPIdArray, TDesC8& aURI, TDesC8& aMimeType, TRequestStatus &aStatus, TDesC8& aHTTPusername, TDesC8& aHTTPpassword, TInt aHTTPauthused ) 
+	{
+	DBG_FILE(_S8("Connect starts..."));
+	iAgentStatus = &aStatus;
+
+	iCurrMedium = aMediumType;
+
+	if( aMediumType != KUidNSmlMediumTypeInternet )
+		{
+		TNSmlObexTransport obexTransport;
+		
+		if ( aMediumType == KUidNSmlMediumTypeUSB )
+			{
+			obexTransport = EObexUsb;
+			}
+		else if ( aMediumType == KUidNSmlMediumTypeIrDA )
+			{
+			obexTransport = EObexIr;
+			}
+		else
+			{
+			obexTransport = EObexBt;
+
+            if ( IsInOfflineModeL() )
+            	{
+			    TInt btActivationEnabled( EBTEnabledInOfflineMode );
+		        CRepository* rep = CRepository::NewLC( KCRUidBluetoothEngine );
+                TInt properr = rep->Get( KBTEnabledInOffline, btActivationEnabled );
+				CleanupStack::PopAndDestroy();
+                
+                if ( btActivationEnabled == EBTDisabledInOfflineMode )
+					{
+					DBG_FILE(_S8("Offline mode set!"));
+					*iAgentStatus = KRequestPending;
+					TRequestStatus* status = iAgentStatus;
+					User::RequestComplete( status, TNSmlError::ESmlStatusNotPossibleInOfflineMode );
+					return;
+					}			        
+				}
+			}
+
+		Connect( obexTransport, aServerAlerted, aMimeType, aStatus );
+		}
+	else
+		{        
+			TBool errormsg = EFalse;
+			if(IsInOfflineModeL()) 
+			{
+        // 1.2 CHANGES: Offline mode
+			if( !iWLANBearer ) // offline mode and no WLAN support
+            {
+				errormsg = ETrue;
+			}
+			else
+			{
+            // used, so it is ok to use first one in the list.
+            if ( aIAPIdArray->At(0) != 0xffffffff && aIAPIdArray->At(0) != 0xfffffffe ) 
+			// 0xffffffff is same as -1 (KErrNotFound) and -2 for Default connection
+                {
+                TUint32 accesspointId = aIAPIdArray->At(0);
+                CCommsDatabase* commDb = CCommsDatabase::NewL();
+                CleanupStack::PushL(commDb);
+                CApUtils* aputils = CApUtils::NewLC( *commDb );
+                TRAP_IGNORE( accesspointId = aputils->WapIdFromIapIdL( accesspointId ) );
+                TApBearerType bearerType = aputils->BearerTypeL( accesspointId );
+                CleanupStack::PopAndDestroy( 2 ); //commdb,aputils
+                            
+                if ( bearerType != EApBearerTypeWLAN )
+                    {
+                    	errormsg = ETrue;
+                    }
+                }
+			}
+			}
+			if(errormsg)
+                {
+                DBG_FILE(_S8("Offline mode set!"));
+	    	    *iAgentStatus = KRequestPending;
+		        TRequestStatus* status = iAgentStatus;
+                User::RequestComplete( status, TNSmlError::ESmlStatusNotPossibleInOfflineMode );
+                return;
+                }
+        // Changes end
+
+		// New attributes username and password to support HTTP authentication
+		Connect( aIAPIdArray, aURI, aMimeType, aStatus, aHTTPusername, aHTTPpassword, aHTTPauthused );
+		}
+	}
+
+
+//------------------------------------------------------------
+// CNSmlTransport::Connect
+// Establishes a communication for OBEX.
+//------------------------------------------------------------
+void CNSmlTransport::Connect( TNSmlObexTransport aTransport,TBool aServerAlerted, TDesC8& aMimeType, TRequestStatus &aStatus )
+	{
+	DBG_FILE(_S8("OBEX Connect starts..."));
+	iObex = ETrue;
+	TInt err( KErrNone );
+	iAgentStatus = &aStatus;
+	if( !aServerAlerted ) // starting OBEX client
+		{
+		DBG_FILE(_S8("starting OBEX client..."));
+		if( iObexBinding == NULL )
+			{
+			TRAP( err, LoadObexDllL() );
+			if( err != KErrNone )
+				{
+				DBG_FILE(_S8("LoadObexDllL() failed!"));
+				*iAgentStatus = KRequestPending;
+				TRequestStatus* status = iAgentStatus;
+				User::RequestComplete( status, err );
+				}
+			}
+
+		if( iObexBinding && aTransport == EObexBt && !err )
+			{
+			// Set observer to get partners bluetooth address/name
+			if( iBTObserver )
+				{
+				iObexBinding->SetExtObserver( iBTObserver );
+				}
+			// Set bluetooth connection info
+			if( iBTDevAddr != TBTDevAddr( 0 ) || iServiceUid != TUUID( 0 ) )
+				{
+				iObexBinding->SetBTConnInfo( iBTDevAddr, iServiceUid );	
+				}
+			}
+
+		if( iObexBinding && !err )
+			{
+			TRAP( err, iObexBinding->ConnectL( aTransport, aServerAlerted, aMimeType, aStatus ) );
+			if( err != KErrNone )
+				{
+				DBG_FILE(_S8("iObexBinding->ConnectL() failed"));
+				*iAgentStatus = KRequestPending;
+				TRequestStatus* status = iAgentStatus;
+				User::RequestComplete( status, err );
+				}
+			}
+		}
+	else
+		{
+		DBG_FILE(_S8("starting OBEX server binding..."));
+		iObexServer = ETrue;
+		if( iObexServerBinding == NULL )
+			{
+			TRAP( err, LoadObexServerBindingDllL() );
+			if( err != KErrNone )
+				{
+				DBG_FILE(_S8("LoadObexServerBindingDllL() failed!"));
+				*iAgentStatus = KRequestPending;
+				TRequestStatus* status = iAgentStatus;
+				User::RequestComplete( status, err );
+				}
+			}
+		if( iObexServerBinding && !err )
+			{
+			iObexServerBinding->Connect( aTransport, aServerAlerted, aMimeType, aStatus );
+			}
+		}
+	}
+
+//------------------------------------------------------------
+// CNSmlTransport::Connect
+// Establishes a communication using the protocol service with the given ID.
+//------------------------------------------------------------
+void CNSmlTransport::Connect( CArrayFixFlat<TUint32>* aIAPIdArray, TDesC8& aURI, TDesC8& aMimeType, TRequestStatus &aStatus, TDesC8& aHTTPusername, TDesC8& aHTTPpassword, TInt aHTTPauthused )
+	{
+	DBG_FILE(_S8("HTTP Connect starts..."));
+	TInt err( KErrNone );
+	iAgentStatus = &aStatus;
+	iObex = EFalse;
+	if( iHTTPBinding == NULL )
+		{
+		TRAP( err, LoadHTTPDllL() );
+		if( err != KErrNone )
+			{
+			DBG_FILE(_S8("LoadHTTPDllL() failed!"));
+			*iAgentStatus = KRequestPending;
+			TRequestStatus* status = iAgentStatus;
+			User::RequestComplete( status, err );
+			}
+		}
+	if( iHTTPBinding && !err )
+		{
+		TRAP( err, iHTTPBinding->OpenCommunicationL( aIAPIdArray, aURI, aMimeType, aStatus, aHTTPusername, aHTTPpassword, aHTTPauthused ) );
+		if( err != KErrNone )
+			{
+			DBG_FILE(_S8("iHTTPBinding->OpenCommunicationL() failed!"));
+			*iAgentStatus = KRequestPending;
+			TRequestStatus* status = iAgentStatus;
+			User::RequestComplete( status, err );
+			}
+		}
+	}
+//------------------------------------------------------------
+// CNSmlTransport::Disconnect
+// Closes a previously opened communication.
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::Disconnect( )
+	{
+	DBG_FILE(_S8("CNSmlTransport::Disconnect( )"));
+	if( iObex )
+		{
+		if( iObexBinding != NULL )
+			{
+			DBG_FILE(_S8("iObexBinding->Cancel() starts.."));	
+			iObexBinding->Cancel();
+			
+			TRequestStatus* status = iAgentStatus;
+			TInt err( KErrNone );
+			TRAP(err, iObexBinding->CloseCommunicationL( *status ) );
+			}
+		if( iObexServerBinding != NULL )
+			{
+			DBG_FILE(_S8("iObexServerBinding->Cancel() starts.."));			
+			iObexServerBinding->Cancel();
+			iObexServerBinding->Disconnect();
+			}
+		}
+	else
+		{
+		if( iHTTPBinding != NULL )
+			{
+			DBG_FILE(_S8("iHTTPBinding->Cancel() starts.."));			
+			iHTTPBinding->Cancel();
+			}
+		}
+	}
+//------------------------------------------------------------
+// CNSmlTransport::Receive
+// Read data across a connection.
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::Receive( TPtr8& aStartPtr, TRequestStatus &aStatus )
+	{
+	DBG_FILE(_S8("CNSmlTransport::Receive starts..."));
+	TInt err( KErrNone );
+	if( iObex )
+		{
+		if( iObexServer )
+			{
+			DBG_FILE(_S8("OBEX server binding Receive starts..."));
+			this->iObexServerBinding->Receive( aStartPtr, aStatus );
+			}
+		else
+			{
+			DBG_FILE(_S8("OBEX ReceiveDataL starts..."));
+			TRAP( err, this->iObexBinding->ReceiveDataL( aStartPtr, aStatus ) );
+			if( err != KErrNone )
+				{
+				DBG_FILE(_S8("iObexBinding->ReceiveDataL failed!"));
+				*iAgentStatus = KRequestPending;
+				TRequestStatus* status = iAgentStatus;
+				User::RequestComplete( status, err );
+				}			
+			}
+		}
+	else
+		{
+		DBG_FILE(_S8("HTTP ReceiveDataL starts..."));
+		TRAP( err, this->iHTTPBinding->ReceiveDataL( aStartPtr, aStatus ) );
+		if( err != KErrNone )
+			{
+			DBG_FILE(_S8("iHTTPBinding->ReceiveDataL failed!"));
+			*iAgentStatus = KRequestPending;
+			TRequestStatus* status = iAgentStatus;
+			User::RequestComplete( status, err );
+			}
+		}
+	}
+//------------------------------------------------------------
+// CNSmlTransport::Send
+// Send data across a connection.
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::Send( TDesC8& aStartPtr, TBool /*aFinalPacket*/, TRequestStatus &aStatus )
+	{
+	DBG_FILE(_S8("CNSmlTransport::Send starts..."));
+	TInt err( KErrNone );
+
+	if( iObex )
+		{
+		if ( iObexServer )
+			{
+			DBG_FILE(_S8("OBEX server binding SendDataL starts..."));
+			this->iObexServerBinding->Send( aStartPtr, ETrue, aStatus );
+			}
+		else
+			{
+			DBG_FILE(_S8("OBEX client SendDataL starts..."));
+			TRAP( err, this->iObexBinding->SendDataL( aStartPtr, ETrue, aStatus ) );
+			if( err != KErrNone )
+				{
+				DBG_FILE(_S8("iObexBinding->SendDataL() failed!"));
+				*iAgentStatus = KRequestPending;
+				TRequestStatus* status = iAgentStatus;
+				User::RequestComplete( status, err );
+				}						
+			}
+		}
+	else
+		{
+        // 1.2 CHANGES: Offline mode
+        TBool offline = EFalse;
+        TInt offlineError( KErrNone );
+        TRAP( offlineError, offline = IsInOfflineModeL() );
+        if ( offline && !iWLANBearer )
+            {
+            DBG_FILE(_S8("Offline mode selected!"));
+            *iAgentStatus = KRequestPending;
+		    TRequestStatus* status = iAgentStatus;
+            User::RequestComplete( status, TNSmlError::ESmlStatusNotPossibleInOfflineMode );
+            return;
+            }
+        // Changes end
+
+		DBG_FILE(_S8("HTTP SendDataL starts..."));
+		TRAP( err, this->iHTTPBinding->SendDataL( aStartPtr, ETrue, aStatus ) );
+		if( err != KErrNone )
+			{
+			DBG_FILE(_S8("iHTTPBinding->SendDataL() failed!"));
+			*iAgentStatus = KRequestPending;
+			TRequestStatus* status = iAgentStatus;
+			User::RequestComplete( status, err );
+			}
+		}
+	}
+//------------------------------------------------------------
+// CNSmlTransport::ChangeTargetURIL
+// Changes target URI
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::ChangeTargetURIL( TDesC8& aURI )
+	{
+	if( iObex )
+		{
+		}
+	else
+		{
+		DBG_FILE(_S8("HTTP ChangeTargetURIL starts..."));
+		this->iHTTPBinding->ChangeTargetURIL( aURI );
+		}
+	}
+
+//------------------------------------------------------------
+// CNSmlTransport::SetBTConnInfo()
+// Set BT device address and service class uid
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::SetBTConnInfo( const TBTDevAddr aBTDevAddr,
+											 const TUUID aUid )
+	{
+	iBTDevAddr = aBTDevAddr;
+	iServiceUid = aUid;
+	}
+
+//------------------------------------------------------------
+// CNSmlTransport::SetExtObserver( MExtBTSearcherObserver* aExtObserver )
+// Set observer to get callbacks
+//------------------------------------------------------------
+EXPORT_C void CNSmlTransport::SetExtObserver( MExtBTSearcherObserver* aExtObserver )
+	{
+	iBTObserver = aExtObserver;
+	}
+
+//End of File
+