tcpiputils/dnd/inc/servers.h
changeset 0 af10295192d8
child 20 7e41d162e158
--- /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 <in_sock.h>
+
+/**
+// @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