mmserv/sts/stsserver/src/stsserversession.cpp
branchRCL_3
changeset 19 095bea5f582e
--- /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);
+    }