public void AddNamespace(string prefix, string uri, XmlDictionaryString uriDictionaryString)
{
if (prefix.Length >= 3)
{
// Upper and lower case letter differ by a bit.
if ((prefix[0] & ~32) == 'X' && (prefix[1] & ~32) == 'M' && (prefix[2] & ~32) == 'L')
{
if (prefix == "xml" && uri == xmlNamespace)
return;
if (prefix == "xmlns" && uri == xmlnsNamespace)
return;
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.XmlReservedPrefix), nameof(prefix)));
}
}
Namespace nameSpace;
for (int i = _nsCount - 1; i >= 0; i--)
{
nameSpace = _namespaces[i];
if (nameSpace.Depth != _depth)
break;
if (nameSpace.Prefix == prefix)
{
if (nameSpace.Uri == uri)
return;
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.XmlPrefixBoundToNamespace, prefix, nameSpace.Uri, uri), nameof(prefix)));
}
}
if (prefix.Length != 0 && uri.Length == 0)
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.XmlEmptyNamespaceRequiresNullPrefix), nameof(prefix)));
if (uri.Length == xmlnsNamespace.Length && uri == xmlnsNamespace)
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.XmlSpecificBindingNamespace, "xmlns", uri)));
// The addressing namespace and the xmlNamespace are the same length, so add a quick check to try to disambiguate
if (uri.Length == xmlNamespace.Length && uri[18] == 'X' && uri == xmlNamespace)
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.XmlSpecificBindingNamespace, "xml", uri)));
if (_namespaces.Length == _nsCount)
{
Namespace[] newNamespaces = new Namespace[_nsCount * 2];
Array.Copy(_namespaces, 0, newNamespaces, 0, _nsCount);
_namespaces = newNamespaces;
}
nameSpace = _namespaces[_nsCount];
if (nameSpace == null)
{
nameSpace = new Namespace();
_namespaces[_nsCount] = nameSpace;
}
nameSpace.Depth = _depth;
nameSpace.Prefix = prefix;
nameSpace.Uri = uri;
nameSpace.UriDictionaryString = uriDictionaryString;
_nsCount++;
_lastNameSpace = null;
}