convergedcallengine/cce/src/cccecallobserverasynchroniser.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedcallengine/cce/src/cccecallobserverasynchroniser.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,322 @@
+/*
+* Copyright (c) 2006 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:  Asynchronises cce call observer calls 
+*
+*/
+
+
+//  INCLUDE FILES
+
+#include "cccecallobserverasynchroniser.h"
+#include "cccelogger.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// NewL()
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+
+CCCECallObserverAsynchroniser* CCCECallObserverAsynchroniser::NewL()
+    {
+    CCCECallObserverAsynchroniser* self = CCCECallObserverAsynchroniser::NewLC();
+    CleanupStack::Pop( self );
+    return self; 
+    }
+
+// -----------------------------------------------------------------------------
+// NewLC()
+// Two-phased constructor
+// Leaves pointer in cleanup stack
+// -----------------------------------------------------------------------------
+
+CCCECallObserverAsynchroniser* CCCECallObserverAsynchroniser::NewLC()
+    {
+    CCCECallObserverAsynchroniser* self = new( ELeave ) CCCECallObserverAsynchroniser();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;    
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CCCECallObserverAsynchroniser::~CCCECallObserverAsynchroniser()
+    {
+    Cancel();
+    iEvents.Close();  
+    }
+
+// -----------------------------------------------------------------------------
+// Set call observer
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::SetMCCECallObserver( MCCECallObserver* aObserver )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::SetMCCECallObserver()" );
+    iCCECallObserver = aObserver;
+    if ( iIsRuning && aObserver )
+        {
+        if( !IsActive() )
+            {
+            SetActive();
+            TRequestStatus* status = &iStatus;
+            User::RequestComplete( status, KErrNone );
+            }
+        }
+     else
+        {
+        Cancel();
+        iEvents.Reset();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// get call observer
+// -----------------------------------------------------------------------------    
+MCCECallObserver* CCCECallObserverAsynchroniser::GetMCCECallObserver()
+    {
+    return iCCECallObserver;
+    }
+
+// -----------------------------------------------------------------------------
+// CActive RunL
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::RunL()
+    {
+    CCELOGSTRING2( "CCCECallObserverAsynchroniser::RunL() events: %d", iEvents.Count() );
+ 
+    if ( !iCCECallObserver )
+        {
+        CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() No observer!");
+        return;
+        }
+        
+    while (iEvents.Count() > 0)
+        {
+        switch ( iEvents[0].iEventType )
+            {
+            case EErrorOccurred:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: EErrorOccurred");
+                iCCECallObserver->ErrorOccurred(
+                    (TCCPError)iEvents[0].iInt1 );
+                break;    
+                }           
+            
+            case ECallStateChanged:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallStateChanged");
+                iCCECallObserver->CallStateChanged(
+                    (CCPCall::TCallState)iEvents[0].iInt1 );
+                break;    
+                }
+                
+            case ECallStateChangedWithInband:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallStateChangedWithInband");
+                iCCECallObserver->CallStateChangedWithInband(
+                    (CCPCall::TCallState)iEvents[0].iInt1 );
+                break;    
+                }
+                
+            case ECallEventOccurred:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallEventOccurredanged");
+                iCCECallObserver->CallEventOccurred(
+                    (MCCECallObserver::TCCECallEvent)iEvents[0].iInt1 );
+                break;    
+                }
+                
+            case ECallDurationChanged:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallDurationChanged");
+                iCCECallObserver->CallDurationChanged(iEvents[0].iDuration );
+                break;    
+                }
+                
+            case ECallCapsChanged:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallCapsChanged");
+                iCCECallObserver->CallCapsChanged(
+                    (MCCECallObserver::TCCECallControlCaps)iEvents[0].iInt1 );
+                break;    
+                }
+                
+            case EHandleTransfer:
+                {
+                CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: EHandleTransfer");
+                iCCECallObserver->HandleTransfer(iEvents[0].iBoolean, *iEvents[0].iDescriptor );
+                break;    
+                }
+            }
+            
+        if( iEvents.Count() )
+            {
+            iEvents.Remove( 0 );
+            iEvents.Compress();
+            }
+        }
+    
+    iIsRuning = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CActive RunError
+// -----------------------------------------------------------------------------
+TInt CCCECallObserverAsynchroniser::RunError(TInt aError)
+    {
+    return aError;
+    }
+
+// -----------------------------------------------------------------------------
+// CActive DoCancel
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::DoCancel()   
+    {
+    iEvents.Reset();
+    iIsRuning = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver ErrorOccurred
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::ErrorOccurred( const TCCPError aError )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::ErrorOccurred");
+    TEventStorage event;
+    event.iEventType = EErrorOccurred;
+    event.iInt1 = aError;
+    AddEvent(event);
+        
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver CallStateChanged
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::CallStateChanged(
+    const CCPCall::TCallState aState )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::CallStateChanged");
+    TEventStorage event;
+    event.iEventType = ECallStateChanged;
+    event.iInt1 = aState;
+    AddEvent(event);
+        
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver CallStateChangedWithInband
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::CallStateChangedWithInband(
+    const CCPCall::TCallState aState )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::CallStateChangedWithInband");
+    TEventStorage event;
+    event.iEventType = ECallStateChangedWithInband;
+    event.iInt1 = aState;
+    AddEvent(event);
+        
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver CallEventOccurred
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::CallEventOccurred( 
+    const MCCECallObserver::TCCECallEvent aEvent )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::CallEventOccurred");
+    TEventStorage event;
+    event.iEventType = ECallEventOccurred;
+    event.iInt1 = aEvent;
+    AddEvent(event);
+        
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver CallDurationChanged
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::CallDurationChanged( 
+    const TTimeIntervalSeconds aDuration )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::CallDurationChanged");
+    TEventStorage event;
+    event.iEventType = ECallDurationChanged;
+    event.iDuration = aDuration;
+    AddEvent(event);
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver CallCapsChanged
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::CallCapsChanged( 
+    const MCCECallObserver::TCCECallControlCaps aCaps )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::CallCapsChanged");
+    TEventStorage event;
+    event.iEventType = ECallCapsChanged;
+    event.iInt1 = aCaps;
+    AddEvent(event);
+    }
+
+// -----------------------------------------------------------------------------
+// MCCECallObserver HandleTransfer
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::HandleTransfer( const TBool aAttended, 
+                             const TDesC& aDestination )
+    {
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::HandleTransfer");
+    TEventStorage event;
+    event.iEventType = EHandleTransfer;
+    event.iBoolean = aAttended;
+    event.iDescriptor = &aDestination;
+    AddEvent(event);
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor
+// -----------------------------------------------------------------------------
+CCCECallObserverAsynchroniser::CCCECallObserverAsynchroniser() 
+    :CActive( EPriorityStandard ), iIsRuning( EFalse )
+    { 
+    }
+
+
+// -----------------------------------------------------------------------------
+// Leaving stuff in constructor
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::ConstructL()
+    {
+    CActiveScheduler::Add( this );
+    }
+    
+// -----------------------------------------------------------------------------
+// Adding event to queue
+// -----------------------------------------------------------------------------
+void CCCECallObserverAsynchroniser::AddEvent( TEventStorage aEvent )
+    {
+    iEvents.Append(aEvent);
+    CCELOGSTRING( "CCCECallObserverAsynchroniser::AddEvent");
+    if (!iIsRuning)
+        {
+        CCELOGSTRING( "CCCECallObserverAsynchroniser::AddEvent Activating...");
+        iIsRuning = ETrue;
+        if (iCCECallObserver)
+            {
+            SetActive();
+            TRequestStatus* status = &iStatus;
+            User::RequestComplete(status, KErrNone);    
+            }
+        }
+    }
+// end of file