예제 #1
0
		private void ReadSection (XmlTextReader reader, string sectionName)
		{
			string attName;
			string nameValue = null;
			string typeValue = null;
			string allowLoc = null, allowDef = null;
			bool requirePermission = false;
			string requirePer = null;
			bool allowLocation = true;
			AllowDefinition allowDefinition = AllowDefinition.Everywhere;

			while (reader.MoveToNextAttribute ()) {
				attName = reader.Name;
				if (attName == null)
					continue;

				if (attName == "allowLocation") {
					if (allowLoc != null)
						ThrowException ("Duplicated allowLocation attribute.", reader);

					allowLoc = reader.Value;
					allowLocation = (allowLoc == "true");
					if (!allowLocation && allowLoc != "false")
						ThrowException ("Invalid attribute value", reader);

					continue;
				}

				if (attName == "requirePermission") {
					if (requirePer != null)
						ThrowException ("Duplicated requirePermission attribute.", reader);
					requirePer = reader.Value;
					requirePermission = (requirePer == "true");
					if (!requirePermission && requirePer != "false")
						ThrowException ("Invalid attribute value", reader);
					continue;
				}

				if (attName == "allowDefinition") {
					if (allowDef != null)
						ThrowException ("Duplicated allowDefinition attribute.", reader);

					allowDef = reader.Value;
					try {
						allowDefinition = (AllowDefinition) Enum.Parse (
								   typeof (AllowDefinition), allowDef);
					} catch {
						ThrowException ("Invalid attribute value", reader);
					}

					continue;
				}

				if (attName == "type")  {
					if (typeValue != null)
						ThrowException ("Duplicated type attribute.", reader);
					typeValue = reader.Value;
					continue;
				}
				
				if (attName == "name")  {
					if (nameValue != null)
						ThrowException ("Duplicated name attribute.", reader);
					nameValue = reader.Value;
					if (nameValue == "location")
						ThrowException ("location is a reserved section name", reader);
					continue;
				}

				ThrowException ("Unrecognized attribute.", reader);
			}

			if (nameValue == null || typeValue == null)
				ThrowException ("Required attribute missing", reader);

			if (sectionName != null)
				nameValue = sectionName + '/' + nameValue;

			reader.MoveToElement();
			object o = LookForFactory (nameValue);
			if (o != null && o != removedMark)
				ThrowException ("Already have a factory for " + nameValue, reader);
			SectionData section = new SectionData (nameValue, typeValue, allowLocation,
				allowDefinition, requirePermission);
			section.FileName = fileName;
			factories [nameValue] = section;

			if (reader.IsEmptyElement)
				reader.Skip ();
			else {
				reader.Read ();
				reader.MoveToContent ();
				if (reader.NodeType != XmlNodeType.EndElement)
					// sub-section inside a section
					ReadSections (reader, nameValue);
				reader.ReadEndElement ();
			}
			reader.MoveToContent ();
		}
예제 #2
0
        private void ReadSection(XmlTextReader reader, string sectionName)
        {
            string          attName;
            string          nameValue = null;
            string          typeValue = null;
            string          allowLoc = null, allowDef = null;
            bool            requirePermission = false;
            string          requirePer        = null;
            bool            allowLocation     = true;
            AllowDefinition allowDefinition   = AllowDefinition.Everywhere;

            while (reader.MoveToNextAttribute())
            {
                attName = reader.Name;
                if (attName == null)
                {
                    continue;
                }

                if (attName == "allowLocation")
                {
                    if (allowLoc != null)
                    {
                        ThrowException("Duplicated allowLocation attribute.", reader);
                    }

                    allowLoc      = reader.Value;
                    allowLocation = (allowLoc == "true");
                    if (!allowLocation && allowLoc != "false")
                    {
                        ThrowException("Invalid attribute value", reader);
                    }

                    continue;
                }

                if (attName == "requirePermission")
                {
                    if (requirePer != null)
                    {
                        ThrowException("Duplicated requirePermission attribute.", reader);
                    }
                    requirePer        = reader.Value;
                    requirePermission = (requirePer == "true");
                    if (!requirePermission && requirePer != "false")
                    {
                        ThrowException("Invalid attribute value", reader);
                    }
                    continue;
                }

                if (attName == "allowDefinition")
                {
                    if (allowDef != null)
                    {
                        ThrowException("Duplicated allowDefinition attribute.", reader);
                    }

                    allowDef = reader.Value;
                    try {
                        allowDefinition = (AllowDefinition)Enum.Parse(
                            typeof(AllowDefinition), allowDef);
                    } catch {
                        ThrowException("Invalid attribute value", reader);
                    }

                    continue;
                }

                if (attName == "type")
                {
                    if (typeValue != null)
                    {
                        ThrowException("Duplicated type attribute.", reader);
                    }
                    typeValue = reader.Value;
                    continue;
                }

                if (attName == "name")
                {
                    if (nameValue != null)
                    {
                        ThrowException("Duplicated name attribute.", reader);
                    }
                    nameValue = reader.Value;
                    if (nameValue == "location")
                    {
                        ThrowException("location is a reserved section name", reader);
                    }
                    continue;
                }

                ThrowException("Unrecognized attribute.", reader);
            }

            if (nameValue == null || typeValue == null)
            {
                ThrowException("Required attribute missing", reader);
            }

            if (sectionName != null)
            {
                nameValue = sectionName + '/' + nameValue;
            }

            reader.MoveToElement();
            object o = LookForFactory(nameValue);

            if (o != null && o != removedMark)
            {
                ThrowException("Already have a factory for " + nameValue, reader);
            }
            SectionData section = new SectionData(nameValue, typeValue, allowLocation,
                                                  allowDefinition, requirePermission);

            section.FileName      = fileName;
            factories [nameValue] = section;

            if (reader.IsEmptyElement)
            {
                reader.Skip();
            }
            else
            {
                reader.Read();
                reader.MoveToContent();
                if (reader.NodeType != XmlNodeType.EndElement)
                {
                    // sub-section inside a section
                    ReadSections(reader, nameValue);
                }
                reader.ReadEndElement();
            }
            reader.MoveToContent();
        }
예제 #3
0
		object CreateNewHandler (string sectionName, SectionData section)
		{
			Type t = Type.GetType (section.TypeName);
			if (t == null)
				throw new ConfigurationException ("Cannot get Type for " + section.TypeName);

#if false
			Type iconfig = typeof (IConfigurationSectionHandler);
			if (!iconfig.IsAssignableFrom (t))
				throw new ConfigurationException (sectionName + " does not implement " + iconfig);
#endif
			
			object o = Activator.CreateInstance (t, true);
			if (o == null)
				throw new ConfigurationException ("Cannot get instance for " + t);

			return o;
		}