cbs/CbsServer/McnClientSrc/CMcn.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2003 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 the class CMcn.
*
*/


// INCLUDE FILES
#include "CMcn.h"
#include "CCbsMcnListener.h"
#include "MCbsMcnObserver.h"
#include "CbsMcnPanic.h"
#include "CbsLogger.h"
#include <CMcnTopicArray.h>

// CONSTANTS
const TInt KReservedSpaceForMcnObservers = 3;

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

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

// -----------------------------------------------------------------------------
// CMcn::CMcn
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CMcn::CMcn()
    {
    }

// -----------------------------------------------------------------------------
// CMcn::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CMcn::ConstructL()
    {    
    CBSLOGSTRING("CBSMCNCLIENT: >>> CMcn::ConstructL()");    

    User::LeaveIfError( iSession.Connect() );
    iObservers = new ( ELeave ) CArrayPtrFlat< MCbsMcnObserver >
        ( KReservedSpaceForMcnObservers );
    iMcnListener = CCbsMcnListener::NewL( *this, iSession );

    CBSLOGSTRING("CBSMCNCLIENT: <<< CMcn::ConstructL()");
    }

// -----------------------------------------------------------------------------
// CMcn::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CMcn* CMcn::NewL() 
    {
    CMcn* self = new ( ELeave ) CMcn;
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

    
// Destructor
EXPORT_C CMcn::~CMcn() 
    {
    if ( iObservers != NULL ) 
        {
        iObservers->ResetAndDestroy();
        }
    delete iObservers;
    delete iMcnListener;
    iSession.Close();
    }

// -----------------------------------------------------------------------------
// CMcn::RegisterL
// Registers an observer to CBS server.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C void CMcn::RegisterL( 
    MCbsMcnObserver* aObserver, 
    const CMcnTopicArray& aArray ) 
    {
    CBSLOGSTRING("CBSMCNCLIENT: >>> CMcn::RegisterL()");

    __ASSERT_DEBUG( aObserver != 0, CbsMcnPanic( EMcnObserverNull ) );
    iObservers->AppendL( aObserver );
    iSession.RegisterL( aArray );

    CBSLOGSTRING("CBSMCNCLIENT: <<< CMcn::RegisterL()");
    }

// -----------------------------------------------------------------------------
// CMcn::UnregisterL
// Unregisters a previously registered MCN observer clearing
// any topic subscriptions of this client in CBS server.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C void CMcn::Unregister( 
    MCbsMcnObserver* aObserver )
    {
    CBSLOGSTRING("CBSMCNCLIENT: >>> CMcn::Unregister()");

    __ASSERT_DEBUG( aObserver !=0 , CbsMcnPanic( EMcnObserverNull ) );
    TInt count( iObservers->Count() );
    for( TInt i = 0; i < count; i++ )
        {
        MCbsMcnObserver* observer = iObservers->At( i );
        if ( observer == aObserver )
            {
            iObservers->Delete( i );
            break;
            }
        }
    
    // ignore result for now
    TInt result( KErrNone );
    TRAP( result, iSession.ClearSubscriptionsL() );

    CBSLOGSTRING("CBSMCNCLIENT: <<< CMcn::Unregister()");
    }

// -----------------------------------------------------------------------------
// CMcn::GetCellInfo
// Retrieves the current MCN message (Cell Info, topic 050) from CBS 
// server. 
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C TInt CMcn::GetCellInfo( 
    TDes& aMcnMessage ) const
    {
    return iSession.GetCellInfo( aMcnMessage );
    }

// -----------------------------------------------------------------------------
// CMcn::RelayMessageL
// Relays aMcnMessage and topic number to the registered observers.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CMcn::RelayMessage( 
    TCbsMcnMessage& aMcnMessage )
    {
    CBSLOGSTRING("CBSMCNCLIENT: >>> CMcn::RelayMessage()");

    TInt count( iObservers->Count() );

    CBSLOGSTRING2("CBSMCNCLIENT: CMcn::RelayMessage(): topicNumber: %d", aMcnMessage.iTopicNumber );
    CBSLOGSTRING2("CBSMCNCLIENT: CMcn::RelayMessage(): Network mode: %d (0=GSM, 1=WCDMA, 2=Not defined)", aMcnMessage.iNetworkMode );
    CBSLOGSTRING2("CBSMCNCLIENT: CMcn::RelayMessage(): Observer count: %d", count );

    for ( TInt i = 0; i < count; )
        {
        TInt prevCount = count;

        CBSLOGSTRING2("CBSMCNCLIENT: CMcn::RelayMessage(): Calling CellInfoChanged... Observer: %d", i);
        
        // Notify all registered observers        
        iObservers->At( i )->CellInfoChanged( aMcnMessage );        
        CBSLOGSTRING("CBSMCNCLIENT: CMcn::RelayMessage(): CellInfoChanged call finished.");

        // Check if the client unregistered it's observer. If so, we don't
        // increase the loop counter.
        count = iObservers->Count();
        if ( count == prevCount )
            {
            i++;
            }        
        }
    CBSLOGSTRING("CBSMCNCLIENT: <<< CMcn::RelayMessage()");
    }

// -----------------------------------------------------------------------------
// CMcn::GetInfoMessage
// Retrieves the current info message from CBS server. 
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C TInt CMcn::GetInfoMessage( 
    TDes& aInfoMessage, 
    TInt aTopicNumber ) const
    {
    return iSession.GetInfoMessage( aInfoMessage, aTopicNumber );   
    }

//  End of File