networkprotocols/dnsproxy/dnsproxyserver/src/dnsproxyengine.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocols/dnsproxy/dnsproxyserver/src/dnsproxyengine.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,430 @@
+// 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 file consists of implementation of DNS Proxy engine. This is the controller
+// class which reads configuration from resolver.ini, configures DNS Proxy components
+// and starts and stops the listener.
+//
+
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#include <es_sock.h>
+#include <cflog.h>
+#include "e32debug.h"
+#include "dnsproxylistener.h"
+#include "dnsproxyengine.h"
+#include "dnsproxyservconf.h"
+#include "dnsproxylog.h"
+#include "inet6log.h"
+
+//intializing the static object
+CDnsProxyEngine* CDnsProxyEngine::iDnsProxyEngine = NULL;
+
+CDnsProxyEngine* CDnsProxyEngine::NewL()
+/**
+ * This is the two phase construction method and is leaving function
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ */
+	{
+	__LOG("\n CDnsProxyEngine::NewL Entry")
+	CDnsProxyEngine* pEngine = new(ELeave)CDnsProxyEngine();
+	CleanupStack::PushL(pEngine);
+	pEngine->ConstructL();
+	CleanupStack::Pop();
+	__LOG("\n CDnsProxyEngine::NewL Exit")
+	return pEngine;
+	}
+
+
+CDnsProxyEngine::CDnsProxyEngine()
+/**
+ * This is the constructor for this class
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ */
+
+	{
+	__LOG("\n CDnsProxyEngine::CDnsProxyEngine Entry")
+	iConfigData = NULL;
+	iConfigDataErr = 0;
+	__LOG("\n  CDnsProxyEngine::CDnsProxyEngine Exit")
+	}
+/* This is the destructor  and deletes all the member variables and thus
+ * releases all the memory assosicated with those objects
+ */
+CDnsProxyEngine::~CDnsProxyEngine()
+/**
+ * This is the destructor  and deletes all the member variables and thus
+ * releases all the memory assosicated with those objects
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::~CDnsProxyEngine Entry")
+	delete iConfigData;
+	delete iProxyServer;
+	delete iListener;
+	delete iDnsproxydb;
+	iSockServ.Close();
+	__LOG("\n CDnsProxyEngine::~CDnsProxyEngine Exit")
+	}
+/* This is second phase construction where in all objects will be created
+ * which potentially may leave due to resource problem
+ */
+void CDnsProxyEngine::ConstructL()
+/**
+ * This is the second phase of construction.
+ * Create intances of proxy database, config server and listener classes.
+ * Reads configuration values from .ini file
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	__LOG("\n CDnsProxyEngine::ConstructL Entry")
+	//Reads the configuration from .ini file
+	ReadConfiguration();
+	User::LeaveIfError(iSockServ.Connect());
+	__LOG("After Reading configuration")
+	iDnsproxydb = CDnsProxyDb::CreateInstanceL(*this);
+	iProxyServer = CDnsServerConfig::NewL(*this);
+	iListener    = CDnsProxyListener::NewL(*this);
+	
+	__LOG("\n CDnsProxyEngine::ConstructL Exit")
+	}
+
+/* This is function reads configuration values from configuration file
+ *
+ */
+void CDnsProxyEngine::ReadConfiguration()
+/**
+ *
+ * This method reads configuration values from .ini file
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::ReadConfiguration Entry")
+	iConfigParams.iSessionCount = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_NUM_SOCK_SESSION,KSessioncount);
+	iConfigParams.iRetryCount   = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_NUM_RETRIES,KRetrycount);
+	iConfigParams.iQSize        = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_QUEUE_SIZE,KQSize);
+	iConfigParams.iTTL          = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_TTL,KTtl);
+	iConfigParams.iDbSize       = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_DB_SIZE,KDbSize);
+	iConfigParams.iTimerVal     = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_TIMER_VAL,KTimerVal);
+
+	iConfigParams.iSerialNum    = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_SERIAL_NUM,KSerialNum);
+	iConfigParams.iRefreshTime  = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_REFRESH_TIME,KRefreshTime);
+	iConfigParams.iRetryTime    = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_RETRY_TIME,KRetryTime);
+	iConfigParams.iExpiretime   = GetIniValue(DNS_PROXY_INI_SECTION,DNS_PROXY_INI_EXPIRE_TIME,KExpireTime);	
+
+	__LOG1("\n CDnsProxyEngine::ReadConfiguration iSessionCount (%d)",iConfigParams.iSessionCount)
+	__LOG1("\n CDnsProxyEngine::ReadConfiguration iRetryCount (%d)",iConfigParams.iRetryCount)
+	__LOG1("\n CDnsProxyEngine::ReadConfiguration iTimerVal (%d)",iConfigParams.iTimerVal)
+	UnLoadConfigurationFile();
+	}
+
+TInt CDnsProxyEngine::Start(const RMessage2& aMessage)
+/**
+ * This is entry point of DNS Proxy functionality. The DHCP server session
+ * calls this using client API to start dnsproxy.
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+    TInt err;
+	__LOG("\n CDnsProxyEngine::Start Entry")
+	err = SetDlinkConnectionInfo(aMessage);
+	if(err!=KErrNone)
+		return err;
+
+	err = iListener->Activate();
+	__LOG("\n CDnsProxyEngine::ReadConfiguration Exit")
+	return err;
+	}
+
+void CDnsProxyEngine::Stop()
+/**
+ * This stops the listener and deletes all the objects.The method is called at the time
+ * of shutdown.
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	__LOG("\n CDnsProxyEngine::Stop Entry")
+	iListener->StopListener();
+	__LOG("\n CDnsProxyEngine::Stop Exit")
+	}
+
+TBool CDnsProxyEngine::FindVar(const TDesC &aSection, const TDesC &aVarName, TInt &aResult)
+/**
+ * This will find specified value for variable in the configuation file
+ * @param aSection - represents the section name in configuration file
+ * @param aVarName - represents name in the specified section
+ * @param aResult - sets the corresponding values for above given varname
+ * @return - returns the boolean flag - if name value pair or loading configuration
+ * 			- fails then returns false
+ * @panic - system wide errors
+ *
+ * @internalTechnology
+ **/
+	{
+	__LOG("\n DnsProxyEngine::FindVar")
+	if(LoadConfigurationFile())
+	  {
+	   ASSERT(iConfigData);	// <-- lint gag
+	   return iConfigData->FindVar(aSection, aVarName, aResult);
+	  }
+	__LOG("\n DnsProxyEngine::FindVar Exit")
+	return EFalse;
+	}
+
+TBool CDnsProxyEngine::LoadConfigurationFile()
+/**
+ * This will load the configuaration file into memory.
+ * If it is already loaded then returns true otherwise loads the file
+ * @param - None
+ * @return boolean - retursn boolean value either true or false
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::LoadConfigurationFile Entry")
+	if (iConfigData)
+		return TRUE;	// Already loaded!
+	if (iConfigDataErr)
+		return FALSE;
+	TRAP(iConfigDataErr, iConfigData = CESockIniData::NewL(DNS_PROXY_INI_DATA));
+	__LOG("\n CDnsProxyEngine::LoadConfigurationFile Exit")
+	return (iConfigData != NULL);
+	}
+
+void CDnsProxyEngine::UnLoadConfigurationFile()
+/**
+ * This will unload the configuaration file from memory.
+ * @param - None
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::UnloadConfigurationFile Entry")
+	delete iConfigData;
+	iConfigData = NULL;
+	iConfigDataErr = 0;
+	__LOG("\n CDnsProxyEngine::UnloadConfigurationFile Exit")
+	}
+
+TInt CDnsProxyEngine::GetIniValue(const TDesC &aSection, const TDesC &aName, TInt aValue)
+/**
+ * This function reads the value for given name in the specified section
+ * @param aSection - represents the section name in configuration file
+ * @param aName - represents name in specified section
+ * @param aValue - represents default value
+ * @return boolean - retursn boolean value either true or false
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::GetIniValue Entry")
+	LOG(_LIT(KFormat, "\t[%S] %S = %d"));
+	TInt value;
+	if (!FindVar(aSection, aName, value))
+		value = aValue;
+    LOG(Log::Printf(KFormat, &aSection, &aName, value));
+    __LOG1("CDnsProxyEngine::GetIniValue %d",value);
+    
+	return value;
+	}
+
+TInt CDnsProxyEngine::AddDbEntryL(const RMessage2& aMsg)
+/**
+ * This method updates DB.
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	if(!iDnsproxydb)
+	   return KErrBadHandle;
+	
+	TBuf8<KMaxName> dbdata;
+	TBuf16<KAddrLength> ipaddress;
+
+	aMsg.Read(0,ipaddress);
+	aMsg.Read(1,dbdata);
+
+	TInetAddr address;
+    address.Input(ipaddress);
+    
+    TInt current_size = iDnsproxydb->GetDbSize();
+    if(current_size < iConfigParams.iDbSize)
+    	{
+  		iDnsproxydb->UpdateDbL(dbdata,address);
+    	}
+    else
+	    {
+	    return KErrGeneral;	
+	    }	
+	__LOG("\n CDnsProxyEngine::AddDbEntryL Exit")
+	return KErrNone;
+	}
+
+TInt CDnsProxyEngine::RemoveDbEntry(const RMessage2& aMsg)
+/**
+ * This method updates DB.
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	if(!iDnsproxydb)
+		return KErrBadHandle;
+
+	__LOG("\n CDnsProxyEngine::RemoveDbEntry Entry")
+	TBuf16<KAddrLength> ipaddress;
+
+	aMsg.Read(0,ipaddress);
+
+	TInetAddr address;
+    address.Input(ipaddress);
+    iDnsproxydb->DeleteDbEntry(address);
+    __LOG("\n CDnsProxyEngine::RemoveDbEntry Exit")
+    return KErrNone;
+	}
+
+void CDnsProxyEngine::UpdateLocalAddr(TInetAddr& aAddr)
+/**
+ * This method updates interface address in the engine.
+ * @param addr - Listen interface address
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	__LOG("\n CDnsProxyEngine::UpdateLocalAddr Entry/Exit")
+	iProxyIfAddr = aAddr;
+	}
+
+TInt CDnsProxyEngine::UpdateDomainInfo(const RMessage2& aMsg)
+/**
+ * This method updates DB.
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+	{
+	TInt err = KErrNone;
+	__LOG("\n CDnsProxyEngine::UpdateDomainInfo Entry")
+	err = aMsg.Read(0,iSuffixInfo);
+	return err;
+	}
+
+    
+TInt CDnsProxyEngine::IsSuffixAvailable()
+/**
+ * This method checks if suffix is available. 
+ * @param  None
+ * @return Length- Length of suffix data
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::IsSuffixAvailable Entry/Exit")
+	return iSuffixInfo.Length();
+	}
+    
+
+
+CDnsProxyEngine* CDnsProxyEngine::GetInstanceL()
+    {
+/**
+ * This method returns single ton pointer to CDnsProxyEngine 
+ * @param  None
+ * @return iUplinkConnection
+ *
+ * @internalTechnology
+ **/    
+    __LOG("\n CDnsProxyEngine::GetInstanceL Entry")    
+    if(!iDnsProxyEngine)
+        {
+        __LOG("\n first time creation ")            
+        iDnsProxyEngine = CDnsProxyEngine::NewL();
+        }
+    __LOG("\n CDnsProxyEngine::GetInstanceL  Exit")        
+    return iDnsProxyEngine;
+    }
+
+
+TInt CDnsProxyEngine::SetUplinkConnectionInfo(const RMessage2 &aMessage)
+/**
+ * This method reads uplink connection info from the message. 
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	
+	__LOG("\n CDnsProxyEngine::SetUplinkConnectionInfo Entry")
+	
+	TInt err = iListener->SetUplinkConnectionInfo(aMessage);
+	__LOG("\n CDnsProxyEngine::SetUplinkConnectionInfo Exit")
+	return err;
+	
+    }
+    
+TInt CDnsProxyEngine::SetDlinkConnectionInfo(const RMessage2 &aMessage)
+/**
+ * This method reads downlink connection info from the message. 
+ * @param aMessage - Message send by the client
+ * @return - None
+ *
+ * @internalTechnology
+ **/
+
+	{
+	__LOG("\n CDnsProxyEngine::SetDlinkConnectionInfo Entry")
+	TInt err = iListener->SetDlinkConnectionInfo(aMessage);
+	__LOG("\n CDnsProxyEngine::SetDlinkConnectionInfo End")
+	return err;
+	}