/// <summary>
 /// Inserts a custom transform.
 /// </summary>
 /// <param name="index"> The index to insert at.</param>
 /// <param name="plugin"> The plugin to add.</param>
 public void InsertCustomTransform(int index, FileReference plugin)
 {
     _plugins.Insert(index, plugin);
 }
        /// <summary>
        /// Get file references.
        /// </summary>
        /// <returns> An array of FileReference.</returns>
        public FileReference[] GetFileReferences()
        {
            XmlDocument document = this.ToXmlDocument();

            XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
            manager.AddNamespace("scr", "http://schemas.ecyware.com/2005/01/Ecyware-GreenBlue-ScriptingApplication");
            manager.AddNamespace("xsd","http://www.w3.org/2001/XMLSchema");
            manager.AddNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");

            string query = "//scr:FileReference";

            XmlNodeList fileReferences =
                document.SelectNodes(query, manager);

            ArrayList list = new ArrayList();
            foreach ( XmlNode node in fileReferences )
            {
                XmlNode value = node.SelectSingleNode("scr:FileName");
                string fileName = value.InnerText;
                FileReference fileRef = new FileReference(fileName);
                list.Add(fileRef);
            }

            return (FileReference[])list.ToArray(typeof(FileReference));
        }
        /// <summary>
        /// Creates a new ScriptingApplicationPackage.
        /// </summary>
        /// <param name="application"> The scripting application.</param>
        /// <param name="arguments"> The application arguments.</param>
        /// <param name="filePath"> The output file path.</param>
        /// <param name="doEncrypt"> Sets the encrypttion setting for a scripting application.</param>
        public static void CreatePackage(ScriptingApplication application, ScriptingApplicationArgs arguments, string filePath, bool doEncrypt)
        {
            try
            {
                if ( application.Header.ApplicationID == null )
                {
                    application.Header.ApplicationID = System.Guid.NewGuid().ToString();
                }

                // Get all FileReference elements.
                FileReference[] fileReferences = application.GetFileReferences();
                string applicationPath = System.Windows.Forms.Application.UserAppDataPath;

                string temp = applicationPath + "/temp/";

                if ( !Directory.Exists(temp) )
                {
                    Directory.CreateDirectory(temp);
                }

                C1.C1Zip.C1ZipFile zipFile = new C1.C1Zip.C1ZipFile();
                zipFile.Create(filePath);
                zipFile.Open(filePath);

                string argumentsFileName = application.Header.ApplicationID + "-applicationArguments.xml";

                FileReference argumentsFileReference = new FileReference(argumentsFileName);
                application.Header.ScriptingApplicationArgumentsReference = argumentsFileReference;

                // Add Scripting Application
                string xml = string.Empty;
                if ( doEncrypt )
                {
                    xml = application.Encrypt();
                }
                else
                {
                    xml = application.ToXml();
                }

                MemoryStream mem = new MemoryStream(System.Text.Encoding.UTF8.GetByteCount(xml));
                StreamWriter writer =  new StreamWriter(mem, System.Text.Encoding.UTF8);
                writer.Write(xml);
                writer.Flush();
                mem.Position = 0;
                zipFile.Entries.Add(writer.BaseStream, application.Header.ApplicationID);
                writer.Close();

                string argsXml = "None";
                if ( arguments != null )
                {
                    // Add Scripting Application Arguments
                    argsXml = arguments.ToXml();
                }
                mem = new MemoryStream(System.Text.Encoding.UTF8.GetByteCount(argsXml));
                writer =  new StreamWriter(mem, System.Text.Encoding.UTF8);
                writer.Write(argsXml);
                writer.Flush();
                mem.Position = 0;
                zipFile.Entries.Add(writer.BaseStream, argumentsFileName);
                writer.Close();

                FileReference[] customTransforms = application.GetCustomTransforms();

                // add custom transforms
                foreach ( FileReference reference in customTransforms )
                {
                    if ( File.Exists(reference.FileName) )
                    {
                        FileInfo fileInfo = new FileInfo(reference.FileName);
                        zipFile.Entries.Add(reference.FileName, fileInfo.Name);
                    }
                }

                MemoryStream stream = new MemoryStream();
                stream.Write(new byte[] {0}, 0, 1);
                zipFile.Entries.Add(stream, "CustomTransformsSeparator");
                stream.Close();

                // add file references that are not custom transforms
                foreach ( FileReference reference in fileReferences )
                {
                    if ( File.Exists(reference.FileName) )
                    {
                        FileInfo fileInfo = new FileInfo(reference.FileName);
                        zipFile.Entries.Add(reference.FileName, fileInfo.Name);
                    }
                }

                zipFile.Close();
            }
            catch
            {
                throw;
            }
        }
 /// <summary>
 /// Adds a custom transform.
 /// </summary>
 /// <param name="plugin"> The plugin to add.</param>
 public void AddCustomTransform(FileReference plugin)
 {
     _plugins.Add(plugin);
 }
        /// <summary>
        /// Loads a file reference.
        /// </summary>
        /// <param name="fileReference"> The file reference to load.</param>
        public void LoadFileReference(FileReference fileReference)
        {
            string fileName = fileReference.FileName;
            string xml = string.Empty;

            using ( FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read) )
            {
                using ( StreamReader reader = new StreamReader(fileStream) )
                {
                    xml = reader.ReadToEnd();
                }
            }

            if ( xml.Length > 0 )
            {
                bool valid = serializer.CanDeserialize(xml);
                if ( valid )
                {
                    Load(fileName);
                }
            }
        }