Msrp/MsrpServer/src/CMSRPConnListener.cpp
author shivsood
Sat, 12 Jun 2010 14:30:11 +0530
branchMSRP_FrameWork
changeset 25 505ad3f0ce5c
permissions -rw-r--r--
MSRP Chat and File Sharing FrameWork - Initial Contribution from Nokia. MSRP Implementation as per RFC 4975 and RCS specifications that supports 1. Multiple one to one chat data sessions as per RCS/RFC 4975 specifications. 2. Multiple file Sharing sessions as per RCS. 3. Data Chunking requirements as per 4975. 3. MSRP Connection sharing requirements as per RFC 4975

/*
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html."
* Initial Contributors:
* Nokia Corporation - initial contribution.
* Contributors:
*
* Description:
* MSRP Implementation
*
*/

#include "CMSRPConnListener.h"
#include "MSRPCommon.h"
// -----------------------------------------------------------------------------
// CMSRPConnListener::NewL
// Static constructor
// -----------------------------------------------------------------------------
//

/*static*/ MMSRPListener* CMSRPConnListener::NewL(CMSRPConnectionManager& aConnMngr)
    {
    MSRPLOG( "CMSRPConnListener::NewL enter" )
    CMSRPConnListener* self = new (ELeave) CMSRPConnListener( aConnMngr );
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    MSRPLOG( "CMSRPConnListener::NewL exit" )
    return self;
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::CMSRPConnListener
// Constructor
// -----------------------------------------------------------------------------
//
CMSRPConnListener::CMSRPConnListener(CMSRPConnectionManager& aConnMngr )        
    : CActive(CActive::EPriorityStandard),
    iConnMngr( aConnMngr )
    {  
    CActiveScheduler::Add(this);
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::~CMSRPConnListener
// Destructor
// -----------------------------------------------------------------------------
//
CMSRPConnListener::~CMSRPConnListener()
    {
    MSRPLOG( "CMSRPConnListener::~CMSRPConnListener enter" )
    delete iTimer;
    Cancel(); 
    iListenSocket.Close();    
/*    if(iDataSocket)
        {
        iDataSocket->Close();
        delete iDataSocket;
        iDataSocket = NULL;
        }*/
    MSRPLOG( "CMSRPConnListener::~CMSRPConnListener exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::ConstructL
// 2nd phase constructor
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::ConstructL()
    {
    iState = ENotListening;
    iTimer = CMSRPTimeOutTimer::NewL( *this );
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::DoCancel
// Cancels outstanding request.
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::DoCancel()
    {
    MSRPLOG( "CMSRPConnListener::DoCancel enter" )
    iListenSocket.CancelAccept();
    //if(iDataSocket)
        {
        iDataSocket->Close();
        delete iDataSocket;
        iDataSocket = NULL;
        }
    MSRPLOG( "CMSRPConnListener::DoCancel exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::ListenL
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::ListenL()
    {
    MSRPLOG( "CMSRPConnListener::ListenL enter" )
    iTimer->Cancel();
    iListenCount++;    
    if(iState == ENotAccepting || iState == ENotListening)
        ActivateL();
    MSRPLOG( "CMSRPConnListener::ListenL exit" )
        
    }
  
// -----------------------------------------------------------------------------
// CMSRPConnListener::ListenCancel
// ListenCancel will get invoked for connections that time out
// So listener will not keep running waiting for clients that failed to connect
// -----------------------------------------------------------------------------
//

void CMSRPConnListener::ListenCancel()
    {
    MSRPLOG( "CMSRPConnListener::ListenCancel enter" )
    if(iListenCount > 0)
        iListenCount--;
    
    if(iListenCount == 0)
        {
        Cancel();    
        iState = ENotAccepting;
       iTimer->After( KListenTimeoutInSeconds * KSecondinMicroseconds );
        }
    MSRPLOG( "CMSRPConnListener::ListenCancel exit" )    
    }

// -----------------------------------------------------------------------------
// called by observer on Notify, reactivates listener and updates count
// -----------------------------------------------------------------------------
void CMSRPConnListener::ListenCompletedL(TBool aValid)
    {
    MSRPLOG( "CMSRPConnListener::ListenCompletedL enter" )
    if(!aValid)
        {
        /*ownership not transferred*/
        iDataSocket->Close();
        delete iDataSocket;        
        }
    else if ( iListenCount > 0)
        {
        iListenCount--;
        }
    iDataSocket = NULL;    
    if(iListenCount > 0)
        {
        ActivateL();
        }
    else
        {
        iState = ENotAccepting;
        iTimer->After( KListenTimeoutInSeconds * KSecondinMicroseconds );
        }
    MSRPLOG( "CMSRPConnListener::ListenCompletedL exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::StartListeningL
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::ActivateL()
    {
    MSRPLOG( "CMSRPConnListener::ActivateL enter" )
    if(iState == ENotListening)
        {
        TInetAddr localAddr;
        iConnMngr.ResolveLocalIPAddressL( localAddr );
        localAddr.SetPort( KMsrpPort );
        User::LeaveIfError( iListenSocket.Open(
                iConnMngr.SocketServer(), KAfInet, KSockStream, KProtocolInetTcp, iConnMngr.SocketServerConn() ) );
        User::LeaveIfError( iListenSocket.SetOpt( KSoReuseAddr, KSolInetIp, ETrue ) );
        
        User::LeaveIfError( iListenSocket.Bind( localAddr ) );
    
        User::LeaveIfError( iListenSocket.Listen( KListenQueueSize ) );

        }
    
    iDataSocket = new (ELeave) RSocket;
    User::LeaveIfError( iDataSocket->Open( iConnMngr.SocketServer() ) );
    iListenSocket.Accept( *iDataSocket, iStatus );
    iState = EAccepting;
    SetActive();

    MSRPLOG( "CMSRPConnListener::ActivateL exit" )
    }


// -----------------------------------------------------------------------------
// CMSRPConnListener::RunL
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::RunL()
    {    
    MSRPLOG2( "CMSRPConnListener::RunL status = %d", iStatus.Int() );
 
    //switch( iState )
        {            
        if( iStatus.Int() == KErrNone )
            {              
            //if(iListenCount) 
            NotifyL(EListenAccepted);
            }
        else
            {
            //if state not stopping NotifyL(EListenPortError); else NotifyL(EStopped);
            NotifyL(EListenPortError);
            }      
         }

    MSRPLOG( "CMSRPConnListener::RunL exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::RunError
// -----------------------------------------------------------------------------
//
TInt CMSRPConnListener::RunError(TInt aError)
    {    
    MSRPLOG( "CMSRPConnListener::RunError enter" );
 
    //leave on other error, terminate 
    //TRAPD(err, NotifyL(ETerminate);
    aError = KErrNone;
    MSRPLOG( "CMSRPConnListener::RunError exit" );
    return aError;
    }


// -----------------------------------------------------------------------------
// CMSRPConnListener::ChangeStateAndNotify
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::NotifyL(TListenerState aNewState)
    {
    MSRPLOG( "CMSRPConnListener::NotifyL enter" )
    iState = aNewState;
    iConnMngr.ListenerStateL( iState, iDataSocket, iStatus.Int());
    MSRPLOG( "CMSRPConnListener::NotifyL exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::TimerExpired
// Callback from the timeout notifier.
// -----------------------------------------------------------------------------
//
void CMSRPConnListener::TimerExpiredL()
    {
    MSRPLOG( "CMSRPConnListener::TimerExpired enter" )
    //non leaving, no issue here as notifyl does not leave on timeout, 
    //TRAPD(err, NotifyL(ETimedOut));
    NotifyL(ETimedOut);
    MSRPLOG( "CMSRPConnListener::TimerExpired exit" )
    }

// -----------------------------------------------------------------------------
// CMSRPConnListener::Stop
// Cancelling any outstanding read/write request.
// -----------------------------------------------------------------------------
//
/*
void CMSRPConnListener::StopListeningL()
    {
    iListenSocket.CancelAccept();
    NotifyL(EStopping);
    }
*/


// End of file