/*
* 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 */)
{
}