source: xmlrpcnet/trunk/fuentes/src/XmlRpcDocWriter.cs @ 379

Last change on this file since 379 was 379, checked in by hectorgh, 5 years ago

adding project files

File size: 16.0 KB
Line 
1/*
2XML-RPC.NET library
3Copyright (c) 2001-2006, Charles Cook <charlescook@cookcomputing.com>
4
5Permission is hereby granted, free of charge, to any person
6obtaining a copy of this software and associated documentation
7files (the "Software"), to deal in the Software without restriction,
8including without limitation the rights to use, copy, modify, merge,
9publish, distribute, sublicense, and/or sell copies of the Software,
10and to permit persons to whom the Software is furnished to do so,
11subject to the following conditions:
12
13The above copyright notice and this permission notice shall be
14included in all copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23DEALINGS IN THE SOFTWARE.
24*/
25
26namespace CookComputing.XmlRpc
27{
28  using System;
29  using System.Collections;
30  using System.IO;
31  using System.Reflection;
32  using System.Text.RegularExpressions;
33  using System.Web.UI;
34
35  public class XmlRpcDocWriter
36  {
37    public static void WriteDoc(HtmlTextWriter wrtr, Type type,
38      bool autoDocVersion)
39    {
40      XmlRpcServiceInfo svcInfo = XmlRpcServiceInfo.CreateServiceInfo(type);
41
42      wrtr.WriteFullBeginTag("html");
43      wrtr.WriteLine();
44      WriteHead(wrtr, svcInfo.Name);
45      wrtr.WriteLine();
46      WriteBody(wrtr, type, autoDocVersion);
47      wrtr.WriteEndTag("html");
48    }
49
50    public static void WriteHead(HtmlTextWriter wrtr, string title)
51    {
52      wrtr.WriteFullBeginTag("head");
53      wrtr.WriteLine();
54      WriteStyle(wrtr);
55      WriteTitle(wrtr, title);
56      wrtr.WriteEndTag("head");
57    }
58   
59    public static void WriteFooter(HtmlTextWriter wrtr, Type type,
60      bool autoDocVersion)
61    {
62      wrtr.WriteBeginTag("div");
63      wrtr.WriteAttribute("id", "content");
64      wrtr.Write(HtmlTextWriter.TagRightChar);
65      wrtr.WriteLine();
66
67      wrtr.WriteFullBeginTag("h2");
68      wrtr.Write("&nbsp;");
69      wrtr.WriteEndTag("h2");
70      wrtr.WriteLine();
71
72      if (autoDocVersion)
73      {
74        AssemblyName name1 = type.Assembly.GetName();
75        wrtr.Write("{0} {1}.{2}.{3}&nbsp;&nbsp;&nbsp;", name1.Name, 
76          name1.Version.Major, name1.Version.Minor, name1.Version.Build);
77
78        AssemblyName name2 = typeof(XmlRpcServerProtocol).Assembly.GetName();
79        wrtr.Write("{0} {1}.{2}.{3}&nbsp;&nbsp;&nbsp;", name2.Name, 
80          name2.Version.Major, name2.Version.Minor, name2.Version.Build);
81
82        wrtr.Write(".NET CLR {0}.{1}.{2}&nbsp;&nbsp;&nbsp;", 
83          Environment.Version.Major,Environment.Version.Minor, 
84          Environment.Version.Build);
85      }
86      wrtr.WriteEndTag("div");
87      wrtr.WriteLine();
88    }
89   
90    static void WriteStyle(HtmlTextWriter wrtr)
91    {
92      wrtr.WriteBeginTag("style");
93      wrtr.WriteAttribute("type", "text/css");
94      wrtr.Write(HtmlTextWriter.TagRightChar);
95      wrtr.WriteLine();
96
97      wrtr.WriteLine("BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; }");
98      wrtr.WriteLine("#content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; }");
99      wrtr.WriteLine("A:link { color: #336699; font-weight: bold; text-decoration: underline; }");
100      wrtr.WriteLine("A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; }");
101      wrtr.WriteLine("A:active { color: #336699; font-weight: bold; text-decoration: underline; }");
102      wrtr.WriteLine("A:hover { color: cc3300; font-weight: bold; text-decoration: underline; }");
103      wrtr.WriteLine("P { color: #000000; margin-top: 0px; margin-bottom: 12px; font-family: Verdana; }");
104      wrtr.WriteLine("pre { background-color: #e5e5cc; padding: 5px; font-family: Courier New; font-size: x-small; margin-top: -5px; border: 1px #f0f0e0 solid; }");
105      wrtr.WriteLine("td { color: #000000; font-family: Verdana; font-size: .7em; border: solid 1px;  }");
106      wrtr.WriteLine("h2 { font-size: 1.5em; font-weight: bold; margin-top: 25px; margin-bottom: 10px; border-top: 1px solid #003366; margin-left: -15px; color: #003366; }");
107      wrtr.WriteLine("h3 { font-size: 1.1em; color: #000000; margin-left: -15px; margin-top: 10px; margin-bottom: 10px; }");
108      wrtr.WriteLine("ul, ol { margin-top: 10px; margin-left: 20px; }");
109      wrtr.WriteLine("li { margin-top: 10px; color: #000000; }");
110      wrtr.WriteLine("font.value { color: darkblue; font: bold; }");
111      wrtr.WriteLine("font.key { color: darkgreen; font: bold; }");
112      wrtr.WriteLine(".heading1 { color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal; background-color: #003366; margin-top: 0px; margin-bottom: 0px; margin-left: -30px; padding-top: 10px; padding-bottom: 3px; padding-left: 15px; width: 105%; }");
113      wrtr.WriteLine(".intro { margin-left: -15px; }");
114      wrtr.WriteLine("table { border: solid 1px; }");
115
116      wrtr.WriteEndTag("style");
117      wrtr.WriteLine();
118    }
119
120    static void WriteTitle(
121      HtmlTextWriter wrtr, 
122      string title)
123    {
124      wrtr.WriteFullBeginTag("title");
125      wrtr.Write(title);
126      wrtr.WriteEndTag("title");
127      wrtr.WriteLine();
128    }
129
130    public static void WriteBody(HtmlTextWriter wrtr, Type type,
131      bool autoDocVersion)
132    {
133      wrtr.WriteFullBeginTag("body");
134      wrtr.WriteLine();
135
136      WriteType(wrtr, type);         
137      wrtr.WriteLine();
138     
139      WriteFooter(wrtr, type, autoDocVersion);
140
141      wrtr.WriteEndTag("div");
142      wrtr.WriteLine();
143      wrtr.WriteEndTag("body");
144      wrtr.WriteLine();
145    }
146
147    public static void WriteType(
148      HtmlTextWriter wrtr, 
149      Type type)
150    {
151      ArrayList structs = new ArrayList();
152     
153      wrtr.WriteBeginTag("div");
154      wrtr.WriteAttribute("id", "content");
155      wrtr.Write(HtmlTextWriter.TagRightChar);
156      wrtr.WriteLine();
157
158      XmlRpcServiceInfo svcInfo =
159        XmlRpcServiceInfo.CreateServiceInfo(type);
160
161      wrtr.WriteBeginTag("p");
162      wrtr.WriteAttribute("class", "heading1");
163      wrtr.Write(HtmlTextWriter.TagRightChar);
164      wrtr.Write(svcInfo.Name);
165      wrtr.WriteEndTag("p");
166      wrtr.WriteFullBeginTag("br");
167      wrtr.WriteEndTag("br");
168      wrtr.WriteLine();
169
170      if (svcInfo.Doc != "")
171      {
172        wrtr.WriteBeginTag("p");
173        wrtr.WriteAttribute("class", "intro");
174        wrtr.Write(HtmlTextWriter.TagRightChar);
175        wrtr.Write(svcInfo.Doc);
176        wrtr.WriteEndTag("p");
177        wrtr.WriteLine();
178      }
179      wrtr.WriteBeginTag("p");
180      wrtr.WriteAttribute("class", "intro");
181      wrtr.Write(HtmlTextWriter.TagRightChar);
182      wrtr.Write("The following methods are supported:");
183      wrtr.WriteEndTag("p");
184      wrtr.WriteLine();
185
186      wrtr.WriteFullBeginTag("ul");
187      wrtr.WriteLine();
188      foreach (XmlRpcMethodInfo mthdInfo in svcInfo.Methods)
189      {
190        if (!mthdInfo.IsHidden)
191        {
192          wrtr.WriteFullBeginTag("li");
193          wrtr.WriteBeginTag("a");
194          wrtr.WriteAttribute("href", "#"+mthdInfo.XmlRpcName);
195          wrtr.Write(HtmlTextWriter.TagRightChar);
196          wrtr.Write(mthdInfo.XmlRpcName);
197          wrtr.WriteEndTag("a");
198          wrtr.WriteEndTag("li");
199          wrtr.WriteLine();
200        }
201      }
202     
203      wrtr.WriteEndTag("ul");
204      wrtr.WriteLine();
205
206      foreach (XmlRpcMethodInfo mthdInfo in svcInfo.Methods)
207      {
208        if (mthdInfo.IsHidden == false)
209          WriteMethod(wrtr, mthdInfo, structs);
210      }
211
212      for(int j = 0; j < structs.Count; j++)
213      {
214        WriteStruct(wrtr, structs[j] as Type, structs);
215      }
216
217      wrtr.WriteEndTag("div");
218      wrtr.WriteLine();
219    }
220
221    static void WriteMethod(
222      HtmlTextWriter wrtr, 
223      XmlRpcMethodInfo mthdInfo,
224      ArrayList structs)
225    {
226      wrtr.WriteFullBeginTag("span");
227      wrtr.WriteLine();
228      wrtr.WriteFullBeginTag("h2");
229      wrtr.WriteBeginTag("a");
230      wrtr.WriteAttribute("name", "#"+mthdInfo.XmlRpcName);
231      wrtr.Write(HtmlTextWriter.TagRightChar);
232      wrtr.Write("method " + mthdInfo.XmlRpcName);
233      wrtr.WriteEndTag("a");
234      wrtr.WriteEndTag("h2");
235      wrtr.WriteLine();
236
237      if (mthdInfo.Doc != "")
238      {
239        wrtr.WriteBeginTag("p");
240        wrtr.WriteAttribute("class", "intro");
241        wrtr.Write(HtmlTextWriter.TagRightChar);
242        wrtr.Write(mthdInfo.Doc);
243        wrtr.WriteEndTag("p");
244        wrtr.WriteLine();
245      }
246     
247      wrtr.WriteFullBeginTag("h3");
248      wrtr.Write("Parameters");
249      wrtr.WriteEndTag("h3");
250      wrtr.WriteLine();
251
252      wrtr.WriteBeginTag("table");
253      wrtr.WriteAttribute("cellspacing", "0");
254      wrtr.WriteAttribute("cellpadding", "5");
255      wrtr.WriteAttribute("width", "90%");
256      wrtr.Write(HtmlTextWriter.TagRightChar);
257
258      if (mthdInfo.Parameters.Length > 0)
259      {
260        foreach (XmlRpcParameterInfo parInfo in mthdInfo.Parameters)
261        {
262          wrtr.WriteFullBeginTag("tr");
263          wrtr.WriteBeginTag("td");
264          wrtr.WriteAttribute("width", "33%");
265          wrtr.Write(HtmlTextWriter.TagRightChar);
266          WriteType(wrtr, parInfo.Type, parInfo.IsParams, structs);
267          wrtr.WriteEndTag("td");
268
269          wrtr.WriteFullBeginTag("td");
270          if (parInfo.Doc == "")
271            wrtr.Write(parInfo.Name);
272          else
273          {
274            wrtr.Write(parInfo.Name);
275            wrtr.Write(" - ");
276            wrtr.Write(parInfo.Doc);
277          }
278          wrtr.WriteEndTag("td");
279          wrtr.WriteEndTag("tr");
280        }
281      }
282      else
283      {
284        wrtr.WriteFullBeginTag("tr");
285        wrtr.WriteBeginTag("td");
286        wrtr.WriteAttribute("width", "33%");
287        wrtr.Write(HtmlTextWriter.TagRightChar);
288        wrtr.Write("none");
289        wrtr.WriteEndTag("td");
290        wrtr.WriteFullBeginTag("td");
291        wrtr.Write("&nbsp;");
292        wrtr.WriteEndTag("td");
293        wrtr.WriteEndTag("tr");
294      }
295      wrtr.WriteEndTag("table");
296      wrtr.WriteLine();
297      wrtr.WriteFullBeginTag("h3");
298      wrtr.Write("Return Value");
299      wrtr.WriteEndTag("h3");
300      wrtr.WriteLine();
301
302
303      wrtr.WriteBeginTag("table");
304      wrtr.WriteAttribute("cellspacing", "0");
305      wrtr.WriteAttribute("cellpadding", "5");
306      wrtr.WriteAttribute("width", "90%");
307      wrtr.Write(HtmlTextWriter.TagRightChar);
308
309      wrtr.WriteFullBeginTag("tr");
310
311      wrtr.WriteBeginTag("td");
312      wrtr.WriteAttribute("width", "33%");
313      wrtr.Write(HtmlTextWriter.TagRightChar);
314      WriteType(wrtr, mthdInfo.ReturnType, false, structs);
315      wrtr.WriteEndTag("td");
316
317      wrtr.WriteFullBeginTag("td");
318      if (mthdInfo.ReturnDoc != "")
319        wrtr.Write(mthdInfo.ReturnDoc);
320      else
321        wrtr.Write("&nbsp;");
322      wrtr.WriteEndTag("td");
323       
324      wrtr.WriteEndTag("tr");
325
326      wrtr.WriteEndTag("table");
327      wrtr.WriteLine();
328
329      wrtr.WriteEndTag("span");
330      wrtr.WriteLine();
331    }
332
333    static void WriteStruct(
334      HtmlTextWriter wrtr, 
335      Type structType,
336      ArrayList structs)
337    {
338      wrtr.WriteFullBeginTag("span");
339      wrtr.WriteLine();
340      wrtr.WriteFullBeginTag("h2");
341      wrtr.WriteBeginTag("a");
342      wrtr.WriteAttribute("name", "#"+structType.Name);
343      wrtr.Write(HtmlTextWriter.TagRightChar);
344      wrtr.Write("struct " + structType.Name);
345      wrtr.WriteEndTag("a");
346      wrtr.WriteEndTag("h2");
347      wrtr.WriteLine();
348   
349      wrtr.WriteFullBeginTag("h3");
350      wrtr.Write("Members");
351      wrtr.WriteEndTag("h3");
352      wrtr.WriteLine();   
353      wrtr.WriteEndTag("span");
354      wrtr.WriteLine(); 
355   
356      wrtr.WriteBeginTag("table");
357      wrtr.WriteAttribute("cellspacing", "0");
358      wrtr.WriteAttribute("cellpadding", "5");
359      wrtr.WriteAttribute("width", "90%");
360      wrtr.Write(HtmlTextWriter.TagRightChar);
361
362      MappingAction structAction = MappingAction.Error;
363      Attribute structAttr = Attribute.GetCustomAttribute(structType, 
364        typeof(XmlRpcMissingMappingAttribute));
365      if (structAttr != null && structAttr is XmlRpcMissingMappingAttribute)
366      {
367        structAction = (structAttr as XmlRpcMissingMappingAttribute).Action;
368      }
369
370      MemberInfo[] mis = structType.GetMembers();
371      foreach (MemberInfo mi in mis)
372      {
373        if (mi.MemberType == MemberTypes.Field)
374        {
375          FieldInfo fi = (FieldInfo)mi;
376       
377          wrtr.WriteFullBeginTag("tr");
378
379          wrtr.WriteBeginTag("td");
380          wrtr.WriteAttribute("width", "33%");
381          wrtr.Write(HtmlTextWriter.TagRightChar);
382          WriteType(wrtr, fi.FieldType, false, structs);
383          wrtr.WriteEndTag("td");
384
385          wrtr.WriteFullBeginTag("td");
386          MappingAction memberAction = structAction;
387          Attribute attr = Attribute.GetCustomAttribute(fi, 
388            typeof(XmlRpcMissingMappingAttribute));
389          if (attr != null && attr is XmlRpcMissingMappingAttribute)
390          {
391            memberAction = (attr as XmlRpcMissingMappingAttribute).Action;
392          }
393          string memberName = fi.Name + " ";
394          string desc = "";
395          Attribute mmbrAttr = Attribute.GetCustomAttribute(fi, 
396            typeof(XmlRpcMemberAttribute));
397          if (attr != null && mmbrAttr is XmlRpcMemberAttribute)
398          {
399            if ((mmbrAttr as XmlRpcMemberAttribute).Member != "")
400              memberName = (mmbrAttr as XmlRpcMemberAttribute).Member + " ";
401            desc = (mmbrAttr as XmlRpcMemberAttribute).Description;
402          }
403          if (memberAction == MappingAction.Ignore)
404            memberName += " (optional) ";
405          if (desc != "")
406            memberName = memberName + "- " + desc;
407          wrtr.Write(memberName);
408          wrtr.WriteEndTag("td");
409                 
410          wrtr.WriteEndTag("tr");
411        }
412      }
413      wrtr.WriteEndTag("table");
414      wrtr.WriteLine();
415   
416    }
417
418    static void WriteType(
419      HtmlTextWriter wrtr, 
420      Type type,
421      bool isparams,
422      ArrayList structs)
423    {
424      // TODO: following is hack for case when type is Object
425      string xmlRpcType;
426      if (!isparams)
427      {
428        if (type != typeof(Object))
429          xmlRpcType = XmlRpcServiceInfo.GetXmlRpcTypeString(type);
430        else
431          xmlRpcType = "any";
432      }
433      else
434        xmlRpcType = "varargs";
435      wrtr.Write(xmlRpcType);
436      if (xmlRpcType == "struct" && type != typeof(XmlRpcStruct))
437      {
438        if (!structs.Contains(type))
439          structs.Add(type);
440        wrtr.Write(" ");
441        wrtr.WriteBeginTag("a");
442        wrtr.WriteAttribute("href", "#"+type.Name);
443        wrtr.Write(HtmlTextWriter.TagRightChar);
444        wrtr.Write(type.Name);
445        wrtr.WriteEndTag("a");
446      }
447      else if (xmlRpcType == "array" || xmlRpcType == "varargs")
448      {
449        if (type.GetArrayRank() == 1)  // single dim array
450        {
451          wrtr.Write(" of ");
452          Type elemType = type.GetElementType();
453          string elemXmlRpcType;
454          if (elemType != typeof(Object))
455            elemXmlRpcType = XmlRpcServiceInfo.GetXmlRpcTypeString(elemType);
456          else
457            elemXmlRpcType = "any";
458          wrtr.Write(elemXmlRpcType);           
459          if (elemXmlRpcType == "struct" && elemType != typeof(XmlRpcStruct))
460          {
461            if (!structs.Contains(elemType))
462              structs.Add(elemType);
463            wrtr.Write(" ");
464            wrtr.WriteBeginTag("a");
465            wrtr.WriteAttribute("href", "#"+elemType.Name);
466            wrtr.Write(HtmlTextWriter.TagRightChar);
467            wrtr.Write(elemType.Name);
468            wrtr.WriteEndTag("a");
469          }
470        }
471      }
472    }
473  }
474}
Note: See TracBrowser for help on using the repository browser.