devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp
branchRCL_3
changeset 8 bc06d8566074
parent 0 40261b775718
child 11 d5f04de580b7
child 15 c1e808730d6c
--- a/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp	Fri Mar 12 15:50:33 2010 +0200
+++ b/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp	Mon Mar 15 12:46:07 2010 +0200
@@ -227,7 +227,8 @@
 //
 void CMMFDevSoundSession::ServiceL(const RMmfIpcMessage& aMessage)
 	{
-	SYMBIAN_DEBPRN2(_L("\nCMMFDevSoundSession[0x%x] NEW REQUEST %02x while pending=%d"), aMessage.Function(), iOperationCompletePending);
+	SYMBIAN_DEBPRN2(_L("\nCMMFDevSoundSession[0x%x] NEW REQUEST %02x while pending=%d"),
+	        aMessage.Function(), iOperationCompletePending || iAsyncQueueStart->IsActive());
 	if( iOperationCompletePending || iAsyncQueueStart->IsActive())
 		{
 		// if not possible to service now, then queue request
@@ -236,7 +237,16 @@
 	else
 		{
 		// If there is no oustanding operation service inmediately
-		DoServiceRequestL(aMessage);
+		TRAPD(err, DoServiceRequestL(aMessage));
+		if (err)
+		    {
+            aMessage.Complete(err); // repeat normal ServiceL() behaviour since we may keep going
+		    }
+	    if (!iOperationCompletePending && iQueuedRequests.Count() != 0)
+	        {
+	        //dequeue next
+	        DequeueRequest();
+	        }
 		}
 	}
 	
@@ -444,12 +454,14 @@
 		if (iCIExtension)
 			{
 			iOperationCompletePending = ETrue;
+			iHandlingExtdCI = ETrue;
 			TRAPD(err2, err = iCIExtension->HandleMessageL(aMessage));
 			if (err2)
 				{
 				err = err2;
 				}
 			iOperationCompletePending = EFalse;
+			iHandlingExtdCI = EFalse;
 			}
 
 		if (err != KErrNone)
@@ -1699,6 +1711,11 @@
 //
 void CMMFDevSoundSession::PreemptionFinishedCallbackReceived(TBool aCanStartNewOperation)
 	{
+    if (iHandlingExtdCI)
+        {
+        // we are in the middle of handling a CI, so ignore - will handle later when unwinding
+        return;
+        }
 	iOperationCompletePending = EFalse;
 	if ( aCanStartNewOperation && iQueuedRequests.Count() != 0 )
 		{
@@ -1706,6 +1723,14 @@
 		}
 	}
 
+//
+// CMMFDevSoundSession::AdaptorControlsContext()
+//
+
+TBool CMMFDevSoundSession::AdaptorControlsContext() const
+    {
+    return !iHandlingExtdCI;
+    }
 
 MMMFDevSoundCustomInterfaceDeMuxPlugin* CMMFDevSoundSession::InterfaceFromUid(TUid aUid)
 	{
@@ -1740,6 +1765,9 @@
 
 void CMMFDevSoundSession::AsynchronousOperationComplete(TInt aError, TBool aCanStartNewOperation)
 	{
+    __ASSERT_DEBUG(!iHandlingExtdCI, Panic(EUnexpectedAsyncOpCompleteHandlingCI));
+        // when handling CIs we should not reach here
+
 	switch (iRequestBeingServiced.Type())
 		{
 		case TMMFDevSoundRequest::ESessionEvents:
@@ -1820,6 +1848,8 @@
 
 void CMMFDevSoundSession::DequeueRequest()
 	{
+    iAsyncQueueStart->Cancel(); // if we're in here cancel any background request
+
 	TMMFDevSoundRequest msg = iQueuedRequests[0];
 
 	if (msg.IsCallBack() > 0)
@@ -1839,7 +1869,8 @@
 		    }
 
 		}
-	else
+
+	if (iQueuedRequests.Count()>0)
 		{
 		// Some rules about what request can be followed
 		SYMBIAN_DEBPRN0(_L("\n CMMFDevSoundSession[0x%x]======== Flag can service new request\n"));