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. |
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 { |
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()) |