private static XmlWriter AddConformanceWrapper(XmlWriter baseWriter, XmlWriterSettings baseWriterSettings, XmlWriterSettings settings) {
ConformanceLevel confLevel = ConformanceLevel.Auto;
bool checkValues = false;
bool checkNames = false;
bool replaceNewLines = false;
bool needWrap = false;
if (baseWriterSettings == null) {
// assume the V1 writer already do all conformance checking;
// wrap only if NewLineHandling == Replace or CheckCharacters is true
if (settings.NewLineHandling == NewLineHandling.Replace) {
replaceNewLines = true;
needWrap = true;
}
if (settings.CheckCharacters) {
checkValues = true;
needWrap = true;
}
}
else {
if (settings.ConformanceLevel != baseWriterSettings.ConformanceLevel) {
confLevel = settings.ConformanceLevel;
needWrap = true;
}
if (settings.CheckCharacters && !baseWriterSettings.CheckCharacters) {
checkValues = true;
checkNames = confLevel == ConformanceLevel.Auto;
needWrap = true;
}
if (settings.NewLineHandling == NewLineHandling.Replace &&
baseWriterSettings.NewLineHandling == NewLineHandling.None) {
replaceNewLines = true;
needWrap = true;
}
}
if (needWrap) {
XmlWriter writer = baseWriter;
if (confLevel != ConformanceLevel.Auto) {
writer = new XmlWellFormedWriter(writer, settings);
}
if (checkValues || replaceNewLines) {
writer = new XmlCharCheckingWriter(writer, checkValues, checkNames, replaceNewLines, settings.NewLineChars);
}
return writer;
}
else {
return baseWriter;
}
}
}