--- /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
+