phoneclientserver/phoneserver/Src/CommandHandler/CommandHandler_NoAiw/CPhSrvComHandRequestManager.cpp
--- a/phoneclientserver/phoneserver/Src/CommandHandler/CommandHandler_NoAiw/CPhSrvComHandRequestManager.cpp Mon Aug 23 15:50:31 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,375 +0,0 @@
-/*
-* Copyright (c) 2003-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: Command Handler Request Manager.
-*
-*/
-
-
-
-// INCLUDES
-#include "cphsrvcomhandrequestmanager.h"
-#include "cphsrvcomhandrequest.h"
-#include "cphsrvsubsessionbase.h"
-#include "phsrvutils.h"
-#include "cphsrvserver.h"
-#include "mphsrvemergencynumbermanager.h"
-
-
-// CONSTANTS
-
-// The size of the Notification manager storage.
-const TInt KPhSrvComHandManagerPendingCallGranularity = 4;
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::CPhSrvComHandRequestManager
-//
-// Constructor.
-// -----------------------------------------------------------------------------
-//
-CPhSrvComHandRequestManager::CPhSrvComHandRequestManager(
- CPhSrvServer& aServer )
-: iServer( aServer )
- {
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::~CPhSrvComHandRequestManager
-//
-// Destructor.
-// -----------------------------------------------------------------------------
-//
-CPhSrvComHandRequestManager::~CPhSrvComHandRequestManager()
- {
- if ( iOutstandingComHandRequests )
- {
- iOutstandingComHandRequests->ResetAndDestroy();
- iOutstandingComHandRequests->Close();
-
- delete iOutstandingComHandRequests;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::ConstructL
-//
-// Complete construction.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::ConstructL()
- {
- iOutstandingComHandRequests = new ( ELeave ) RPointerArray<
- CPhSrvComHandRequest >( KPhSrvComHandManagerPendingCallGranularity );
-
- CPhSrvComHandRequest* emergencyRequest = CPhSrvComHandRequest::NewL();
- CleanupStack::PushL( emergencyRequest );
- User::LeaveIfError(
- iOutstandingComHandRequests->Append( emergencyRequest ) );
- CleanupStack::Pop(); // emergencyRequest
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::NegotiatorRequestL
-//
-// Initiate a command handler request - called by the external command handler
-// interface.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::NegotiatorRequestL(
- const RMessage2& aMessage,
- const TPhCltComHandCommandParameters& aParams,
- CPhSrvSubSessionBase& aSubSession )
- {
- // If we have no registered initiator then we can't perform the request.
- if ( !iComHandInitiator )
- {
- User::Leave( KErrNotReady );
- }
-
- // If the request is DTMF stop, it is handled as emergency request.
- TBool isDtmfCancel =
- (
- ( aParams.iCommandHandlerCommand == EPhCltCommandVts ) &&
- ( aParams.iDtmfAction == EPhCltDtmfStop )
- );
-
- // If the request is dial and the number is emergencynumber, it is
- // handled as emergency request.
- TBool isEmergencyCall =
- ( aParams.iCommandHandlerCommand == EPhCltCommandAtd );
- if( isEmergencyCall )
- {
- isEmergencyCall = iServer.EmergencyNumberManagerL().
- EmergencyNumberManagerIsEmergencyNumberL(
- ( TDes16& ) aParams.iDialData.iTelNumber,
- EPhCltEmergencyNumberQueryModeNormal );
- }
-
- // Panic if this is not the only request from this subsession.
- if ( RequestAlreadyExists( aSubSession ) )
- {
- // Cancel all ongoing requests first.
- NegotiatorRequestCancel( aSubSession );
-
- PhoneServerUtils::PanicClient(
- EPhoneServerPanicTooManyRequestsOngoing,
- aMessage );
- }
-
- // Normal request handling, request is ok.
- else
- {
- CPhSrvComHandRequest* temp = NULL;
-
- // Emergency request handling.
- if ( ( isDtmfCancel || isEmergencyCall ) &&
- ( *iOutstandingComHandRequests )[0]->SubSessionHandle() == 0 )
- {
- ( *iOutstandingComHandRequests )[0]->UpdateEmergencyRequest(
- aMessage,
- aParams,
- aSubSession.SubSessionUniqueHandle() );
- temp = ( *iOutstandingComHandRequests )[0];
- }
- else
- {
- // Create pending request
- CPhSrvComHandRequest* request = CPhSrvComHandRequest::NewLC(
- aMessage,
- aParams,
- aSubSession.SubSessionUniqueHandle() );
-
- User::LeaveIfError(
- iOutstandingComHandRequests->Append( request ) );
- CleanupStack::Pop( request );
- temp = request;
- }
-
- // Now see if the command handler notifier (initiator) is ready
- if ( iComHandInitiator->InitiatorIsReadyToPerformRequest() )
- {
- // Ask the call initiator to perform the request
- // (basically completes the phone app engine's outstanding
- // ComHand Notifier request).
- iComHandInitiator->InitiatorMakeAsynchronousComHandRequest(
- aParams );
-
- iActiveRequest = temp;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::NegotiatorRequestCancel
-//
-// Cancel a pending command handler request.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::NegotiatorRequestCancel(
- CPhSrvSubSessionBase& aSubSession )
- {
- // Obtain the subsessions handle
- const TInt handle = aSubSession.SubSessionUniqueHandle();
-
- // Now look for any pending requests that match.
- const TInt count = iOutstandingComHandRequests->Count();
- for( TInt i = 0; i < count; i++ )
- {
- CPhSrvComHandRequest* entry = ( *iOutstandingComHandRequests )[i];
- if ( entry->SubSessionHandle() == handle )
- {
- if ( entry == iActiveRequest )
- {
- // This request is active, so inform that it is deleted.
- iActiveRequest = NULL;
- }
-
- // Found matching entry, so cancel it and clean up
- if ( i == 0 ) // 0 stands for emergency request
- {
- entry->Cancel();
- entry->ClearEmergencyRequest();
- }
- else
- {
- iOutstandingComHandRequests->Remove( i );
- entry->Cancel();
- delete entry;
- }
- }
- }
- UpdateQueue();
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::SetNegotiatorReadyRequestL
-//
-// Updates the negotiator so that it knows if the notifier
-// session is able to perform the request.
-// Does not leave.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::SetNegotiatorReadyRequestL(
- MPhSrvComHandInitiator& aInitiator )
- {
- // There mustn't already be a command handler initiator, or the existing
- // initiator must be the same as the new one (otherwise, panic).
- __ASSERT_ALWAYS( !iComHandInitiator || &aInitiator == iComHandInitiator,
- PhoneServerUtils::Panic(
- EPhoneServerPanicExistingComHandInitiatorFault ) );
-
- // Update our pointer
- iComHandInitiator = &aInitiator;
-
- UpdateQueue();
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::SetNegotiatorReadyRequestCancel
-//
-// Indicates that the initiator is no longer available.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::SetNegotiatorReadyRequestCancel(
- MPhSrvComHandInitiator& aInitiator )
- {
- if ( iComHandInitiator && iComHandInitiator == &aInitiator )
- {
- iComHandInitiator = NULL;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::SetNegotiatorAttemptedRequestResponseValue
-//
-// Handle a response from the phone app engine - this is the
-// result of attempting to perform a command handler request
-// (based upon a previous clients external command handler request).
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::SetNegotiatorAttemptedRequestResponseValue(
- TPhCltPhoneResults aResult )
- {
- // Handle response event only if there is request that waits response.
- if ( iActiveRequest )
- {
- // Get the first item in the list - this is the oldest, and has the
- // details of the command handler request we had previously initiated.
- CPhSrvComHandRequest* head = NULL;
- if ( ( *iOutstandingComHandRequests )[0]->SubSessionHandle() != 0 )
- {
- head = ( *iOutstandingComHandRequests )[0];
- }
- else
- {
- head = ( *iOutstandingComHandRequests )[1];
- }
- // Complete the request so that the external command handler client
- // knows the result of the request attempt
- head->InformOfComHandRequestAttemptResult( aResult );
-
- // Delete the pending request (now that it's been processed) and tidy
- // up
- if ( ( *iOutstandingComHandRequests )[0]->SubSessionHandle() != 0 )
- {
- ( *iOutstandingComHandRequests )[0]->ClearEmergencyRequest();
- }
- else
- {
- iOutstandingComHandRequests->Remove( 1 );
- delete head;
- }
-
- // Reset the iActiveRequest variable.
- iActiveRequest = NULL;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::UpdateQueue
-//
-// Update the request queue.
-// -----------------------------------------------------------------------------
-//
-void CPhSrvComHandRequestManager::UpdateQueue()
- {
- // If we have no registered initiator then we do nothing here.
- if ( iComHandInitiator )
- {
- // If we have more than one item in the queue, then we
- // try and fire of the next item here.
- if ( iComHandInitiator->InitiatorIsReadyToPerformRequest() &&
- ( iOutstandingComHandRequests->Count() > 1 ||
- ( *iOutstandingComHandRequests )[0]->SubSessionHandle() != 0 ) )
- {
- // Get the request at the top of the list (head of the queue)
- CPhSrvComHandRequest* head = NULL;
- if ( ( *iOutstandingComHandRequests )[0]->SubSessionHandle() != 0 )
- {
- head = ( *iOutstandingComHandRequests )[0];
- }
- else
- {
- head = ( *iOutstandingComHandRequests )[1];
- }
-
- iComHandInitiator->InitiatorMakeAsynchronousComHandRequest(
- head->ComHandParameters() );
-
- iActiveRequest = head;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvComHandRequestManager::RequestAlreadyExists
-//
-// Check whether there already is request(s) for the subsession given as
-// parameter.
-// -----------------------------------------------------------------------------
-//
-TBool CPhSrvComHandRequestManager::RequestAlreadyExists(
- CPhSrvSubSessionBase& aSubSession )
- {
- TBool isThereRequest = EFalse;
-
- // Obtain the subsessions handle
- const TInt handle = aSubSession.SubSessionUniqueHandle();
-
- // Look for any pending requests that match the handle.
- const TInt count = iOutstandingComHandRequests->Count();
- TInt i = 0;
- for( i = 0; i < count; i++ )
- {
- CPhSrvComHandRequest* entry =
- ( *iOutstandingComHandRequests )[i];
- if ( entry->SubSessionHandle() == handle )
- {
- isThereRequest = ETrue;
- }
- }
- return isThereRequest;
- }
-
-// End of File