view API/Savers/Xml/WarFoundryXmlFileSaver.cs @ 483:4d6c92744254

Re #419: Remove assumptions of a file-based install * Embed sample files as resources * Load the sample files as a "hack"
author IBBoard <dev@ibboard.co.uk>
date Wed, 11 Jul 2012 20:39:34 +0100
parents 3c4a6403a88c
children
line wrap: on
line source

using System;
using IBBoard.WarFoundry.API.Savers;
using IBBoard.WarFoundry.API.Objects;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using IBBoard.IO;
using IBBoard.Lang;

namespace IBBoard.WarFoundry.API.Savers.Xml
{
	public class WarFoundryXmlFileSaver : IWarFoundryFileSaver
	{
		public WarFoundryXmlFileSaver()
		{
		}

		public bool Save(string path, params WarFoundryLoadedObject[] objects)
		{
			ZipOutputStream zipStream = new ZipOutputStream(new FileStream(path, FileMode.Create));
			AddFiles(zipStream, objects);
			zipStream.Close();
			return true;
		}

		public void AddFiles(ZipOutputStream zipStream, WarFoundryLoadedObject[] objects)
		{
			foreach (WarFoundryLoadedObject obj in objects)
			{
				AddFile(zipStream, obj);
			}
		}

		public void AddFile(ZipOutputStream zipStream, WarFoundryLoadedObject obj)
		{
			ZipEntry entry = new ZipEntry(GetZipEntryName(obj));
			zipStream.PutNextEntry(entry);
			byte[] bytes = GetObjectBytes(obj);
			zipStream.Write(bytes, 0, bytes.Length);
		}

		public byte[] GetObjectBytes(WarFoundryLoadedObject obj)
		{
			string xmlString = "";
			
			if (obj is GameSystem)
			{
				xmlString = GetGameSystemString((GameSystem)obj);
			}
			else if (obj is Army)
			{
				xmlString = GetArmyString((Army)obj);
			}
			
			return StringManipulation.StringToBytes(xmlString);
		}		

		public string GetGameSystemString(GameSystem obj)
		{
			return new WarFoundryXmlGameSystemSaver().CreateXmlString(obj);
		}
		
		public string GetArmyString(Army obj)
		{
			return new WarFoundryXmlArmySaver().CreateXmlString(obj);
		}

		private string GetZipEntryName(WarFoundryLoadedObject obj)
		{
			return obj.ID + GetFileExtension(obj);
		}

		public string GetFileExtension(WarFoundryLoadedObject obj)
		{
			string ext = "";
			
			if (obj is Army)
			{
				ext = ".armyx";
			}
			else if (obj is Race)
			{
				ext = ".racex";
			}
			else if (obj is GameSystem)
			{
				ext = ".systemx";
			}
			
			return ext;
		}
	}
}