mmserv/sts/stsproxy/src/rstssession.cpp
changeset 47 c2e43643db4c
parent 42 1fa3fb47b1e3
--- a/mmserv/sts/stsproxy/src/rstssession.cpp	Wed Aug 18 10:17:22 2010 +0300
+++ b/mmserv/sts/stsproxy/src/rstssession.cpp	Thu Sep 02 20:58:01 2010 +0300
@@ -16,6 +16,7 @@
  * to the STS Server.
  */
 
+//  Include Files  
 #include "rstssession.h"
 #include "stsclientservercommon.h"
 
@@ -96,6 +97,7 @@
 
 void RStsSession::HandleMessage(TStsCallBack& aMessage)
     {
+    bool signalObserver = false;
     TStsCallBackType type = aMessage.callBackType;
     if (type == EStsPlayAlarmComplete)
         {
@@ -104,7 +106,7 @@
         iObserverMutex.Wait();
         if (observer == iObserverMap[context])
             {
-            observer->PlayAlarmComplete(aMessage.alarmContext);
+            signalObserver = true;
             }
         else
             {
@@ -112,6 +114,10 @@
             }
         iObserverMap.erase(context);
         iObserverMutex.Signal();
+        if (signalObserver)
+            {
+            observer->PlayAlarmComplete(aMessage.alarmContext);
+            }
         }
     else if (type == EStsShutdown)
         {
@@ -165,7 +171,6 @@
     {
     TInt result = iThread.Create(KNullDesC, RStsSession::CallBackThreadMain,
             KDefaultStackSize, &User::Heap(), (TAny*) this);
-
     if (result == KErrNone)
         {
         TRequestStatus rendezvousStatus = KRequestPending;
@@ -186,7 +191,6 @@
             iThread.Kill(result);
             }
         }
-
     return result;
     }
 
@@ -208,14 +212,12 @@
                     KStsServerBuild), KNumSlots, EIpcSession_Sharable);
             }
         }
-
     if (result == KErrNone)
         {
         TPckg<TThreadId> idPckg(iServerThreadId);
         result = SendReceive(StsMsg_RegisterMsgQueue, TIpcArgs(iMsgQueue,
                 &idPckg));
         }
-
     return result;
     }
 
@@ -239,7 +241,6 @@
                 }
             }
         }
-
     return result;
     }
 
@@ -267,19 +268,56 @@
 void RStsSession::SendPlayAlarm(CSystemToneService::TAlarmType aAlarm,
         unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
     {
+    bool signalObserver = false;
     TPckg<unsigned int> alarmContextPckg(aAlarmContext);
+    // Need to do the SendReceive and adding the observer to the
+    // observer map in a critical section in case the playback
+    // completes before this method has a chance to update the
+    // observer list.
+    iObserverMutex.Wait();
     TInt err = SendReceive(StsMsg_PlayAlarm, TIpcArgs(aAlarm,
             &alarmContextPckg, &aObserver));
     if (err != KErrNone)
         {
         //TODO: Log a message
-        aObserver.PlayAlarmComplete(aAlarmContext);
+        signalObserver = true;
         }
     else
         {
-        iObserverMutex.Wait();
         iObserverMap[aAlarmContext] = &aObserver;
-        iObserverMutex.Signal();
+        }
+    iObserverMutex.Signal();
+    if (signalObserver)
+        {
+        aObserver.PlayAlarmComplete(aAlarmContext);
+        }
+    }
+
+void RStsSession::SendPlayToneAlarm(CSystemToneService::TToneType aTone,
+        unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
+    {
+    bool signalObserver = false;
+    TPckg<unsigned int> alarmContextPckg(aAlarmContext);
+    // Need to do the SendReceive and adding the observer to the
+    // observer map in a critical section in case the playback
+    // completes before this method has a chance to update the
+    // observer list.
+    iObserverMutex.Wait();
+    TInt err = SendReceive(StsMsg_PlayToneAlarm, TIpcArgs(aTone,
+            &alarmContextPckg, &aObserver));
+    if (err != KErrNone)
+        {
+        //TODO: Log a message
+        signalObserver = true;
+        }
+    else
+        {
+        iObserverMap[aAlarmContext] = &aObserver;
+        }
+    iObserverMutex.Signal();
+    if (signalObserver)
+        {
+        aObserver.PlayAlarmComplete(aAlarmContext);
         }
     }
 
@@ -295,26 +333,6 @@
         }
     }
 
-void RStsSession::SendPlayToneForStop(CSystemToneService::TToneType aTone,
-        unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
-    {
-    TPckg<unsigned int> alarmContextPckg(aAlarmContext);
-    TInt err = SendReceive(StsMsg_PlayTone, TIpcArgs(aTone,
-            &alarmContextPckg, &aObserver));
-    if (err != KErrNone)
-        {
-        //TODO: Log a message
-        aObserver.PlayAlarmComplete(aAlarmContext);
-        }
-    else
-        {
-        iObserverMutex.Wait();
-        iObserverMap[aAlarmContext] = &aObserver;
-        iObserverMutex.Signal();
-        }
-   }   
-    
-
 void RStsSession::CleanUpObservers()
     {
     iObserverMutex.Wait();