syncmlfw/common/obex/obexdsplugin/src/NSmlObexDSplugin.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/obex/obexdsplugin/src/NSmlObexDSplugin.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1121 @@
+/*
+* Copyright (c) 2002-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:  SyncML Obex plugin for data syncronization
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <nsmlsyncalerthandlerif.h>
+#include <nsmlconstants.h> 
+#include "NSmlObexDSplugin.h"
+
+// CONSTANTS
+const TUint KAlertEComInterface = 0x101F9A2C;
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+namespace 
+	{
+	TInt CompareAlertsByPriorityL( const CImplementationInformation& aP1,
+	                               const CImplementationInformation& aP2)
+		{
+		TInt ret( 0 );
+		TInt comp = aP1.OpaqueData().Compare( aP2.OpaqueData() );
+		
+		if ( comp > 0 )
+			{
+			ret = 1;
+			}
+		else if ( comp < 0 )
+			{
+			ret = -1;
+			}
+		return ret;
+		}
+	}
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNSmlObexDSplugin* CNSmlObexDSplugin::NewL()
+    {
+    //DBG_BEGIN();
+    DBG_FILE( _S8("CNSmlObexDSplugin::NewL: begin") );
+    CNSmlObexDSplugin* self = new (ELeave) CNSmlObexDSplugin();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+	DBG_FILE( _S8("CNSmlObexDSplugin::NewL: end") );    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::CNSmlObexDSplugin()
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CNSmlObexDSplugin::CNSmlObexDSplugin():
+  iPtr( 0, 0),
+  iSendPtr( 0, 0 ),
+  iConnectionAlive( ETrue )
+  	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ConstructL()
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::ConstructL()
+    {
+	iZeroPkg = ETrue;
+	iObexContent = ENSmlDataSync;
+	iState = EIdle;
+	iResponseError = KErrNone ;
+    // create OBEX object to receive obex transfer
+    iObexBufData = CBufFlat::NewL( 10*KBufferSize );
+    iObexBufObject = CObexBufObject::NewL( iObexBufData );
+	iSessCancelled = ETrue;
+	iSessionActive = EFalse;
+	iThreadId = TThreadId( 0 );
+	/* Needs a new SRCS interface **/
+	iBtAddr = TBTDevAddr(0);
+	iBtName = KNullDesC().AllocL();
+
+	iServiceTimer = new (ELeave) CPluginServiceTimer( this, KPluginTimeOutValue );
+	iServiceTimer->ConstructL();
+	CActiveScheduler::Add( iServiceTimer );
+	
+	iGetPacketWaiterAo = CNSmlObexPacketWaiterAsync::NewL( iSs, iObexBufData, iObexBufObject ); 	
+	CActiveScheduler::Add( iGetPacketWaiterAo );
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::AlertLibrary()
+// virtual from MNSmlAlertObexPluginContext
+// -----------------------------------------------------------------------------
+//
+RLibrary& CNSmlObexDSplugin::AlertLibrary()
+	{
+	return iAlertLib;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::AlertThreadId()
+// virtual from MNSmlAlertObexPluginContext
+// -----------------------------------------------------------------------------
+//
+TThreadId* CNSmlObexDSplugin::AlertThreadId()
+	{
+	return &iThreadId;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::IsOBEXActive()
+// 
+// -----------------------------------------------------------------------------
+//
+TBool CNSmlObexDSplugin::IsOBEXActive()
+    {
+	return iSessionActive;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::~CNSmlObexDSplugin()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CNSmlObexDSplugin::~CNSmlObexDSplugin()
+    {
+	DBG_FILE( _S8("CNSmlObexDSplugin::~CNSmlObexDSplugin(): begin") );
+	
+	Disconnect();
+
+	if( iListener )
+		{
+		iListener->iSessCancelled = iSessCancelled;
+		delete iListener;
+		iListener = NULL;
+		}
+	
+	if ( iServerThread )
+		{
+		//check, if server thread still running.
+		if ( iServerThread->ExitType() == EExitPending ) 
+			{
+			//waiting for the server to finish.
+			TRequestStatus serverLogon;
+			iServerThread->Logon( serverLogon );
+			User::WaitForRequest( serverLogon );
+			}
+		iServerThread->Close();
+		delete iServerThread;
+		iServerThread = NULL;
+		}
+	
+    delete iObexBufData;
+    iObexBufData = NULL;
+
+    delete iObexBufObject;
+    iObexBufObject = NULL;
+
+	delete iData;
+	iData = NULL;
+
+	delete iBtName;
+	if ( iAlertLib.Handle() )
+		{
+		iAlertLib.Close();
+		}
+
+	if( iServiceTimer )
+		{
+		iServiceTimer->Cancel();
+		}
+	
+	delete iServiceTimer;
+	iServiceTimer = NULL;
+	
+	if(iGetPacketWaiterAo)
+		{
+		delete iGetPacketWaiterAo;
+		iGetPacketWaiterAo = NULL;
+		}
+	
+	DBG_FILE( _S8("CNSmlObexDSplugin::~CNSmlObexDSplugin(): end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ErrorIndication( TInt aError )
+// 
+// -----------------------------------------------------------------------------
+//
+#ifdef __NSML_DEBUG__
+void CNSmlObexDSplugin::ErrorIndication( TInt aError )
+    {
+	iZeroPkg = ETrue;
+	DBG_FILE_CODE( aError, _S8("CNSmlObexDSplugin::ErrorIndication...") );
+	Disconnect();
+    }
+#else
+void CNSmlObexDSplugin::ErrorIndication( TInt /*aError*/ )
+    {
+	iZeroPkg = ETrue;
+	Disconnect();
+    }
+#endif
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::TransportUpIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::TransportUpIndication()
+    {
+	DBG_FILE( _S8("CNSmlObexDSplugin::TransportUpIndication...") );
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::TransportDownIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::TransportDownIndication()
+    {
+	DBG_FILE( _S8("CNSmlObexDSplugin::TransportDownIndication...") );
+	Disconnect();
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ObexConnectIndication( const TObexConnectInfo& /*aRemoteInfo*/, const TDesC8& /*aInfo*/ )
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::ObexConnectIndication  (const TObexConnectInfo& /*aRemoteInfo*/, const TDesC8& /*aInfo*/)
+    {
+	_DBG_FILE("CNSmlObexDSplugin::ObexConnectIndication [w43 20.10.2003]");	
+	TInt err( KErrNone );
+	iStopped = EFalse;
+
+	iStartTimer = ETrue;
+    TSockAddr addr; 
+    
+    if ( iObexServer && iMediaType == ESrcsMediaBT )
+        {
+        iObexServer->RemoteAddr( addr );
+    
+        TRfcommSockAddr btAddr( addr ); 
+        iBtAddr = btAddr.BTAddr();
+        TInt nameError( KErrNone );
+        TRAP( nameError, BluetoothNameByAddressL( addr ) );
+        if ( nameError )
+            {
+            iResponseError = ConvertError( nameError ) ; 
+			_DBG_FILE("CNSmlObexDSplugin::ObexConnectIndication [Error in getting Bluetooth Name]") ;
+            }
+        }
+    if (iResponseError == KErrNone)
+	    {
+	      if(!iGetPacketWaiterAo)
+	    	{
+	    	TRAP_IGNORE (iGetPacketWaiterAo = CNSmlObexPacketWaiterAsync::NewL( iSs,
+		   																		iObexBufData,
+		   																		iObexBufObject ) ) ;
+		   	CActiveScheduler::Add( iGetPacketWaiterAo );
+			
+			iGetPacketWaiterAo->SetObexServer(iObexServer) ; // Added for setting the server
+	    	}
+	 
+		if( iListener )
+			{
+			_DBG_FILE("delete iListener");	
+			delete iListener;
+			iListener = NULL;
+			}
+		
+		err = iSs.Connect();
+		if( err == KErrNotFound )
+			{
+			// obexcommserver was not running, creating one into a new thread
+			if (iServerThread)
+				{
+				iServerThread->Close();
+				delete iServerThread;
+				iServerThread = NULL;
+				}
+			
+			iServerThread = new RThread();
+			
+			if ( iServerThread )
+				{
+				RSemaphore signal;
+				signal.CreateLocal(0);
+				
+				err = iServerThread->Create( _L("ObexCommServerThread"),
+											 CreateServerL,
+											 1024*6,
+											 KMinHeapSize,
+											 KMinHeapSize*320,
+											 &signal );
+				if ( err == KErrNone )
+					{
+					iServerThread->Resume();
+					signal.Wait();
+					err = iSs.Connect();
+					}
+					
+				signal.Close();
+				}
+			else
+				{
+				err = KErrNoMemory;
+				}
+			}
+		
+		if( err == KErrNone )
+			{
+			iSessCancelled = EFalse;
+			iListener = new CDisListener( iSs, this );
+			if (!iListener)
+				{
+				err = KErrNoMemory;
+				}
+				
+			if( err == KErrNone )
+				{
+				iListener->ListenDisconnect();
+				DBG_FILE( _S8("CNSmlObexDSplugin iServiceTimer->StopTimer()") );
+				iServiceTimer->Cancel();
+				iServiceTimer->StopTimer();
+				}
+			}
+			
+			if ( err )
+			  {
+			  iConnectionAlive = EFalse;
+			  }
+			else
+			  {
+			  iConnectionAlive = ETrue;
+			  }
+	    iResponseError = ConvertError( err );
+	    DBG_FILE_CODE( iResponseError, _S8("CNSmlObexDSplugin::ObexConnectIndication [Error]..") );	
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ObexDisconnectIndication( const TDesC8& /*aInfo*/ )
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::ObexDisconnectIndication( const TDesC8& /*aInfo*/ )
+    {
+	_DBG_FILE("CNSmlObexDSplugin::ObexDisconnectIndication");
+	Disconnect();
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::PutRequestIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::PutRequestIndication ()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::PutRequestIndication");
+	
+	iState = EIdle;
+	if ( iObexBufObject )
+		{
+		iObexBufData->Reset();
+		iObexBufObject->Reset();
+		}
+	if( iStopped )
+		{
+		_DBG_FILE("CNSmlObexDSplugin service unavailable");
+		iObexServer->RequestIndicationCallback(NULL);
+		}
+	else 
+		{
+		_DBG_FILE("CNSmlObexDSplugin::PutRequestIndication - END [service available]");		
+		iObexServer->RequestIndicationCallback(iObexBufObject);		
+		}	
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::PutPacketIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::PutPacketIndication()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::PutPacketIndication");
+	TInt bytes( this->iObexBufObject->BytesReceived() );
+	DBG_FILE_CODE( bytes, _S8("reveived bytes") );
+	if( iStopped )
+		{
+		_DBG_FILE("CNSmlObexDSplugin service unavailable");
+		return KErrIrObexRespServiceUnavail;
+		}
+	return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::PutCompleteIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::PutCompleteIndication () 
+    {
+	_DBG_FILE("CNSmlObexDSplugin::PutCompleteIndication");
+	DBG_FILE_CODE( iResponseError, _S8("CNSmlObexDSplugin::PutCompleteIndication...iResponseError...") );
+	if (iResponseError == KErrNone) 
+		{
+		if ( !iConnectionAlive )
+		  	{
+			_DBG_FILE("CNSmlObexDSplugin::PutCompleteIndication - connection not alive!");
+			iResponseError = KErrServerBusy ;  
+		  	}
+	
+		if (iResponseError == KErrNone)  
+			{
+			TInt err( KErrNone );
+
+			err = CheckMimeType();
+
+			_DBG_FILE("CNSmlObexDSplugin After CheckMimeType");
+
+			if( err == KErrNone )
+				{
+				if ( iObexBufData->Size() > KNSmlLocalSyncWorkspaceSize )
+				    {
+				    _DBG_FILE("CNSmlObexDSplugin: Received package too large!");
+					iResponseError = KErrIrObexRespReqEntityTooLarge ;
+					}
+				if (iResponseError == KErrNone) 
+					{
+					if ( iZeroPkg )
+						{
+						_DBG_FILE("CNSmlObexDSplugin..Forwarding Zero Pkg");
+						DBG_DUMP((void*)iObexBufData->Ptr(0).Ptr(), iObexBufData->Size(), _S8("Zero Pkg") );
+
+						#ifdef __NSML_DEBUG__
+						_DBG_FILE("CNSmlObexDSplugin..Zero Pkg: CWbxml2XmlConverter::ConvertL() begin");
+						CWbxml2XmlConverter* c = NULL;
+						TRAP( err, c = CWbxml2XmlConverter::NewL() );
+						if (c)
+							{
+							TRAP( err, c->ConvertL(iObexBufData->Ptr(0).Ptr(), iObexBufData->Size()) );
+							DBG_DUMP((void*)c->Document().Ptr(), c->Document().Length(), _S8("Zero Pkg (XML)") );
+							delete c;
+							}
+						_DBG_FILE("CNSmlObexDSplugin..Zero Pkg: CWbxml2XmlConverter::ConvertL() end");
+						#endif // __NSML_DEBUG__
+				
+						TRAP( err, err = ForwardZeroPkgL( iObexContent ) );
+						iResponseError = err ;
+						iZeroPkg = EFalse;
+						}
+					else
+						{
+						_DBG_FILE("CNSmlObexDSplugin..SetReceivedPacket");
+						DBG_DUMP((void*)iObexBufData->Ptr(0).Ptr(), iObexBufData->Size(), _S8("CNSmlObexDSplugin SetReceivedPacket") );
+
+						#ifdef __NSML_DEBUG__
+						_DBG_FILE("CNSmlObexDSplugin..SetReceivedPacket: CWbxml2XmlConverter::ConvertL() begin");
+						CWbxml2XmlConverter* c = NULL;
+						TRAP( err, c = CWbxml2XmlConverter::NewL() );
+						if (c)
+							{
+							TRAP( err, c->ConvertL(iObexBufData->Ptr(0).Ptr(), iObexBufData->Size()) );
+							DBG_DUMP((void*)c->Document().Ptr(), c->Document().Length(), _S8("SetReceivedPacket (XML)") );
+							delete c;
+							}
+						_DBG_FILE("CNSmlObexDSplugin..SetReceivedPacket: CWbxml2XmlConverter::ConvertL() end");
+						#endif // __NSML_DEBUG__
+						
+						if( !iStopped )
+							{
+							this->iObexBufObject->BytesReceived();
+							this->iSs.SetReceivedPacket( this->iObexBufData->Ptr( 0 ) );
+							}
+						else
+							{
+							err = KErrAccessDenied;
+							iResponseError = err ; 
+							}
+						}
+					}
+				}
+			else if ( err == KErrNotSupported )
+			    {
+		    	_DBG_FILE("CNSmlObexDSplugin: Mimetype not supported!");
+			    iResponseError = KErrIrObexRespUnsupMediaType;
+			    }
+			else
+				{
+				iResponseError = ConvertError( err );
+				}
+				
+			if (iResponseError != KErrNone) 
+				{
+				iObexServer->RequestCompleteIndicationCallback(ERespNotAcceptable);
+				}
+			else
+				{
+				iObexServer->RequestCompleteIndicationCallback(ERespSuccess);
+				}
+			}		
+		}			
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::GetRequestIndication( CObexBaseObject* /*aRequiredObject*/ )
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::GetRequestIndication (CObexBaseObject* /*aRequestedObject*/)
+    {
+	_DBG_FILE("CNSmlObexDSplugin::GetRequestIndication-- Begin");
+
+	iObexBufObject->Reset();
+
+	iState = EGetSendPacket;
+	DBG_FILE_CODE( iResponseError, _S8("CNSmlObexDSplugin::GetRequestIndication...ResponseError : ") );
+	if (iResponseError == KErrNone)
+		{
+		if(!iGetPacketWaiterAo)
+			{
+			_DBG_FILE( "CNSmlObexDSplugin::GetRequestIndication...NULL - 1 ");
+			iState = EIdle;
+			iObexServer->RequestIndicationCallback(NULL);
+			}
+		else
+			{
+			_DBG_FILE( "CNSmlObexDSplugin::GetRequestIndication...iGetPacketWaiterAo->WaitForGetData");
+			iState = EIdle;
+			iGetPacketWaiterAo->WaitForGetData();
+			_DBG_FILE("CNSmlObexDSplugin::GetRequestIndication- End with WaitforGetdata");
+			return ;				
+			}
+		}
+		else
+		{
+		_DBG_FILE( "CNSmlObexDSplugin::GetRequestIndication...NULL - 2 ");
+		iState = EIdle;
+		iObexServer->RequestIndicationCallback(NULL);			
+		}
+	_DBG_FILE("CNSmlObexDSplugin::GetRequestIndication- End abnormal");
+   }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::GetPacketIndication()
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::GetPacketIndication()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::GetPacketIndication");
+	if( iStopped )
+		{
+		_DBG_FILE("CNSmlObexDSplugin service unavailable");
+		return KErrIrObexRespServiceUnavail;
+		}
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::GetCompleteIndication()
+// 
+// -----------------------------------------------------------------------------
+void CNSmlObexDSplugin::GetCompleteIndication ()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::GetCompleteIndication");
+    iResponseError = KErrNone ;
+    iObexServer->RequestCompleteIndicationCallback(ERespSuccess);
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::SetPathIndication(const CObex::TSetPathInfo& /*aPathInfo*/, const TDesC8& /*aInfo*/)
+// 
+// -----------------------------------------------------------------------------
+void CNSmlObexDSplugin::SetPathIndication(const CObex::TSetPathInfo& /*aPathInfo*/, const TDesC8& /*aInfo*/)
+    {
+    _DBG_FILE("CNSmlObexDSplugin::SetPathIndication");
+    iResponseError = KErrNone ;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::AbortIndication()
+// 
+// -----------------------------------------------------------------------------
+void CNSmlObexDSplugin::AbortIndication()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::AbortIndication");
+	Disconnect();
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::Disconnect()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::Disconnect()
+    {
+	_DBG_FILE("CNSmlObexDSplugin::Disconnect Begin");
+	iZeroPkg = ETrue;
+
+	if( iStartTimer != EFalse )
+		{
+		DBG_FILE( _S8("CNSmlObexDSplugin iServiceTimer->StartTimer()") );
+		iServiceTimer->Cancel();
+		iServiceTimer->StartTimer();
+		}
+
+	iState = EIdle;
+	
+	if( !iSessCancelled )
+		{
+		_DBG_FILE("CNSmlObexDSplugin::Calling iGetPacketWaiterAo DoCancel");
+		iGetPacketWaiterAo->Cancel();
+		_DBG_FILE("calling iSs.Disconnect()");
+		iSs.Disconnect();
+		iSs.Close();
+		iSessCancelled = ETrue;		
+		}
+	
+	if ( iServerThread )
+		{
+		_DBG_FILE("CNSmlObexDSplugin::Disconnect() closing thread");
+		//check, if server thread still running.
+		if ( iServerThread->ExitType() == EExitPending ) 
+			{
+			//waiting for the server to finish.
+			TRequestStatus serverLogon;
+			iServerThread->Logon( serverLogon );
+			User::WaitForRequest( serverLogon );
+			}
+		iServerThread->Close();
+		delete iServerThread;
+		iServerThread = NULL;
+		}
+	
+	if(iGetPacketWaiterAo)
+		{
+		delete iGetPacketWaiterAo;
+		iGetPacketWaiterAo = NULL;
+		}
+	_DBG_FILE("CNSmlObexDSplugin::Disconnect End");
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::CheckMimeType()
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::CheckMimeType()
+	{ 	
+	_DBG_FILE("CNSmlObexDSplugin::CheckMimeType() - mimetype in dump...");
+	
+	TBuf8<256> mimeType;
+	mimeType.Copy( this->iObexBufObject->Type() );
+	TrimRightSpaceAndNull( mimeType );
+	mimeType.LowerCase();
+
+	DBG_DUMP( (void*)mimeType.Ptr(), mimeType.Length(), _S8("Received mimetype") );
+
+	if ( (mimeType.Compare( KDataSyncMIME ) == 0) ||
+		 (mimeType.Compare( KDataSyncDSAlertNotification ) == 0) )
+		{		
+		_DBG_FILE("CNSmlObexDSplugin... KDataSyncMIME OBEX content");
+		iObexContent = ENSmlDataSync;
+		return KErrNone;
+		}
+	else
+		{
+		_DBG_FILE("Unsupported mime type");
+		return KErrNotSupported;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::TrimRightSpaceAndNull()
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::TrimRightSpaceAndNull( TDes8& aDes ) const
+{
+	aDes.TrimRight();
+	if ( aDes.Length() > 0 )
+		{
+		if ( aDes[aDes.Length() - 1] == NULL )
+			{
+			aDes.SetLength( aDes.Length() - 1 );
+			} 
+		}
+}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ForwardZeroPkgL( TNSmlObexContent aSyncSelection )
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::ForwardZeroPkgL( TNSmlObexContent aSyncSelection )
+	{
+	_DBG_FILE("CNSmlObexDSplugin::ForwardZeroPkgL()");
+	TInt err( ENSmlErrNotConsumed );
+
+	if ( aSyncSelection == ENSmlDataSync )
+		{
+		CNSmlSyncAlertHandler* alert = 0;
+		RImplInfoPtrArray implArray;
+		TUid ifUid = { KAlertEComInterface };
+		CleanupStack::PushL( PtrArrCleanupItemRArr( 
+								CImplementationInformation, &implArray ) );
+		REComSession::ListImplementationsL( ifUid, implArray );
+
+		// sort alert handlers by priority (= opaque_data)
+		implArray.Sort( TLinearOrder< CImplementationInformation >( CompareAlertsByPriorityL ));
+
+		for( TInt j = 0; err == ENSmlErrNotConsumed && j < implArray.Count(); j++ )
+			{
+			alert = CNSmlSyncAlertHandler::NewL( implArray[ j ]->ImplementationUid() );
+
+			if ( alert )
+				{
+				CleanupStack::PushL( alert );
+				err = alert->StartSyncL( this->iObexBufData->Ptr( 0 ),
+					iMediaType, 
+					iBtAddr, 
+					*iBtName, 
+					this );
+				CleanupStack::PopAndDestroy( alert );
+				alert = 0;
+				}
+			}
+		REComSession::FinalClose();
+		CleanupStack::PopAndDestroy();	// implArray
+		}
+	else
+		{
+		err = KErrNotSupported;
+		}
+	return err;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::SetMediaType( TSrcsMediaType aMediaType )
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::SetMediaType( TSrcsMediaType aMediaType )
+    {
+	DBG_FILE( _S8("CNSmlObexDSplugin::SetMediaType()") );
+	iMediaType = aMediaType;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::CreateServer( TAny* aPtr )
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::CreateServerL( TAny* aPtr )
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+	CActiveScheduler::Install(scheduler);	
+	TRAPD( err, StartServerL( aPtr ) );
+	__ASSERT_ALWAYS(err == KErrNone, User::Panic(_L("OBEXCommServer"), err));
+	delete scheduler;
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+//	DBG_FILE(_S8("CNSmlObexDSplugin::CreateServerL"));	
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::StartServer( TAny* aPtr )
+// 
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::StartServerL( TAny* aPtr )
+	{
+//	DBG_FILE(_S8("CNSmlObexDSplugin::StartServerL - Begin"));	
+	CNSmlObexCommServer* server = CNSmlObexCommServer::NewL( KNSmlDSObexCommServerName() );
+	RSemaphore* s = (RSemaphore*)aPtr;
+	s->Signal();
+	CActiveScheduler::Start();
+//	DBG_FILE(_S8("CNSmlObexDSplugin::StartServerL - End"));	
+	delete server;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::ConvertError( TInt aError )
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::ConvertError( TInt aError )
+	{
+	DBG_FILE_CODE( aError, _S8("ConvertError...") );
+	TInt obexErr ( KErrIrObexRespInternalError );
+
+	switch (aError)
+	{
+	case KErrNone:
+		obexErr = KErrNone;
+		break;
+
+	case KErrNotFound:
+		obexErr = KErrIrObexRespNotFound;
+		break;
+
+	case KErrGeneral:
+	case KErrCancel:
+	case KErrNoMemory:
+		obexErr = KErrIrObexRespInternalError;
+		break;
+
+	case KErrNotSupported:
+		obexErr = KErrIrObexRespBadRequest;
+		break;
+
+	case KErrArgument:
+	case KErrTotalLossOfPrecision:
+	case KErrBadHandle:
+	case KErrOverflow:
+	case KErrUnderflow:
+	case KErrAlreadyExists:
+	case KErrPathNotFound:
+	case KErrDied:
+	case KErrInUse:
+	case KErrServerTerminated:
+		obexErr = KErrIrObexRespInternalError;
+		break;
+
+	case KErrServerBusy:
+		obexErr = KErrIrObexRespServiceUnavail;
+		break;
+
+	case KErrCompletion:
+	case KErrNotReady:
+	case KErrUnknown:
+	case KErrCorrupt:
+	case KErrAccessDenied:
+	case KErrLocked:
+	case KErrWrite:
+	case KErrDisMounted:
+	case KErrEof:
+	case KErrDiskFull:
+	case KErrBadDriver:
+	case KErrBadName:
+	case KErrCommsLineFail:
+	case KErrCommsFrame:
+	case KErrCommsOverrun:
+	case KErrCommsParity:
+	case KErrTimedOut:
+	case KErrCouldNotConnect:
+	case KErrCouldNotDisconnect:
+	case KErrBadLibraryEntryPoint:
+	case KErrBadDescriptor:
+	case KErrAbort:
+	case KErrTooBig:
+	case KErrDivideByZero:
+	case KErrBadPower:
+	case KErrDirFull:
+	case KErrHardwareNotAvailable:
+		obexErr = KErrIrObexRespInternalError;
+		break;
+	default:
+		obexErr = KErrIrObexRespInternalError;
+		break;
+	};
+	DBG_FILE_CODE( obexErr, _S8("ConvertError returned...") );
+	return obexErr;
+}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::SetObexServer( CObexServer* aObexServer )
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNSmlObexDSplugin::SetObexServer( CObexServer* aObexServer )
+    {
+    DBG_FILE(_S8("CNSmlObexDSplugin::SetObexServer - Begin"));	
+    iObexServer = aObexServer;
+	
+	iGetPacketWaiterAo->SetObexServer(aObexServer) ; // Added for setting the server
+	
+    return iObexServer->Start(this) ;
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::BluetoothNameByAddressL( TSockAddr aAddr )
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::BluetoothNameByAddressL( TSockAddr aAddr )
+    {
+	RSocketServ	sockServ;
+	RHostResolver resolver;	
+	TNameEntry result;
+	
+	User::LeaveIfError( sockServ.Connect() );
+	CleanupClosePushL( sockServ );
+	
+	User::LeaveIfError( resolver.Open( sockServ, KBTAddrFamily, KBTLinkManager ));
+    CleanupClosePushL( resolver );
+	
+    TInquirySockAddr addr( aAddr );
+	addr.SetIAC( KGIAC );
+	addr.SetAction( KHostResName );
+
+	delete iBtName;
+	iBtName = NULL; 
+
+	if ( resolver.GetByAddress( addr, result ) == KErrNone )
+	    {
+	    iBtName = result().iName.AllocL(); 
+ 	    }
+	else 
+	    {
+	    iBtName = KNullDesC().AllocL();
+	    }
+	    
+	CleanupStack::PopAndDestroy( 2, &sockServ );   //  resolver
+    }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexDSplugin::CancelIndicationCallback()
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexDSplugin::CancelIndicationCallback()
+	{
+	DBG_FILE(_S8("CNSmlObexDSplugin::CancelIndicationCallback"));	
+	}
+
+// =================== CNSmlObexPacketWaiterAsync class Implementation  =====================
+
+// -----------------------------------------------------------------------------
+// CNSmlObexPacketWaiterAsync* CNSmlObexPacketWaiterAsync::NewL(RNSmlDSObexServerSession& aSession,
+//	CBufFlat* aObexBufData,	CObexBufObject* aObexBufObject)
+//
+// -----------------------------------------------------------------------------
+//
+CNSmlObexPacketWaiterAsync* CNSmlObexPacketWaiterAsync::NewL (RNSmlDSObexServerSession& aSession,
+									  CBufFlat* aObexBufData,
+									  CObexBufObject* aObexBufObject)
+	{
+	CNSmlObexPacketWaiterAsync* self = new (ELeave) CNSmlObexPacketWaiterAsync( aSession,
+																				aObexBufData,
+																				aObexBufObject );
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self); // self
+	return self;	
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexPacketWaiterAsync::CNSmlObexPacketWaiterAsync(RNSmlDSObexServerSession& aSession,
+//	CBufFlat* aObexBufData,	CObexBufObject* aObexBufObject)
+//
+// -----------------------------------------------------------------------------
+//
+CNSmlObexPacketWaiterAsync::CNSmlObexPacketWaiterAsync(RNSmlDSObexServerSession& aSession,
+	CBufFlat* aObexBufData,	CObexBufObject* aObexBufObject) : CActive( EPriorityStandard ),
+	iSession(aSession), iObexBufData(aObexBufData), iObexBufObject(aObexBufObject), iPtr(NULL, 0) 
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexPacketWaiterAsync::ConstructL()
+//
+// -----------------------------------------------------------------------------
+// 
+void CNSmlObexPacketWaiterAsync::ConstructL()
+	{
+	iState = EIdle ;
+    iData = HBufC8::NewL( KNSmlLocalSyncWorkspaceSize );
+	iPtr.Set( iData->Des() );
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlObexPacketWaiterAsync::~CNSmlObexPacketWaiterAsync ()
+//
+// -----------------------------------------------------------------------------
+// 
+CNSmlObexPacketWaiterAsync::~CNSmlObexPacketWaiterAsync ()
+	{
+	DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::~CNSmlObexPacketWaiterAsync") );
+	//Cancel() ;
+	delete iData;
+	}
+	
+// -----------------------------------------------------------------------------
+// CNSmlObexPacketWaiterAsync::WaitForGetData()
+//
+// -----------------------------------------------------------------------------
+// 
+void CNSmlObexPacketWaiterAsync::WaitForGetData()
+	{
+	_DBG_FILE("CNSmlObexPacketWaiterAsync WaitForGetData: start");
+	iState = EGetting ;
+	iStatus = KRequestPending ;
+	TRequestStatus &lRequestStatus = iStatus;
+	iPtr.SetLength(0);
+	iSession.GetSendPacket( iPtr, lRequestStatus );
+	if( !IsActive() )
+		{
+		DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::WaitForGetData : Before SetActive") );
+		SetActive();
+		DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::WaitForGetData : After SetActive") );
+		}
+	_DBG_FILE("CNSmlObexPacketWaiterAsync WaitForGetData: end");
+	return;
+	}
+	
+// -----------------------------------------------------------------------------
+// void CNSmlObexPacketWaiterAsync::RunL()
+//
+// -----------------------------------------------------------------------------
+//	
+void CNSmlObexPacketWaiterAsync::RunL()
+	{
+	TInt err( KErrNone );
+	iState = EIdle ;
+	if ( iStatus == KErrNone)
+		{
+		iObexBufData->Reset();
+		_DBG_FILE( "CNSmlObexPacketWaiterAsync::RunL...iObexBufData->InsertL");
+		TRAP( err, iObexBufData->InsertL( 0, this->Data() ) );
+		
+		if ( err != KErrNone )
+			{
+			_DBG_FILE( "CNSmlObexPacketWaiterAsync::RunL...err != KErrNone - 1");
+			iObexServer->RequestIndicationCallback(NULL);
+			}
+		else
+			{
+			#ifdef __NSML_DEBUG__
+			_DBG_FILE("CNSmlObexPacketWaiterAsync::RunL: CWbxml2XmlConverter begin");
+			CWbxml2XmlConverter* c = NULL;
+			TRAP( err, c = CWbxml2XmlConverter::NewL() );
+			if (c)
+				{
+				TRAP( err, c->ConvertL(iObexBufData->Ptr(0).Ptr(), iObexBufData->Size()) );
+				DBG_DUMP((void*)c->Document().Ptr(), c->Document().Length(), _S8("CNSmlObexPacketWaiterAsync GetRequestIndication (XML)") );
+				delete c;
+				}
+			_DBG_FILE("CNSmlObexPacketWaiterAsync::RunL: CWbxml2XmlConverter end");
+			#endif // __NSML_DEBUG__
+
+
+			TRAP( err, iObexBufObject->SetDataBufL( iObexBufData ) );
+			if ( err != KErrNone )
+				{
+				_DBG_FILE( "CNSmlObexPacketWaiterAsync::RunL...err != KErrNone - 2");
+				iObexServer->RequestIndicationCallback(NULL);
+				}
+			else
+				{
+				_DBG_FILE( "CNSmlObexPacketWaiterAsync::RunL...iObexBufObject");
+				iObexServer->RequestIndicationCallback(iObexBufObject);
+				}			    
+			}					
+		}
+	else
+		{
+		_DBG_FILE( "CNSmlObexPacketWaiterAsync::RunL...err != KErrNone - 3");
+		iObexServer->RequestIndicationCallback(NULL);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// void CNSmlObexPacketWaiterAsync::DoCancel()
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexPacketWaiterAsync::DoCancel()
+	{
+	DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::DoCancel") );
+	if (iState == EGetting)
+		{
+		DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::CancelGetSendPacket") );
+		iSession.CancelGetSendPacket();	
+		DBG_FILE( _S8("CNSmlObexPacketWaiterAsync::RequestIndicationCallback(NULL)") );
+		iObexServer->RequestIndicationCallback(NULL);
+		iState = EIdle ;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// void CNSmlObexPacketWaiterAsync::SetObexServer( CObexServer* aObexServer )
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexPacketWaiterAsync::SetObexServer( CObexServer* aObexServer )
+	{
+	iObexServer = aObexServer;
+	}
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//End of File
+