2003-07-20 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System / System.Net / SocketAddress.cs
1 //
2 // System.Net.SocketAddress.cs
3 //
4 // Author:
5 //   Miguel de Icaza (miguel@ximian.com)
6 //   Dick Porter (dick@ximian.com)
7 //
8 // (C) Ximian, Inc.  http://www.ximian.com
9 //
10
11 using System.Net.Sockets;
12
13 namespace System.Net {
14
15         public class SocketAddress {
16                 private byte[] data;
17                 
18                 public SocketAddress (AddressFamily family, int size)
19                 {
20                         if(size<2) {
21                                 throw new ArgumentOutOfRangeException("size is too small");
22                         }
23                         
24                         data=new byte[size];
25                         data[0]=(byte)family;
26                         data[1]=(byte) ((int) family >> 8);
27                 }
28
29                 public SocketAddress (AddressFamily family)
30                         : this (family, 32)
31                 {
32                 }
33                 
34                 //LAMESPEC: the MS doc about this class is wrong. The size is not stored in byte 1. Instead
35                 // byte [0] and byte [1] hold the family (little endian).
36                 public AddressFamily Family {
37                         get {
38                                 return (AddressFamily) (data [0] + (data [1] << 8));
39                         }
40                 }
41
42                 public int Size {
43                         get {
44                                 return data.Length;
45                         }
46                 }
47
48                 public byte this [ int offset ] {
49                         get {
50                                 return(data[offset]);
51                         }
52
53                         set {
54                                 data[offset]=value;
55                         }
56                 }
57
58                 public override string ToString() {
59                         string af=((AddressFamily)data[0]).ToString();
60                         int size = data.Length;
61                         string ret=af+":"+size+":{";
62                         
63                         for(int i=2; i<size; i++) {
64                                 int val=(int)data[i];
65                                 ret=ret+val;
66                                 if(i<size-1) {
67                                         ret=ret+",";
68                                 }
69                         }
70                         
71                         ret=ret+"}";
72                         
73                         return(ret);
74                 }
75
76                 public override bool Equals (object obj)
77                 {
78                         if (obj is System.Net.SocketAddress &&
79                             ((System.Net.SocketAddress) obj).data.Length == data.Length){
80                                 byte [] otherData = ((System.Net.SocketAddress) obj).data;
81                                 for (int i = 0; i < data.Length; i++)
82                                         if (otherData [i] != data [i])
83                                                 return false;
84
85                                 return true;
86                         }
87
88                         return false;
89                 }
90
91                 public override int GetHashCode ()
92                 {
93                         int code = 0;
94
95                         for (int i = 0; i < data.Length; i++)
96                                 code += data [i] + i;
97
98                         return code;
99                 }
100         }
101 }