mmserv/sts/stsproxy/src/rstssession.cpp
changeset 47 c2e43643db4c
parent 42 1fa3fb47b1e3
equal deleted inserted replaced
42:1fa3fb47b1e3 47:c2e43643db4c
    14  * Description:
    14  * Description:
    15  * The file provides the implementation of the client side session
    15  * The file provides the implementation of the client side session
    16  * to the STS Server.
    16  * to the STS Server.
    17  */
    17  */
    18 
    18 
       
    19 //  Include Files  
    19 #include "rstssession.h"
    20 #include "rstssession.h"
    20 #include "stsclientservercommon.h"
    21 #include "stsclientservercommon.h"
    21 
    22 
    22 const TUint KNumSlots = 30;
    23 const TUint KNumSlots = 30;
    23 
    24 
    94     server.Close();
    95     server.Close();
    95     }
    96     }
    96 
    97 
    97 void RStsSession::HandleMessage(TStsCallBack& aMessage)
    98 void RStsSession::HandleMessage(TStsCallBack& aMessage)
    98     {
    99     {
       
   100     bool signalObserver = false;
    99     TStsCallBackType type = aMessage.callBackType;
   101     TStsCallBackType type = aMessage.callBackType;
   100     if (type == EStsPlayAlarmComplete)
   102     if (type == EStsPlayAlarmComplete)
   101         {
   103         {
   102         MStsPlayAlarmObserver* observer = aMessage.observer;
   104         MStsPlayAlarmObserver* observer = aMessage.observer;
   103         unsigned int context = aMessage.alarmContext;
   105         unsigned int context = aMessage.alarmContext;
   104         iObserverMutex.Wait();
   106         iObserverMutex.Wait();
   105         if (observer == iObserverMap[context])
   107         if (observer == iObserverMap[context])
   106             {
   108             {
   107             observer->PlayAlarmComplete(aMessage.alarmContext);
   109             signalObserver = true;
   108             }
   110             }
   109         else
   111         else
   110             {
   112             {
   111             //TODO: Log a message
   113             //TODO: Log a message
   112             }
   114             }
   113         iObserverMap.erase(context);
   115         iObserverMap.erase(context);
   114         iObserverMutex.Signal();
   116         iObserverMutex.Signal();
       
   117         if (signalObserver)
       
   118             {
       
   119             observer->PlayAlarmComplete(aMessage.alarmContext);
       
   120             }
   115         }
   121         }
   116     else if (type == EStsShutdown)
   122     else if (type == EStsShutdown)
   117         {
   123         {
   118         iState = EStopping;
   124         iState = EStopping;
   119         }
   125         }
   163 
   169 
   164 TInt RStsSession::StartThread()
   170 TInt RStsSession::StartThread()
   165     {
   171     {
   166     TInt result = iThread.Create(KNullDesC, RStsSession::CallBackThreadMain,
   172     TInt result = iThread.Create(KNullDesC, RStsSession::CallBackThreadMain,
   167             KDefaultStackSize, &User::Heap(), (TAny*) this);
   173             KDefaultStackSize, &User::Heap(), (TAny*) this);
   168 
       
   169     if (result == KErrNone)
   174     if (result == KErrNone)
   170         {
   175         {
   171         TRequestStatus rendezvousStatus = KRequestPending;
   176         TRequestStatus rendezvousStatus = KRequestPending;
   172 
   177 
   173         //  Register for rendezvous notification when thread is started.
   178         //  Register for rendezvous notification when thread is started.
   184         if (result != KErrNone)
   189         if (result != KErrNone)
   185             {
   190             {
   186             iThread.Kill(result);
   191             iThread.Kill(result);
   187             }
   192             }
   188         }
   193         }
   189 
       
   190     return result;
   194     return result;
   191     }
   195     }
   192 
   196 
   193 TInt RStsSession::CreateServerSession()
   197 TInt RStsSession::CreateServerSession()
   194     {
   198     {
   206             result = CreateSession(KStsServerName, TVersion(
   210             result = CreateSession(KStsServerName, TVersion(
   207                     KStsServerMajorVersion, KStsServerMinorVersion,
   211                     KStsServerMajorVersion, KStsServerMinorVersion,
   208                     KStsServerBuild), KNumSlots, EIpcSession_Sharable);
   212                     KStsServerBuild), KNumSlots, EIpcSession_Sharable);
   209             }
   213             }
   210         }
   214         }
   211 
       
   212     if (result == KErrNone)
   215     if (result == KErrNone)
   213         {
   216         {
   214         TPckg<TThreadId> idPckg(iServerThreadId);
   217         TPckg<TThreadId> idPckg(iServerThreadId);
   215         result = SendReceive(StsMsg_RegisterMsgQueue, TIpcArgs(iMsgQueue,
   218         result = SendReceive(StsMsg_RegisterMsgQueue, TIpcArgs(iMsgQueue,
   216                 &idPckg));
   219                 &idPckg));
   217         }
   220         }
   218 
       
   219     return result;
   221     return result;
   220     }
   222     }
   221 
   223 
   222 TInt RStsSession::Connect()
   224 TInt RStsSession::Connect()
   223     {
   225     {
   237                 {
   239                 {
   238                 result = iObserverMutex.CreateLocal();
   240                 result = iObserverMutex.CreateLocal();
   239                 }
   241                 }
   240             }
   242             }
   241         }
   243         }
   242 
       
   243     return result;
   244     return result;
   244     }
   245     }
   245 
   246 
   246 void RStsSession::Close()
   247 void RStsSession::Close()
   247     {
   248     {
   265     }
   266     }
   266 
   267 
   267 void RStsSession::SendPlayAlarm(CSystemToneService::TAlarmType aAlarm,
   268 void RStsSession::SendPlayAlarm(CSystemToneService::TAlarmType aAlarm,
   268         unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
   269         unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
   269     {
   270     {
       
   271     bool signalObserver = false;
   270     TPckg<unsigned int> alarmContextPckg(aAlarmContext);
   272     TPckg<unsigned int> alarmContextPckg(aAlarmContext);
       
   273     // Need to do the SendReceive and adding the observer to the
       
   274     // observer map in a critical section in case the playback
       
   275     // completes before this method has a chance to update the
       
   276     // observer list.
       
   277     iObserverMutex.Wait();
   271     TInt err = SendReceive(StsMsg_PlayAlarm, TIpcArgs(aAlarm,
   278     TInt err = SendReceive(StsMsg_PlayAlarm, TIpcArgs(aAlarm,
   272             &alarmContextPckg, &aObserver));
   279             &alarmContextPckg, &aObserver));
   273     if (err != KErrNone)
   280     if (err != KErrNone)
   274         {
   281         {
   275         //TODO: Log a message
   282         //TODO: Log a message
       
   283         signalObserver = true;
       
   284         }
       
   285     else
       
   286         {
       
   287         iObserverMap[aAlarmContext] = &aObserver;
       
   288         }
       
   289     iObserverMutex.Signal();
       
   290     if (signalObserver)
       
   291         {
   276         aObserver.PlayAlarmComplete(aAlarmContext);
   292         aObserver.PlayAlarmComplete(aAlarmContext);
   277         }
   293         }
       
   294     }
       
   295 
       
   296 void RStsSession::SendPlayToneAlarm(CSystemToneService::TToneType aTone,
       
   297         unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
       
   298     {
       
   299     bool signalObserver = false;
       
   300     TPckg<unsigned int> alarmContextPckg(aAlarmContext);
       
   301     // Need to do the SendReceive and adding the observer to the
       
   302     // observer map in a critical section in case the playback
       
   303     // completes before this method has a chance to update the
       
   304     // observer list.
       
   305     iObserverMutex.Wait();
       
   306     TInt err = SendReceive(StsMsg_PlayToneAlarm, TIpcArgs(aTone,
       
   307             &alarmContextPckg, &aObserver));
       
   308     if (err != KErrNone)
       
   309         {
       
   310         //TODO: Log a message
       
   311         signalObserver = true;
       
   312         }
   278     else
   313     else
   279         {
   314         {
   280         iObserverMutex.Wait();
       
   281         iObserverMap[aAlarmContext] = &aObserver;
   315         iObserverMap[aAlarmContext] = &aObserver;
   282         iObserverMutex.Signal();
   316         }
       
   317     iObserverMutex.Signal();
       
   318     if (signalObserver)
       
   319         {
       
   320         aObserver.PlayAlarmComplete(aAlarmContext);
   283         }
   321         }
   284     }
   322     }
   285 
   323 
   286 void RStsSession::SendStopAlarm(unsigned int aAlarmContext)
   324 void RStsSession::SendStopAlarm(unsigned int aAlarmContext)
   287     {
   325     {
   292     if (err != KErrNone)
   330     if (err != KErrNone)
   293         {
   331         {
   294         //TODO: Log a message
   332         //TODO: Log a message
   295         }
   333         }
   296     }
   334     }
   297 
       
   298 void RStsSession::SendPlayToneForStop(CSystemToneService::TToneType aTone,
       
   299         unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
       
   300     {
       
   301     TPckg<unsigned int> alarmContextPckg(aAlarmContext);
       
   302     TInt err = SendReceive(StsMsg_PlayTone, TIpcArgs(aTone,
       
   303             &alarmContextPckg, &aObserver));
       
   304     if (err != KErrNone)
       
   305         {
       
   306         //TODO: Log a message
       
   307         aObserver.PlayAlarmComplete(aAlarmContext);
       
   308         }
       
   309     else
       
   310         {
       
   311         iObserverMutex.Wait();
       
   312         iObserverMap[aAlarmContext] = &aObserver;
       
   313         iObserverMutex.Signal();
       
   314         }
       
   315    }   
       
   316     
       
   317 
   335 
   318 void RStsSession::CleanUpObservers()
   336 void RStsSession::CleanUpObservers()
   319     {
   337     {
   320     iObserverMutex.Wait();
   338     iObserverMutex.Wait();
   321     while (!iObserverMap.empty())
   339     while (!iObserverMap.empty())