internal override void Close(WriteState currentState) {
if (currentState == WriteState.Error) {
return;
}
try {
switch (type) {
case DocumentXmlWriterType.InsertSiblingAfter:
XmlNode parent = start.ParentNode;
if (parent == null) {
throw new InvalidOperationException(Res.GetString(Res.Xpn_MissingParent));
}
for (int i = fragment.Count - 1; i >= 0; i--) {
parent.InsertAfter(fragment[i], start);
}
break;
case DocumentXmlWriterType.InsertSiblingBefore:
parent = start.ParentNode;
if (parent == null) {
throw new InvalidOperationException(Res.GetString(Res.Xpn_MissingParent));
}
for (int i = 0; i < fragment.Count; i++) {
parent.InsertBefore(fragment[i], start);
}
break;
case DocumentXmlWriterType.PrependChild:
for (int i = fragment.Count - 1; i >= 0; i--) {
start.PrependChild(fragment[i]);
}
break;
case DocumentXmlWriterType.AppendChild:
for (int i = 0; i < fragment.Count; i++) {
start.AppendChild(fragment[i]);
}
break;
case DocumentXmlWriterType.AppendAttribute:
CloseWithAppendAttribute();
break;
case DocumentXmlWriterType.ReplaceToFollowingSibling:
if (fragment.Count == 0) {
throw new InvalidOperationException(Res.GetString(Res.Xpn_NoContent));
}
CloseWithReplaceToFollowingSibling();
break;
}
}
finally {
fragment.Clear();
}
}