mmserv/radioutility/radioserver/Server/Src/RadioServerSession.cpp
changeset 0 71ca22bcf22a
child 8 e35735ece90c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/radioutility/radioserver/Server/Src/RadioServerSession.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,176 @@
+/*
+* Copyright (c) 2002-2004 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 class implements the server-side session.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include 	<custominterfacebuilder.h>
+#include 	<custominterfacecustomcommandparser.h>
+#include    <mmf/common/mmfcustomcommandparsermanager.h>
+#include    <mmf/common/mmfcontrollerframework.h>
+#include    <mmf/common/mmfipcserver.h>
+
+#include	"RadioServerSession.h"
+#include	"RadioServer.h"
+#include    "RadioDebug.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::CRadioServerSession
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CRadioServerSession::CRadioServerSession(
+	CRadioServer& aServer )
+	:	iServer(aServer),
+		iCustomInterfaceBuilder(NULL),
+		iObjectContainer(NULL),
+		iCustomCommandParserManager(NULL)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRadioServerSession::ConstructL()
+    {
+	RADIO_RDEBUG(_L("[RADIO-SVR] CRadioServerSession::ConstructL()"));
+	iServer.AddSession();
+
+	iCustomCommandParserManager = CMMFCustomCommandParserManager::NewL();
+
+	CCustomInterfaceCustomCommandParser* customInterfaceParser =
+			CCustomInterfaceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(customInterfaceParser);
+	iCustomCommandParserManager->AddCustomCommandParserL(*customInterfaceParser);
+    CleanupStack::Pop(customInterfaceParser);
+
+	iCustomInterfaceBuilder = CCustomInterfaceBuilder::NewL(MMFObjectContainerL(),
+															*(iServer.iDevSound));
+	// This needs to be pushed eventhough it's member variable, since the ownership
+	// is passed to the container. Otherwise, it will result in memory leak.
+	CleanupStack::PushL(iCustomInterfaceBuilder);
+	// Append custom interface builder to the array of MMFObjects
+	User::LeaveIfError(MMFObjectContainerL().AddMMFObject(*iCustomInterfaceBuilder));
+	CleanupStack::Pop(iCustomInterfaceBuilder);
+    }
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CRadioServerSession* CRadioServerSession::NewL(
+	CRadioServer& aServer )
+    {
+    CRadioServerSession* self = new( ELeave ) CRadioServerSession(aServer);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+CRadioServerSession::~CRadioServerSession()
+    {
+	RADIO_RDEBUG(_L("[RADIO-SVR] CRadioServerSession::~CRadioServerSession"));
+	iServer.DropSession();
+	delete iCustomCommandParserManager;
+	delete iObjectContainer;
+    }
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::ServiceL
+// -----------------------------------------------------------------------------
+//
+void CRadioServerSession::ServiceL(
+    const RMessage2& aMessage )
+    {
+    // Get the destination info to see who the message is destined for
+    TMMFMessageDestinationPckg destinationPckg;
+	MmfMessageUtil::ReadL(aMessage, 0, destinationPckg);
+	if ( (destinationPckg().DestinationHandle() == KRadioServerObjectHandle) &&
+         (destinationPckg().InterfaceId() == KRadioServerInterfaceUid) )
+	    {
+		iServer.ServiceRequestL(aMessage);
+		}
+	else
+		{
+	    // Create a TMMFMessage and get the destination info from the client
+        // into TMMFMessage.
+        TMMFMessage message(aMessage);
+    	message.FetchDestinationL();
+
+	    // Check if Custom Command Parser manager can handle the message...
+	    TBool handled = EFalse;
+	    if ( iCustomCommandParserManager )
+            {
+		    handled = iCustomCommandParserManager->HandleRequest(message);
+            }
+
+        // If the CCCParser manager couldn't handle the message, check if the
+        // Message is for one of the MMF Objects
+	    if ( !handled )
+            {
+		    CMMFObject* object = NULL;
+            TInt status(KErrNone);
+            // Try to find MMFObject that handles this request
+		    status = MMFObjectContainerL().FindMMFObject(message.Destination(), object);
+            // If found, give message to the MMFObject
+            if ( KErrNone == status )
+                {
+		        object->HandleRequest(message);
+		        handled = ETrue;
+                }
+            }
+
+        // No body has handled this message, the request is not supported
+		if ( !handled )
+			{
+			message.Complete(KErrNotSupported);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::GetCustomInterfaceBuilderL
+// -----------------------------------------------------------------------------
+//
+const TMMFMessageDestination& CRadioServerSession::GetCustomInterfaceBuilderL()
+	{
+	return iCustomInterfaceBuilder->Handle();
+	}
+
+// -----------------------------------------------------------------------------
+// CRadioServerSession::MMFObjectContainerL()
+// -----------------------------------------------------------------------------
+//
+CMMFObjectContainer& CRadioServerSession::MMFObjectContainerL()
+	{
+	// Construct iMMFObjectContainer if we haven't already.
+	if ( !iObjectContainer )
+	    {
+		iObjectContainer = new(ELeave) CMMFObjectContainer;
+	    }
+	return *iObjectContainer;
+	}
+
+//  End of File