//
// Author:
// Sebastien Pouliot (spouliot@motus.com)
+// Atsushi Enomoto (atsushi@ximian.com)
//
// (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
+// (C) 2004 Novell Inc.
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System.IO;
using System.Xml;
using System.Xml.Xsl;
-namespace System.Security.Cryptography.Xml {
+namespace System.Security.Cryptography.Xml
+{
- [MonoTODO]
- public class XmlDsigXsltTransform : Transform {
+ public class XmlDsigXsltTransform : Transform
+ {
- private Type[] input;
- private Type[] output;
+ private Type [] input;
+ private Type [] output;
private bool comments;
private XmlNodeList xnl;
- private CryptoStream cs;
+ private XmlDocument inputDoc;
- public XmlDsigXsltTransform () : this (false) {}
+ public XmlDsigXsltTransform () : this (false)
+ {
+ }
public XmlDsigXsltTransform (bool includeComments)
{
comments = includeComments;
- Algorithm = "http://www.w3.org/TR/1999/REC-xslt-19991116";
+ Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigXsltTransform;
}
- public override Type[] InputTypes {
+ public override Type [] InputTypes {
get {
if (input == null) {
- lock (this) {
- // this way the result is cached if called multiple time
- input = new Type [3];
- input[0] = typeof (System.IO.Stream);
- input[1] = typeof (System.Xml.XmlDocument);
- input[2] = typeof (System.Xml.XmlNodeList);
- }
+ input = new Type [3];
+ input [0] = typeof (System.IO.Stream);
+ input [1] = typeof (System.Xml.XmlDocument);
+ input [2] = typeof (System.Xml.XmlNodeList);
}
return input;
}
}
- public override Type[] OutputTypes {
+ public override Type [] OutputTypes {
get {
if (output == null) {
- lock (this) {
- // this way the result is cached if called multiple time
- output = new Type [1];
- output[0] = typeof (System.IO.Stream);
- }
+ output = new Type [1];
+ output [0] = typeof (System.IO.Stream);
}
return output;
}
return xnl;
}
- [MonoTODO("Missing some action - see InvalidXslt test")]
public override object GetOutput ()
{
- return (object) cs;
+ if (xnl == null)
+ throw new ArgumentNullException ("LoadInnerXml before transformation.");
+
+ XmlResolver resolver = GetResolver ();
+
+ XslTransform xsl = new XslTransform ();
+ XmlDocument doc = new XmlDocument ();
+ doc.XmlResolver = resolver;
+ foreach (XmlNode n in xnl)
+ doc.AppendChild (doc.ImportNode (n, true));
+ xsl.Load (doc, resolver);
+
+ if (inputDoc == null)
+ throw new ArgumentNullException ("LoadInput before transformation.");
+
+ MemoryStream stream = new MemoryStream ();
+ // only possible output: Stream
+ xsl.XmlResolver = resolver;
+ xsl.Transform (inputDoc, null, stream);
+
+ stream.Seek (0, SeekOrigin.Begin);
+ return stream;
}
public override object GetOutput (Type type)
{
- if (type != Type.GetType ("System.IO.Stream"))
+ if (type != typeof (Stream))
throw new ArgumentException ("type");
return GetOutput ();
}
xnl = nodeList;
}
- [MonoTODO()]
public override void LoadInput (object obj)
{
- XslTransform xsl = new XslTransform ();
- XmlDocument doc = new XmlDocument ();
- doc.XmlResolver = GetResolver ();
- Stream stream = null;
-
// possible input: Stream, XmlDocument, and XmlNodeList
- if (obj is Stream) {
- doc.Load (obj as Stream);
- xsl.Load (doc);
- }
- else if (obj is XmlDocument) {
- xsl.Load (obj as XmlDocument);
- }
- else if (obj is XmlNodeList) {
- // Is it valid operation?
+ Stream s = (obj as Stream);
+ if (s != null) {
+ inputDoc = new XmlDocument ();
+ inputDoc.XmlResolver = GetResolver ();
+// inputDoc.Load (obj as Stream);
+ inputDoc.Load (new XmlSignatureStreamReader (new StreamReader (s)));
+ return;
}
- if (xnl != null) {
- stream = new MemoryStream ();
- // only possible output: Stream
- xsl.Transform (doc, null, stream);
+ XmlDocument xd = (obj as XmlDocument);
+ if (xd != null) {
+ inputDoc = xd;
+ return;
}
- if (stream != null)
- cs = new CryptoStream (stream, new FromBase64Transform (), CryptoStreamMode.Read);
- else
- cs = null;
- // note: there is no default are other types won't throw an exception
+ XmlNodeList nl = (obj as XmlNodeList);
+ if (nl != null) {
+ inputDoc = new XmlDocument ();
+ inputDoc.XmlResolver = GetResolver ();
+ for (int i = 0; i < nl.Count; i++)
+ inputDoc.AppendChild (inputDoc.ImportNode (nl [i], true));
+ }
}
}
}