phoneengine/callhandling/src/cpecallarrayowner.cpp
changeset 0 5f000ab63145
child 78 baacf668fe89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/callhandling/src/cpecallarrayowner.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,476 @@
+/*
+* 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:  This file contains the implementation of CPECallArrayOwner class 
+*                member functions.
+*
+*/
+
+
+// INCLUDE FILES
+#include <talogger.h>
+#include <pepanic.pan>
+#include <ccce.h>
+
+#include "cpecallarrayowner.h"
+#include "cpesinglecall.h"
+#include "cpevideocallhandling.h"
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES  
+// None.
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None.
+
+// ==================== LOCAL FUNCTIONS ====================
+// None.
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CPECallArrayOwner
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPECallArrayOwner::CPECallArrayOwner()
+    {
+    }
+
+// Destructor
+CPECallArrayOwner::~CPECallArrayOwner()
+    {
+    TEFLOGSTRING( KTAOBJECT, 
+        "CALL CPECallArrayOwner::~CPECallArrayOwner: Start." );
+    
+    if ( iCallArray )
+        {
+        iCallArray->ResetAndDestroy();
+        iCallArray->Close();
+        delete iCallArray;
+        iCallArray = NULL;
+        }
+        
+    TEFLOGSTRING( KTAOBJECT, 
+        "CALL: CPECallArrayOwner::~CPECallArrayOwner: Complete." );
+    }    
+
+CPECallArrayOwner* CPECallArrayOwner::NewL(
+        CCCE& iConvergedCallEngine, 
+        MPEMessageSender& aOwner )
+    {
+    TEFLOGSTRING( KTAOBJECT,
+         "CALL CPECallArrayOwner::NewL: start." );
+    
+    CPECallArrayOwner* self = new ( ELeave ) CPECallArrayOwner();
+    CleanupStack::PushL( self );
+    self->ConstructL( iConvergedCallEngine, aOwner );
+    CleanupStack::Pop( self );
+
+    TEFLOGSTRING( KTAOBJECT, 
+        "CALL CPECallArrayOwner::NewL: complete." );
+    
+    return self;
+    }
+    
+void CPECallArrayOwner::ConstructL(
+        CCCE& iConvergedCallEngine, 
+        MPEMessageSender& aOwner )
+
+    {
+    TEFLOGSTRING( KTAOBJECT,
+         "CALL CPECallArrayOwner::ConstructL: start." );
+    
+    iCallArray = new ( ELeave ) RPointerArray< CPESingleCall >;
+    
+    // Open emergency call, this done here so that phone app doesn't allocate memory
+    // when emeregency call is really created.
+    CPESingleCall* call = CreateEmergencyCallL( aOwner );
+    call->SetCall( iConvergedCallEngine.InitializeEmergencyCall( *call ) );
+        
+    TEFLOGSTRING( KTAOBJECT, 
+        "CALL CPECallArrayOwner::ConstructL: complete." );
+    }
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CreateCallL
+// 
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::CreateCallL( MPEMessageSender& aOwner )
+    {
+    TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateCallL");
+    CPESingleCall* call( NULL );
+
+    if( iCallArray->Count() < ( KPEMaximumNumberOfVoiceCalls ) )
+        {
+        // Find free call id
+        for( TInt callId = 0; callId < KPEMaximumNumberOfVoiceCalls; callId++ )
+            {
+            if( !GetCallObject( callId ) )
+                {
+                call = CPESingleCall::NewL( aOwner );
+                call->SetCallId( callId );
+                iCallArray->Append( call );
+                break;
+                }
+            }
+        }
+    else
+        {
+        TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateCallL Leave( ECCPRequestFailure )");
+        User::Leave( ECCPRequestFailure );
+        }
+    return call;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallByCallId
+// 
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::GetCallObject( 
+        const TInt aCallId ) const
+    {
+    TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::GetCallObject");
+    CPESingleCall* call( NULL );
+    TInt callIndex;
+
+    __ASSERT_DEBUG( 
+        aCallId <= ( KPEMaximumNumberOfVoiceCalls + KPEMaximumNumberOfDataCalls ),
+        Panic( EPEPanicIndexOutOfRange) );
+        
+    for( callIndex = 0; callIndex < iCallArray->Count(); callIndex++ )
+        {
+        if( aCallId == (*iCallArray)[callIndex]->GetCallId() )
+            {
+            call = (*iCallArray)[callIndex];
+            TEFLOGSTRING2( KTAMESINT, "CALL CPECallArrayOwner::GetCallObject %d", callIndex);
+            break;
+            }
+        }
+    return call;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::GetCallObjectByIndex
+// 
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::GetCallObjectByIndex( 
+        const TInt aIndex ) const
+    {
+    TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::GetCallObjectByIndex");
+
+    __ASSERT_DEBUG( 
+        aIndex < ( KPEMaximumNumberOfVoiceCalls ),
+        Panic( EPEPanicIndexOutOfRange) );
+        
+    return aIndex < Count() ? (*iCallArray)[aIndex] : NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::DeleteCallObject
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CPECallArrayOwner::DeleteCallObject( 
+        const TInt aCallId )
+    {
+    TEFLOGSTRING2( KTAMESINT, "CALL CPECallArrayOwner::DeleteCallObject, call id: %d", aCallId );
+    CPESingleCall* call( NULL );
+    TInt callIndex;
+    TInt errorCode( KErrNotFound );
+
+    __ASSERT_DEBUG( 
+        aCallId <= ( KPEMaximumNumberOfVoiceCalls + KPEMaximumNumberOfDataCalls ),
+        Panic( EPEPanicIndexOutOfRange) );
+    
+    if( aCallId != KPEEmergencyCallId )
+        {
+        // Normal Voice Calls
+        for( callIndex = 0; callIndex < iCallArray->Count(); callIndex++ )
+            {
+            if( aCallId == (*iCallArray)[callIndex]->GetCallId() )
+                {
+                call = (*iCallArray)[callIndex];
+                delete call;
+                iCallArray->Remove(callIndex);
+                iCallArray->Compress();
+                errorCode = KErrNone;
+                break;
+                }
+            }
+        }
+    return errorCode;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::Count()
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CPECallArrayOwner::Count() const
+    {
+    TEFLOGSTRING2( KTAMESINT, "CALL CPECallArrayOwner::Count %d", iCallArray->Count() );
+    return iCallArray->Count();
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::ActiveCallCount()
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CPECallArrayOwner::ActiveCallCount() const
+    {
+    TInt numberOfCalls = 0;
+
+    // Count ongoing voice calls
+    numberOfCalls = iCallArray->Count();
+    
+    for( TInt callIndex = 0; 
+         callIndex < iCallArray->Count();
+         callIndex++ )
+        {
+        if( EPEStateIdle == (*iCallArray)[callIndex]->GetCallState() )
+            {
+            numberOfCalls--;
+            }
+        }
+    TEFLOGSTRING2( KTAMESINT, "CALL CPECallArrayOwner::ActiveCallCount %d", numberOfCalls );
+
+    return numberOfCalls;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CreateEmercencyCallL
+// Method 
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::CreateEmergencyCallL( MPEMessageSender& aOwner )
+    {
+    TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateEmercencyCallL");
+    CPESingleCall* call = GetCallObject( KPEEmergencyCallId );
+    
+    if( !call )
+        {
+        call = CPESingleCall::NewL( aOwner );
+        call->SetCallId( KPEEmergencyCallId );
+        iCallArray->Append( call );
+        }
+    else
+        {
+        TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateEmercencyCallL: Already exist");
+        User::Leave( KErrAlreadyExists );
+        }
+
+    return call;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CreateDataCallL
+// 
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::CreateDataCallL( MPEMessageSender& aOwner )
+    {
+    TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateDataCallL");
+    CPESingleCall* call( NULL );
+
+    if( iCallArray->Count() < ( KPEMaximumNumberOfVoiceCalls ) )
+        {
+        // find free call id
+        for( TInt callId = KPEDataCallIdBase; 
+            callId < KPEDataCallIdBase + KPEMaximumNumberOfDataCalls; callId++ )
+            {
+            if( !GetCallObject( callId ) )
+                {
+                call = CPESingleCall::NewL( aOwner );
+                call->SetCallId( callId );
+                iCallArray->Append( call );
+                break;
+                }
+            }
+        if( !call )
+            {
+            // Leave if all datacallids are reserved
+            TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateCallL all datacallids are reserved Leave( ECCPRequestFailure )");
+            User::Leave( ECCPRequestFailure );
+            }
+        }
+    else
+        {
+        TEFLOGSTRING( KTAMESINT, "CALL CPECallArrayOwner::CreateCallL Leave( ECCPRequestFailure )");
+        User::Leave( ECCPRequestFailure );
+        }
+    return call;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallPointerByState
+// returns CPESingleCall voice call object by State, NULL if not found
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::CallPointerByState( 
+        TPEState aState ) const
+    {
+    CPESingleCall* returnValue = NULL;
+    
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallPointerByState: asked aState: %d", 
+        aState );
+    
+    for( TInt callIndex = 0; 
+         callIndex < iCallArray->Count();
+         callIndex++ )
+        {
+        if( aState == (*iCallArray)[callIndex]->GetCallState() )
+            {
+            TEFLOGSTRING2( 
+                KTAREQEND, 
+                "CALL CPECallHandling::CallPointerByState: callIndex: %d", 
+                callIndex );
+            returnValue = (*iCallArray)[callIndex];
+            break;
+            }
+        }
+
+    return returnValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::IsCallByState
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CPECallArrayOwner::IsCallByState( 
+        const TPEState aState ) const
+    {
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallByState: asked aState: %d", 
+        aState );
+  
+    return CallByState( aState ) ? ETrue : EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::IsCallByCallId
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CPECallArrayOwner::IsCallByCallId( 
+        const TInt aCallId ) const
+    {
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallByCallId: asked aCallId: %d", 
+        aCallId );
+
+    return GetCallObject( aCallId ) ? ETrue : EFalse;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallByState
+// -----------------------------------------------------------------------------
+//
+EXPORT_C MPECall* CPECallArrayOwner::CallByState( 
+        const TPEState aState ) const
+    {
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallByState: asked aState: %d", 
+        aState );
+  
+    return CallPointerByState( aState );
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallByCallId
+// -----------------------------------------------------------------------------
+//
+EXPORT_C MPECall* CPECallArrayOwner::CallByCallId( 
+        const TInt aCallId ) const
+    {
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallByCallId: asked aCallId: %d", 
+        aCallId );
+
+    return GetCallObject( aCallId );
+    }
+
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallByName
+// -----------------------------------------------------------------------------
+//
+EXPORT_C MPECall* CPECallArrayOwner::CallByName( 
+        const TName& aName ) const
+    {
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallByName: aName: %S", 
+        &aName );
+    return CallPointerByName( aName );      
+    }
+    
+// -----------------------------------------------------------------------------
+// CPECallArrayOwner::CallPointerByName
+// -----------------------------------------------------------------------------
+//
+CPESingleCall* CPECallArrayOwner::CallPointerByName( 
+        const TName& aName ) const
+    {
+    CPESingleCall* call( NULL );
+    for ( TInt index=0; index < Count(); index++ )
+        {
+        CPESingleCall* callData = GetCallObjectByIndex( index );
+        if( callData )
+            {
+            RMobileCall::TMobileCallInfoV3 callInfo;
+            callData->GetCallInfo( callInfo );
+            if( callInfo.iCallName == aName )
+                {
+                call = callData;
+                break;
+                }
+            }
+        }
+    TEFLOGSTRING2( 
+        KTAREQEND, 
+        "CALL CPECallHandling::CallPointerByName: call: %d", 
+        call );
+    return call;      
+    }
+    
+// ================= OTHER EXPORTED FUNCTIONS ==============================
+
+// End of File