return resultPath.ToString();
}
- private static MyDict<string, Stream> s_XmlFileInMemoryCache = null;
- private static MyDict<string, Stream> s_XmlFileInMemoryCacheBackup = null;
+ private static MyDict<string, MemoryStream> s_XmlFileInMemoryCache = null;
private static readonly object s_XmlFileMemoryCacheLock = new object();
static void initXmlFileCacheIfNotYet()
{
if (s_XmlFileInMemoryCache == null)
{
- s_XmlFileInMemoryCache = new MyDict<string, Stream>();
- s_XmlFileInMemoryCacheBackup = new MyDict<string, Stream>();
+ s_XmlFileInMemoryCache = new MyDict<string, MemoryStream>();
- foreach (var file in GetDataFiles())
+ foreach (Tuple<string, byte[]> file in GetDataFiles())
{
- addBytes(file.Item1, file.Item2);
+ var ms = new MemoryStream(file.Item2);
+ s_XmlFileInMemoryCache[NormalizeFilePath(file.Item1)] = ms;
}
}
}
}
- public static void cacheXml(string filename, string content)
- {
- initXmlFileCacheIfNotYet();
- MemoryStream ms = new MemoryStream();
- StreamWriter sw = new StreamWriter(ms);
- sw.Write(content);
- sw.Flush();
- s_XmlFileInMemoryCache[NormalizeFilePath(filename)] = ms;
-
- MemoryStream msbak = new MemoryStream();
- ms.Position = 0;
- ms.CopyTo(msbak);
- s_XmlFileInMemoryCacheBackup[NormalizeFilePath(filename)] = msbak;
- }
-
public static Stream getStreamDirect(string filename)
{
- foreach (var file in GetDataFiles())
+ foreach (Tuple<string, byte[]> file in GetDataFiles())
{
if (file.Item1 == filename)
{
lock (s_XmlFileMemoryCacheLock)
{
- Stream s = s_XmlFileInMemoryCache[normalizedFileName];
+ MemoryStream ms = s_XmlFileInMemoryCache[normalizedFileName];
- if (s == null)
+ if (ms == null)
{
throw new FileNotFoundException("File Not Found: " + filename);
}
- if (s.CanSeek)
- {
- s.Position = 0;
- return s;
- }
- else
- {
- Stream msbak = s_XmlFileInMemoryCacheBackup[normalizedFileName];
- MemoryStream msnew = new MemoryStream();
- msbak.Position = 0;
- msbak.CopyTo(msnew);
-
- s_XmlFileInMemoryCache[normalizedFileName] = msnew;
- msnew.Position = 0;
- return msnew;
- }
- }
- }
-
- public static void addBytes(string filename, byte[] bytes)
- {
- if (null == filename)
- return;
-
- initXmlFileCacheIfNotYet();
-
- lock (s_XmlFileMemoryCacheLock)
- {
- var ms = new MemoryStream(bytes);
- s_XmlFileInMemoryCache[NormalizeFilePath(filename)] = ms;
- MemoryStream msbak = new MemoryStream();
+ // Always give out a new stream, so there's no concern about concurrent use
+ MemoryStream msnew = new MemoryStream();
ms.Position = 0;
- ms.CopyTo(msbak);
- s_XmlFileInMemoryCacheBackup[NormalizeFilePath(filename)] = msbak;
+ ms.CopyTo(msnew);
+ msnew.Position = 0;
+ return msnew;
}
}
- public static void addStream(string filename, Stream s)
+ public static void addStream(string filename, MemoryStream s!!)
{
if (null == filename)
return;
lock (s_XmlFileMemoryCacheLock)
{
+ // overwrite any existing
s_XmlFileInMemoryCache[NormalizeFilePath(filename)] = s;
-
- MemoryStream msbak = new MemoryStream();
- s.Position = 0;
- s.CopyTo(msbak);
- s_XmlFileInMemoryCacheBackup[NormalizeFilePath(filename)] = msbak;
}
}
public static void CreateByteTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("x");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateUTF8EncodedTestFile(string strFileName, Encoding encode)
{
- Stream strm = new MemoryStream();
- TextWriter tw = new StreamWriter(strm, encode);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encode, bufferSize:-1, leaveOpen:true);
tw.WriteLine("<root>");
tw.Write("\u00A9");
tw.WriteLine("</root>");
- tw.Flush();
- FilePathUtil.addStream(strFileName, strm);
+ FilePathUtil.addStream(strFileName, s);
}
public static void CreateEncodedTestFile(string strFileName, Encoding encode)
{
- Stream strm = new MemoryStream();
- TextWriter tw = new StreamWriter(strm, encode);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encode, bufferSize:-1, leaveOpen:true);
tw.WriteLine("<root>");
tw.WriteLine("</root>");
- tw.Flush();
- FilePathUtil.addStream(strFileName, strm);
+ FilePathUtil.addStream(strFileName, s);
}
public static void CreateWhitespaceHandlingTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("<!DOCTYPE dt [");
tw.WriteLine("<!ELEMENT WHITESPACE1 (#PCDATA)*>");
tw.WriteLine("<!ELEMENT WHITESPACE2 (#PCDATA)*>");
tw.WriteLine("<WHITESPACE2> <ELEM /> </WHITESPACE2>");
tw.WriteLine("<WHITESPACE3>\t<ELEM />\t</WHITESPACE3>");
tw.WriteLine("</doc>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
}
public static void CreateGenericTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
tw.WriteLine("<!-- comment1 -->");
tw.WriteLine("<?PI1_First processing instruction?>");
tw.WriteLine("<CHARS_COMMENT1>xxx<!-- comment1-->zzz</CHARS_COMMENT1>");
tw.WriteLine("<CHARS_COMMENT2><!-- comment1-->zzz</CHARS_COMMENT2>");
tw.WriteLine("<CHARS_COMMENT3>xxx<!-- comment1--></CHARS_COMMENT3>");
- tw.Flush();
tw.WriteLine("<ISDEFAULT />");
tw.WriteLine("<ISDEFAULT a1='a1value' />");
tw.WriteLine("<BOOLEAN1>true</BOOLEAN1>");
tw.WriteLine("<GRPDESCR>twin brothers, and sons to Aegeon and Aemilia.</GRPDESCR>");
tw.WriteLine("</PGROUP>");
tw.WriteLine("<PGROUP>");
- tw.Flush();
tw.WriteLine("<XMLLANG0 xml:lang=\"en-US\">What color NO_REFERENCEe1; is it?</XMLLANG0>");
tw.Write("<XMLLANG1 xml:lang=\"en-GB\">What color is it?<a><b><c>Language Test</c><PERSONA>DROMIO OF EPHESUS</PERSONA></b></a></XMLLANG1>");
tw.WriteLine("<NOXMLLANG />");
tw.WriteLine("<VALIDXMLLANG3 xml:lang=\"a b-cd\" />");
tw.Write("</PLAY>");
- tw.Flush();
FilePathUtil.addStream(strFileName, s);
}
public static void CreateInvalidNamespaceTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("<NAMESPACE0 xmlns:bar=\"1\"><bar1:check>Namespace=1</bar1:check></NAMESPACE0>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateNamespaceTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
tw.WriteLine("<DOCNAMESPACE>");
tw.WriteLine("<NAMESPACE0 xmlns:bar=\"1\"><bar:check>Namespace=1</bar:check></NAMESPACE0>");
tw.WriteLine("<a13 a:check=\"Namespace=13\" xmlns:a=\"13\" /><check14 xmlns=\"14\">Namespace=14</check14></NAMESPACE3>");
tw.WriteLine("<NONAMESPACE>Namespace=\"\"</NONAMESPACE>");
tw.WriteLine("</DOCNAMESPACE>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateXmlLangTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("<PGROUP>");
tw.WriteLine("<PERSONA>DROMIO OF EPHESUS</PERSONA>");
tw.WriteLine("<PERSONA>DROMIO OF SYRACUSE</PERSONA>");
tw.WriteLine("<XMLLANG2 xml:lang=\"en-US\">What color is it?<TITLE><!-- this is a comment--></TITLE><XMLLANG1 xml:lang=\"en-GB\">Testing language<XMLLANG0 xml:lang=\"en-US\">What color is it?</XMLLANG0>haha </XMLLANG1>hihihi</XMLLANG2>");
tw.WriteLine("<DONEXMLLANG />");
tw.WriteLine("</PGROUP>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateXmlSpaceTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
tw.WriteLine("<PGROUP>");
tw.WriteLine("<PERSONA>DROMIO OF EPHESUS</PERSONA>");
tw.WriteLine("<XMLSPACE2A xml:space=\'default\'>< <XMLSPACE3 xml:space=\'preserve\'> < > <XMLSPACE4 xml:space=\'default\'> < > </XMLSPACE4> test </XMLSPACE3> ></XMLSPACE2A>");
tw.WriteLine("<GRPDESCR>twin brothers, and attendants on the two Antipholuses.</GRPDESCR>");
tw.WriteLine("</PGROUP>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateJunkTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
string str = new string('Z', (1 << 20) - 1);
tw.Write(str);
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
{
WriteToBuffer(ref WTextOnly, ref WTextOnlylen, System.BitConverter.GetBytes(strBase64[i]));
}
- MemoryStream mems = new MemoryStream();
- XmlWriter w = XmlWriter.Create(mems, null);
+
+ var mems = new MemoryStream();
+ using var w = XmlWriter.Create(mems, new XmlWriterSettings { CloseOutput = false });
+
w.WriteStartDocument();
w.WriteStartElement("Root");
w.WriteStartElement("ElemAll");
w.WriteRaw("D2BAa<MIX></MIX>AQID");
w.WriteEndElement();
w.WriteEndElement();
- w.Flush();
+
FilePathUtil.addStream(strFileName, mems);
}
{
WriteToBuffer(ref WTextOnly, ref WTextOnlylen, System.BitConverter.GetBytes(strBinHex[i]));
}
- MemoryStream mems = new MemoryStream();
- XmlWriter w = XmlWriter.Create(mems);
+ var mems = new MemoryStream();
+ using var w = XmlWriter.Create(mems, new XmlWriterSettings { CloseOutput = false });
+
w.WriteStartElement("Root");
w.WriteStartElement("ElemAll");
w.WriteBinHex(Wbinhex, 0, (int)Wbinhexlen);
w.WriteEndElement();
- w.Flush();
w.WriteStartElement("ElemEmpty");
w.WriteString(string.Empty);
w.WriteElementString("ElemErr", "a&A2A3");
w.WriteEndElement();
- w.Flush();
+
FilePathUtil.addStream(strFileName, mems);
}
public static void CreateBigElementTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
string str = new string('Z', (1 << 20) - 1);
tw.WriteLine("<Root>");
tw.Write("<");
tw.Write(str);
tw.WriteLine("X />");
- tw.Flush();
tw.Write("<");
tw.Write(str);
tw.WriteLine("Y />");
tw.WriteLine("</Root>");
- tw.Flush();
FilePathUtil.addStream(strFileName, s);
}
public static void CreateXSLTStyleSheetWCopyTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
+
tw.WriteLine("<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">");
tw.WriteLine("<xsl:template match=\"/\">");
tw.WriteLine("<xsl:copy-of select=\"/\" />");
tw.WriteLine("</xsl:template>");
tw.WriteLine("</xsl:stylesheet>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateConstructorTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
tw.WriteLine("<?xml version=\"1.0\"?>");
tw.WriteLine("<ROOT>");
tw.WriteLine("<ATTRIBUTE3 a1='a1value' a2='a2value' a3='a3value' />");
tw.Write("</ROOT>");
- tw.Flush();
+
FilePathUtil.addStream(strFileName, s);
}
public static void CreateLineNumberTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
FilePathUtil.addStream(strFileName, s);
}
public static void CreateLbNormalizationTestFile(string strFileName)
{
- Stream s = new MemoryStream();
- TextWriter tw = new StreamWriter(s);
+ var s = new MemoryStream();
+ using var tw = new StreamWriter(s, encoding:null, bufferSize:-1, leaveOpen:true);
FilePathUtil.addStream(strFileName, s);
}