bluetoothengine/headsetsimulator/core/src/Server/hsaudioserver.cpp
author michal.sulewski
Wed, 15 Sep 2010 15:59:44 +0200
branchheadsetsimulator
changeset 60 90dbfc0435e3
permissions -rw-r--r--
source code commit

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