networkprotocols/dnsproxy/dnsproxyserver/src/dnsproxywriter.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocols/dnsproxy/dnsproxyserver/src/dnsproxywriter.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,162 @@
+// 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:
+// This class constructs the DNS response packet and sends it back to
+// querying hosts. After sending the DNS query response to querying hosts,
+// DNS writer checks if there is anything pending in the queue which needs
+// to be send back to the querying host.Once done it deletes the completed
+// query context from the queue. This is dervied from CActive.
+//
+
+
+
+/**
+ @file
+ @internalTechnology
+*/
+#include "inet6log.h"
+#include <cflog.h>
+#include "dnsproxylistener.h"
+#include "dnsproxywriter.h"
+
+CDnsProxyWriter* CDnsProxyWriter::NewL(CDnsProxyListener& aListener)
+/**
+ * This method creates an instance of CDnsProxyWriter.
+ * @param aListener - Reference of the listener object
+ * @return - Pointer to class instance
+ *
+ * @internalTechnology
+ **/
+	{
+    CDnsProxyWriter*writer = new(ELeave)CDnsProxyWriter(aListener);
+	return writer;
+	}
+
+CDnsProxyWriter::CDnsProxyWriter(CDnsProxyListener& aListener):CActive(EPriorityStandard),iListener(aListener)
+/**
+ * This is constructor for CDnsProxyWriter.It adds itself to CActive scheduler.
+ * @param aListener - Reference of the listener object
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CDnsProxyWriter::ConstructL()
+/**
+ * Second phase construction
+ * @param -None
+ * @return -None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	}
+
+CDnsProxyWriter::~CDnsProxyWriter()
+/**
+ * This is destructor for CDnsProxyWriter.It cancels any pending requests.
+ * @param -None
+ * @return -None
+ *
+ * @internalTechnology
+ **/
+
+	{
+    Cancel();
+	}
+
+void CDnsProxyWriter::RunL()
+/**
+ * This method implements RunL method of this active object.It deletes all the completed queries
+ * and processes the next resolved query. That is, query whose state is EResolved.
+ *
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+		//delete the completed messages
+		TInt index = 0;
+		TQueryContext *qCtx = NULL;
+
+		while(iListener.iQueryContext.Count() > index)
+			{
+			TQueryState queryState = iListener.iQueryContext[index]->GetQueryState();
+			TQueryContext *qCtx = iListener.GetQCtxFromList(EQueryDone);
+			if(qCtx)
+				{
+				iListener.DeleteQCtxFromListL(qCtx);
+				qCtx = NULL;
+				}
+            index++;
+			}
+			
+		qCtx = iListener.GetQCtxFromList(EResolved);
+		if(qCtx)
+			{
+			WriteTo(qCtx);
+			}
+	}
+
+void CDnsProxyWriter::DoCancel()
+/**
+ * This method cancels outstanding write request.
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	iListener.iListenerSocket.CancelSend();
+	}
+
+void CDnsProxyWriter::WriteTo(TQueryContext* aQueryContext)
+/**
+ * This method gets DNS response from query context and sends it to the querying host.
+ * @param queryContext - Pointer to the query context
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	if(IsActive())
+		return;
+	
+	TPtrC8 msg = aQueryContext->GetDnsReplyMessage();
+	addr = aQueryContext->GetSourceAddr();
+	aQueryContext->SetQueryState(EQueryDone);
+
+	iListener.iListenerSocket.SendTo(msg,aQueryContext->GetSourceAddr(),0,iStatus);
+	SetActive();
+	}
+
+TInt CDnsProxyWriter::RunError(TInt /*aErr*/)
+/**
+ * This method implements RunError method of an active object. This helps in debugging.
+ * @param aErr - Error code
+ * @return - Error code
+ *
+ * @internalTechnology
+ **/
+	{
+	iListener.DeleteAllQCtxFromList();
+	return KErrNone;
+	}