IMPSengine/ImpsIpCirWatcher/ImpsUdpIpCirWatcher/src/UdpCirWatcher.cpp
author William Roberts <williamr@symbian.org>
Sun, 14 Mar 2010 13:08:59 +0000
branchCompilerCompatibility
changeset 10 013df0aa6707
parent 0 094583676ce7
permissions -rw-r--r--
Automatic merge from PDK_3.0.h

/*
* Copyright (c) 2005 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: CirWatcher for UDP
*
*
*/


// INCLUDE FILES
#include <ecom/ecom.h>
#include <f32file.h>
#include <flogger.h>
#include <msgconnmanagerapi.h>
#include "UdpCirWatcher.h"
#include "UdpSocketListener.h"
#include "CirWatcherDefines.h"
#include "ImpsIpCirWatcherAPI.h"

// ================= MEMBER FUNCTIONS =======================
//

// ----------------------------------------------------------
// CUdpCirWatcher::CUdpCirWatcher
//
// ----------------------------------------------------------
//
CUdpCirWatcher::CUdpCirWatcher() : iReferenceCount( 1 )
    {
    }

// ----------------------------------------------------------
// CUdpCirWatcher::NewL
//
// ----------------------------------------------------------
//
CUdpCirWatcher* CUdpCirWatcher::NewL()
    {
    CUdpCirWatcher* self = NULL;
    if ( Dll::Tls() == NULL )
        {
        self = new ( ELeave ) CUdpCirWatcher();
        CleanupStack::PushL( self );
        self->ConstructL();
        CleanupStack::Pop();
        Dll::SetTls( self );
        }
    else
        {
        self = static_cast<CUdpCirWatcher*>( Dll::Tls() );
        self->IncreaseReferenceCount();
        }
    return self;
    }

// ----------------------------------------------------
// CUdpCirWatcher::Destroy
// Destructor
// ----------------------------------------------------
//
void CUdpCirWatcher::Destroy()
    {
    DecreaseReferenceCount();
    CImpsUdpCirWatcher::Destroy();
    if ( ReferenceCount() == 0 )
        {
        Dll::FreeTls();
        delete this;
        }
    }

// ----------------------------------------------------
// CUdpCirWatcher::DeleteSingleton
// Destructor
// ----------------------------------------------------
//
void CUdpCirWatcher::DeleteSingleton()
    {
    CImpsUdpCirWatcher::DeleteSingleton();
    Dll::FreeTls();
    delete this;
    }

// ----------------------------------------------------
// CUdpCirWatcher::Destroy
//
// ----------------------------------------------------
//
void CUdpCirWatcher::StoreDestructorKeyL( const TUid aDestructorKey )
    {
    User::LeaveIfError( iDestructorKeyArray.Append( aDestructorKey ) );
    }

// ----------------------------------------------------------
// CUdpCirWatcher::ConstructL
//
// ----------------------------------------------------------
//
void CUdpCirWatcher::ConstructL()
    {
#ifdef _DEBUG
    DeleteLogFileL();
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::ConstructL()" ) );
#endif
    User::LeaveIfError( iSocketSession.Connect() );
    }

// ----------------------------------------------------------
// CTcpCirWatcher::DeleteLogFileL
//
// ----------------------------------------------------------
//
void CUdpCirWatcher::DeleteLogFileL()
    {
    RFs session;
    User::LeaveIfError( session.Connect() );
    CFileMan* manager = CFileMan::NewL( session );
    manager->Delete( _L( "C:\\Logs\\ImpsUdpWatcher\\*.*" ) );
    session.Close();
    delete manager;
    manager = NULL;
    }

// ----------------------------------------------------
// CUdpCirWatcher::~CUdpCirWatcher
// Destructor
// ----------------------------------------------------
//
CUdpCirWatcher::~CUdpCirWatcher()
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::~CUdpCirWatcher()" ) );
#endif
    iListenerQueue.ResetAndDestroy();
    iListenerQueue.Close();
    iSocketSession.Close();
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( " Destructor ends" ) );
#endif
    }

// ----------------------------------------------------------
// CUdpCirWatcher::FindListener
//
// ----------------------------------------------------------
//
TBool CUdpCirWatcher::FindListenerL( const TInt aServicePort,
                                     const MImpsCirReceiver& aCirReceiver )
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::FindListener()" ) );
#endif
    TBool found = EFalse;
    TInt count = iListenerQueue.Count();
    CUdpSocketListener* listener = NULL;
    for ( TInt i = 0;!found && i < count;i++ )
        {
        listener = iListenerQueue[i];
        if ( listener->ServicePort() == aServicePort )
            {
#ifdef _DEBUG
            CUdpCirWatcher::WriteToLog( _L8(
                                            "  Port %d already on watch, attach the new listener to it" ), aServicePort );
#endif
            found = ETrue;
            listener->AppendReceiverL( aCirReceiver );
            }
        }
    return found;
    }

