diff -r 02103bf20ee5 -r 90dbfc0435e3 bluetoothengine/headsetsimulator/core/src/Server/hsaudioserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/headsetsimulator/core/src/Server/hsaudioserver.cpp Wed Sep 15 15:59:44 2010 +0200 @@ -0,0 +1,227 @@ +/* + * 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 "hsaudioserver.h" +#include "debug.h" + +CHsAudioServer* CHsAudioServer::NewL( RSocketServ& aSocketServ, + TBool aPullAudio ) + { + CHsAudioServer* self = CHsAudioServer::NewLC( aSocketServ, aPullAudio ); + CleanupStack::Pop( self ); + return self; + } + +CHsAudioServer* CHsAudioServer::NewLC( RSocketServ& aSocketServ, + TBool aPullAudio ) + { + CHsAudioServer* self = new ( ELeave ) CHsAudioServer( aSocketServ, + aPullAudio ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CHsAudioServer::~CHsAudioServer() + { + + if ( iSCOSocket ) + { + delete iSCOSocket; + } + } + +void CHsAudioServer::ListenL() + { + TRACE_FUNC_ENTRY + + if ( iListening ) + { + User::Leave( KErrInUse ); + } + if ( iSCOSocket ) + { + delete iSCOSocket; + iSCOSocket = NULL; + } + iSCOSocket = CBluetoothSynchronousLink::NewL( *this, iSServ ); + + User::LeaveIfNull( iSCOSocket ); + + User::LeaveIfError( iSCOSocket->AcceptConnection( iAcceptedPackets ) ); + + TRACE_FUNC_EXIT + } + +void CHsAudioServer::ConnectL( const TBTDevAddr &aAddr ) + { + TRACE_FUNC_ENTRY + + if ( iConnected ) + { + User::Leave( KErrInUse ); + } + if ( iSCOSocket ) + { + delete iSCOSocket; + iSCOSocket = NULL; + } + iSCOSocket = CBluetoothSynchronousLink::NewL( *this, iSServ ); + + User::LeaveIfNull( iSCOSocket ); + + iAddr = aAddr; + iSCOSocket->SetupConnection( aAddr, iAcceptedPackets ); + + TRACE_FUNC_EXIT + } + +void CHsAudioServer::Disconnect() + { + TRACE_FUNC_ENTRY + + if ( iSCOSocket && iConnected ) + { + iSCOSocket->CancelReceive(); + iSCOSocket->CancelSend(); + iSCOSocket->Disconnect(); + delete iSCOSocket; + iSCOSocket = NULL; + iConnected = EFalse; + iListening = EFalse; + + ListenL(); + } + + TRACE_FUNC_EXIT + } + +void CHsAudioServer::Shutdown() + { + TRACE_FUNC_ENTRY + + if ( iSCOSocket ) + { + if ( iListening ) + { + iSCOSocket->CancelAccept(); + } + delete iSCOSocket; + iSCOSocket = NULL; + iListening = EFalse; + iConnected = EFalse; + } + + TRACE_FUNC_EXIT + } + +void CHsAudioServer::SetPullAudio( TBool aPullAudio ) + { + iPullAudio = aPullAudio; + } + +TBool CHsAudioServer::IsConnected() + { + return iConnected; + } + +TBool CHsAudioServer::IsListen() + { + return iListening; + } + +CHsAudioServer::CHsAudioServer( RSocketServ& aSocketServ, TBool aPullAudio ) : + iSServ( aSocketServ ), iAcceptedPackets( EAnySCOPacket ), iListening( + EFalse ), iPullAudio( aPullAudio ) + { + + } + +void CHsAudioServer::ConstructL() + { + + } + +void CHsAudioServer::HandleSetupConnectionCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + iConnected = ETrue; + iListening = EFalse; + iSCOSocket->AcceptConnection( TBTSyncPackets( iAcceptedPackets ) ); + + if ( aErr == KErrNone && iPullAudio ) + { + User::LeaveIfError( iSCOSocket->Receive( iReceiveBuffer ) ); + } + + TRACE_FUNC_EXIT + + } + +void CHsAudioServer::HandleDisconnectionCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + iConnected = EFalse; + iListening = ETrue; + iSCOSocket->AcceptConnection( TBTSyncPackets( iAcceptedPackets ) ); + + TRACE_FUNC_EXIT + } +void CHsAudioServer::HandleAcceptConnectionCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + iConnected = ETrue; + iListening = EFalse; + + if ( aErr == KErrNone && iPullAudio && iSCOSocket ) + { + User::LeaveIfError( iSCOSocket->Receive( iReceiveBuffer ) ); + } + + TRACE_FUNC_EXIT + } + +void CHsAudioServer::HandleSendCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + if ( iPullAudio ) + { + User::LeaveIfError( iSCOSocket->Receive( iReceiveBuffer ) ); + } + + TRACE_FUNC_EXIT + } +void CHsAudioServer::HandleReceiveCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + if ( iPullAudio && aErr != KErrNone ) + { + User::LeaveIfError( iSCOSocket->Receive( iReceiveBuffer ) ); + + } + if ( aErr == KErrDisconnected ) + { + Disconnect(); + } + + TRACE_FUNC_EXIT + }