Mercurial > repos > IBDev-IBBoard.WarFoundry.API
diff API/Factories/AbstractWarFoundryFactory.cs @ 337:3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
no-open-ticket
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 03 Apr 2011 18:50:32 +0000 |
parents | |
children | 1ed2f3ab5e35 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API/Factories/AbstractWarFoundryFactory.cs Sun Apr 03 18:50:32 2011 +0000 @@ -0,0 +1,181 @@ +// 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 event SingleArgMethodInvoker<GameSystem> GameSystemLoaded; + + public event SingleArgMethodInvoker<Race> RaceLoaded; + + public event SingleArgMethodInvoker<Army> ArmyLoaded; + + 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. + /// In addition, the method fires the appropriate XxxLoaded event for each object created for asynchronous use. + /// </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); + + protected void OnGameSystemLoaded(GameSystem system) + { + if (GameSystemLoaded != null) + { + GameSystemLoaded(system); + } + } + + protected void OnRaceLoaded(Race race) + { + if (RaceLoaded != null) + { + RaceLoaded(race); + } + } + + protected void OnArmyLoaded(Army army) + { + if (ArmyLoaded != null) + { + ArmyLoaded(army); + } + } + } +}