zeroconf/server/src/cmessagehandler.cpp
changeset 14 da856f45b798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zeroconf/server/src/cmessagehandler.cpp	Thu Jun 24 19:09:47 2010 +0530
@@ -0,0 +1,268 @@
+// Copyright (c) 2008-2009 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:
+// cmessagehandler.cpp
+// 
+//
+/**
+@file
+@internalTechnology
+*/
+
+//System include
+#include <mdns/cdnsmessagecomposerparser.h>
+#include <mdns/cdnsmessage.h>
+#include <e32base.h>
+
+//user include
+#include "cmessagehandler.h"
+#include "cqueryhandler.h"
+#include "ccacheentry.h"
+#include "cresponsehandler.h"
+#include "cadvertizehandler.h"
+#include <mdns/mdnscachemgr.h>
+
+__FLOG_STMT(_LIT8(KComponent,"MDNSServer");)
+//
+/**
+Two phase constructor 
+@param aServer reference to CBonjourServer
+@return pointer to CMessageHandler
+*/
+CMessageHandler* CMessageHandler::NewL(CMdnsServer& aServer)
+	{
+	CMessageHandler* self = new (ELeave) CMessageHandler(aServer);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+/**
+Implementation of MSocketHandlerObserver 
+@param aData packet recieved from the mdns port
+@param aAddr address from which packet is recieved
+@param aLength length of the packet reieved
+@return void
+*/		
+void CMessageHandler::OnCompletionL(TDesC8& aData, const TSockAddr& aAddr, TInt aLength ) 
+	{
+	__FLOG(_L8("CMessageHandler::OnCompletionL - Entry"));
+	HandleIncomingPacketL(aData ,aAddr ,aLength );
+	iRecieveSocket->Activate(TSocketHandlerParams(ESocketRecieve));	
+	__FLOG(_L8("CMessageHandler::OnCompletionL - Exit"));
+	}
+/**
+Any error in the socket will be notified here
+@paran aError error with which socket leaves
+@return void
+*/	
+void CMessageHandler::OnError(TInt /*aError*/)
+	{
+	__FLOG(_L8("CMessageHandler::OnError -Entry Exit"));
+	}
+	
+/**
+Constructor
+*/
+CMessageHandler::CMessageHandler(CMdnsServer& aServer):iServer(aServer)
+	{
+	
+	}
+	
+/**
+Two phase constructor
+*/	
+void CMessageHandler::ConstructL()
+	{
+	__FLOG_OPEN(KMDNSSubsystem, KComponent);
+	__FLOG(_L8("CMessageHandler::ConstructL - Entry"));
+	iQueryHandler = CQueryHandler::NewL(*this);
+	iResponseHandler = CResponseHandler::NewL(*this);
+	iAdvertizeHandler = CAdvertizeHandler::NewL(*this);
+	iRecieveSocket = CSocketHandler::NewL(iServer.Socket(),*this,ESocketRecieve);
+	iSendMessageQueue = CSendMessageQueue::NewL(iServer.Socket());
+	iRecieveSocket->Activate(TSocketHandlerParams(ESocketRecieve));	
+	iDnsCache = CMDNSCacheManager::NewL(200);
+	iDummyhandler = CBaseHandler::NewL(*this);
+	__FLOG(_L8("CMessageHandler::ConstructL - Exit"));
+	}
+
+/*
+Destructor
+*/	
+CMessageHandler::~CMessageHandler()
+	{
+	__FLOG(_L8("CMessageHandler::~CMessageHandler - Entry"));
+	delete iQueryHandler;
+	delete iResponseHandler;
+	delete iAdvertizeHandler;
+	delete iRecieveSocket;
+	TRAPD(err,iDnsCache->DumpCacheL());
+	delete iDnsCache;
+	delete iPacket;
+	delete iSendMessageQueue;
+	delete iDummyhandler;
+	__FLOG(_L8("CMessageHandler::~CMessageHandler - Exit"));
+	__FLOG_CLOSE;
+	}
+/**
+This method parse the packet and dispatch the packet for handling it based on the operation requested.
+from the header
+@param aData packet read from the mdns port
+@param aAddr address from which the packet is recieved
+@param length lenght of the data recieved
+@return void
+*/	
+void CMessageHandler::HandleIncomingPacketL(TDesC8& aData, const TSockAddr& aAddr, TInt /*length*/)
+	{
+	__FLOG(_L8("CMessageHandler::HandleIncomingPacketL - Entry"));    
+	CDnsMessageComposerParser* comPos = CDnsMessageComposerParser::NewL();	
+	CleanupStack::PushL(comPos);
+	CDnsMessage* message = comPos->ParseMessageL(aData);
+	CleanupStack::PushL(message);
+	CBaseHandler& iOperationHandler = GetHandlerL(*message);
+	iOperationHandler.HandleIncomingPacketL(*message ,aAddr);	
+	CleanupStack::PopAndDestroy(message);//comPos and message
+	CleanupStack::PopAndDestroy(comPos);
+	__FLOG(_L8("CMessageHandler::HandleIncomingPacketL - Exit"));
+	}
+
+/**
+This is a factory method which reads the packet and returns the handle to either
+response or query handler
+@param aMessage Dnspacket to read the header and to constructthe appropriate handler.
+@return Poointer to CBaseHandler --base class to both response and query handler.
+*/ 
+CBaseHandler& CMessageHandler::GetHandlerL(CDnsMessage& aMessage)
+	{
+	__FLOG(_L8("CMessageHandler::GetHandlerL - Entry"));
+	TDnsHeader header = aMessage.Header();
+	//
+	if(header.IsQuery() && !header.IsAuthoritative())
+		{
+		return 	*iQueryHandler;
+		}
+	else if(header.IsAuthoritative())
+		{
+		return *iResponseHandler;
+		}
+	else 
+		{
+		return *iDummyhandler;	
+		}	
+	__FLOG(_L8("CMessageHandler::GetHandlerL - Exit"));		
+	}
+/**
+@return return a reference to CacheManager
+*/
+MDNSCacheMgr& CMessageHandler::DnsCache() const
+	{
+	__FLOG(_L8("CMessageHandler::DnsCache -Entry Exit"));
+     return *iDnsCache;		
+	}
+
+/*
+ * Routes the query sent by the client to query handler to handle it.
+ * @param aMessage Pointer to a message object ;contains the query.
+ * @param aHandle session id which generated the query.
+ */
+void CMessageHandler::ServiceClientQueryL(CDnsMessage* aMessage,TInt aHandle)
+	{
+	__FLOG(_L8("CMessageHandler::ServiceClientQueryL - Entry"));
+	iQueryHandler->ServiceClientQueryL(aMessage, aHandle);
+	__FLOG(_L8("CMessageHandler::ServiceClientQueryL - Exit"));
+	}
+	
+/*
+ * returns the pointer to the messagequeue.
+ */
+CSendMessageQueue& CMessageHandler::MessageQueue()const
+	{
+	__FLOG(_L8("CMessageHandler::MessageQueue -Entry Exit"));
+	return *iSendMessageQueue;	
+	}
+
+/*
+ * Notify the server after the query has been handled.
+ * @param aClientHandle SessionId which had sent the query.
+ */
+void CMessageHandler::NotifyClientQuery(TInt aClientHandle)
+	{
+	__FLOG(_L8("CMessageHandler::NotifyClientQuery - Entry"));
+	iServer.NotifyClientQuery(aClientHandle);	
+	__FLOG(_L8("CMessageHandler::NotifyClientQuery - Exit"));
+	}
+	
+/*
+ * Route an internal query to the query handler
+ * @param aMessage pointer to the dnsmeesage containg the query.
+ * @param Observer to which successfull delivery of packet to be notified.
+ */
+void CMessageHandler::SendQueryL(CDnsMessage* aMessage, MMessageHandler& aObserver)
+	{
+	__FLOG(_L8("CMessageHandler::SendQueryL - Entry"));
+	iQueryHandler->SendQueryL(aMessage, aObserver);	
+	__FLOG(_L8("CMessageHandler::SendQueryL - Exit"));
+	}
+/*
+ * Route the packet to be advertised to the adveritser.
+ * @param aData array of CDnsresourceData to be advertised.
+ * @param aSessionId session which adveritised the packet.
+ */			
+void CMessageHandler::AdvertizePacketL(const RPointerArray<CDnsResourceData> aData, TInt aSessionId,TBool aIsUpdate)
+    {
+    __FLOG(_L8("CMessageHandler::AdvertizePacketL - Entry"));
+    iAdvertizeHandler->AdvertizePacketL(aData, aSessionId,aIsUpdate);
+    __FLOG(_L8("CMessageHandler::AdvertizePacketL - Exit"));
+    }
+
+/*
+ * Notify the server when a new service is published
+ * @param aName name of the service published
+ * inacase of autoresolve name will be the new published name.
+ * @param aError will be the result of publish.ESuccess if successfull and E*Conflict.
+ * @param aSessionId session which initaiated publish.
+ * 
+ */
+void CMessageHandler::NotifyServicePublishL(const RBuf8& aName,TInt aError, TInt aSessionId)
+    {
+    __FLOG(_L8("CMessageHandler::NotifyServicePublishL - Entry"));
+    iServer.NotifyServicePublishL(aName,aError, aSessionId);
+    __FLOG(_L8("CMessageHandler::NotifyServicePublishL - Exit"));
+    }
+    
+/*
+ * @param aProbing ETrue if hostprobing in progress.
+ */
+void CMessageHandler::SetStateHostProbing(TBool aProbing)
+    {
+    __FLOG(_L8("CMessageHandler::SetStateHostProbing - Entry"));
+    iServer.SetStateHostProbing(aProbing);
+    __FLOG(_L8("CMessageHandler::SetStateHostProbing - Exit"));
+    }
+
+/* 
+ * notify the server when a new service has been published in the network
+ * @param aName array of new service published , for the servcetype client has requested.
+ */
+void CMessageHandler::NotifyNewServiceL(const RArray<RBuf8>& aName)
+    {
+    __FLOG(_L8("CMessageHandler::NotifyNewServiceL - Entry"));
+    iServer.NotifyNewServiceL(aName);
+    __FLOG(_L8("CMessageHandler::NotifyNewServiceL - Exit"));
+    }
+
+CMdnsServer& CMessageHandler::Server()
+    {
+    return iServer; 
+    }