--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/sts/stsserver/src/stsserversession.cpp Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2010 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:
+ * This method provides the generic Symbian specific message handling
+ * for the server session. The actual STS specific processing occurs
+ * in the STS class.
+ */
+
+// Include Files
+#include "stsserversession.h"
+#include "stsserver.h"
+#include "sts.h"
+
+// CStsServerSession IMPLEMENTATION
+CStsServerSession::CStsServerSession(CStsServer& aServer, CSts& aSts) :
+ iServer(aServer), iSts(aSts)
+ {
+ }
+
+CStsServerSession::~CStsServerSession()
+ {
+ CleanUpObservers();
+ TStsCallBack callBack;
+ callBack.callBackType = EStsShutdown;
+ iMsgQueue.SendBlocking(callBack);
+ iServer.DropSession(this);
+ iMsgQueue.Close();
+ }
+
+void CStsServerSession::CreateL()
+ {
+ iServer.AddSession(this);
+ }
+
+void CStsServerSession::ServiceL(const RMessage2& aMessage)
+ {
+ switch (aMessage.Function())
+ {
+ case StsMsg_RegisterMsgQueue:
+ DoRegisterMsgQueueL(aMessage);
+ break;
+ case StsMsg_PlayTone:
+ DoPlayToneL(aMessage);
+ break;
+ case StsMsg_PlayAlarm:
+ DoPlayAlarmL(aMessage);
+ break;
+ case StsMsg_PlayToneAlarm:
+ DoPlayToneAlarmL(aMessage);
+ break;
+ case StsMsg_StopAlarm:
+ DoStopAlarmL(aMessage);
+ break;
+ default:
+ break;
+ }
+ }
+
+void CStsServerSession::ServiceError(const RMessage2& aMessage, TInt aError)
+ {
+ CSession2::ServiceError(aMessage, aError);
+ }
+
+void CStsServerSession::DoRegisterMsgQueueL(const RMessage2& aMessage)
+ {
+ TInt result = iMsgQueue.Open(aMessage, 0);
+ if (result == KErrNone)
+ {
+ TThreadId id = RThread().Id();
+ TPckg<TThreadId> idPckg(id);
+ TRAP(result,aMessage.Write(1, idPckg));
+ }
+ aMessage.Complete(result);
+ }
+
+void CStsServerSession::DoPlayToneL(const RMessage2& aMessage)
+ {
+ CSystemToneService::TToneType tone =
+ (CSystemToneService::TToneType) aMessage.Int0();
+ aMessage.Complete(KErrNone);
+ iSts.PlayTone(tone);
+ }
+
+void CStsServerSession::DoPlayAlarmL(const RMessage2& aMessage)
+ {
+ CSystemToneService::TAlarmType alarm =
+ (CSystemToneService::TAlarmType) aMessage.Int0();
+ unsigned int context = 0;
+ iSts.PlayAlarm(alarm, context, *this);
+ iObserverMap[context] = (MStsPlayAlarmObserver*) aMessage.Ptr2();
+ TPckg<unsigned int> contextPckg(context);
+ TRAPD(err,aMessage.WriteL(1,contextPckg));
+ aMessage.Complete(err);
+ // if the context is 0 there was a problem with the PlayAlarm,
+ // so trigger the PlayAlarmComplete callback.
+ if (context == 0)
+ {
+ PlayAlarmComplete(0);
+ }
+ }
+
+void CStsServerSession::DoPlayToneAlarmL(const RMessage2& aMessage)
+ {
+ CSystemToneService::TToneType tone =
+ (CSystemToneService::TToneType) aMessage.Int0();
+ unsigned int context = 0;
+ iSts.PlayAlarm(tone, context, *this);
+ iObserverMap[context] = (MStsPlayAlarmObserver*) aMessage.Ptr2();
+ TPckg<unsigned int> contextPckg(context);
+ TRAPD(err,aMessage.WriteL(1,contextPckg));
+ aMessage.Complete(err);
+ // if the context is 0 there was a problem with the PlayAlarm,
+ // so trigger the PlayAlarmComplete callback.
+ if (context == 0)
+ {
+ PlayAlarmComplete(0);
+ }
+ }
+
+void CStsServerSession::DoStopAlarmL(const RMessage2& aMessage)
+ {
+ unsigned int context = aMessage.Int0();
+ aMessage.Complete(KErrNone);
+ iObserverMap.erase(context);
+ iSts.StopAlarm(context);
+ }
+
+void CStsServerSession::CleanUpObservers()
+ {
+ while (!iObserverMap.empty())
+ {
+ //TODO: Add trace here
+ unsigned int context = iObserverMap.begin()->first;
+ iObserverMap.erase(context);
+ iSts.StopAlarm(context);
+ }
+ }
+
+void CStsServerSession::PlayAlarmComplete(unsigned int aAlarmContext)
+ {
+ TStsCallBack callBack =
+ {
+ EStsPlayAlarmComplete, iObserverMap[aAlarmContext], aAlarmContext
+ };
+ iMsgQueue.SendBlocking(callBack);
+ iObserverMap.erase(aAlarmContext);
+ }