view api/Savers/Xml/WarFoundryXmlFileSaver.cs @ 322:3e9b0603afad

Re #338: WarFoundry.API - Save System Data * Alter visibility in GameSystem saver to allow for re-use of code * Add encoding to XML * Make use of GameSystem saver within FileSaver
author IBBoard <dev@ibboard.co.uk>
date Wed, 09 Mar 2011 20:32:08 +0000
parents 2ba88d5fb881
children 8a64b36d36b8
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);
			}
			
			return StringManipulation.StringToBytes(xmlString);
		}		
		
		public string GetGameSystemString (GameSystem obj)
		{
			return new WarFoundryXmlGameSystemSaver().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;
		}
	}
}