bluetoothengine/headsetsimulator/core/src/Server/hsaudioserver.cpp
branchheadsetsimulator
changeset 60 90dbfc0435e3
--- /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
+    }