mmserv/voipaudioservices/VoIPServer/src/VoIPServer.cpp
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/voipaudioservices/VoIPServer/src/VoIPServer.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,336 @@
+/*
+ * Copyright (c) 2007-2008 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:  Implements VoIP server object.
+ *
+ */
+
+#include <e32svr.h>
+#include <e32uid.h>
+#include <e32capability.h>
+#include "debugtracemacros.h"
+#include "VoIPECallEventHandler.h"
+#include "VoIPServerShutdown.h"
+#include "VoIPServerSession.h"
+#include "VoIPServer.h"
+
+// CONSTANTS
+const TInt KShutDownDelayTime = 2000000; // 2 sec delay time
+const TInt KNumOfSessions = 3;
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::NewL
+//
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServer* CVoIPAudioServer::NewL()
+    {
+    CVoIPAudioServer* self = new (ELeave) CVoIPAudioServer;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::CVoIPAudioServer
+//
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServer::CVoIPAudioServer() :
+    CServer2(CActive::EPriorityHigh, ESharableSessions),
+    iSession(0)
+    {
+    iECallInProgress = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::~CVoIPAudioServer
+//
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServer::~CVoIPAudioServer()
+    {
+    TRACE_PRN_FN_ENT;
+    CancelECallEventNotifier();
+    delete iShutdownTimer;
+    TRACE_PRN_FN_EXT;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::NewSessionL
+//
+// -----------------------------------------------------------------------------
+//
+CSession2* CVoIPAudioServer::NewSessionL(const TVersion& aVersion,
+        const RMessage2& aMessage) const
+    {
+    TRACE_PRN_FN_ENT;
+
+    // Block session creation during active emergency call
+    if (iECallInProgress)
+        {
+        User::Leave(KErrPermissionDenied);
+        }
+
+    // Block access to audio device when MultimediaDD capability missing
+    if (!aMessage.HasCapability(ECapabilityMultimediaDD))
+        {
+        User::Leave(KErrPermissionDenied);
+        }
+
+    // Limit number of sessions created by the server.
+    if (iSession >= KNumOfSessions)
+        {
+        User::Leave(KErrPermissionDenied);
+        }
+
+    const TVersion version(KVoIPServMajorVersionNumber,
+            KVoIPServMinorVersionNumber, KVoIPServBuildVersionNumber);
+
+    if (!User::QueryVersionSupported(version, aVersion))
+        {
+        User::Leave(KErrNotSupported);
+        }
+
+    CVoIPAudioServerSession* session = CVoIPAudioServerSession::NewL(
+            *((CVoIPAudioServer*) this));
+
+    TRACE_PRN_FN_EXT;
+    return session;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::ConstructL()
+    {
+    TRACE_PRN_FN_ENT;
+
+    iShutdownTimer = CDelayVoIPServerShutDown::NewL();
+    StartL(KVoIPServerName);
+    RThread().SetPriority(EPriorityRealTime);
+    StartECallEventNotifierL();
+
+    TRACE_PRN_FN_EXT;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::AddSession
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::AddSession()
+    {
+    iSession++;
+    // If shutdown timer is active, cancel it here.
+    iShutdownTimer->Cancel();
+
+    TRACE_PRN_N1(_L("VoIP->SRV: AddSession->Active Sessions: [%d]"), iSession);
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::DropSession
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::DropSession()
+    {
+    iSession--;
+
+    // If session count is zero, launch shutdown timer here
+    if (iSession == 0)
+        {
+        iShutdownTimer->SetDelay(TTimeIntervalMicroSeconds32(
+                KShutDownDelayTime));
+        }
+
+    TRACE_PRN_N1(_L("VoIP->DNL: DropSession->Active Sessions: [%d]"), iSession);
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::SessionCount
+//
+// -----------------------------------------------------------------------------
+//
+TInt CVoIPAudioServer::SessionCount()
+    {
+    return iSession;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::SetDnLinkSession
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::SetDnLinkSession(CVoIPAudioServerSession* aSession,
+        TBool aStatus)
+    {
+    if (aStatus)
+        {
+        iDnlinkSession = aSession;
+        }
+    else
+        {
+        iDnlinkSession = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::SetUpLinkSession
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::SetUpLinkSession(CVoIPAudioServerSession* aSession,
+        TBool aStatus)
+    {
+    if (aStatus)
+        {
+        iUplinkSession = aSession;
+        }
+    else
+        {
+        iUplinkSession = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::HasDnLinkSession
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVoIPAudioServer::HasDnLinkSession()
+    {
+    TBool status = EFalse;
+    if (iDnlinkSession)
+        {
+        status = ETrue;
+        }
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::HasUpLinkSession
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVoIPAudioServer::HasUpLinkSession()
+    {
+    TBool status = EFalse;
+    if (iUplinkSession)
+        {
+        status = ETrue;
+        }
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::StartECallEventNotifierL
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::StartECallEventNotifierL()
+    {
+    if (!iECallHandler)
+        {
+        iECallHandler = CVoIPECallEventHandler::NewL(
+                (const_cast<CVoIPAudioServer*> (this)));
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::CancelECallEventNotifier
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::CancelECallEventNotifier()
+    {
+    delete iECallHandler;
+    iECallHandler = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::NotifyECallEvent
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServer::NotifyECallEvent(TInt aECall)
+    {
+    iECallInProgress = aECall;
+
+    if (iECallInProgress)
+        {
+        if (HasDnLinkSession())
+            {
+            iDnlinkSession->CloseDownlink();
+            }
+        if (HasUpLinkSession())
+            {
+            iUplinkSession->CloseUplink();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServer::RunServerL
+//
+// -----------------------------------------------------------------------------
+//
+static void RunServerL()
+    {
+    TRACE_PRN_N(_L("VoIP->RunServerL"));
+
+    // Create and install the active scheduler we need
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    // Create the server (leave it on the cleanup stack)
+    CVoIPAudioServer* server = CVoIPAudioServer::NewL();
+
+    // Initialisation complete, now signal the client
+    RProcess::Rendezvous(KErrNone);
+
+    // Start the scheduler and wait for client requests
+    CActiveScheduler::Start();
+
+    // Ready to exit.
+    // Cleanup scheduler and delete the server
+    CleanupStack::PopAndDestroy(scheduler);
+    delete server;
+
+    TRACE_PRN_N(_L("VoIP->RunServerL - VoIP server closed"));
+    }
+
+// -----------------------------------------------------------------------------
+// E32Main
+// Entry point for the server
+// -----------------------------------------------------------------------------
+//
+TInt E32Main()
+    {
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    TInt r = KErrNoMemory;
+    if (cleanup)
+        {
+        TRAP(r, RunServerL());
+        delete cleanup;
+        }
+    __UHEAP_MARKEND;
+    return r;
+    }
+
+// End of file