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