multimediacommsengine/mmcecli/src/mceitcreceiverbase.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mceitcreceiverbase.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2005 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:    
+*
+*/
+
+
+
+
+
+#include "mceitcreceiverbase.h"
+#include "mceitc.h"
+#include "mceclilogs.h"
+
+
+_LIT8( KMceEmpty, "");
+
+#ifdef MCE_UNIT_TEST
+#define MCE_UNIT_TEST_RETURN { if ( aError == KErrNoMemory ) return aError; }
+#else
+#define MCE_UNIT_TEST_RETURN
+#endif
+ 
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::CMceItcReceiverBase
+// -----------------------------------------------------------------------------
+//
+CMceItcReceiverBase::CMceItcReceiverBase ( MMceItc& aITC ) 
+ : CActive( EPriorityStandard ),
+   iITC( aITC )
+	{
+    CActiveScheduler::Add ( this );
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::~CMceItcReceiverBase
+// -----------------------------------------------------------------------------
+//
+CMceItcReceiverBase::~CMceItcReceiverBase () 
+	{
+	CActive::Cancel();
+	}
+	
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::Init
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::Init() 
+	{
+	
+    iITCMsgArgs.Set (EMceItcArgIds, &iIdsPckg);
+    iITCMsgArgs.Set (EMceItcArgBufSizes, &iSizesPckg);
+	
+	ReceiveNext();
+	
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::RunL
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::RunL ()
+	{
+    MCECLI_DEBUG("CMceItcReceiverBase::RunL, Entry");
+	
+	TInt err = iStatus.Int();
+    MCECLI_DEBUG_DVALUE("status", err );
+	
+	if (err == KErrServerTerminated)
+		{
+        MCECLI_DEBUG("unrecoverable error!");
+		// This will leave to RunError-function. See below.
+		User::Leave( err );
+		}
+    // Take copy of the ids. iIdsPckg could be overwritten by ReceiveNext.
+    TMceIds ids( iIdsPckg() );		
+    if ( err == KErrNone )
+        {
+        MCECLI_DEBUG("itc received");
+		IncomingEventL( ids );
+        }
+    else if ( err == KErrCompletion )
+        {
+        MCECLI_DEBUG("itc completed");
+        err = KErrNone;
+        }
+    else
+        {
+        MCECLI_DEBUG("renew itc");
+        // For errors receive has to be renewed before calling the observer 
+        // which might delete the CMCE or CMCEConnection, 
+        // which leads to deletion of this object.
+        ReceiveNext();
+        ErrorOccuredL( ids, err );
+        }    
+    MCECLI_DEBUG("CMceItcReceiverBase::RunL, Exit");
+	}
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CMceItcReceiverBase::RunError( TInt aError )
+	{
+    MCECLI_DEBUG("CMceItcReceiverBase::RunError, Entry");
+    MCECLI_DEBUG_DVALUE("error", aError );
+
+	if (aError == KErrServerTerminated)
+		{
+		// Return the error to the active scheduler and stop receiving.
+		// Receiving must be stopped.
+		// It would lead to infinite RunL-RunError-loop.
+		return aError;
+		}
+    // Ignore all the other errors and continue receiving
+	ReceiveNext ();
+    
+    MCECLI_DEBUG("CMceItcReceiverBase::RunError, Exit");
+    
+    MCE_UNIT_TEST_RETURN
+    
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::RunError
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::DoCancel()
+    {
+    MCECLI_DEBUG("CMceItcReceiverBase::DoCancel, Entry");
+    
+    iITC.CancelReceive( iITCMsgArgs );
+
+    MCECLI_DEBUG("CMceItcReceiverBase::DoCancel, Exit");
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::ReceiveNext
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::ReceiveNext()
+	{
+    MCECLI_DEBUG("CMceItcReceiverBase::ReceiveNext, Entry");
+	
+	if (!IsActive())
+        {
+        iITC.Receive( iITCMsgArgs,iStatus );
+	    SetActive();
+        }
+    MCECLI_DEBUG("CMceItcReceiverBase::ReceiveNext, Exit");
+	}
+	
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::ReceiveDataLC
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::ReceiveDataLC( HBufC8*& aContext, HBufC8*& aContent )
+	{
+    MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, Entry");
+	
+    TIpcArgs tmpITCArgs;
+    TMceIds ids( iIdsPckg() );
+    TPckgBuf<TMceIds> tmpIdsPckg( ids );
+    tmpITCArgs.Set( EMceItcArgIds, &tmpIdsPckg );
+    
+    if ( iSizesPckg().iContextBufSize != KErrNotFound )
+        {
+        aContext = HBufC8::NewLC( iSizesPckg().iContextBufSize );
+        }
+        
+    if ( iSizesPckg().iContentBufSize != KErrNotFound )
+        {
+        aContent = HBufC8::NewLC( iSizesPckg().iContentBufSize );
+        }
+
+    __ASSERT_ALWAYS( !( !aContext && aContent ), User::Leave( KErrGeneral ) );
+    
+    if ( aContext || aContent )
+        {
+    	MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, receiving data!!") 
+
+		HBufC8* dummy = KMceEmpty().AllocLC();
+        TInt err = iITC.Receive( tmpITCArgs, 
+                                 ( aContext ? aContext->Des() : dummy->Des() ), 
+                                 ( aContent ? aContent->Des() : dummy->Des() ) );
+                                 
+    	MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, data received") 	
+		CleanupStack::PopAndDestroy( dummy );
+		    		        
+        if ( err != KErrNone ) 
+            {
+    		MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, receiving failed")
+            User::Leave( err );
+            }
+        }
+    MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, Exit");
+        
+	}
+	
+
+
+// -----------------------------------------------------------------------------
+// CMceItcReceiverBase::IncomingEventL
+// -----------------------------------------------------------------------------
+//
+void CMceItcReceiverBase::IncomingEventL( TMceIds& aIds )
+    {
+    MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, Entry");
+    
+    HBufC8* context = NULL;
+    HBufC8* content = NULL;
+    TMceItcCallBack callback = static_cast<TMceItcCallBack>( aIds.iCallbackID );
+    
+    MCECLI_DEBUG_CALLBACK( "CALLBACK", callback );
+    MCECLI_DEBUG_IDS( "IDS", aIds );
+
+    ReceiveDataLC( context, content );
+        
+    ReceiveNext();
+    
+    if ( context && content )
+        {
+    	MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received both data") 	
+        IncomingEventL( callback, aIds, *context, content );
+        CleanupStack::Pop( content );
+        CleanupStack::PopAndDestroy( context );//context
+        }
+    else if ( !context && !content )
+        {
+    	MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received no data") 	
+        IncomingEventL( callback, aIds );
+        }
+    else
+        {
+    	MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received context") 	
+        IncomingEventL( callback, aIds, *context );
+        CleanupStack::PopAndDestroy( context );
+        }
+
+    MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, Exit");
+    }
+