bluetoothengine/headsetsimulator/core/src/Server/hsserver.cpp
branchheadsetsimulator
changeset 60 90dbfc0435e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/headsetsimulator/core/src/Server/hsserver.cpp	Wed Sep 15 15:59:44 2010 +0200
@@ -0,0 +1,278 @@
+/*
+ * 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 */)
+    {
+
+    }