dosservices/commondsy/src/CDSYController.cpp
author Pat Downey <patd@symbian.org>
Tue, 13 Jul 2010 15:20:50 +0100
branchRCL_3
changeset 46 c903c54160b5
parent 0 4e1aa6a622a0
permissions -rw-r--r--
DEADHEAD: Closing redundant branch - superseded by a616a19c9ce0 which includes fix for 2620 only as fix for bug 2631 is included in Nokia drop.

/*
* Copyright (c) 2009 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:  Implementation of CCDSYController class
*
*/


// INCLUDE FILES 
#include "CDSYController.h"
#include "CDSYMessage.h"
#include "CDSYServiceLogic.h"
#include "CDSYMessagesServiceLogic.h"
#include "commondsy_debug.h"


// EXTERNAL DATA STRUCTURES
// EXTERNAL FUNCTION PROTOTYPES  
// CONSTANTS
const TInt KServiceLogicArrayGranularity = 100;

// MACROS
// LOCAL CONSTANTS AND MACROS
// MODULE DATA STRUCTURES
// LOCAL FUNCTION PROTOTYPES
// FORWARD DECLARATIONS


// ============================= LOCAL FUNCTIONS ===============================



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



// -----------------------------------------------------------------------------
// CCDSYController::CCDSYController
// -----------------------------------------------------------------------------
CCDSYController::CCDSYController()
: iCurrentTransactionID( 0 )
, iServiceLogics( KServiceLogicArrayGranularity )
    {
    COM_TRACE_( "CDSY - CCDSYController::CCDSYController()" );
    COM_TRACE_( "CDSY - CCDSYController::CCDSYController - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::~CCDSYController
// -----------------------------------------------------------------------------
CCDSYController::~CCDSYController()
    {
    COM_TRACE_( "CDSY - CCDSYController::~CCDSYController()" );

    iServiceLogics.ResetAndDestroy();

    COM_TRACE_( "CDSY - CCDSYController::~CCDSYController - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::NewL
// -----------------------------------------------------------------------------
CCDSYController* CCDSYController::NewL()
    {
    COM_TRACE_( "CDSY - CCDSYController::NewL()" );

    CCDSYController* controller = new ( ELeave ) CCDSYController();

    COM_TRACE_1( "CDSY - CCDSYController::NewL - return 0x%x", controller );
    return controller;
    }



// -----------------------------------------------------------------------------
// CCDSYController::ProcessMessageL
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::ProcessMessageL( TCDSYMessage& aCDSYMessage )
    {
    COM_TRACE_1( "CDSY - CCDSYController::ProcessMessageL(0x%x)", &aCDSYMessage );

    TUint count = 0;
    for ( TInt i = 0; i < iServiceLogics.Count(); i++ )
        {
        if ( ( ( iServiceLogics[i] )->MessageGroup() == aCDSYMessage.Group() )
            && ( ( iServiceLogics[i] )->MessageID() == aCDSYMessage.ID() )
            && ( ( ( iServiceLogics[i] )->DynamicRegistration() == EFalse )
                || ( ( ( iServiceLogics[i] )->DynamicRegistration() )
                    && ( ( iServiceLogics[i] )->MessageTransactionID() == aCDSYMessage.TransactionID() ) ) ) )
            {
            count++;
            ( ( iServiceLogics[i] )->CDSYServiceLogic() )->ProcessMessageL( aCDSYMessage );
            }
        }
    TRACE_ASSERT( count > 0 );
    TRACE_ASSERT( count < 2 );
   
    COM_TRACE_( "CDSY - CCDSYController::ProcessMessageL - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::RegisterServiceLogicL
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::RegisterServiceLogicL( const TUint32 aMessageGroup, const TUint32 aMessageID, MCDSYServiceLogic* aCDSYServiceLogic )
    {
    COM_TRACE_3( "CDSY - CCDSYController::RegisterServiceLogicL(0x%x, 0x%x, 0x%x)", aMessageGroup, aMessageID, aCDSYServiceLogic );

#ifdef _DEBUG

    // Check that this hasn't been already registered
    for ( TInt i = 0; i < iServiceLogics.Count(); i++ )
        {
        if ( ( ( iServiceLogics[i] )->MessageGroup() == aMessageGroup )
            && ( ( iServiceLogics[i] )->MessageID() == aMessageID ) )
            {
            TRACE_ASSERT_ALWAYS;
            }
        }

#endif //#ifdef _DEBUG

    CCDSYMessagesServiceLogic* serviceLogic = CCDSYMessagesServiceLogic::NewL( aMessageGroup, aMessageID, aCDSYServiceLogic );
    TInt err = iServiceLogics.Append( serviceLogic );
    if ( err != KErrNone )
        {
        TRACE_ASSERT_ALWAYS;
        delete serviceLogic;
        User::Leave( err );
        }
     
    COM_TRACE_( "CDSY - CCDSYController::RegisterServiceLogicL - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::RegisterServiceLogicL
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::RegisterServiceLogicL( const TUint32 aMessageGroup, const TUint32 aMessageID, const TUint32 aTransactionID, MCDSYServiceLogic* aCDSYServiceLogic )
    {
    COM_TRACE_4( "CDSY - CCDSYController::RegisterServiceLogicL(0x%x, 0x%x, 0x%x, 0x%x)", aMessageGroup, aMessageID, aTransactionID, aCDSYServiceLogic );

#ifdef _DEBUG

    // Check that this hasn't been already registered
    for ( TInt i = 0; i < iServiceLogics.Count(); i++ )
        {
        if ( ( ( iServiceLogics[i] )->MessageGroup() == aMessageGroup )
            && ( ( iServiceLogics[i] )->MessageID() == aMessageID ) )
            {
            TRACE_ASSERT_ALWAYS;
            }
        }

#endif //#ifdef _DEBUG

    CCDSYMessagesServiceLogic* serviceLogic = CCDSYMessagesServiceLogic::NewL( aMessageGroup, aMessageID, aTransactionID, aCDSYServiceLogic );
    TInt err = iServiceLogics.Append( serviceLogic );
    if ( err != KErrNone )
        {
        TRACE_ASSERT_ALWAYS;
        delete serviceLogic;
        User::Leave( err );
        }
   
    COM_TRACE_( "CDSY - CCDSYController::RegisterServiceLogicL - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::UnregisterServiceLogic
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::UnregisterServiceLogic( const TUint32 aMessageGroup, const TUint32 aMessageID, const MCDSYServiceLogic* aCDSYServiceLogic )
    {
    COM_TRACE_3( "CDSY - CCDSYController::UnregisterServiceLogic(0x%x, 0x%x, 0x%x)", aMessageGroup, aMessageID, aCDSYServiceLogic );

    for ( TInt i = iServiceLogics.Count() - 1; i >= 0; i-- )
        {
        if ( ( ( iServiceLogics[i] )->CDSYServiceLogic() == aCDSYServiceLogic )
            && ( ( iServiceLogics[i] )->MessageGroup() == aMessageGroup )
            && ( ( iServiceLogics[i] )->MessageID() == aMessageID ) )
            {
            delete iServiceLogics[i];
            iServiceLogics.Remove( i );
            i = -1;
            }
        }

    COM_TRACE_( "CDSY - CCDSYController::UnregisterServiceLogic - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::UnregisterServiceLogic
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::UnregisterServiceLogic( const TUint32 aMessageGroup, const TUint32 aMessageID, const TUint32 aTransactionID, const MCDSYServiceLogic* aCDSYServiceLogic )
    {
    COM_TRACE_4( "CDSY - CCDSYController::UnregisterServiceLogic(0x%x, 0x%x, 0x%x, 0x%x)", aMessageGroup, aMessageID, aTransactionID, aCDSYServiceLogic );

    for ( TInt i = iServiceLogics.Count() - 1; i >= 0; i-- )
        {
        if ( ( ( iServiceLogics[i] )->CDSYServiceLogic() == aCDSYServiceLogic )
            && ( ( iServiceLogics[i] )->MessageGroup() == aMessageGroup )
            && ( ( iServiceLogics[i] )->MessageID() == aMessageID )
            && ( ( iServiceLogics[i] )->MessageTransactionID() == aTransactionID ) )
            {
            delete iServiceLogics[i];
            iServiceLogics.Remove( i );
            i = -1;
            }
        }

    COM_TRACE_( "CDSY - CCDSYController::UnregisterServiceLogic - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::ExpireMessageL
// -----------------------------------------------------------------------------
EXPORT_C void CCDSYController::ExpireMessageL( TCDSYMessage& aCDSYMessage )
    {
    COM_TRACE_1( "CDSY - CCDSYController::ExpireMessageL(0x%x)", &aCDSYMessage );

    TUint count = 0;
    for ( TInt i = 0; i < iServiceLogics.Count(); i++ )
        {
        if((((iServiceLogics[i])->MessageGroup() == aCDSYMessage.Group())
                && ((iServiceLogics[i])->MessageID() == aCDSYMessage.ID())
                && ((iServiceLogics[i])->DynamicRegistration() == EFalse))
            || (((iServiceLogics[i])->DynamicRegistration() != EFalse)
                && ((iServiceLogics[i])->MessageTransactionID() == aCDSYMessage.TransactionID())))
            {
            count++;
            ( ( iServiceLogics[i] )->CDSYServiceLogic() )->ExpireMessageL( aCDSYMessage );
            }
        if(((iServiceLogics[i])->DynamicRegistration() != EFalse)
            && ((iServiceLogics[i])->MessageTransactionID() == aCDSYMessage.TransactionID()))
            {
            delete iServiceLogics[i];
            iServiceLogics.Remove( i );
            i--;
            }
        }
    TRACE_ASSERT( count > 0 );
    TRACE_ASSERT( count < 2 );

    COM_TRACE_( "CDSY - CCDSYController::ExpireMessageL - return void" );
    }



// -----------------------------------------------------------------------------
// CCDSYController::GetNewTransactionID
// -----------------------------------------------------------------------------
EXPORT_C TUint8 CCDSYController::GetNewTransactionID()
    {
    COM_TRACE_( "CDSY - CCDSYController::GetNewTransactionID()" );

    iCurrentTransactionID++;

    COM_TRACE_1( "CDSY - CCDSYController::GetNewTransactionID - return 0x%x", iCurrentTransactionID );
    return iCurrentTransactionID;
    }