convergedcallengine/csplugin/src/cspcallcommandhandler.cpp
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedcallengine/csplugin/src/cspcallcommandhandler.cpp	Wed Sep 01 12:15:03 2010 +0100
@@ -0,0 +1,193 @@
+/*
+* Copyright (c) 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:  Implements the class CSPCallCommandHandler
+*
+*/
+
+
+#include "cspcallcommandhandler.h"
+#include "mcspcallcommandhandling.h"
+#include "csplogger.h"
+
+// ---------------------------------------------------------------------------
+// CSPCallCommandHandler::NewL.
+// ---------------------------------------------------------------------------
+//
+CSPCallCommandHandler* CSPCallCommandHandler::NewL()
+    {
+    CSPLOGSTRING(CSPOBJECT, 
+        "CSPCallCommandHandler::NewL()" );
+    CSPCallCommandHandler* self = new ( ELeave ) CSPCallCommandHandler();
+    return self;    
+    }
+
+// ---------------------------------------------------------------------------
+// Destructs the array including remaining calls.
+// ---------------------------------------------------------------------------
+//
+CSPCallCommandHandler::~CSPCallCommandHandler()
+    {
+    iActiveHangupArray.Reset();
+    iActiveHangupArray.Close();
+    CSPLOGSTRING(CSPOBJECT, 
+        "CSPCallCommandHandler::~CSPCallCommandHandler");
+    }
+
+// ---------------------------------------------------------------------------
+// CSPCallCommandHandler::IndicateActiveHangup
+// ---------------------------------------------------------------------------
+//
+TInt CSPCallCommandHandler::IndicateActiveHangup( MCCPCallCommandHandling& aCall )
+    {
+    TInt err = iActiveHangupArray.Find( &aCall );
+    if ( err == KErrNotFound )
+        {
+        err = iActiveHangupArray.Append( &aCall );
+        CSPLOGSTRING2( 
+            CSPINT, 
+            "CSPCallCommandHandler::IndicateActiveHangup append error: %d", 
+            err );
+        }
+    else
+        {
+        CSPLOGSTRING( 
+            CSPINT, 
+            "CSPCallCommandHandler::IndicateActiveHangup call already added");
+        }
+    CSPLOGSTRING2( 
+        CSPINT, 
+        "CSPCallCommandHandler::IndicateActiveHangup active hangup count: %d", 
+        iActiveHangupArray.Count());
+        
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CSPCallCommandHandler::CSPCallCommandHandler::IndicateHangupComplete
+// ---------------------------------------------------------------------------
+//  
+TInt CSPCallCommandHandler::IndicateHangupComplete( MCCPCallCommandHandling& aCall )
+    {
+    TInt index = iActiveHangupArray.Find( &aCall );
+    if ( index != KErrNotFound )
+        {
+        iActiveHangupArray.Remove( index );
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateHangupComplete remove");
+        }
+
+    if( !iActiveHangupArray.Count() && iPendingCall )
+        {
+        if( iPendingCommand == ECSPAnswerCall )
+            {
+            CSPLOGSTRING(CSPINT, 
+                "CSPCallCommandHandler::IndicateHangupComplete perform answer request");
+            iPendingCall->PerformAnswerRequest();
+            iPendingCommand = ECSPNone;
+            iPendingCall = NULL;
+            }
+        else if( iPendingCommand == ECSPDialCall )
+            {
+            CSPLOGSTRING(CSPINT, 
+                "CSPCallCommandHandler::IndicateHangupComplete perform dial request");
+            iPendingCall->PerformDialRequest();
+            iPendingCommand = ECSPNone;
+            iPendingCall = NULL;
+            }
+        }
+        
+    CSPLOGSTRING2(CSPINT, 
+        "CSPCallCommandHandler::IndicateHangupComplete active hangup count: %d", 
+        iActiveHangupArray.Count());
+        
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSPCallCommandHandler::IndicateDialRequest
+// ---------------------------------------------------------------------------
+//
+TInt CSPCallCommandHandler::IndicateDialRequest( MCCPCallCommandHandling& aCall )
+            
+    {
+    CSPLOGSTRING(CSPINT, 
+        "CSPCallCommandHandler::IndicateDialRequest");
+    TInt ret( KErrNone );
+    
+    if( !iActiveHangupArray.Count() )
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateDialRequest dial");
+        aCall.PerformDialRequest();
+        }
+    else if( !iPendingCall && iPendingCommand == ECSPNone )
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateDialRequest delay dialing");
+        iPendingCall = &aCall;
+        iPendingCommand = ECSPDialCall;
+        }
+    else
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateDialRequest ERROR already exists");
+        ret = KErrAlreadyExists;
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CSPCallCommandHandler::IndicateAnswerRequest
+// ---------------------------------------------------------------------------
+//
+TInt CSPCallCommandHandler::IndicateAnswerRequest( MCCPCallCommandHandling& aCall )
+            
+    {
+    CSPLOGSTRING(CSPINT, "CSPCallCommandHandler::IndicateAnswerRequest" );
+        
+    TInt ret( KErrNone );
+    
+    if( !iActiveHangupArray.Count() )
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateAnswerRequest answer");
+        aCall.PerformAnswerRequest();
+        }
+    else if( !iPendingCall && iPendingCommand == ECSPNone )
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateAnswerRequest delay answering");
+        iPendingCall = &aCall;
+        iPendingCommand = ECSPAnswerCall;
+        }
+    else
+        {
+        CSPLOGSTRING(CSPINT, 
+            "CSPCallCommandHandler::IndicateAnswerRequest ERROR already exists");
+        ret = KErrAlreadyExists;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// Constructs the monitor.
+// ---------------------------------------------------------------------------
+//
+CSPCallCommandHandler::CSPCallCommandHandler()
+    {
+    CSPLOGSTRING(CSPOBJECT, "CSPCallCommandHandler::CSPCallCommandHandler");
+    }
+
+// End of File