/* Web Polygraph       http://www.web-polygraph.org/
 * (C) 2003-2006 The Measurement Factory
 * Licensed under the Apache License, Version 2.0 */

#ifndef POLYGRAPH__RUNTIME_HOSTMAP_H
#define POLYGRAPH__RUNTIME_HOSTMAP_H

#include "xstd/Array.h"
#include "xstd/NetAddr.h"

class ContentSel;
class ServerRep;
class SslWrap;
class PubWorld;
class HttpCookies;

// Host configuration record
class HostCfg {
	public:
		HostCfg(const NetAddr &anAddr);

	public:
		NetAddr theAddr;
		ContentSel *theContent;    // can be shared among HostCfgs
		const SslWrap *theSslWrap; // can be shared among HostCfgs
		ServerRep *theServerRep;
		PubWorld *thePubWorld;     // for visible servers only
		HttpCookies *theCookies;
};

// a NetAddr <-> Host configuration map
// add-only operation
class HostMap {
	public:
		HostMap(int aCapacity); // cap may be adjusted a bit
		~HostMap();

		int capacity() const { return theIndex.capacity(); }
		int hostCount() const { return theCount; }
		int iterationCount() const { return theIndex.count(); }

		HostCfg *at(int idx); // idx may be out of bounds
		HostCfg *at(const NetAddr &addr);

		ServerRep *serverRepAt(int idx);
		const SslWrap *findSslWrap(const NetAddr &addr) const;
		PubWorld *findPubWorld(const NetAddr &addr);
		PubWorld *findPubWorldAt(int idx);

		HostCfg *find(const NetAddr &addr);
		HostCfg *find(const NetAddr &addr, int &idx);
		bool findIdx(const NetAddr &addr, int &idx) const;
		HostCfg *addAt(int idx, const NetAddr &addr);

	protected:
		bool endSearch(const NetAddr &addr, int idx, bool &res) const;
		int hash0(const NetAddr &addr) const;
		int hash1(const NetAddr &addr) const;

	protected:
		Array<HostCfg*> theIndex;
		int theCount;  // entries in the hash
};

extern HostMap *TheHostMap; // move to globals?

#endif


syntax highlighted by Code2HTML, v. 0.9.1