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