ProcessSinkProviderNode(ConfigNode node, RemotingXmlConfigFileData configData, bool isTemplate, bool isServer) { bool isFormatter = false; // Make sure the node is a "formatter" or "provider". String nodeName = node.Name; if (nodeName.Equals("formatter")) isFormatter = true; else if (nodeName.Equals("provider")) isFormatter = false; else { ReportError( Environment.GetResourceString("Remoting_Config_ProviderNeedsElementName"), configData); } String id = null; String typeName = null; String assemName = null; Hashtable properties = CreateCaseInsensitiveHashtable(); RemotingXmlConfigFileData.SinkProviderEntry template = null; foreach (DictionaryEntry entry in node.Attributes) { String keyStr = (String)entry.Key; switch (keyStr) { case "id": { if (!isTemplate) { // only templates can have the id attribute ReportNonTemplateIdAttributeError(node, configData); } else id = (String)entry.Value; break; } // case "id" case "ref": { if (isTemplate) { ReportTemplateCannotReferenceTemplateError(node, configData); } else { if (isServer) { template = (RemotingXmlConfigFileData.SinkProviderEntry) _serverChannelSinkTemplates[entry.Value]; } else { template = (RemotingXmlConfigFileData.SinkProviderEntry) _clientChannelSinkTemplates[entry.Value]; } if (template == null) { ReportUnableToResolveTemplateReferenceError( node, entry.Value.ToString(), configData); } else { // load template data typeName = template.TypeName; assemName = template.AssemblyName; foreach (DictionaryEntry param in template.Properties) { properties[param.Key] = param.Value; } } } break; } // case "ref" case "type": { RemotingConfigHandler.ParseType((String)entry.Value, out typeName, out assemName); break; } // case "type" default: properties[keyStr] = entry.Value; break; } // switch } // foreach attribute // check for errors if ((typeName == null) || (assemName == null)) ReportMissingTypeAttributeError(node, "type", configData); RemotingXmlConfigFileData.SinkProviderEntry sinkProviderEntry = new RemotingXmlConfigFileData.SinkProviderEntry(typeName, assemName, properties, isFormatter); // start storing sink data foreach (ConfigNode childNode in node.Children) { SinkProviderData providerData = ProcessSinkProviderData(childNode, configData); sinkProviderEntry.ProviderData.Add(providerData); } // foreach // if we reference a template and didn't specify any provider data, we // should copy over the provider data from the template if (template != null) { // < if (sinkProviderEntry.ProviderData.Count == 0) { sinkProviderEntry.ProviderData = template.ProviderData; } } if (isTemplate) { if (isServer) _serverChannelSinkTemplates[id] = sinkProviderEntry; else _clientChannelSinkTemplates[id] = sinkProviderEntry; return null; } else { return sinkProviderEntry; } } // ProcessSinkProviderNode
private static RemotingXmlConfigFileData.SinkProviderEntry ProcessSinkProviderNode(ConfigNode node, RemotingXmlConfigFileData configData, bool isTemplate, bool isServer) { bool isFormatter = false; string name = node.Name; if (name.Equals("formatter")) { isFormatter = true; } else if (name.Equals("provider")) { isFormatter = false; } else { ReportError(Environment.GetResourceString("Remoting_Config_ProviderNeedsElementName"), configData); } string str2 = null; string typeName = null; string assemName = null; Hashtable properties = CreateCaseInsensitiveHashtable(); RemotingXmlConfigFileData.SinkProviderEntry entry = null; foreach (DictionaryEntry entry2 in node.Attributes) { string key = (string) entry2.Key; string str6 = key; if (str6 == null) { goto Label_01AD; } if (!(str6 == "id")) { if (str6 == "ref") { goto Label_00D2; } if (str6 == "type") { goto Label_0196; } goto Label_01AD; } if (!isTemplate) { ReportNonTemplateIdAttributeError(node, configData); } else { str2 = (string) entry2.Value; } continue; Label_00D2: if (isTemplate) { ReportTemplateCannotReferenceTemplateError(node, configData); } else { if (isServer) { entry = (RemotingXmlConfigFileData.SinkProviderEntry) _serverChannelSinkTemplates[entry2.Value]; } else { entry = (RemotingXmlConfigFileData.SinkProviderEntry) _clientChannelSinkTemplates[entry2.Value]; } if (entry == null) { ReportUnableToResolveTemplateReferenceError(node, entry2.Value.ToString(), configData); } else { typeName = entry.TypeName; assemName = entry.AssemblyName; foreach (DictionaryEntry entry3 in entry.Properties) { properties[entry3.Key] = entry3.Value; } } } continue; Label_0196: RemotingConfigHandler.ParseType((string) entry2.Value, out typeName, out assemName); continue; Label_01AD: properties[key] = entry2.Value; } if ((typeName == null) || (assemName == null)) { ReportMissingTypeAttributeError(node, "type", configData); } RemotingXmlConfigFileData.SinkProviderEntry entry4 = new RemotingXmlConfigFileData.SinkProviderEntry(typeName, assemName, properties, isFormatter); foreach (ConfigNode node2 in node.Children) { SinkProviderData data = ProcessSinkProviderData(node2, configData); entry4.ProviderData.Add(data); } if ((entry != null) && (entry4.ProviderData.Count == 0)) { entry4.ProviderData = entry.ProviderData; } if (!isTemplate) { return entry4; } if (isServer) { _serverChannelSinkTemplates[str2] = entry4; } else { _clientChannelSinkTemplates[str2] = entry4; } return null; }