public void RegisterNamespaceManager(string namespaceUri, INodeManager nodeManager)
{
if (String.IsNullOrEmpty(namespaceUri)) throw new ArgumentNullException("namespaceUri");
if (nodeManager == null) throw new ArgumentNullException("nodeManager");
// look up the namespace uri.
int index = m_server.NamespaceUris.GetIndex(namespaceUri);
if (index < 0)
{
index = m_server.NamespaceUris.Append(namespaceUri);
}
// allocate a new table (using arrays instead of collections because lookup efficiency is critical).
INodeManager[][] namespaceManagers = new INodeManager[m_server.NamespaceUris.Count][];
lock (m_namespaceManagers)
{
// copy existing values.
for (int ii = 0; ii < m_namespaceManagers.Length; ii++)
{
if (m_namespaceManagers.Length >= ii)
{
namespaceManagers[ii] = m_namespaceManagers[ii];
}
}
// allocate a new array for the index being updated.
INodeManager[] registeredManagers = namespaceManagers[index];
if (registeredManagers == null)
{
registeredManagers = new INodeManager[1];
}
else
{
registeredManagers = new INodeManager[registeredManagers.Length+1];
Array.Copy(namespaceManagers[index], registeredManagers, namespaceManagers[index].Length);
}
// add new node manager to the end of the list.
registeredManagers[registeredManagers.Length-1] = nodeManager;
namespaceManagers[index] = registeredManagers;
// replace the table.
m_namespaceManagers = namespaceManagers;
}
}