public QualifiedName GetRemoteBrowseName(string browseName)
{
// check for null.
if (String.IsNullOrEmpty(browseName))
{
return QualifiedName.Null;
}
// parse the browse name.
QualifiedName qname = QualifiedName.Parse(browseName);
// construct the qualified name with the remote index.
ushort namespaceIndex = GetRemoteNamespaceIndex(qname.NamespaceIndex);
// unescape any special characters in name.
string name = qname.Name;
int index = name.IndexOf('%');
if (index != -1)
{
StringBuilder buffer = new StringBuilder(name.Length);
for (int ii = 0; ii < name.Length; ii++)
{
if (name[ii] == '%')
{
int code = 0;
if (ii < name.Length-2)
{
int ch = ToHexDigit(name[ii+1]);
if (ch > 0)
{
code = ch * 16;
ch = ToHexDigit(name[ii+2]);
if (ch > 0)
{
code += ch;
buffer.Append((char)code);
continue;
}
}
}
}
buffer.Append(name[ii]);
}
return new QualifiedName(buffer.ToString(), namespaceIndex);
}
// check if no translation required.
if (qname.NamespaceIndex == namespaceIndex)
{
return qname;
}
// return a new name.
return new QualifiedName(qname.Name, namespaceIndex);
}