phoneclientserver/phoneserver/Src/Standard/Standard_Aiw/CPhSrvCallRequestManager.cpp
changeset 0 ff3b6d0fd310
child 12 ae8abd0db65c
child 43 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/phoneserver/Src/Standard/Standard_Aiw/CPhSrvCallRequestManager.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,291 @@
+/*
+* Copyright (c) 2002-2004 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:  Call Request Manager.
+*
+*/
+
+
+
+// INCLUDES
+#include "CPhSrvCallRequestManager.h"
+#include "CPhSrvCallRequest.h"
+#include "CPhSrvSubSessionBase.h"
+#include "PhSrvUtils.h"
+
+
+// CONSTANTS
+
+// The size of the Notification manager storage.
+const TInt KPhSrvNotificationManagerPendingCallGranularity = 4;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::CPhSrvCallRequestManager
+// 
+// C++ constructor.
+// -----------------------------------------------------------------------------
+//
+CPhSrvCallRequestManager::CPhSrvCallRequestManager()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::~CPhSrvCallRequestManager
+// 
+// C++ destructor.
+// -----------------------------------------------------------------------------
+//
+CPhSrvCallRequestManager::~CPhSrvCallRequestManager()
+    {
+    if ( iOutstandingRequestsCall )
+        {
+        iOutstandingRequestsCall->ResetAndDestroy();
+        iOutstandingRequestsCall->Close();
+        }
+    delete iOutstandingRequestsCall;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::ConstructL
+// 
+// Complete construction.
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::ConstructL()
+    {
+    iOutstandingRequestsCall = new ( ELeave ) RPointerArray< 
+        CPhSrvCallRequest >( KPhSrvNotificationManagerPendingCallGranularity );
+
+    CPhSrvCallRequest* emergencyCallRequest = CPhSrvCallRequest::NewL();
+    CleanupStack::PushL( emergencyCallRequest );
+    User::LeaveIfError( 
+        iOutstandingRequestsCall->Append( emergencyCallRequest ) );
+    CleanupStack::Pop(); // emergencyCallRequest
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::NegotiatorDialL
+// 
+// Initiate a dial request - called by the external call
+// interface.
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::NegotiatorDialL( 
+    const RMessage2& aMessage, 
+    CPhCltExtPhoneDialData& aArgs,
+    CPhSrvSubSessionBase& aSubSession )
+    {
+    // If we have no registered initiator then we can't make a call.
+    if ( !iCallInitiator )
+        {
+        User::Leave( KErrNotReady );
+        }
+    
+    if (  aArgs.TelephoneNumber() == KPhSrvUsedEmergencyCallNumber && 
+         ( *iOutstandingRequestsCall )[0]->SubSessionHandle() == 0 )
+        {
+        ( *iOutstandingRequestsCall )[0]->UpdateEmercgencyCall( 
+            aMessage, 
+           aArgs,
+            aSubSession.SubSessionUniqueHandle() );         
+        }
+    else
+        {
+        // Create pending request
+        CPhSrvCallRequest* request = CPhSrvCallRequest::NewLC( 
+            aMessage, 
+            aArgs,
+            aSubSession.SubSessionUniqueHandle() );
+
+        User::LeaveIfError( iOutstandingRequestsCall->Append( request ) );
+        CleanupStack::Pop( request );
+        }
+
+    // Now see if the call notifier (initiator) is ready 
+    if ( iCallInitiator->InitiatorIsReadyToMakeCall() )
+        {
+        // Ask the call initiator to make the call (basically completes the
+        //phone app engine's outstanding call notifier request).
+        iCallInitiator->InitiatorMakeAsynchronousCallL( aArgs );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::NegotiatorDialCancel
+// 
+// Cancel a pending dial request.
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::NegotiatorDialCancelL( 
+    CPhSrvSubSessionBase& aSubSession )
+    {
+    // Obtain the subsessions handle
+    const TInt handle = aSubSession.SubSessionUniqueHandle();
+
+    // Now look for any pending requests that match.
+    const TInt count = iOutstandingRequestsCall->Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        CPhSrvCallRequest* entry = ( *iOutstandingRequestsCall )[i];
+        if ( entry->SubSessionHandle() == handle )
+            {
+            // Found matching entry, so cancel it and clean up
+            if ( i == 0 ) // 0 stands for emergency call
+                {
+                entry->Cancel();
+                entry->ClearEmergencyCall();
+                }
+            else
+                {
+                iOutstandingRequestsCall->Remove( i );
+                entry->Cancel();
+                delete entry;
+                }
+
+            // If we have more than one item in the queue, then we
+            // try and fire of the next item here.
+            if ( iCallInitiator->InitiatorIsReadyToMakeCall() && 
+                 ( iOutstandingRequestsCall->Count() > 1 ||
+                 ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 ) )
+                {
+                // Get the call at the top of the list (head of the queue)
+                CPhSrvCallRequest* head = NULL;
+                if ( ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 )
+                    {
+                    head = ( *iOutstandingRequestsCall )[0];
+                    }
+                else
+                    {
+                    head = ( *iOutstandingRequestsCall )[1];
+                    }
+
+
+                iCallInitiator->InitiatorMakeAsynchronousCallL( 
+                    head->CallArguments() );
+                }
+
+            return;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::SetNegotiatorReadyCall
+// 
+// Updates the negotiator so that it knows if the notifier
+// session is able to make a call.
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::SetNegotiatorReadyCallL(
+    MPhSrvInitiatorCall& aInitiator )
+    {
+    // There mustn't already be a call initiator, or the existing call
+    // initiator must be the same as the new one (otherwise, panic).
+    __ASSERT_ALWAYS( !iCallInitiator || &aInitiator == iCallInitiator, 
+        PhoneServerUtils::Panic( 
+        EPhoneServerPanicExistingCallInitiatorFault ) );
+
+    // Update our pointer
+    iCallInitiator = &aInitiator;
+
+    // If we have more than one item in the queue, then we
+    // try and fire of the next item here.
+    if ( iCallInitiator->InitiatorIsReadyToMakeCall() && 
+         ( iOutstandingRequestsCall->Count() > 1 ||
+           ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 ) )
+        {
+        // Get the call at the top of the list (head of the queue)
+        CPhSrvCallRequest* head = NULL;
+        if ( ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 )
+            {
+            head = ( *iOutstandingRequestsCall )[0];
+            }
+        else
+            {
+            head = ( *iOutstandingRequestsCall )[1];
+            }
+
+        iCallInitiator->InitiatorMakeAsynchronousCallL(
+            head->CallArguments() );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::SetNegotiatorReadyCallCancel
+// 
+// Indicates that the initiator is no longer available
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::SetNegotiatorReadyCallCancel( 
+    MPhSrvInitiatorCall& aInitiator )
+    {
+    if ( iCallInitiator && iCallInitiator == &aInitiator )
+        {
+        iCallInitiator = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvCallRequestManager::SetNegotiatorAttemptedCallResponseValue
+// 
+// Handle a response from the phone app engine - this is the 
+// result of attempting to make a call (based upon a previous
+// clients external call request)
+// -----------------------------------------------------------------------------
+//
+void CPhSrvCallRequestManager::SetNegotiatorAttemptedCallResponseValue( 
+    TPhCltPhoneResults aResult )
+    {
+    if ( iOutstandingRequestsCall->Count() > 1 ||
+         ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 )
+        {
+        // Get the first item in the list - this is the oldest, and has the
+        // details of the call we had previously initiated.
+        CPhSrvCallRequest* head = NULL;
+        if ( ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 )
+            {
+            head = ( *iOutstandingRequestsCall )[0];
+            }
+        else
+            {
+            head = ( *iOutstandingRequestsCall )[1];
+            }
+        // Complete the request so that the external call client knows the
+        // result of the call attempt
+        head->InformOfCallAttemptResult( aResult );
+
+        // Delete the pending request (now that it's been processed) and tidy
+        // up
+        if ( ( *iOutstandingRequestsCall )[0]->SubSessionHandle() != 0 )
+            {
+            ( *iOutstandingRequestsCall )[0]->ClearEmergencyCall();
+            }
+        else
+            {
+            iOutstandingRequestsCall->Remove( 1 );
+            delete head;
+            }
+        }
+    }
+
+
+// End of File