callcontinuity/vcc/src/cvccdtmfprovider.cpp
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/callcontinuity/vcc/src/cvccdtmfprovider.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,263 @@
+/*
+* 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:   Sends and receives DTMF tones
+*
+*/
+
+#include <cconvergedcallprovider.h>
+
+#include "cvccdtmfprovider.h"
+#include "cvccdirector.h"
+#include "rubydebug.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Symbian constructor
+// ---------------------------------------------------------------------------
+//
+CVccDtmfProvider* CVccDtmfProvider::NewL(
+        RPointerArray<CConvergedCallProvider>& /*aProviders*/, 
+        const MCCPDTMFObserver& aObserver,
+        CVccDirector& aDirector )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::NewL" );
+	CVccDtmfProvider* self;
+	self = new( ELeave ) CVccDtmfProvider( aObserver, aDirector );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CVccDtmfProvider::~CVccDtmfProvider()
+	{
+	iObservers.Close();
+	iProviders.Close();
+	}
+
+// ---------------------------------------------------------------------------
+// CVccDtmfProvider::CVccDtmfProvider
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CVccDtmfProvider::CVccDtmfProvider( const MCCPDTMFObserver& aObserver,
+                                    CVccDirector& aDirector):
+    iDirector( &aDirector )                                   
+    {
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::CVccDtmfProvider" );		
+    iObservers.InsertInAddressOrder( &aObserver );
+    }
+		
+// ---------------------------------------------------------------------------
+// 2nd phase constructor
+// ---------------------------------------------------------------------------
+//
+void CVccDtmfProvider::ConstructL()
+	{
+    RUBY_DEBUG_BLOCKL( "CVccDtmfProvider::ConstructL" );
+	}
+
+
+// ---------------------------------------------------------------------------
+// @ see MCCPDTMFObserver::HandleDTMFEvent
+// ---------------------------------------------------------------------------
+//
+void CVccDtmfProvider::HandleDTMFEvent( const MCCPDTMFObserver::TCCPDtmfEvent aEvent,
+								        const TInt aError,
+								        const TChar aTone ) const
+    {
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::HandleDTMFEvent" );	
+    RUBY_DEBUG1( "CVccDtmfProvider::HandleDTMFEvent -- obs count: %d",
+                                                  iObservers.Count() );
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        iObservers[i]->HandleDTMFEvent( aEvent, aError, aTone );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::CancelDtmfStringSending
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::CancelDtmfStringSending()
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::CancelDtmfStringSending" );
+    RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)",
+                        iDirector->CurrentCallTypeForDTMF() );
+    TInt err( KErrNotSupported );
+    
+    CConvergedCallProvider* prov = iDirector->GetProvider();
+    if( prov )
+        {
+        MCCPDTMFProvider* dtmf = NULL;
+        TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) );
+        if( err1 == KErrNone )
+            {
+            err = dtmf->CancelDtmfStringSending();
+            }
+        else
+            {
+            err = err1;
+            }
+         
+        }
+    
+    RUBY_DEBUG1( "err = %d ", err );
+  
+    return err;
+	}
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::StartDtmfTone
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::StartDtmfTone( const TChar aTone )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::StartDtmfTone" );
+    RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)",
+                         iDirector->CurrentCallTypeForDTMF() );
+    TInt err( KErrNotSupported );
+    
+    CConvergedCallProvider* prov = iDirector->GetProvider();
+    if( prov )
+        {
+        MCCPDTMFProvider* dtmf = NULL;
+        TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) );
+        if( err1 == KErrNone )
+            {
+            err = dtmf->StartDtmfTone( aTone );
+            }
+        else
+            {
+            err = err1;
+            }
+        }
+    return err;
+	}
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::StopDtmfTone
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::StopDtmfTone()
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::StopDtmfTone" );
+    RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)",
+                       iDirector->CurrentCallTypeForDTMF() );
+    TInt err( KErrNotSupported );
+    CConvergedCallProvider* prov = iDirector->GetProvider();
+    if( prov )
+        {
+        MCCPDTMFProvider* dtmf = NULL;
+        TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) );
+        if( err1 == KErrNone )
+            {
+            err = dtmf->StopDtmfTone();
+            }
+        else
+            {
+            err = err1;
+            }
+        }
+    return err;
+	}
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::SendDtmfToneString
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::SendDtmfToneString( const TDesC& aString )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::SendDtmfToneString" );
+    RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)",
+                      iDirector->CurrentCallTypeForDTMF() );
+    TInt err( KErrNotSupported );
+    
+    CConvergedCallProvider* prov = iDirector->GetProvider();
+    if( prov )
+        {
+        MCCPDTMFProvider* dtmf = NULL;
+        TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) );
+        if( err1 == KErrNone )
+            {
+            err = dtmf->SendDtmfToneString( aString );
+            }
+        else
+            {
+            err = err1;
+            }
+        }
+    RUBY_DEBUG1( "err = %d ", err );
+   
+    return err;
+	}
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::ContinueDtmfStringSending
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::ContinueDtmfStringSending( const TBool aContinue )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::ContinueDtmfStringSending" );
+    RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", 
+                        iDirector->CurrentCallTypeForDTMF() );
+    TInt err ( KErrNotSupported );
+    
+    CConvergedCallProvider* prov = iDirector->GetProvider();
+    if( prov )
+        {
+        MCCPDTMFProvider* dtmf = NULL;
+        TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) );
+        if( err1 == KErrNone )
+            {
+            err = dtmf->ContinueDtmfStringSending( aContinue );
+            }
+        else
+            {
+            err = err1;
+            }
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::AddObserverL
+// ---------------------------------------------------------------------------
+//
+void CVccDtmfProvider::AddObserverL( const MCCPDTMFObserver& aObserver )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::AddObserverL" );
+    iObservers.InsertInAddressOrderL( &aObserver );
+	}
+
+// ---------------------------------------------------------------------------
+// @see MCCPDTMFProvider::RemoveObserver
+// ---------------------------------------------------------------------------
+//
+TInt CVccDtmfProvider::RemoveObserver( const MCCPDTMFObserver& aObserver )
+	{
+    RUBY_DEBUG_BLOCK( "CVccDtmfProvider::RemoveObserver" );
+    TInt res = iObservers.Find( &aObserver );
+    if ( res != KErrNotFound )
+        {
+        iObservers.Remove( res );
+        res = KErrNone;
+        }
+    return res;
+	}