bluetoothengine/headsetsimulator/core/src/Server/hsserver.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 "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 */)
    {

    }