diff -r 000000000000 -r af10295192d8 tcpiputils/dnd/inc/servers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dnd/inc/servers.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,186 @@ +// Copyright (c) 2004-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: +// servers.cpp - server manager module +// + +#ifndef __SERVERS_H__ +#define __SERVERS_H__ + +/** +@file servers.h +DNS server list maintenance +@internalComponent Domain Name Resolver +*/ + +#include + +/** +// @brief The name resolution scope level and type (multicast or unicast) +// +// The server scope defines the scope level [1..16] which is +// served by the server. Additionally, the scope is stored +// either as positive integer (if resolution is based on +// multicast strategy), or negative number if resolution is +// based on traditional DNS server. +// +// Currently only two server scopes are used: +// @li Link Local Scope, using multicast resolution (LLMNR) +// @li Global Scope, using unicast resolution (the traditional DNS) +*/ +typedef enum + { + // Node local hosts file Resolution + EDnsServerScope_HOSTFILE = 0, + // Globan Unicast Resolution + EDnsServerScope_UC_GLOBAL = -KIp6AddrScopeGlobal, + // Link Local Multicast Resolution + EDnsServerScope_MC_LOCAL = KIp6AddrScopeLinkLocal + } TDnsServerScope; + + +// Select a virtual sublist of currently known servers +class TDnsServerFilter + { +public: + inline TBool IsUnicast() const { return iServerScope < 0; } + inline TBool IsMulticast() const { return iServerScope > 0; } + TInt iServerId; //< Current default server (0 = first matching server) + TUint32 iLockId; //< Eligible severs must be from "locked" scope + TUint8 iLockType; //< Locked scope level [1,,16] + TDnsServerScope iServerScope:8; //< Server scope and type + }; + +class MDnsServerListNotify + { +public: + // Called when the requested server list has become known (if request was pending) + virtual void ServerListComplete(const TDnsServerFilter &aList, TInt aResult) = 0; + }; + +class MDnsServerManager + { +public: + /** + // @brief Virtual desctructor. + // + // The actual server manager object can be deleted by a delete of this mixin class. + */ + virtual ~MDnsServerManager() {} + /** + // @brief Informs that the system configuration has changed. + // This triggers the rescanning of the interfaces and + // availabla name server addresses. + */ + virtual void ConfigurationChanged() = 0; + /** + // @brief Open the server list (if not already open) + // @param aFilter the server filter + // @param aNotify the callback, which is used only if server list is not yet available + // @returns + // @li < 0, fatal error (notify callback is not installed) + // @li = 0, server list is available (notify callback is not installed) + // @li > 0, server list is not available, the notify callback will be called later + */ + virtual TInt OpenList(const TDnsServerFilter &aFilter, MDnsServerListNotify *aNotify) = 0; + /** + // @brief Count the number of servers matching the filter + // @param aFilter the server filter + // @returns the number of servers matching the filter + */ + virtual TInt Count(const TDnsServerFilter &aFilter) const = 0; + /** + // @brief Return id of the next matching server after the specified server + // @param aFilter the server filter + // @param aServerId id of the current server (if = 0, the first matching server is returned) + // @returns + // @li < 0, error [does not happen currently] + // @li = 0, there is no next server (server list is empty or only had the single server) + // @li > 0, is the id of the next server ( != aServerId) + */ + virtual TInt Next(const TDnsServerFilter &aFilter, TInt aServerId) const = 0; + /** + // @brief Request is not using the serverlist anymore + // @param aFilter the server filter (cancel notify callback for this) + */ + virtual void CloseList(const TDnsServerFilter &aFilter) = 0; + /** + // @brief Return the IP addres of the server + // @param aServerId identify the server + // @retval aAddr the server address corresponding to the server id, if return OK + // @returns + // @li KErrNone (OK), if a server with the specified ID exist and address returned + // @li KErrNotFound, if there is no server corresponding the specified id + */ + virtual TInt Address(TInt aServerId, TInetAddr &aAddr) const = 0; + /** + // @brief Assuming addr came from the server, return the matching scope id + // @param aServerId identify the server + // @param aAddr the address to examine + // @returns + // @li = 0, cannot find scope id for the address (probably no server matching the id) + // @li != 0, is the scope id for the address assuming it originated from the specified server + */ + virtual TUint32 Scope(TInt aServerId, const TInetAddr &aAddr) = 0; + /** + // @brief Search server id by server address + // @param aAddr a address of the server to be looked (must be KAfInet6) + // @returns the corresponding server id (> 0), if the list contained a + // matching server + */ + virtual TInt ServerId(const TInetAddr &aAddr) const = 0; + /** + // @brief Return the name space id matching the filter + // @param aFilter the server filter + // @param aServerId the specific server, if non-zero + // @returns + // @li = 0, cannot find the name space id + // @li != 0, is the name space id corresponding the filter + */ + virtual TUint32 NameSpace(const TDnsServerFilter &aFilter, TInt aServerId) const = 0; + /** + // @brief Rebuild interface and server lists + // @returns + // @li KErrNone, if list rebuilt successfully (list can be empty!) + // @li < 0, if there are some fatal socket errors + */ + virtual TInt BuildServerList() = 0; + /** + // @brief Add DNS server address for a interface + // + // The specified address will be included into the server list when the + // named interface is active. + // + // @param aInterface is the name of the interface + // @param aAddr DNS server address + // + */ + virtual void AddServerAddress(const TName &aInterface, const TInetAddr &aAddr) = 0; + /** + // @brief Lock filter scope by address + // @param aAddr the address + // @param aNetwork the network id + // @param aFilter the server filter to modify + */ + virtual void LockByAddress(const TInetAddr &aAddr, TUint32 aNid, TDnsServerFilter &aFilter) = 0; + }; + +class CDndEngine; +class DnsServerManager + { +public: + // Create a new server manager instance + static MDnsServerManager *NewL(CDndEngine &aControl); + }; + +#endif