diff -r 02103bf20ee5 -r 90dbfc0435e3 bluetoothengine/headsetsimulator/core/src/Server/hsserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/headsetsimulator/core/src/Server/hsserver.cpp Wed Sep 15 15:59:44 2010 +0200 @@ -0,0 +1,278 @@ +/* + * Component Name: Headset Simulator + * Author: Comarch S.A. + * Version: 1.0 + * Copyright (c) 2010 Comarch S.A. + * + * This Software is submitted by Comarch S.A. to Symbian Foundation Limited on + * the basis of the Member Contribution Agreement entered between Comarch S.A. + * and Symbian Foundation Limited on 5th June 2009 (“Agreement”) and may be + * used only in accordance with the terms and conditions of the Agreement. + * Any other usage, duplication or redistribution of this Software is not + * allowed without written permission of Comarch S.A. + * + */ + +#include "hsserver.h" +#include "hsclientobservers.h" +#include "debug.h" + +CHsServer* CHsServer::NewL( RSocketServ &aSocketServ ) + { + CHsServer* self = CHsServer::NewLC( aSocketServ ); + CleanupStack::Pop( self ); + return self; + } + +CHsServer* CHsServer::NewLC( RSocketServ &aSocketServ ) + { + CHsServer* self = new ( ELeave ) CHsServer( aSocketServ ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CHsServer::~CHsServer() + { + TRACE_FUNC_ENTRY + + if ( iSocketServer ) + { + delete iSocketServer; + } + + if ( iBlankSocket ) + { + delete iBlankSocket; + } + + TRACE_FUNC_EXIT + } + +TInt CHsServer::Listen() + { + TRACE_FUNC_ENTRY + + TInt error = KErrNone; + TProtocolDesc protDesc; + TBTSockAddr addr; + TProtocolName protName( KRFCOMMDesC ); + + if ( iListen ) + { + TRACE_FUNC_EXIT + return KErrAlreadyExists; + } + + error = iSServ.FindProtocol( protName, protDesc ); + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + TRAP(error, iSocketServer = CBluetoothSocket::NewL(*this, iSServ, + protDesc.iSockType, protDesc.iProtocol)); + + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + error = iSocketServer->GetOpt( KRFCOMMGetAvailableServerChannel, + KSolBtRFCOMM, iPort ); + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + addr.SetPort( iPort ); + addr.SetSecurity( iServerSecurity ); + + error = iSocketServer->Bind( addr ); + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + error = iSocketServer->Listen( KListenQueueSize ); + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + if ( !iBlankSocket ) + { + TRAP(error, iBlankSocket=CBluetoothSocket::NewL(*this, iSServ)); + } + + if ( error != KErrNone ) + { + TRACE_FUNC_EXIT + return error; + } + + error = iSocketServer->Accept( *iBlankSocket ); + + iListen = ETrue; + + TRACE_INFO( ( _L("Returned value = %d"), error) ); + TRACE_FUNC_EXIT + + return error; + } + +TBool CHsServer::IsReady() + { + return iListen; + } + +void CHsServer::Shutdown() + { + TRACE_FUNC_ENTRY + + if ( iSocketServer ) + { + if ( iListen ) + { + iSocketServer->CancelAccept(); + iListen = EFalse; + } + + // Return value may be ignored + iSocketServer->Shutdown( RSocket::EImmediate ); + delete iSocketServer; + iSocketServer = NULL; + } + else + { + TRAP_IGNORE( HandleShutdownCompleteL(KErrNone) ); + } + + TRACE_FUNC_EXIT + } + +void CHsServer::SetNewClientObserver( + MHsAcceptNewClientObserver &aNewClientObserv ) + { + iNewClientObserver = &aNewClientObserv; + } + +TInt CHsServer::GetPort() + { + return iPort; + } + +void CHsServer::GetSocketAndTryToConnectL( const TBTSockAddr &aAddr ) + { + TRACE_FUNC_ENTRY + TBTSockAddr sockaddr( aAddr ); + TProtocolName protocolName( KRFCOMMDesC ); + TProtocolDesc protocolDesc; + + if ( iBlankSocket2 != NULL ) + { + delete iBlankSocket2; + iBlankSocket2 = NULL; + } + + User::LeaveIfError( iSServ.FindProtocol( protocolName, protocolDesc ) ); + iBlankSocket2 = CBluetoothSocket::NewL( *this, iSServ, + protocolDesc.iSockType, protocolDesc.iProtocol ); + User::LeaveIfError( iBlankSocket2->Connect( sockaddr ) ); + TRACE_FUNC_EXIT + } + +CHsServer::CHsServer( RSocketServ &aSocketServ ) : + iSServ( aSocketServ ) + { + iServerSecurity.SetUid( TUid::Uid( 0x10ff ) ); + iServerSecurity.SetAuthentication( EFalse ); + iServerSecurity.SetAuthorisation( EFalse ); + iServerSecurity.SetEncryption( EFalse ); + } + +void CHsServer::ConstructL() + { + + } + +void CHsServer::HandleConnectCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + iNewClientObserver->HandleNewClientL( aErr == KErrNone ? iBlankSocket2 + : NULL, aErr ); + if ( aErr != KErrNone ) + { + delete iBlankSocket2; + } + iBlankSocket2 = NULL; + + TRACE_FUNC_EXIT + } + +void CHsServer::HandleAcceptCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + if ( iNewClientObserver ) + { + iNewClientObserver->HandleNewClientL( iBlankSocket, aErr ); + } + else + { + iNewClientObserver->HandleNewClientL( NULL, KErrBadHandle ); + delete iBlankSocket; + } + iBlankSocket = NULL; + iBlankSocket = CBluetoothSocket::NewL( *this, iSServ ); + User::LeaveIfError( iSocketServer->Accept( *iBlankSocket ) ); + + TRACE_FUNC_EXIT + } + +void CHsServer::HandleShutdownCompleteL( TInt /** aErr */) + { + TRACE_FUNC_ENTRY + + if ( iBlankSocket ) + { + delete iBlankSocket; + iBlankSocket = NULL; + } + if ( iSocketServer ) + { + delete iSocketServer; + iSocketServer = NULL; + } + iListen = EFalse; + + TRACE_FUNC_EXIT + } + +void CHsServer::HandleSendCompleteL( TInt /** aErr */) + { + + } + +void CHsServer::HandleReceiveCompleteL( TInt /** aErr */) + { + + } + +void CHsServer::HandleIoctlCompleteL( TInt /** aErr */) + { + } + +void CHsServer::HandleActivateBasebandEventNotifierCompleteL( TInt /** aErr */, + TBTBasebandEventNotification& /** aEventNotification */) + { + + }