diff -r a36789189b53 -r 095bea5f582e mmserv/sts/stsserver/src/stsserversession.cpp --- /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 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 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 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); + }