view api/Factories/AbstractWarFoundryFactory.cs @ 151:1d13820b3d96

Fixes #176: Bug when saving recently edited army * Add loaded file cleanup to AbstractWarFoundryFactory * Add override of method with Zip reference closing to WarFoundryXmlFactory WarFoundry now no longer ends up with trailing handles to files, although why they only caused problems in some situations is unknown Also: * Some line ending fixes (curse cross-platform development and different line terminators!)
author IBBoard <dev@ibboard.co.uk>
date Sat, 26 Sep 2009 18:48:36 +0000
parents fcbc3beea498
children 3e287b6b5244
line wrap: on
line source

// This file (AbstractWarFoundryFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2007, 2008, 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.IO;
using System.Collections.Generic;
using IBBoard.WarFoundry.API.Objects;

namespace IBBoard.WarFoundry.API.Factories
{
	public abstract class AbstractWarFoundryFactory<FILE_TYPE> : IWarFoundryFactory
	{		
		public virtual void CompleteLoading(IWarFoundryStagedLoadObject obj)
		{
			//Pretend we've fully loaded, as this will probably be standard for non-native factories and some native factories
			obj.SetAsFullyLoaded();
		}
			
		public bool CanHandleFileFormat (FileInfo file)
		{
			FILE_TYPE typedFile = GetFileAsSupportedType(file);
			bool canHandle = typedFile != null && CheckCanHandleFileFormat(typedFile);

			if (typedFile != null)
			{
				CleanUpFileAsSupportedType(typedFile);
			}

			return canHandle;
		}

		public bool CanHandleFileAsRace(FileInfo file)
		{
			FILE_TYPE typedFile = GetFileAsSupportedType(file);
			bool canHandle = typedFile != null && CheckCanHandleFileAsRace(typedFile);

			if (typedFile != null)
			{
				CleanUpFileAsSupportedType(typedFile);
			}

			return canHandle;
		}

		public bool CanHandleFileAsGameSystem(FileInfo file)
		{
			FILE_TYPE typedFile = GetFileAsSupportedType(file);
			bool canHandle = typedFile != null && CheckCanHandleFileAsGameSystem(typedFile);

			if (typedFile != null)
			{
				CleanUpFileAsSupportedType(typedFile);
			}

			return canHandle;
		}

		public bool CanHandleFileAsArmy(FileInfo file)
		{
			FILE_TYPE typedFile = GetFileAsSupportedType(file);
			bool canHandle = typedFile != null && CheckCanHandleFileAsArmy(typedFile);

			if (typedFile != null)
			{
				CleanUpFileAsSupportedType(typedFile);
			}

			return canHandle;
		}

		protected virtual void CleanUpFileAsSupportedType(FILE_TYPE typedFile)
		{
			//Do nothing by default
		}
		
		/// <summary>
		/// Converts the <see cref="FileInfo"/> object in to the appropriate type for this class so that it can perform its checks. If no conversion is required (the test can be performed on a <see cref="FileInfo"/> object) the object should be returned with no modification. 
		/// If the file is not of supported type the <code>null</code> should be returned.
		/// </summary>
		/// <param name="file">
		/// A <see cref="FileInfo"/> to get the supported source object from.
		/// </param>
		/// <returns>
		/// An object of type <see cref="FILE_TYPE"/> that has been converted from the input <see cref="FileInfo"/> object, or <code>null</code> if the conversion cannot be made.
		/// </returns>
		protected abstract FILE_TYPE GetFileAsSupportedType(FileInfo file);
		
		/// <summary>
		/// Checks whether the factory thinks it can load data from the file in its paramaterised type.
		/// </summary>
		/// <param name="file">
		/// An object of the converted <see cref="FILE_TYPE"/> to check support for
		/// </param>
		/// <returns>
		/// <code>true</code> if the factory thinks it can support the file, else <code>false</code>
		/// </returns>
		protected abstract bool CheckCanHandleFileFormat(FILE_TYPE file);

		/// <summary>
		/// Checks whether the factory thinks it can load data from the file in its paramaterised type as a Race object.
		/// </summary>
		/// <param name="file">
		/// An object of the converted <see cref="FILE_TYPE"/> to check support for
		/// </param>
		/// <returns>
		/// <code>true</code> if the factory thinks it can support the file as a Race, else <code>false</code>
		/// </returns>
		protected abstract bool CheckCanHandleFileAsRace(FILE_TYPE file);

		/// <summary>
		/// Checks whether the factory thinks it can load data from the file in its paramaterised type as a GameSystem object.
		/// </summary>
		/// <param name="file">
		/// An object of the converted <see cref="FILE_TYPE"/> to check support for
		/// </param>
		/// <returns>
		/// <code>true</code> if the factory thinks it can support the file as a GameSystem, else <code>false</code>
		/// </returns>
		protected abstract bool CheckCanHandleFileAsGameSystem(FILE_TYPE file);

		/// <summary>
		/// Checks whether the factory thinks it can load data from the file in its paramaterised type as an Army object.
		/// </summary>
		/// <param name="file">
		/// An object of the converted <see cref="FILE_TYPE"/> to check support for
		/// </param>
		/// <returns>
		/// <code>true</code> if the factory thinks it can support the file as a Army, else <code>false</code>
		/// </returns>
		protected abstract bool CheckCanHandleFileAsArmy(FILE_TYPE file);
		
		
		public ICollection<IWarFoundryObject> CreateObjectsFromFile(FileInfo file)
		{
			return DoCreateObjectsFromFile(GetFileAsSupportedType(file));
		}
		
		/// <summary>
		/// Reads the data from the supplied converted <see cref="FILE_TYPE"/> object and returns it as a collection of loadable objects.
		/// </summary>
		/// <param name="file">
		/// An object of the converted <see cref="FILE_TYPE"/> for the file to load data from
		/// </param>
		/// <returns>
		/// A <see cref="ICollection`1"/> of <see cref="IWarFoundryObject"/>s that were loaded from the file object
		/// </returns>
		protected abstract ICollection<IWarFoundryObject> DoCreateObjectsFromFile(FILE_TYPE file);
	}
}