2 // Author: Atsushi Enomoto <atsushi@ximian.com>
4 // Copyright (C) 2009,2010 Novell, Inc (http://www.novell.com)
6 // Permission is hereby granted, free of charge, to any person obtaining
7 // a copy of this software and associated documentation files (the
8 // "Software"), to deal in the Software without restriction, including
9 // without limitation the rights to use, copy, modify, merge, publish,
10 // distribute, sublicense, and/or sell copies of the Software, and to
11 // permit persons to whom the Software is furnished to do so, subject to
12 // the following conditions:
14 // The above copyright notice and this permission notice shall be
15 // included in all copies or substantial portions of the Software.
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 using System.Collections.Generic;
27 using System.Collections.ObjectModel;
28 using System.ComponentModel;
30 using System.ServiceModel;
31 using System.ServiceModel.Channels;
32 using System.ServiceModel.Description;
33 using System.ServiceModel.Dispatcher;
34 using System.Threading;
36 namespace System.ServiceModel.Discovery.VersionCD1
38 internal class DiscoveryTargetClientCD1 : DuplexClientBase<IDiscoveryTargetContractCD1>, DiscoveryClient.IDiscoveryCommon
40 public DiscoveryTargetClientCD1 (ServiceEndpoint endpoint)
41 : this (new DiscoveryTargetCallbackCD1 (), endpoint)
45 DiscoveryTargetClientCD1 (DiscoveryTargetCallbackCD1 instance, ServiceEndpoint endpoint)
46 : base (instance, endpoint)
48 instance.ReplyFindCompleted += delegate (MessageContractsCD1.FindResponse response) {
49 find_completed = delegate { return response; };
50 reply_find_handle.Set ();
52 instance.ReplyResolveCompleted += delegate (MessageContractsCD1.ResolveResponse response) {
53 resolve_completed = delegate { return response; };
54 reply_resolve_handle.Set ();
60 Func<FindCriteria,FindResponse> find_delegate;
61 Func<MessageContractsCD1.FindResponse> find_completed;
62 ManualResetEvent reply_find_handle = new ManualResetEvent (false);
64 public IAsyncResult BeginFind (FindCriteria criteria, AsyncCallback callback, object state)
66 if (find_delegate == null)
67 find_delegate = new Func<FindCriteria,FindResponse> (Find);
68 return find_delegate.BeginInvoke (criteria, callback, state);
71 public FindResponse EndFind (IAsyncResult result)
73 return find_delegate.EndInvoke (result);
76 FindResponse Find (FindCriteria criteria)
78 var req = new MessageContractsCD1.FindRequest () { Body = new FindCriteriaCD1 (criteria) };
79 Channel.BeginFind (req, delegate (IAsyncResult result) {
80 Channel.EndFind (result);
83 if (!reply_find_handle.WaitOne (InnerChannel.OperationTimeout))
84 throw new TimeoutException ();
86 var ir = find_completed ();
87 var ret = new FindResponse ();
88 foreach (var fr in ir.Body)
89 ret.Endpoints.Add (fr.ToEndpointDiscoveryMetadata ());
92 find_completed = null;
98 Func<ResolveCriteria,ResolveResponse> resolve_delegate;
99 Func<MessageContractsCD1.ResolveResponse> resolve_completed;
100 ManualResetEvent reply_resolve_handle = new ManualResetEvent (false);
102 public IAsyncResult BeginResolve (ResolveCriteria criteria, AsyncCallback callback, object state)
104 if (resolve_delegate == null)
105 resolve_delegate = new Func<ResolveCriteria,ResolveResponse> (Resolve);
106 return resolve_delegate.BeginInvoke (criteria, callback, state);
109 public ResolveResponse EndResolve (IAsyncResult result)
111 return resolve_delegate.EndInvoke (result);
114 public ResolveResponse Resolve (ResolveCriteria criteria)
116 var req = new MessageContractsCD1.ResolveRequest () { Body = new ResolveCriteriaCD1 (criteria) };
117 Channel.BeginResolve (req, delegate (IAsyncResult result) {
118 Channel.EndResolve (result);
121 if (!reply_resolve_handle.WaitOne (InnerChannel.OperationTimeout))
122 throw new TimeoutException ();
124 var ir = resolve_completed ();
125 var metadata = ir.Body.ToEndpointDiscoveryMetadata ();
126 var sequence = ir.MessageSequence.ToDiscoveryMessageSequence ();
127 return new ResolveResponse (metadata, sequence);
129 resolve_completed = null;
133 internal class DiscoveryTargetCallbackCD1 : IDiscoveryTargetCallbackContractCD1
135 public event Action<MessageContractsCD1.FindResponse> ReplyFindCompleted;
136 public event Action<MessageContractsCD1.ResolveResponse> ReplyResolveCompleted;
138 public void ReplyFind (MessageContractsCD1.FindResponse message)
140 if (ReplyFindCompleted != null)
141 ReplyFindCompleted (message);
144 public void ReplyResolve (MessageContractsCD1.ResolveResponse message)
146 if (ReplyResolveCompleted != null)
147 ReplyResolveCompleted (message);