2009-05-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel / PeerNode.cs
1 //
2 // PeerNode.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2005,2009 Novell, Inc.  http://www.novell.com
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 using System;
29 using System.Collections.Generic;
30 using System.Collections.ObjectModel;
31 using System.ServiceModel.Channels;
32
33 namespace System.ServiceModel
34 {
35         public abstract class PeerNode : IOnlineStatus
36         {
37                 internal PeerNode (string meshId, int port)
38                 {
39                         MeshId = meshId;
40                         Port = port;
41                 }
42
43                 public event EventHandler Offline;
44                 public event EventHandler Online;
45
46                 public bool IsOnline { get; internal set; }
47
48                 internal string MeshId { get; private set; }
49
50                 internal int NodeId { get; set; }
51
52                 internal abstract bool IsOpen { get; }
53
54                 public int Port { get; private set; }
55
56                 public abstract PeerMessagePropagationFilter MessagePropagationFilter { get; set; }
57
58                 internal abstract void Open (TimeSpan timeout);
59
60                 public void RefreshConnection ()
61                 {
62                 }
63
64                 public override string ToString ()
65                 {
66                         return String.Format ("MeshId: {0}, Node ID: {1}, Online: {2}, Opened:{3}, Port: {4}", MeshId, NodeId, IsOnline, IsOpen, Port);
67                 }
68
69                 internal void SetOnline ()
70                 {
71                         IsOnline = true;
72                         if (Online != null)
73                                 Online (this, EventArgs.Empty);
74                 }
75
76                 internal void SetOffline ()
77                 {
78                         IsOnline = false;
79                         if (Offline != null)
80                                 Offline (this, EventArgs.Empty);
81                 }
82         }
83
84         internal class PeerNodeImpl : PeerNode
85         {
86                 internal PeerNodeImpl (PeerResolver resolver, string meshId, int port)
87                         : base (meshId, port)
88                 {
89                         this.resolver = resolver;
90                 }
91
92                 PeerResolver resolver;
93                 object registered_id;
94
95                 // FIXME: implement
96                 public override PeerMessagePropagationFilter MessagePropagationFilter { get; set; }
97
98                 internal override bool IsOpen {
99                         get { return registered_id != null; }
100                 }
101
102                 internal override void Open (TimeSpan timeout)
103                 {
104                         DateTime startTime = DateTime.Now;
105
106                         int maxAddresses = 3; // FIXME: get it from somewhere
107
108                         // FIXME: not sure how I should handle addresses
109                         int idx = 0;
110                         foreach (var addr in resolver.Resolve (MeshId, maxAddresses, timeout)) {
111                                 idx++;
112                                 registered_id = resolver.Register (MeshId, addr, timeout - (DateTime.Now - startTime));
113                                 NodeId = idx;
114                                 SetOnline ();
115                                 break;
116                         }
117                 }
118         }
119 }