2 // CategoriesDocument.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2009 Novell, Inc. http://www.novell.com
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
29 using System
.Collections
.Generic
;
30 using System
.Collections
.ObjectModel
;
32 using System
.ServiceModel
;
33 using System
.ServiceModel
.Channels
;
36 namespace System
.ServiceModel
.Syndication
38 public abstract class CategoriesDocument
40 public static InlineCategoriesDocument
Create (Collection
<SyndicationCategory
> categories
)
42 return new InlineCategoriesDocument (categories
);
45 public static ReferencedCategoriesDocument
Create (Uri linkToCategoriesDocument
)
47 return new ReferencedCategoriesDocument (linkToCategoriesDocument
);
50 public static InlineCategoriesDocument
Create (Collection
<SyndicationCategory
> categories
, bool isFixed
, string scheme
)
52 return new InlineCategoriesDocument (categories
, isFixed
, scheme
);
55 public static CategoriesDocument
Load (XmlReader reader
)
58 throw new ArgumentNullException ("reader");
60 var f
= new AtomPub10CategoriesDocumentFormatter ();
61 reader
.MoveToContent ();
63 CategoriesDocument doc
;
64 if (reader
.GetAttribute ("href") == null)
65 doc
= new InlineCategoriesDocument ();
67 doc
= new ReferencedCategoriesDocument ();
68 doc
.GetFormatter ().ReadFrom (reader
);
73 internal CategoriesDocument ()
77 CategoriesDocumentFormatter formatter
;
78 SyndicationExtensions extensions
= new SyndicationExtensions ();
80 public Dictionary
<XmlQualifiedName
, string> AttributeExtensions
{
81 get { return extensions.Attributes; }
84 public Uri BaseUri { get; set; }
86 public SyndicationElementExtensionCollection ElementExtensions
{
87 get { return extensions.Elements; }
90 public string Language { get; set; }
92 public CategoriesDocumentFormatter
GetFormatter ()
94 if (formatter
== null)
95 formatter
= new AtomPub10CategoriesDocumentFormatter (this);
99 public void Save (XmlWriter writer
)
101 GetFormatter ().WriteTo (writer
);
104 protected internal virtual bool TryParseAttribute (string name
, string ns
, string value, string version
)
106 var inline
= this as InlineCategoriesDocument
;
107 if (name
== "lang" && ns
== Namespaces
.Xml
)
109 else if (name
== "base" && ns
== Namespaces
.Xml
)
110 BaseUri
= new Uri (value, UriKind
.RelativeOrAbsolute
);
111 else if (name
== "href" && ns
== String
.Empty
&& this is ReferencedCategoriesDocument
)
112 ((ReferencedCategoriesDocument
) this).Link
= new Uri (value, UriKind
.RelativeOrAbsolute
);
113 else if (name
== "fixed" && ns
== String
.Empty
&& inline
!= null && value == "true")
114 inline
.IsFixed
= true;
115 else if (name
== "scheme" && ns
== String
.Empty
&& inline
!= null)
116 inline
.Scheme
= value;
122 protected internal virtual bool TryParseElement (XmlReader reader
, string version
)
125 throw new ArgumentNullException ("reader");
127 var f
= GetFormatter ();
128 if (!f
.CanRead (reader
))
134 protected internal virtual void WriteAttributeExtensions (XmlWriter writer
, string version
)
136 extensions
.WriteAttributeExtensions (writer
, version
);
139 protected internal virtual void WriteElementExtensions (XmlWriter writer
, string version
)
141 extensions
.WriteElementExtensions (writer
, version
);