telutils/telephonyservice/src/ccallinformationimpl.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) 2007-2008 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:  Provides implementation for CCallInformation -class.
*
*/


#include <e32base.h>
#include <callinformation.h>    //Call Information Mediator API

#include "ccallinformationimpl.h"
#include "ccallinfoiter.h"
#include "mcallinformationobserver.h"
#include "telsrvlogger.h"


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

// ---------------------------------------------------------------------------
// C++ constructor.
// ---------------------------------------------------------------------------
//
CCallInformationImpl::CCallInformationImpl() : CTelSrvBase( )
    {
         
    }


// ---------------------------------------------------------------------------
// Symbian second-phase constructor.
// ---------------------------------------------------------------------------
//
void CCallInformationImpl::ConstructL(CMediatorService* aMediatorService)
    {    
    CTelSrvBase::BaseConstructL( aMediatorService );    
    
    }


// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CCallInformationImpl* CCallInformationImpl::NewL()
    {
    TSLOGSTRING("CCallInformationImpl::NewL <<");
    CCallInformationImpl* self = new (ELeave) CCallInformationImpl( );     
    CleanupStack::PushL( self );
    
    CMediatorService* mediatorService = CMediatorService::NewLC( CMediatorService::ECallInfo );    
    self->ConstructL(mediatorService);    
        
    CleanupStack::Pop( 2,self );    
    TSLOGSTRING("CCallInformationImpl::NewL >>");
    return self;
    }

// ---------------------------------------------------------------------------
// Two-phased constructor for testing purposes.
// ---------------------------------------------------------------------------
//
CCallInformationImpl* CCallInformationImpl::NewL(CMediatorService* aMediatorService)
    {        
    CCallInformationImpl* self = new (ELeave) CCallInformationImpl( );    
    
    CleanupStack::PushL( self );
    self->ConstructL(aMediatorService);
    CleanupStack::Pop( self );
    
    return self;
    }


// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CCallInformationImpl::~CCallInformationImpl()
    {        
    delete iInfos;
    delete iCallIter;       
    delete iInfosInState;    
    delete iCallStateIter;    
    }


// ---------------------------------------------------------------------------
// Saves the observer call information changes.
// ---------------------------------------------------------------------------
//
void CCallInformationImpl::NotifyCallInformationChanges(
    MCallInformationObserver& aObserver )
    {
    TSLOGSTRING("CCallInformationImpl::NotifyCallInformationChanges <<");
    iObserver = &aObserver;    
    }
    
// ---------------------------------------------------------------------------
// Removes the observer.
// ---------------------------------------------------------------------------
//
void CCallInformationImpl::CancelNotification( )
    {
    TSLOGSTRING("CCallInformationImpl::CancelNotification <<");
    iObserver = NULL;    
    }


// ---------------------------------------------------------------------------
// From class CTelSrvBase.
// A response to a Mediator Service command.
// ---------------------------------------------------------------------------
//
void CCallInformationImpl::DoHandleCommandResponseL( const TDesC8& aData )
  {
  TSLOGSTRING("CCallInformationImpl::DoHandleCommandResponseL <<");  
  iInfos = CCallInfos::NewL();
  iInfos->InternalizeL( aData );                
  iCallIter = CCallInfoIter::NewL( *iInfos );
  
  TSLOGSTRING("CCallInformationImpl::DoHandleCommandResponseL >>");
  }

// ---------------------------------------------------------------------------
// From class MMediatorServiceObserver
// A Mediator Service event.
// ---------------------------------------------------------------------------
//
void CCallInformationImpl::DoHandleMediatorEventL( const TDesC8& aData )
  {  
  TSLOGSTRING("CCallInformationImpl::DoHandleMediatorEventL <<");  
  delete iInfos;
  iInfos = NULL;
      
  delete iCallIter;
  iCallIter = NULL;
      
  iInfos = CCallInfos::NewL();
  iInfos->InternalizeL( aData );      
  iCallIter = CCallInfoIter::NewL( *iInfos );      
        
  if( iObserver )
      {
      iObserver->CallInformationChanged();
      }  
  TSLOGSTRING("CCallInformationImpl::DoHandleMediatorEventL >>");
  }

// ---------------------------------------------------------------------------
// Returns info about all calls. 
// ---------------------------------------------------------------------------
//
CCallInfoIter& CCallInformationImpl::GetCallsL( )
    {    
    TSLOGSTRING("CCallInformationImpl::GetCallsL <<");
    if( !iCallIter )
        {
        TSLOGSTRING("CCallInformationImpl::GetCallsL; Leaves with KErrNoMemory");
        User::Leave( KErrNoMemory ); //memory allocation failed in CommandResponseL or MediatorEventL
        }
    
    TSLOGSTRING("CCallInformationImpl::GetCallsL >>");
    return *iCallIter;            
    }

// ---------------------------------------------------------------------------
// Returns information whether call in given state exist. 
// ---------------------------------------------------------------------------
//
TBool CCallInformationImpl::IsCallInState( CCPCall::TCallState aState ) const
    {
    TBool match ( EFalse );
    
    const RPointerArray<TCallInfo>& calls = iInfos->CallInfos();
    TInt count = calls.Count();
        
    for( int i = 0; i < count; i++ )
        {
        const TCallInfo& call = *calls[i];
        if( aState == call.CallState() )    
            {
            match = ETrue;
            break;
            }
        }           
    return match;
    }