public bool CompilePackage(string PackageFilename, PKGCompilerArgs Args, out string ErrorText)
        {
            string data = "";

            UpdateText("Loading data");
            try
            {
                data = File.ReadAllText(PackageFilename, Encoding.UTF8);
            }
            catch (Exception ee)
            {
                ErrorText = "Cannot read the file: " + ee.Message;
                return(false);
            }

            PKGRootData r;

            try
            {
                r = JsonConvert.DeserializeObject <PKGRootData>(data);
                if (r.HeaderID != "FoxPackageScriptV1")
                {
                    ErrorText = "The file is not a valid Package Script";
                    return(false);
                }
            }
            catch (Exception ee)
            {
                Debug.WriteLine(ee.ToString());
                ErrorText = "The file cannot be parsed.";
                return(false);
            }

            bool res = CheckScript(r, out ErrorText);

            if (res == false)
            {
                return(false);
            }

            return(CompilePackage(r, Args, out ErrorText));
        }
        public bool CompilePackage(PKGRootData Package, PKGCompilerArgs Args, out string ErrorText)
        {
            try
            {
                ErrorText    = "";
                AbortProcess = false;
                UpdateText("Preparing data");

                PKGRootData ZipDef = new PKGRootData();
                ZipDef.Description = Package.Description;
                ZipDef.HeaderID    = Package.HeaderID;
                ZipDef.Outputfile  = "";
                ZipDef.PackageID   = Package.PackageID;
                ZipDef.Script      = Package.Script;
                ZipDef.Title       = Package.Title;
                ZipDef.VersionID   = Package.VersionID;
                ZipDef.Folders     = new List <PKGFolder>(); //not needed here
                ZipDef.Files       = new List <PKGFile>();
                ZipDef.Signatures  = new Dictionary <string, List <byte[]> >();

                using (Stream filestream = File.Open(Package.Outputfile, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    using (ZipArchive ZipFile = new ZipArchive(filestream, ZipArchiveMode.Create, true, Encoding.UTF8))
                    {
                        ZipArchiveEntry entry;
                        byte[]          signature;

                        foreach (PKGFile file in Package.Files)
                        {
                            if (AbortProcess == true)
                            {
                                filestream.Close();
                                ErrorText = "Aborted";
                                return(false);
                            }

                            UpdateText("Compressing " + file.SrcFile);

                            PKGFile inzipfile = new PKGFile();
                            inzipfile.ID              = file.ID;
                            inzipfile.SrcFile         = Guid.NewGuid().ToString();
                            inzipfile.FileName        = file.FileName;
                            inzipfile.FolderName      = file.FolderName;
                            inzipfile.KeepInMeta      = file.KeepInMeta;
                            inzipfile.InstallThisFile = file.InstallThisFile;

                            Stream FileStream = File.Open(file.SrcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                            entry = ZipFile.CreateEntry(inzipfile.SrcFile, CompressionLevel.Optimal);
                            using (Stream ZipStream = entry.Open())
                            {
                                FileStream.CopyTo(ZipStream);
                            }
                            FileStream.Seek(0, SeekOrigin.Begin);

                            if (AbortProcess == true)
                            {
                                filestream.Close();
                                ErrorText = "Aborted";
                                return(false);
                            }

                            UpdateText("Signing " + file.SrcFile);

                            signature = null;
                            if (Args.UseExtSign == false)
                            {
                                signature = Certificates.Sign(FileStream, Args.SignCert, Args.SignLocation);
                            }
                            else
                            {
                                SmartCards sm = new SmartCards();
                                signature = sm.SignData(Args.SignExtCert, FileStream, Args.PIN);
                            }
                            FileStream.Close();
                            if (signature == null)
                            {
                                ErrorText = "Signing failed";
                                filestream.Close();
                                return(false);
                            }

                            UpdateText("Storing Signature " + file.SrcFile);

                            ZipDef.Files.Add(inzipfile);
                            ZipDef.Signatures.Add(inzipfile.SrcFile.ToLower(), new List <byte[]> {
                                signature
                            });
                        }

                        UpdateText("Finalizing");

                        byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(ZipDef, Formatting.None));
                        signature = null;
                        if (Args.UseExtSign == false)
                        {
                            signature = Certificates.Sign(data, Args.SignCert, Args.SignLocation);
                        }
                        else
                        {
                            SmartCards sm = new SmartCards();
                            signature = sm.SignData(Args.SignExtCert, data, Args.PIN);
                        }
                        entry = ZipFile.CreateEntry("Script.json", CompressionLevel.Optimal);
                        using (Stream ZipStream = entry.Open())
                        {
                            ZipStream.Write(data, 0, data.Length);
                        }

                        entry = ZipFile.CreateEntry("Script.json.sign", CompressionLevel.Optimal);
                        using (Stream ZipStream = entry.Open())
                        {
                            ZipStream.Write(signature, 0, signature.Length);
                        }
                        return(true);
                    }
                }
            }
            catch (Exception ee)
            {
                Debug.WriteLine(ee.ToString());
                ErrorText = "SEH Error";
                return(false);
            }
        }