Namespace System
Namespace Net

/*
	@brief  インターネットホストの情報を表すクラス
	@author OverTaker
	@date   2008/10/19
*/

Class IPHostEntry
Public
	/*
	@brief  ホストに関連付けられた端末の情報をリストで取得する
	@return IPEndPointクラスが格納されたリスト
	*/
	Abstract Function HostList() As System.Collections.Generic.List<IPEndPoint>

	/*
	@brief  ホストに関連付けられた端末の情報を1つだけ取得する
	@return ホストの情報を表すIPEndPointクラス
	*/
	Abstract Function Host() As IPEndPoint

	/*
	@brief  ホストに関連付けられたIPアドレスを取得する
	@return IPAddressクラスが格納されたリスト
	*/
	Abstract Function IPAddressList() As System.Collections.Generic.List<IPAddress>

	/*
	@brief  ホストに付けられている、他の名前を取得する
	@return 名前が格納されたリスト
	*/
	Abstract Function Aliases() As System.Collections.Generic.List<String>

	/*
	@brief  ホスト名を取得する
	@return ホスト名
	*/
	Abstract Function HostName() As String
End Class

Namespace Detail

/*
	@brief  IPHostEntryクラスのaddrinfoを使った実装
*/

Class IPHostEntryAddrinfo
	Inherits IPHostEntry
	infos As *addrinfo
Public
	Sub IPHostEntryAddrinfo(addrinfos As *addrinfo)
		infos = addrinfos
	End Sub

	Sub ~IPHostEntryAddrinfo()
		freeaddrinfo(infos As addrinfo)
	End Sub

	Override Function HostList() As System.Collections.Generic.List<IPEndPoint>
		Dim list As System.Collections.Generic.List<IPEndPoint>
		Dim info = infos As *addrinfo
		While info <> NULL
			list.Add( IPEndPoint.Create( New SocketAddress(info->ai_addr, info->ai_addrlen) ) )
			info = info->ai_next
		Wend
		Return list
	End Function

	Override Function Host() As IPEndPoint
			Return IPEndPoint.Create( New SocketAddress(infos->ai_addr, infos->ai_addrlen) )
	End Function

	Override Function IPAddressList() As System.Collections.Generic.List<IPAddress>
		Dim list As System.Collections.Generic.List<IPAddress>
		Dim info = infos As *addrinfo
		While info <> NULL
			list.Add( New IPAddress(info->ai_addr))
			info = info->ai_next
		Wend
		Return list
	End Function

	Override Function Aliases() As System.Collections.Generic.List<String>
		Dim list As System.Collections.Generic.List<String>
		Dim info = infos As *addrinfo
		Dim temp[ELM(NI_MAXHOST)] As TCHAR
		While info <> NULL
			If getnameinfo(info->ai_addr As sockaddr, info->ai_addrlen, temp, NI_MAXHOST, NULL, 0, 0) Then
				Throw New ActiveBasic.Windows.WindowsException(WSAGetLastError(), "IPHostEntry.Aliases: Failed to getnameinfo.")
			End If
			list.Add(New String(temp))
			info = info->ai_next
		Wend
		Return list
	End Function

	Override Function HostName() As String
		Dim temp[ELM(NI_MAXHOST)] As TCHAR
		If getnameinfo(infos->ai_addr As sockaddr, infos->ai_addrlen, temp, NI_MAXHOST, NULL, 0, 0) Then
			Throw New ActiveBasic.Windows.WindowsException(WSAGetLastError(), "IPHostEntry.HostName: Failed to getnameinfo.")
		End If
		Return New String(temp)
	End Function
End Class

End Namespace

End Namespace
End Namespace