| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;namespace InABox.Core{    public delegate void ImportNotificationEvent(object sender, string message);    public delegate void ImportLogEvent(object sender, string message);    public delegate bool ImportPreProcessEvent(object sender, Dictionary<string, string> values);    public delegate bool ImportPostProcessEvent(object sender, object entity, Dictionary<string, string> values);    public delegate void ImportSaveEvent(object sender, object entity);    public delegate CoreTable ImportLoadEvent(object sender, Type type, String[] fields, String ID);        public interface IImporter    {        string[] Properties { get; }        /// <summary>        /// Represents the fields in the header of the imported file, and therefore what fields <see cref="Mappings"/> can map from.        /// These should be populated by <see cref="ReadHeader"/>.        /// </summary>        string[] Fields { get; }        bool HasHeader { get; set; }        int HeaderRow { get; set; }        /// <summary>        /// While <see cref="Fields"/> represents the fields that this importer recognises, <see cref="Mappings"/> represents how the properties of        /// the imported object are populated, so while there may be a one to one mapping from <see cref="Fields"/>, this does not have to be the case.        /// </summary>        /// <remarks>        /// These mappings must be initialised to get any data from <see cref="Import"/>.        /// </remarks>        List<ImportMapping> Mappings { get; }        IEnumerable<string> Log { get; }        event ImportNotificationEvent OnNotify;        event ImportLogEvent OnError;        event ImportLogEvent OnLog;        event ImportPreProcessEvent BeforeProcess;        event ImportPostProcessEvent AfterProcess;        event ImportSaveEvent OnSave;        event ImportLoadEvent OnLoad;        bool Open(Stream stream);        void Close();        /// <summary>        /// Import the data from the stream specified when <see cref="Open(Stream)"/> was called, using <see cref="OnSave"/> to for each line.        /// </summary>        /// <remarks>        /// This method <i>must</i> be called after <see cref="Open(Stream)"/> and <see cref="ReadHeader"/>.        ///         /// One should also have set <see cref="OnSave"/> and <see cref="OnLoad"/>.        /// </remarks>        /// <returns>The number of items imported.</returns>        int Import();        /// <summary>        /// Move to the next line in the import.        /// </summary>        /// <remarks>        /// While not all importers will need to do anything with this method, it <i>must</i> be called before <see cref="ReadLine"/>.        /// </remarks>        /// <returns><see langword="true"/> if there is still data to be read.</returns>        bool MoveNext();        /// <summary>        /// Read the header of the file, populating <see cref="Fields"/>.        /// </summary>        /// <remarks>        /// This is called regardless of whether <see cref="HasHeader"/> is <see langword="true"/>.        /// </remarks>        /// <returns><see langword="true"/> if the header was read successfully.</returns>        bool ReadHeader();        /// <summary>        /// Read the values of a line.        /// </summary>        /// <remarks>        /// The keys of the results are those present in <see cref="Fields"/>.        /// </remarks>        /// <returns>        /// A dictionary of values, where the keys are given by <see cref="Fields"/>.        /// </returns>        Dictionary<string, string> ReadLine();    }}
 |