NetworkAddressResolver.h revision f972422c
1/*
2 * Copyright 2010, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _NETWORK_ADDRESS_RESOLVER_H
6#define _NETWORK_ADDRESS_RESOLVER_H
7
8
9#include <ObjectList.h>
10#include <Referenceable.h>
11#include <String.h>
12#include <SupportDefs.h>
13
14
15class BNetworkAddress;
16struct addrinfo;
17
18
19// flags for name resolution
20enum {
21	B_NO_ADDRESS_RESOLUTION			= 0x0001,
22	B_UNCONFIGURED_ADDRESS_FAMILIES	= 0x0002,
23};
24
25
26class BNetworkAddressResolver: public BReferenceable {
27public:
28								BNetworkAddressResolver();
29								BNetworkAddressResolver(const char* address,
30									uint16 port = 0, uint32 flags = 0);
31								BNetworkAddressResolver(const char* address,
32									const char* service, uint32 flags = 0);
33								BNetworkAddressResolver(int family,
34									const char* address, uint16 port = 0,
35									uint32 flags = 0);
36								BNetworkAddressResolver(int family,
37									const char* address, const char* service,
38									uint32 flags = 0);
39								~BNetworkAddressResolver();
40
41			status_t			InitCheck() const;
42
43			void				Unset();
44
45			status_t			SetTo(const char* address, uint16 port = 0,
46									uint32 flags = 0);
47			status_t			SetTo(const char* address, const char* service,
48									uint32 flags = 0);
49			status_t			SetTo(int family, const char* address,
50									uint16 port = 0, uint32 flags = 0);
51			status_t			SetTo(int family, const char* address,
52									const char* service, uint32 flags = 0);
53
54			status_t			GetNextAddress(uint32* cookie,
55									BNetworkAddress& address) const;
56			status_t			GetNextAddress(int family, uint32* cookie,
57									BNetworkAddress& address) const;
58
59	// TODO all the ::Resolve variants are needed. Maybe the SetTo and
60	// constructors could be removed as ::Resolve is the right way to get a
61	// resolver (using the cache).
62	static	BReference<const BNetworkAddressResolver> Resolve(
63									const char* address, const char* service,
64									uint32 flags = 0);
65	static	BReference<const BNetworkAddressResolver> Resolve(
66									const char* address, uint16 port = 0,
67									uint32 flags = 0);
68	static	BReference<const BNetworkAddressResolver> Resolve(int family,
69									const char* address, const char* service,
70									uint32 flags = 0);
71	static	BReference<const BNetworkAddressResolver> Resolve(int family,
72									const char* address, uint16 port = 0,
73									uint32 flags = 0);
74
75private:
76			addrinfo*			fInfo;
77			status_t			fStatus;
78
79
80	struct CacheEntry {
81		CacheEntry(int family, const char* address, const char* service,
82			uint32 flags, BNetworkAddressResolver* resolver)
83			:
84			fFamily(family),
85			fAddress(address),
86			fService(service),
87			fFlags(flags),
88			fResolver(resolver, false)
89		{
90		}
91
92		bool Matches(int family, BString address, BString service, uint32 flags)
93		{
94			return family == fFamily && flags == fFlags && address == fAddress
95				&& service == fService;
96		}
97
98		int fFamily;
99		BString fAddress;
100		BString fService;
101		uint32 fFlags;
102
103		BReference<const BNetworkAddressResolver> fResolver;
104	};
105
106	static	BObjectList<CacheEntry> sCacheMap;
107};
108
109
110#endif	// _NETWORK_ADDRESS_RESOLVER_H
111