
/*!
	@brief  sockaddr構造体のラップ
	@author OverTaker
	@date   2008/10/08
*/



Namespace System
Namespace Net

Class SocketAddress
	item As *Byte
	itemSize As Long
Public

	/*!
	@brief  コンストラクタ。アドレスファミリを指定して初期化する。
	@param  アドレスファミリ
	*/
	Sub SocketAddress(family As Sockets.AddressFamily)
		Select Case family
			Case System.Net.Sockets.AddressFamily.InterNetwork
				init(family, SizeOf(sockaddr_in))
			Case System.Net.Sockets.AddressFamily.InterNetworkV6
				init(family, SizeOf(sockaddr_in6))
			Case Else
				init(family, SizeOf(sockaddr))
		End Select
	End Sub

	/*!
	@brief  コンストラクタ。アドレスファミリと大きさを指定して初期化する。
	@param  アドレスファミリ
	@param  大きさ
	*/
	Sub SocketAddress(family As Sockets.AddressFamily, size As Long)
		init(family, size)
	End Sub

	/*!
	@brief  コンストラクタ。sockaddrを指定して初期化する
	@param  sockaddr構造体
	@note   このコンストラクタはライブラリ内でのみ使用する目的で作られています。
	*/
	Sub SocketAddress(addr As *sockaddr, len As Long)
		itemSize = len
		item = malloc(itemSize)
		memcpy(item, addr, itemSize)
	End Sub

	/*!
	@brief  デストラクタ
	*/
	Sub ~SocketAddress()
		If item <> NULL Then free(item)
	End Sub

	/*!
	@brief  アドレスファミリを取得する
	@return アドレスファミリ
	*/
	Function AddressFamily() As Sockets.AddressFamily
		Return New Sockets.AddressFamily(Items->sa_family, "AddressFamily")
	End Function

	/*!
	@brief  sockaddrを取得する
	@return sockaddrを示すアドレス
	*/
	Function Items() As *sockaddr
		Return item As *sockaddr
	End Function

	/*!
	@brief  sockaddrの大きさを取得する
	@return sockaddrの大きさ
	*/
	Function Size() As Long
		Return itemSize
	End Function

	/*!
	@brief  等しいかどうかを取得する
	@retval True  等しい
	@retval False 等しくない
	*/
	Function Equals(address As SocketAddress) As Boolean
		If This.Size = address.Size Then
			Dim i As Long
			For i = 0 To ELM(Size)
				If This.item[i] <> address.item[i] Then Return False
			Next
			Return True
		Else
			Return False
		End If
	End Function

Private

	/*!
	@brief  初期化する
	@param  アドレスファミリ
	@param  確保するsockaddrの大きさ
	*/
	Sub init(family As DWord, size As Long)
		itemSize = size
		item = calloc( itemSize )
		Items->sa_family = family As Word
	End Sub
End Class

End Namespace
End Namespace