From 1dad4987624528d75b84fd640e4b924bce2e52c4 Mon Sep 17 00:00:00 2001 From: atsushi Date: Tue, 21 Apr 2009 12:01:26 +0000 Subject: [PATCH] 2009-04-21 Atsushi Enomoto * PeerNode.cs : update API to the latest .NET amd implement some. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mcs@132248 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- .../System.ServiceModel/ChangeLog | 4 ++ .../System.ServiceModel/PeerNode.cs | 84 +++++++++++++++++++--- 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/class/System.ServiceModel/System.ServiceModel/ChangeLog b/class/System.ServiceModel/System.ServiceModel/ChangeLog index 1adef3e053..ecc03635ca 100755 --- a/class/System.ServiceModel/System.ServiceModel/ChangeLog +++ b/class/System.ServiceModel/System.ServiceModel/ChangeLog @@ -1,5 +1,9 @@ 2009-04-21 Atsushi Enomoto + * PeerNode.cs : update API to the latest .NET amd implement some. + +2009-04-21 Atsushi Enomoto + * PeerResolver.cs, PeerResolverImpl.cs : update API to the latest .NET. diff --git a/class/System.ServiceModel/System.ServiceModel/PeerNode.cs b/class/System.ServiceModel/System.ServiceModel/PeerNode.cs index f90b63e719..cf3adea927 100644 --- a/class/System.ServiceModel/System.ServiceModel/PeerNode.cs +++ b/class/System.ServiceModel/System.ServiceModel/PeerNode.cs @@ -4,7 +4,7 @@ // Author: // Atsushi Enomoto // -// Copyright (C) 2005 Novell, Inc. http://www.novell.com +// Copyright (C) 2005,2009 Novell, Inc. http://www.novell.com // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -32,25 +32,89 @@ using System.ServiceModel.Channels; namespace System.ServiceModel { - public abstract class PeerNode + public abstract class PeerNode : IOnlineStatus { - protected PeerNode () + internal PeerNode (string meshId, int port) { + MeshId = meshId; + Port = port; } - public abstract event EventHandler Offline; - public abstract event EventHandler Online; + public event EventHandler Offline; + public event EventHandler Online; - public abstract bool IsOnline { get; } + public bool IsOnline { get; internal set; } - public abstract bool IsOpen { get; } + internal string MeshId { get; private set; } + + internal int NodeId { get; set; } + + internal abstract bool IsOpen { get; } + + public int Port { get; private set; } public abstract PeerMessagePropagationFilter MessagePropagationFilter { get; set; } - [MonoTODO] - public static PeerNode Get (Uri listenUri) + internal abstract void Open (TimeSpan timeout); + + public void RefreshConnection () + { + } + + public override string ToString () { - throw new NotImplementedException (); + return String.Format ("MeshId: {0}, Node ID: {1}, Online: {2}, Opened:{3}, Port: {4}", MeshId, NodeId, IsOnline, IsOpen, Port); + } + + internal void SetOnline () + { + IsOnline = true; + if (Online != null) + Online (this, EventArgs.Empty); + } + + internal void SetOffline () + { + IsOnline = false; + if (Offline != null) + Offline (this, EventArgs.Empty); + } + } + + internal class PeerNodeImpl : PeerNode + { + internal PeerNodeImpl (PeerResolver resolver, string meshId, int port) + : base (meshId, port) + { + this.resolver = resolver; + } + + PeerResolver resolver; + ICollection addresses; + object registered_id; + + // FIXME: implement + public override PeerMessagePropagationFilter MessagePropagationFilter { get; set; } + + internal override bool IsOpen { + get { return registered_id != null; } + } + + internal override void Open (TimeSpan timeout) + { + DateTime startTime = DateTime.Now; + + int maxAddresses = 3; // FIXME: get it from somewhere + + // FIXME: not sure how I should handle addresses + int idx = 0; + foreach (var addr in resolver.Resolve (MeshId, maxAddresses, timeout)) { + idx++; + registered_id = resolver.Register (MeshId, addr, timeout - (DateTime.Now - startTime)); + NodeId = idx; + SetOnline (); + break; + } } } } -- 2.11.4.GIT