diff -r 000000000000 -r af10295192d8 networkprotocols/dnsproxy/dnsproxyserver/src/dnsproxywriter.cpp --- /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 +#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; + }