7b7f4a7125c75d52827c296bf780703c7b6870a7
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Discovery / DiscoveryReference.cs
1 // \r
2 // System.Web.Services.Discovery.DiscoveryReference.cs\r
3 //\r
4 // Author:\r
5 //   Dave Bettin (javabettin@yahoo.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Dave Bettin, 2002\r
9 //\r
10 \r
11 using System.IO;\r
12 using System.Xml.Serialization;\r
13 \r
14 namespace System.Web.Services.Discovery {\r
15         public abstract class DiscoveryReference {\r
16                 \r
17                 #region Fields\r
18 \r
19                 private string defaultFilename;\r
20                 private DiscoveryClientProtocol clientProtocol;\r
21 \r
22                 #endregion // Fields\r
23 \r
24                 #region Constructors\r
25 \r
26                 protected DiscoveryReference () \r
27                 {\r
28                 }\r
29                 \r
30                 #endregion // Constructors\r
31 \r
32                 #region Properties\r
33 \r
34                 [XmlIgnore]\r
35                 public DiscoveryClientProtocol ClientProtocol {\r
36                         get { return clientProtocol; }                  \r
37                         set { clientProtocol = value; }\r
38                         \r
39                 }\r
40                 \r
41                 public virtual string DefaultFilename {\r
42                         get { return FilenameFromUrl (Url); }                   \r
43                 }\r
44                 \r
45                 [XmlIgnore]\r
46                 public abstract string Url {\r
47                         get;            \r
48                         set;\r
49                 }\r
50                 \r
51                 #endregion // Properties\r
52 \r
53                 #region Methods\r
54 \r
55                 protected static string FilenameFromUrl (string url)\r
56                 {\r
57                         int i = url.LastIndexOf ("/");\r
58                         if (i != -1) url = url.Substring (i+1);\r
59                         \r
60                         i = url.IndexOfAny (new char[] {'.','?','\\'});\r
61                         if (i != -1) url = url.Substring (0,i);\r
62                         \r
63                         System.Text.StringBuilder sb = new System.Text.StringBuilder ();\r
64                         for (int n=0; n<url.Length; n++)\r
65                                 if (Char.IsLetterOrDigit (url[n]) || url[n] == '_') sb.Append (url[n]);\r
66                                 \r
67                         return sb.ToString ();\r
68                 }\r
69                 \r
70                 public abstract object ReadDocument (Stream stream);\r
71                 \r
72                 public void Resolve () \r
73                 {\r
74                         if (clientProtocol == null) \r
75                                 throw new InvalidOperationException ("The ClientProtocol property is a null reference");\r
76                         \r
77                         if (clientProtocol.Documents.Contains (Url))    // Already resolved\r
78                                 return;\r
79                         \r
80                         string contentType = null;\r
81                         string url = Url;\r
82                         Stream stream = clientProtocol.Download (ref url, ref contentType);\r
83                         Resolve (contentType, stream);\r
84                 }\r
85                 \r
86                 protected internal abstract void Resolve (string contentType, Stream stream);\r
87                 \r
88                 public abstract void WriteDocument (object document, Stream stream);            \r
89 \r
90                 #endregion // Methods\r
91         }\r
92 }