mmserv/sts/sts/src/sts.cpp
changeset 20 b67dd1fc57c5
child 33 5e8b14bae8c3
child 42 1fa3fb47b1e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/sts/sts/src/sts.cpp	Fri May 14 18:19:45 2010 -0500
@@ -0,0 +1,181 @@
+/*
+ * 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 file provides the implementation of System Tone Service used
+ * by the STS Server.
+ */
+
+#include "sts.h"
+
+class CSts::CPlayerNode
+    {
+public:
+    CPlayerNode(CStsPlayer* aPlayer);
+    CPlayerNode(CStsPlayer* aPlayer, MStsPlayAlarmObserver& aObserver);
+    ~CPlayerNode();
+    bool HasObserver();
+    CStsPlayer* Player();
+    MStsPlayAlarmObserver& Observer();
+private:
+    CStsPlayer* iPlayer;
+    MStsPlayAlarmObserver* iObserver;
+    };
+
+CSts::CPlayerNode::CPlayerNode(CStsPlayer* aPlayer) :
+    iPlayer(aPlayer), iObserver(0)
+    {
+    }
+
+CSts::CPlayerNode::CPlayerNode(CStsPlayer* aPlayer,
+        MStsPlayAlarmObserver& aObserver) :
+    iPlayer(aPlayer), iObserver(&aObserver)
+    {
+    }
+
+CSts::CPlayerNode::~CPlayerNode()
+    {
+    delete iPlayer;
+    }
+
+bool CSts::CPlayerNode::HasObserver()
+    {
+    return iObserver != 0;
+    }
+
+CStsPlayer* CSts::CPlayerNode::Player()
+    {
+    return iPlayer;
+    }
+
+MStsPlayAlarmObserver& CSts::CPlayerNode::Observer()
+    {
+    return *iObserver;
+    }
+
+/*static*/CSts* CSts::Create()
+    {
+    CSts* self = new CSts();
+    if (self != 0)
+        {
+        bool successful = self->Init();
+        if (!successful)
+            {
+            delete self;
+            self = 0;
+            }
+        }
+    return self;
+    }
+
+/*static*/void CSts::Delete(CSts* aSts)
+    {
+    delete aSts;
+    }
+
+CSts::CSts() :
+    iNextContext(1)
+    {
+    }
+
+bool CSts::Init()
+    {
+    return true;
+    }
+
+CSts::~CSts()
+    {
+    CleanUpPlayers();
+    }
+
+void CSts::PlayTone(CSystemToneService::TToneType aTone)
+    {
+    CStsPlayer* player = CStsPlayer::CreateTonePlayer(*this, aTone,
+            iNextContext);
+    if (player != 0)
+        {
+        iPlayerMap[iNextContext] = new CPlayerNode(player);
+        iNextContext++;
+        if (iNextContext == 0)
+            iNextContext++;
+        player->Play();
+        }
+    else
+        {
+        //TODO: Add trace here
+        }
+    }
+
+void CSts::PlayAlarm(CSystemToneService::TAlarmType aAlarm,
+        unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
+    {
+    CStsPlayer* player = CStsPlayer::CreateAlarmPlayer(*this, aAlarm,
+            iNextContext);
+    if (player != 0)
+        {
+        iPlayerMap[iNextContext] = new CPlayerNode(player, aObserver);
+        aAlarmContext = iNextContext;
+        iNextContext++;
+        if (iNextContext == 0)
+            iNextContext++;
+        player->Play();
+        }
+    else
+        {
+        //TODO: Add trace here
+        aAlarmContext = 0;
+        }
+    }
+
+void CSts::StopAlarm(unsigned int aAlarmContext)
+    {
+    CPlayerNode* node = iPlayerMap[aAlarmContext];
+    iPlayerMap.erase(aAlarmContext);
+    if (node)
+        {
+        node->Player()->Stop();
+        delete node;
+        }
+    else
+        {
+        //TODO: Add trace here
+        }
+    }
+
+void CSts::CleanUpPlayers()
+    {
+        while (!iPlayerMap.empty())
+            {
+            //TODO: Add trace here
+            StopAlarm(iPlayerMap.begin()->first);
+            }
+    }
+
+void CSts::PlayComplete(unsigned int aContext)
+    {
+    CPlayerNode* node = iPlayerMap[aContext];
+    iPlayerMap.erase(aContext);
+    if (node)
+        {
+        CStsPlayer* player = node->Player();
+        if (node->HasObserver())
+            {
+            node->Observer().PlayAlarmComplete(aContext);
+            }
+        delete node;
+        }
+    else
+        {
+        // TODO: log unexpected error
+        }
+    }