Merge pull request #757 from mlintner/master
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Dispatcher / MexInstanceContextProvider.cs
1 //
2 // MexInstanceContextProvider.cs
3 //
4 // Author:
5 //      Ankit Jain <jankit@novell.com>
6 //
7 // Copyright (C) 2006 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.ServiceModel.Description;
30 using System.ServiceModel.Channels;
31 using System.Xml;
32 using System.IO;
33
34 namespace System.ServiceModel.Dispatcher
35 {
36         internal class MexInstanceContextProvider : IInstanceContextProvider
37         {
38                 InstanceContext ctx;
39
40                 public MexInstanceContextProvider (ServiceHostBase service_host)
41                 {
42                         foreach (IServiceBehavior beh in service_host.Description.Behaviors) {
43                                 ServiceMetadataBehavior mex_beh = beh as ServiceMetadataBehavior;
44                                 if (mex_beh == null)
45                                         continue;
46
47                                 MetadataExchange mex_instance = new MetadataExchange (mex_beh);
48                                 ctx = new InstanceContext (mex_instance);
49                                 break;
50                         }
51                         //if (ctx == null)
52                 }
53                 
54                 public InstanceContext GetExistingInstanceContext (Message message, IContextChannel channel)
55                 {
56                         if (message.Headers.Action != "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get")
57                                 return null;
58
59                         return ctx;
60                 }
61
62                 public void InitializeInstanceContext (InstanceContext instanceContext, Message message, IContextChannel channel)
63                 {
64                 }
65
66                 public bool IsIdle (InstanceContext instanceContext)
67                 {
68                         throw new NotImplementedException ();
69                 }
70
71                 public void NotifyIdle (InstanceContextIdleCallback callback, InstanceContext instanceContext)
72                 {
73                         throw new NotImplementedException ();
74                 }
75         }
76         
77         class MetadataExchange : IMetadataExchange
78         {
79                 ServiceMetadataBehavior beh;
80                 
81                 public MetadataExchange (ServiceMetadataBehavior beh)
82                 {
83                         this.beh = beh;
84                 }
85
86                 public Message Get (Message request)
87                 {
88                         UniqueId id = request.Headers.MessageId;
89
90                         MemoryStream ms = new MemoryStream ();
91                         XmlWriterSettings xws = new XmlWriterSettings ();
92                         xws.OmitXmlDeclaration = true;
93                         
94                         using (XmlWriter xw = XmlWriter.Create (ms, xws))
95                                 beh.MetadataExporter.GetGeneratedMetadata ().WriteTo (xw);
96
97                         ms.Seek (0, SeekOrigin.Begin);
98                         XmlReader xr = XmlReader.Create (ms);
99
100                         Message ret = Message.CreateMessage (request.Version,
101                                 "http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse",
102                                 xr);
103                         ret.Headers.RelatesTo = id;
104
105                         return ret;
106                 }
107
108                 public IAsyncResult BeginGet (Message request, AsyncCallback cb, object state)
109                 {
110                         throw new NotImplementedException ();
111                 }
112
113                 public Message EndGet (IAsyncResult result)
114                 {
115                         throw new NotImplementedException ();
116                 }
117         }
118 }