// ----------------------------------------------------------
// CUdpCirWatcher::FindListener
//
// ----------------------------------------------------------
//
CUdpSocketListener* CUdpCirWatcher::FindListener( TInt& aIndex,
                                                  const TInt aServicePort ) const
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::FindListener()" ) );
#endif
    TBool found = EFalse;
    TInt count = iListenerQueue.Count();
    CUdpSocketListener* listener = NULL;
    for ( TInt i = 0;!found && i < count;i++ )
        {
        listener = iListenerQueue[i];
        if ( listener->ServicePort() == aServicePort )
            {
            found = ETrue;
            aIndex = i;
            }
        }
    return listener;
    }

// ----------------------------------------------------------
// CUdpCirWatcher::CreateListenerL
//
// ----------------------------------------------------------
//
TInt CUdpCirWatcher::CreateListenerL( const TInt aServicePort,
                                      const MImpsCirReceiver& aCirReceiver )
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::CreateListenerL()" ) );
#endif
    CUdpSocketListener* listener = CUdpSocketListener::NewL( aServicePort, aCirReceiver );
    CleanupStack::PushL( listener );
    User::LeaveIfError( iListenerQueue.Append( listener ) );
    CleanupStack::Pop();  //listener
    return listener->StartUdpSocketListen( iSocketSession );
    }

// ----------------------------------------------------------
// CUdpCirWatcher::RegisterCirReceiverL
//
// ----------------------------------------------------------
//
void CUdpCirWatcher::RegisterCirReceiverL( const MImpsCirReceiver& aCirReceiver,
                                           const TInt aServicePort )
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::RegisterCirReceiverL() - Port: %d" ), aServicePort );
#endif
    TInt count = iListenerQueue.Count();
    if ( count > 0 )
        {
        if ( !FindListenerL( aServicePort, aCirReceiver ) )
            User::LeaveIfError( CreateListenerL( aServicePort, aCirReceiver ) );
        }
    else
        User::LeaveIfError( CreateListenerL( aServicePort, aCirReceiver ) );
    }

// ----------------------------------------------------------
// CUdpCirWatcher::UnregisterCirReceiverL
//
// ----------------------------------------------------------
//
void CUdpCirWatcher::UnregisterCirReceiverL( const MImpsCirReceiver& aCirReceiver )
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::UnregisterCirReceiverL()" ) );
#endif
    TBool found = EFalse;
    TInt count = iListenerQueue.Count();
    if ( count > 0 )
        {
        CUdpSocketListener* listener = NULL;
        for ( TInt i = 0;!found && i < count;i++ )
            {
            listener = iListenerQueue[i];
            if ( listener->Contains( aCirReceiver ) >= 0 )
                {
                found = ETrue;
                if ( !listener->RemoveReceiver( aCirReceiver ) )
                    {
                    iListenerQueue.Remove( i );
                    delete listener;
                    listener = NULL;
                    }
                }
            }
        if ( !found )
            User::Leave( KErrNotFound );
        }
    }

// ----------------------------------------------------------
// CUdpCirWatcher::Reset
//
// ----------------------------------------------------------
//
void CUdpCirWatcher::Reset( const TInt aServicePort )
    {
#ifdef _DEBUG
    CUdpCirWatcher::WriteToLog( _L8( "CUdpCirWatcher::Reset() - Port: %d" ), aServicePort );
#endif
    CUdpSocketListener* listener = NULL;
    if ( aServicePort != KErrArgument )
        {
        TInt index = KErrNotFound;
        listener = FindListener( index, aServicePort );
        if ( listener != NULL && index >= 0 )
            {
            iListenerQueue.Remove( index );
            delete listener;
            listener = NULL;
            }
        }
    else
        {
        TInt count = iListenerQueue.Count();
        for ( TInt i = 0;i < count;i++ )
            {
            listener = iListenerQueue[i];
            iListenerQueue.Remove( i );
            delete listener;
            listener = NULL;
            }
        }
    }

// ---------------------------------------------------------
// CUdpCirWatcher::IncreaseReferenceCount
//
// ---------------------------------------------------------
//
void CUdpCirWatcher::IncreaseReferenceCount()
    {
    iReferenceCount++;
    }

// ---------------------------------------------------------
// CUdpCirWatcher::DecreaseReferenceCount
//
// ---------------------------------------------------------
//
void CUdpCirWatcher::DecreaseReferenceCount()
    {
    iReferenceCount--;
    }

// ----------------------------------------------------------
// CUdpCirWatcher::ReferenceCount
//
// ----------------------------------------------------------
//
const TInt CUdpCirWatcher::ReferenceCount() const
    {
    return iReferenceCount;
    }

#ifdef _DEBUG

// ----------------------------------------------------
// CCIRWatcher::WriteToLog
//
// ----------------------------------------------------
//
void CUdpCirWatcher::WriteToLog( TRefByValue<const TDesC8> aFmt, ... )
    {
    VA_LIST list;
    VA_START( list, aFmt );
    TBuf8<KUdpLogBufferMaxSize> buf;
    buf.FormatList( aFmt, list );
    RFileLogger::Write( KUdpLogDir, KUdpWatcherLogFile, EFileLoggingModeAppend, buf );
    }

#endif

// End of File