view api/Factories/Xml/WarFoundryXmlGameSystemFactory.cs @ 150:b36cc4af435b

Re #176: Bug when saving recently edited army * Try to make sure that we clear up more of our open streams Bug seems to be state related in some way since I can only trigger it when loading the file as the first action, but doesn't seem to be related to file loading of other data files since a diagnostic hard-coded "LoadFiles()" call in the FrmMain constructor doesn't change the behaviour
author IBBoard <dev@ibboard.co.uk>
date Sat, 26 Sep 2009 10:43:28 +0000
parents 2f3cafb69799
children c1caf467dd40
line wrap: on
line source

//  This file (WarFoundryXmlGameSystemFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard
// 
// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.

using System;
using System.Collections.Generic;
using System.Xml;
using ICSharpCode.SharpZipLib.Zip;
using IBBoard.Logging;
using IBBoard.Xml;
using IBBoard.WarFoundry.API.Objects;

namespace IBBoard.WarFoundry.API.Factories.Xml
{
	/// <summary>
	/// A sub-factory specifically for loading GameSystems from WarFoundry XML files
	/// </summary>
	public class WarFoundryXmlGameSystemFactory : AbstractStagedLoadedSubFactory
	{	
		private Dictionary<GameSystem, XmlDocument> extraData = new Dictionary<GameSystem, XmlDocument>();
		
		public WarFoundryXmlGameSystemFactory(WarFoundryXmlFactory factory) : base(factory)
		{
		}
		
		private void StoreExtraData(GameSystem wfObject, XmlElement elem)
		{
			extraData[wfObject] = elem.OwnerDocument;
		}
	
		private XmlDocument GetExtraData(GameSystem obj)
		{
			XmlDocument extra = null;
			extraData.TryGetValue(obj, out extra);			
			return extra;
		}
		
		public GameSystem CreateSystemFromElement(ZipFile file, XmlElement elem)
		{
			string id = elem.GetAttribute("id");
			string name = elem.GetAttribute("name");
			GameSystem system = new GameSystem(id, name, mainFactory);
			StoreExtraData(system, elem);
			return system;
		}		
		
		public void CompleteLoading(GameSystem system)
		{
			if (!WarFoundryXmlFactoryUtils.CanCompleteLoading(system))
			{
				return;
			}
			
			system.SetAsLoading();			
			XmlDocument extraData = GetExtraData(system);
			LoadCategoriesForSystem(system, extraData);
			XmlElement statsElem = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "/system:system/system:sysStatsList");
			string defaultStatsID = statsElem.GetAttribute("defaultStats");
			LoadSystemStatsForSystem(system, extraData);
			system.StandardSystemStatsID = defaultStatsID;
			XmlElement systemElement = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "/system:system");
			system.WarnOnError = XmlTools.GetBoolValueFromAttribute(systemElement, "warn");
			system.AllowAllies = XmlTools.GetBoolValueFromAttribute(systemElement, "allowAllies");
			LogNotifier.DebugFormat(GetType(), "Completed loading of GameSystem with ID {0}", system.ID);
			LogNotifier.DebugFormat(GetType(), "GameSystem with ID {0} default stats: {1}", system.ID, system.StandardSystemStatsID);
			system.SetAsFullyLoaded();
		}
		
		private void LoadCategoriesForSystem(GameSystem system, XmlNode elem)
		{
			foreach (XmlElement cat in WarFoundryXmlFactoryUtils.SelectNodes(elem, "/system:system/system:categories/cat:cat"))
			{
				system.AddCategory(CreateCategoryFromElement(cat));
			}
		}	
		
		private void LoadSystemStatsForSystem(GameSystem system, XmlNode elem)
		{
			foreach (XmlElement stats in WarFoundryXmlFactoryUtils.SelectNodes(elem, "/system:system/system:sysStatsList/system:sysStats"))
			{
				SystemStats sysStats = CreateSystemStatsFromElement(stats);
				system.AddSystemStats(sysStats);
			}
		}
		
		private SystemStats CreateSystemStatsFromElement(XmlElement elem)
		{
			SystemStats sysStats = new SystemStats(elem.GetAttribute("id"));
			
			foreach (XmlElement slot in WarFoundryXmlFactoryUtils.SelectNodes(elem, "system:sysStat"))
			{
				sysStats.AddStatSlot(slot.GetAttribute("name"));
			}

			return sysStats;
		}	
	}
}