2 // DataObject.cs - DataObject implementation for XML Signature
3 // http://www.w3.org/2000/09/xmldsig#Object
6 // Sebastien Pouliot (spouliot@motus.com)
8 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
13 namespace System.Security.Cryptography.Xml {
15 // XmlElement part of the signature
16 // Note: Looks like KeyInfoNode (but the later is XmlElement inside KeyInfo)
17 // required for "enveloping signatures"
18 public class DataObject {
21 private string mimeType;
22 private string encoding;
23 private XmlDocument document;
27 Build (null, null, null, null);
30 public DataObject (string id, string mimeType, string encoding, XmlElement data)
33 throw new ArgumentNullException ("data");
35 Build (id, mimeType, encoding, data);
38 // this one accept a null "data" parameter
39 private void Build (string id, string mimeType, string encoding, XmlElement data)
41 document = new XmlDocument ();
42 XmlElement xel = document.CreateElement (XmlSignature.ElementNames.Object, XmlSignature.NamespaceURI);
45 xel.SetAttribute (XmlSignature.AttributeNames.Id, id);
47 if (mimeType != null) {
48 this.mimeType = mimeType;
49 xel.SetAttribute (XmlSignature.AttributeNames.MimeType, mimeType);
51 if (encoding != null) {
52 this.encoding = encoding;
53 xel.SetAttribute (XmlSignature.AttributeNames.Encoding, encoding);
56 XmlNode newNode = document.ImportNode (data, true);
57 xel.AppendChild (newNode);
59 document.AppendChild (xel);
62 // why is data a XmlNodeList instead of a XmlElement ?
63 public XmlNodeList Data {
65 XmlNodeList xnl = document.GetElementsByTagName (XmlSignature.ElementNames.Object);
66 return xnl[0].ChildNodes;
70 throw new ArgumentNullException ("value");
72 Build (id, mimeType, encoding, null);
73 XmlNodeList xnl = document.GetElementsByTagName (XmlSignature.ElementNames.Object);
74 if ((xnl != null) && (xnl.Count > 0)) {
75 foreach (XmlNode xn in value) {
76 XmlNode newNode = document.ImportNode (xn, true);
77 xnl [0].AppendChild (newNode);
83 // default to null - no encoding
84 public string Encoding {
85 get { return encoding; }
86 set { encoding = value; }
96 public string MimeType {
97 get { return mimeType; }
98 set { mimeType = value; }
101 public XmlElement GetXml ()
103 if ((document.DocumentElement.LocalName == XmlSignature.ElementNames.Object) && (document.DocumentElement.NamespaceURI == XmlSignature.NamespaceURI)) {
104 // recreate all attributes in order
105 XmlAttribute xa = null;
106 document.DocumentElement.Attributes.RemoveAll ();
108 xa = document.CreateAttribute (XmlSignature.AttributeNames.Id);
110 document.DocumentElement.Attributes.Append (xa);
112 if (mimeType != null) {
113 xa = document.CreateAttribute (XmlSignature.AttributeNames.MimeType);
115 document.DocumentElement.Attributes.Append (xa);
117 if (encoding != null) {
118 xa = document.CreateAttribute (XmlSignature.AttributeNames.Encoding);
120 document.DocumentElement.Attributes.Append (xa);
122 xa = document.CreateAttribute ("xmlns");
123 xa.Value = XmlSignature.NamespaceURI;
124 document.DocumentElement.Attributes.Append (xa);
126 return document.DocumentElement;
129 public void LoadXml (XmlElement value)
132 throw new ArgumentNullException ("value");
134 if ((value.LocalName != XmlSignature.ElementNames.Object) || (value.NamespaceURI != XmlSignature.NamespaceURI)) {
135 document.LoadXml (value.OuterXml);
138 document.LoadXml (value.OuterXml);
139 XmlAttribute xa = value.Attributes [XmlSignature.AttributeNames.Id];
140 id = ((xa != null) ? xa.InnerText : null);
141 xa = value.Attributes [XmlSignature.AttributeNames.MimeType];
142 mimeType = ((xa != null) ? xa.InnerText : null);
143 xa = value.Attributes [XmlSignature.AttributeNames.Encoding];
144 encoding = ((xa != null) ? xa.InnerText : null);