private static XmlWriter CreateWriterImpl(Stream output, Encoding encoding, bool closeOutput, XmlWriterSettings settings) {
Debug.Assert(output != null);
Debug.Assert(encoding != null);
Debug.Assert(settings != null);
XmlWriter writer;
if (encoding.CodePage == 65001) {
// If the encoding is UTF-8, create a special-purpose writer
switch (settings.OutputMethod) {
case XmlOutputMethod.Xml:
if (settings.Indent) {
writer = new XmlUtf8RawTextWriterIndent(output, encoding, settings, closeOutput);
}
else {
writer = new XmlUtf8RawTextWriter(output, encoding, settings, closeOutput);
}
break;
case XmlOutputMethod.Html:
if (settings.Indent) {
writer = new HtmlUtf8RawTextWriterIndent(output, encoding, settings, closeOutput);
}
else {
writer = new HtmlUtf8RawTextWriter(output, encoding, settings, closeOutput);
}
break;
case XmlOutputMethod.Text:
writer = new TextUtf8RawTextWriter(output, encoding, settings, closeOutput);
break;
case XmlOutputMethod.AutoDetect:
writer = new XmlAutoDetectWriter(output, encoding, settings);
break;
default:
Debug.Assert(false, "Invalid XmlOutputMethod setting.");
return null;
}
}
else {
// Otherwise, create a general-purpose writer than can do any encoding
switch (settings.OutputMethod) {
case XmlOutputMethod.Xml:
if (settings.Indent) {
writer = new XmlEncodedRawTextWriterIndent(output, encoding, settings, closeOutput);
}
else {
writer = new XmlEncodedRawTextWriter(output, encoding, settings, closeOutput);
}
break;
case XmlOutputMethod.Html:
if (settings.Indent) {
writer = new HtmlEncodedRawTextWriterIndent(output, encoding, settings, closeOutput);
}
else {
writer = new HtmlEncodedRawTextWriter(output, encoding, settings, closeOutput);
}
break;
case XmlOutputMethod.Text:
writer = new TextEncodedRawTextWriter(output, encoding, settings, closeOutput);
break;
case XmlOutputMethod.AutoDetect:
writer = new XmlAutoDetectWriter(output, encoding, settings);
break;
default:
Debug.Assert(false, "Invalid XmlOutputMethod2 setting.");
return null;
}
}
// Wrap with Xslt/XQuery specific writer if needed;
// XmlOutputMethod.AutoDetect writer does this lazily when it creates the underlying Xml or Html writer.
if (settings.OutputMethod != XmlOutputMethod.AutoDetect) {
if (settings.IsQuerySpecific) {
// Create QueryOutputWriter if CData sections or DocType need to be tracked
writer = new QueryOutputWriter((XmlRawWriter)writer, settings);
}
}
// wrap with well-formed writer
writer = new XmlWellFormedWriter(writer, settings);
return writer;
}