diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/obex/obexdsplugin/src/NSmlObexDSplugin.cpp --- /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 +#include +#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 +