Merge pull request #1508 from slluis/fix-20966
[mono.git] / mcs / class / WindowsBase / System.IO.Packaging / PackagePropertiesPart.cs
1 // PackagePropertiesPart.cs created with MonoDevelop
2 // User: alan at 11:07 04/11/2008
3 //
4 // To change standard headers go to Edit->Preferences->Coding->Standard Headers
5 //
6
7 using System;
8 using System.Xml;
9
10 namespace System.IO.Packaging
11 {
12         class PackagePropertiesPart : PackageProperties
13         {
14                 const string NSDc = "http://purl.org/dc/elements/1.1/";
15                 const string NSDcTerms = "http://purl.org/dc/terms/";
16                 const string NSXsi = "http://www.w3.org/2001/XMLSchema-instance";
17                 
18                 string category;
19                 string contentStatus;
20                 string contentType;
21                 DateTime? created;
22                 string creator;
23                 string description;
24                 string identifier;
25                 string keywords;
26                 string language;
27                 string lastModifiedBy;
28                 DateTime? lastPrinted;
29                 DateTime? modified;
30                 string revision;
31                 string subject;
32                 string title;
33                 string version;
34
35                 public PackagePropertiesPart ()
36                 {
37                         
38                 }
39
40                 public override string Category {
41                         get {
42                                 return category;
43                         }
44                         set {
45                                 Package.CheckIsReadOnly ();
46                                 category = value;
47                         }
48                 }
49                 public override string ContentStatus {
50                         get {
51                                 return contentStatus;
52                         }
53                         set {
54                                 Package.CheckIsReadOnly ();
55                                 contentStatus = value;
56                         }
57                 }
58                 public override string ContentType {
59                         get {
60                                 return contentType;
61                         }
62                         set {
63                                 Package.CheckIsReadOnly ();
64                                 contentType = value;
65                         }
66                 }
67                 public override DateTime? Created {
68                         get {
69                                 return created;
70                         }
71                         set {
72                                 Package.CheckIsReadOnly ();
73                                 created = value;
74                         }
75                 }
76                 public override string Creator {
77                         get {
78                                 return creator;
79                         }
80                         set {
81                                 Package.CheckIsReadOnly ();
82                                 creator = value;
83                         }
84                 }
85                 public override string Description {
86                         get {
87                                 return description;
88                         }
89                         set {
90                                 Package.CheckIsReadOnly ();
91                                 description = value;
92                         }
93                 }
94                 public override string Identifier {
95                         get {
96                                 return identifier;
97                         }
98                         set {
99                                 Package.CheckIsReadOnly ();
100                                 identifier = value;
101                         }
102                 }
103                 public override string Keywords {
104                         get {
105                                 return keywords;
106                         }
107                         set {
108                                 Package.CheckIsReadOnly ();
109                                 keywords = value;
110                         }
111                 }
112                 public override string Language {
113                         get {
114                                 return language;
115                         }
116                         set {
117                                 Package.CheckIsReadOnly ();
118                                 language = value;
119                         }
120                 }
121                 public override string LastModifiedBy {
122                         get {
123                                 return lastModifiedBy;
124                         }
125                         set {
126                                 Package.CheckIsReadOnly ();
127                                 lastModifiedBy = value;
128                         }
129                 }
130                 public override DateTime? LastPrinted {
131                         get {
132                                 return lastPrinted;
133                         }
134                         set {
135                                 Package.CheckIsReadOnly ();
136                                 lastPrinted = value;
137                         }
138                 }
139                 public override DateTime? Modified {
140                         get {
141                                 return modified;
142                         }
143                         set {
144                                 Package.CheckIsReadOnly ();
145                                 modified = value;
146                         }
147                 }
148                 public override string Revision {
149                         get {
150                                 return revision;
151                         }
152                         set {
153                                 Package.CheckIsReadOnly ();
154                                 revision = value;
155                         }
156                 }
157                 public override string Subject {
158                         get {
159                                 return subject;
160                         }
161                         set {
162                                 Package.CheckIsReadOnly ();
163                                 subject = value;
164                         }
165                 }
166                 public override string Title {
167                         get {
168                                 return title;
169                         }
170                         set {
171                                 Package.CheckIsReadOnly ();
172                                 title = value;
173                         }
174                 }
175                 public override string Version {
176                         get {
177                                 return version;
178                         }
179                         set {
180                                 Package.CheckIsReadOnly ();
181                                 version = value;
182                         }
183                 }
184                 
185                 internal override void LoadFrom (Stream stream)
186                 {
187                         if (stream.Length == 0)
188                                 return;
189                         
190                         XmlDocument doc = new XmlDocument ();
191                         doc.Load (stream);
192                         
193                         XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);
194                         manager.AddNamespace ("prop", NSPackageProperties);
195                         manager.AddNamespace ("dc", NSDc);
196                         manager.AddNamespace ("dcterms", NSDcTerms);
197                         manager.AddNamespace ("xsi", NSXsi);
198
199                         XmlNode node;
200                         if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:category", manager)) != null)
201                                 category = node.InnerXml;
202             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:contentStatus", manager)) != null)
203                                 contentStatus = node.InnerXml;
204             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:contentType", manager)) != null)
205                                 contentType = node.InnerXml;
206                         if ((node = doc.SelectSingleNode ("prop:coreProperties/dcterms:created", manager)) != null)
207                                 created = DateTime.Parse (node.InnerXml);
208             if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:creator", manager)) != null)
209                                 creator = node.InnerXml;
210             if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:description", manager)) != null)
211                                 description = node.InnerXml;
212                         if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:identifier", manager)) != null)
213                                 identifier = node.InnerXml;
214             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:keywords", manager)) != null)
215                                 keywords = node.InnerXml;
216             if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:language", manager)) != null)
217                                 language = node.InnerXml;
218             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:lastModifiedBy", manager)) != null)
219                                 lastModifiedBy = node.InnerXml;
220             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:lastPrinted", manager)) != null)
221                                 lastPrinted = DateTime.Parse (node.InnerXml);
222             if ((node = doc.SelectSingleNode ("prop:coreProperties/dcterms:modified", manager)) != null)
223                                 modified = DateTime.Parse (node.InnerXml);
224             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:revision", manager)) != null)
225                                 revision = node.InnerXml;
226             if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:subject", manager)) != null)
227                                 subject = node.InnerXml;
228             if ((node = doc.SelectSingleNode ("prop:coreProperties/dc:title", manager)) != null)
229                                 title = node.InnerXml;
230             if ((node = doc.SelectSingleNode ("prop:coreProperties/prop:version", manager)) != null)
231                                 version = node.InnerXml;
232                 }
233
234                 internal override void WriteTo(XmlTextWriter writer)
235                 {
236                         XmlDocument doc = new XmlDocument ();
237                         XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);
238                         manager.AddNamespace ("prop", NSPackageProperties);
239                         manager.AddNamespace ("dc", NSDc);
240                         manager.AddNamespace ("dcterms", NSDcTerms);
241                         manager.AddNamespace ("xsi", NSXsi);
242                         
243                         // Create XML declaration
244                         doc.AppendChild (doc.CreateXmlDeclaration ("1.0", "UTF-8", null));
245
246                         // Create root node with required namespace declarations
247                         XmlNode coreProperties = doc.AppendChild (doc.CreateNode (XmlNodeType.Element, "coreProperties", NSPackageProperties));
248                         coreProperties.Attributes.Append (doc.CreateAttribute ("xmlns:dc")).Value = NSDc;
249                         coreProperties.Attributes.Append (doc.CreateAttribute ("xmlns:dcterms")).Value = NSDcTerms;
250                         coreProperties.Attributes.Append (doc.CreateAttribute ("xmlns:xsi")).Value = NSXsi;
251
252                         // Create the children
253                         if (Category != null)
254                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "category", NSPackageProperties)).InnerXml = Category;
255                         if (ContentStatus != null)
256                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "contentStatus", NSPackageProperties)).InnerXml = ContentStatus;
257                         if (ContentType != null)
258                         coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "contentType", NSPackageProperties)).InnerXml = ContentType;
259                         if (Created.HasValue)
260                         {
261                                 XmlAttribute att = doc.CreateAttribute ("xsi", "type", NSXsi);
262                                 att.Value = "dcterms:W3CDTF";
263                                 
264                                 XmlNode created = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dcterms", "created", NSDcTerms));
265                                 created.Attributes.Append (att);
266                                 created.InnerXml = Created.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z";
267                         }
268                         if (Creator != null)
269                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "creator", NSDc)).InnerXml = Creator;
270                         if (Description != null)
271                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "description", NSDc)).InnerXml = Description;
272                         if (Identifier != null)
273                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "identifier", NSDc)).InnerXml = Identifier;
274                         if (Keywords != null)
275                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "keywords", NSPackageProperties)).InnerXml = Keywords;
276                         if (Language != null)
277                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "language", NSDc)).InnerXml = Language;
278                         if (LastModifiedBy != null)
279                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "lastModifiedBy", NSPackageProperties)).InnerXml = LastModifiedBy;
280                         if (LastPrinted.HasValue)
281                         {
282                                 XmlNode lastPrinted = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "lastPrinted", NSPackageProperties));
283
284                                 lastPrinted.InnerXml = LastPrinted.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z"; 
285                         }
286                         if (Revision != null)
287                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "revision", NSPackageProperties)).InnerXml = Revision;
288                         if (Subject != null)
289                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "subject", NSDc)).InnerXml = Subject;
290                         if (Title != null)
291                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "title", NSDc)).InnerXml = Title;
292                         if (Version != null)
293                                 coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "version", NSPackageProperties)).InnerXml = Version;
294
295                         if (Modified.HasValue)
296                         {
297                                 XmlAttribute att = doc.CreateAttribute("xsi", "type", NSXsi);
298                                 att.Value = "dcterms:W3CDTF";
299                                 
300                                 XmlNode modified = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dcterms", "modified", NSDcTerms));
301                                 modified.Attributes.Append (att);
302                                 modified.InnerXml = Modified.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z";
303                         }
304                         
305                         doc.WriteContentTo (writer);
306                 }
307         }
308 }