telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmcalllist.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmcalllist.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,367 @@
+// Copyright (c) 2006-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:
+//
+
+
+
+//  INCLUDE FILES
+#include "cmmcalllist.h"
+#include "cmmcalltsy.h"
+#include "cmmphonetsy.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmCallList::CMmCallList()
+    {
+    }
+
+CMmCallList* CMmCallList::NewL(
+    CMmPhoneTsy* aMmPhone )
+    {
+    
+    CMmCallList* aCallList = NULL;
+        
+    if ( aMmPhone )
+        {
+        aCallList = new (ELeave) CMmCallList();  
+        CleanupStack::PushL( aCallList );
+        aCallList->iMmPhone = aMmPhone;
+        aCallList->ConstructL();
+        CleanupStack::Pop();
+        }
+
+    return aCallList;
+    }
+
+void CMmCallList::ConstructL()
+    {
+    //Create call container
+    CreateContainerL();
+    }
+
+CMmCallList::~CMmCallList()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallByIndex
+// Returns call object by index. The indexing begins from 0.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallByIndex(
+    TInt aIndex )
+    {
+    CMmCallTsy* mmCall = NULL;
+
+    if ( iObjectContainer )
+        {
+        if ( aIndex >= 0 && aIndex < iObjectContainer->Count() )
+            {
+            mmCall = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( aIndex ) );
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallByIndexAndLine
+// Returns call object by index and line.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallByIndexAndLine(
+    TInt aIndex,
+    const TName* aLineName )
+    {
+
+    CMmCallTsy* mmCall = NULL;
+    CMmCallTsy* mmCallSeek = NULL;
+
+    TInt callCount = iObjectContainer->Count();
+    TInt index( 0 );
+
+    //search through call list
+    for ( TInt i = 0; i < callCount; i++ )
+        {
+        //get current call
+        mmCallSeek = reinterpret_cast<CMmCallTsy*>(
+            iObjectContainer->At( i ) );
+
+        //get the name of the line from which this call has been opened.
+        //see class CMmLineTsy to see how the call object naming works.
+        TName curLineName = mmCallSeek->
+                                CallName().Left( aLineName->Length() );
+
+        //if the name is the same as the line name given as input parameter
+        if ( curLineName.Compare( *aLineName ) == 0 )
+            {
+            if ( index == aIndex )
+                {
+                //Break out
+                mmCall = mmCallSeek;
+                i = callCount;
+                }
+            else
+                {
+                index++;
+                }
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallById
+// Returns call object by call id. Call ID has to differ from 0 because
+// call list may contain multiple call objects with call ID 0!
+// In that case the method will return NULL.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallById(
+    const TInt aCallId )
+    {
+    CMmCallTsy* mmCall = NULL;
+    CMmCallTsy* mmCallSeek = NULL;
+
+    if ( ( 0 < aCallId ) && iObjectContainer )
+        {
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            mmCallSeek = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( i ) );
+            
+            if ( aCallId == mmCallSeek->CallId() )
+                {
+                mmCall = mmCallSeek;
+                break;
+                }
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallByName
+// Returns call object by name.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallByName(
+    const TName* aName )
+    {
+    CMmCallTsy* mmCall = NULL;
+    CMmCallTsy* mmCallSeek = NULL;
+
+    if ( iObjectContainer )
+        {
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            mmCallSeek = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( i ) );  
+
+            TName aCurrCallName = mmCallSeek->CallName();
+            if ( aCurrCallName.Compare( *aName ) == KErrNone )
+                {
+                mmCall = mmCallSeek;
+                break;
+                }
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallByMode
+// Returns call object by mode.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallByMode(
+    RMobilePhone::TMobileService aCallMode )
+    {
+    CMmCallTsy* mmCall = NULL;
+    CMmCallTsy* mmCallSeek = NULL;
+
+    if ( iObjectContainer )
+        {
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            mmCallSeek = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( i ) ); 
+            if ( mmCallSeek->CallMode() == aCallMode )
+                {           
+                mmCall = mmCallSeek;
+                break;
+                }
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::RemoveMmCallById
+// Removes a call by id from the list of calls.
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallList::RemoveMmCallById(
+    TInt aMmCallId )
+    {
+    TInt ret( KErrNotFound );
+
+    if ( iObjectContainer )
+        {
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            CMmCallTsy* mmCall = 
+                reinterpret_cast<CMmCallTsy*>( iObjectContainer->At( i ) );
+
+            if ( aMmCallId == mmCall->CallId() )
+                {           
+                iObjectContainer->Delete( i );          
+                if ( iObjectContainer->Count() > 1 )
+                    {
+                    iObjectContainer->Compress();
+                    }
+                ret = KErrNone;
+                break;
+                }       
+            } 
+        }
+
+    return ret;    
+    }   
+
+// ---------------------------------------------------------------------------
+// CMmCallList::GetMmCallByStatus
+// Returns a call by status from the list of calls.
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmCallList::GetMmCallByStatus(
+    RMobileCall::TMobileCallStatus aStatus )
+    {
+    CMmCallTsy* mmCall = NULL;
+    CMmCallTsy* mmCallSeek = NULL;
+
+    if ( iObjectContainer )
+        {
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            mmCallSeek = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( i ) );
+            if ( mmCallSeek->MobileCallStatus() == aStatus )
+                {           
+                mmCall = mmCallSeek;
+                break;
+                }
+            }
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::RemoveCallsByLine
+// Removes Call objects from Call list that has been opened 
+// from the Line (which name is given as a input parameter).
+// ---------------------------------------------------------------------------
+//
+void CMmCallList::RemoveCallsByLine(
+    const TName* aLineName )
+    {
+    //if call list exists
+    if ( iObjectContainer )
+        {
+        TInt callCount = iObjectContainer->Count();
+        TInt index( 0 );
+        //search through call list
+        for ( TInt i = 0; i < callCount; i++ )
+            {
+            //get current call
+            CMmCallTsy* mmCall = 
+              reinterpret_cast<CMmCallTsy*>( iObjectContainer->At( index ) );
+
+            //get the name of the line from which this call has been opened.
+            //see class CMmLineTsy to see how the call object naming works.
+            TName curLineName = mmCall->
+                                    CallName().Left( aLineName->Length() );
+
+            //if the name is the same as the line name given as input param.
+            if ( curLineName.Compare( *aLineName ) == 0 )
+                {
+                //close this call
+                mmCall->Close();
+                index--;
+                }
+            index++;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallList::AddObject
+// Adds a call object to the array and remove unused call objects.
+// from the Line (which name is given as a input parameter).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallList::AddObject(
+    CTelObject* aTsyObject )
+    {   
+    TInt ret( KErrGeneral );
+
+    if ( iObjectContainer )
+        {    
+        for ( TInt i = 0; i < iObjectContainer->Count(); i++ )
+            {
+            CMmCallTsy* mmCall = reinterpret_cast<CMmCallTsy*>(
+                iObjectContainer->At( i ) );
+
+            //Remove object for incoming call or ghost call that is on idle
+            //state and don't have a owner (client)
+            if ( ( RCall::EStatusIdle == mmCall->Status() ) &&
+                 ( mmCall->IsUnownedCallObject() ) )
+                {
+                iObjectContainer->Delete( i );
+                mmCall->Close();
+                }
+            }
+
+        if ( iObjectContainer->Count() > 1 )
+            {
+            iObjectContainer->Compress();
+            }
+
+        TInt trapError( KErrNone );
+
+        //Append the object to the container
+        TRAP( trapError, iObjectContainer->AppendL( aTsyObject ) );
+        
+        if ( KErrNone != trapError )
+            {
+            //change return value to indicate out of memory error
+            ret = KErrNoMemory;
+            }
+        else
+            {
+            //success return value
+            ret = KErrNone;
+            }
+        }
+
+    return ret;
+    }
+
+//  End of File