Beispiel #1
0
        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;
 }