Beispiel #1
0
        /// <summary>
        /// Updates the application.
        /// </summary>
        /// <param name="dsd">The DSD.</param>
        private static void UpdateApplication(LicensingDetails dsd)
        {
            string folder;
            string localfile;
            //we need the exe file for later execution
            var    exefile = "";
            string exefolder;

            try
            {
                //0: reset current directory in case it was changed
                Directory.SetCurrentDirectory(Application.StartupPath);
                //1: Get the online files
                folder = _sd.AppName + "v" + DateTime.Now.Ticks;
                Directory.CreateDirectory(folder);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while creating the temporary folder\n:" + ex);
                return;
            }

            try
            {
                var client = new WebClient();
                localfile = dsd.FileLocation.Substring(dsd.FileLocation.LastIndexOf('/') + 1);
                client.DownloadFile(dsd.FileLocation, localfile);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while downloading new files\n:" + ex);
                return;
            }

            try
            {
                var          myname = AppDomain.CurrentDomain.FriendlyName;
                const string vshost = ".vshost.";
                //remove .vshost for testing
                if (myname.Contains(vshost))
                {
                    myname = myname.Replace(vshost, ".");
                }

                //2.1 unpack
                ZipExtras.ExtractZipFile(localfile, folder);

                //2.2 find exe
                foreach (var f in DirectoryExtras.GetFilesRecursive(folder))
                {
                    if (f.Contains(".exe"))
                    {
                        exefile = f;
                    }

                    if (f.EndsWith(myname))
                    {
                        break;
                    }
                }

                const string br = "\\";
                exefolder = "";
                //ignore everything above this dir
                while (exefile.Length > 0)
                {
                    var c = StringExtras.ContainsSubStringCount(exefile, br);
                    if (c > 0)
                    {
                        var s = exefile.Substring(0, exefile.IndexOf(br, StringComparison.Ordinal));
                        exefolder += s + br;
                        exefile    = exefile.Substring(exefile.IndexOf(br, StringComparison.Ordinal) + 1);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while unzipping new files\n:" + ex);
                return;
            }

            //move folder/* to the local dir
            //delete the zip file
            //delete folder remnants
            //start the exefile we found before

            var operations = "move /Y \"" + exefolder + "\"\\* . " +
                             "& del /Q \"" + localfile + "\" " +
                             "& rmdir /Q /S \"" + folder + "\" " +
                             "& start \"\" \"" + exefile + "\" ";

            RunCommands(operations);

            //4: Kill process
            Application.Exit();
        }
        /// <summary>
        /// perform the merging of a vanilla df zip file, a mod zip file, an output dir, and whether to merge save and init dirs
        /// </summary>
        /// <param name="vanilla">vanilla df zip file</param>
        /// <param name="mod">mod df zip file</param>
        /// <param name="realoutput">output dir</param>
        /// <param name="mergesave">whether to persist save dir from orig output dir</param>
        /// <param name="mergeinit">whether to persist init dir from orig output dir</param>
        /// <param name="sf">a delegate to change status text</param>
        public static bool MergeOp(String vanilla, String mod, String realoutput, bool mergesave, bool mergeinit, ChangeStatusTextDel sf = null)
        {
            string vantemp = Directory.GetCurrentDirectory() + "\\vanillatemp";
            string modtemp = Directory.GetCurrentDirectory() + "\\modtemp";

            const string raw      = "\\raw";
            const string art      = "\\data\\art";
            const string init     = "\\data\\init\\init.txt";
            const string initd    = "\\data\\init\\d_init.txt";
            const string datainot = "\\data\\init";
            const string dsave    = "\\data\\save";

            string outputtemp     = Directory.GetCurrentDirectory() + "\\df";
            string outputtempsave = outputtemp + dsave;
            string outputtempinit = outputtemp + datainot;
            string outputinit     = outputtemp + init;
            string outputdinit    = outputtemp + initd;

            string realsavedir  = realoutput + dsave;
            string realsaveinit = realoutput + datainot;

            string modinit  = modtemp + init;
            string moddinit = modtemp + init;

            //delete temps if already exist
            FileExtras.DeleteDirectory(vantemp);
            FileExtras.DeleteDirectory(modtemp);
            FileExtras.DeleteDirectory(outputtemp);

            ChangeStatusText(sf, Resources.start_exct_van_zip);
            try
            {
                //unpack vanilla
                ZipExtras.ExtractZipFile(vanilla, vantemp);
                ChangeStatusText(sf, Resources.fin_exct_van_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_van_zip + ex);
                return(false);
            }

            try
            {
                //unpack mod
                ZipExtras.ExtractZipFile(mod, modtemp);
                ChangeStatusText(sf, Resources.fin_exct_mod_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_mod_zip + ex);
                return(false);
            }

            try
            {
                //move vanilla
                FileExtras.MergeDirectories(outputtemp, vantemp);

                //delete raw and art
                FileExtras.DeleteDirectory(outputtemp + raw);
                FileExtras.DeleteDirectory(outputtemp + art);

                //move mod raw and art
                FileExtras.MergeDirectories(outputtemp + raw, modtemp + raw);
                FileExtras.MergeDirectories(outputtemp + art, modtemp + art);
                //copy init/init.d
                if (File.Exists(modinit))
                {
                    File.Copy(modinit, outputinit, true);
                }
                if (File.Exists(moddinit))
                {
                    File.Copy(moddinit, outputdinit, true);
                }

                ChangeStatusText(sf, Resources.fin_merge);

                //get save games if required
                if (mergesave && Directory.Exists(realsavedir))
                {
                    FileExtras.CreateDirectory(outputtempsave);
                    FileExtras.MergeDirectories(outputtempsave, realsavedir);
                }

                //get init dir if required
                if (mergeinit && Directory.Exists(realsaveinit))
                {
                    FileExtras.MergeDirectories(outputtempinit, realsaveinit);
                }

                //delete temps
                FileExtras.DeleteDirectory(vantemp);
                FileExtras.DeleteDirectory(modtemp);

                //move temp to real
                FileExtras.DeleteDirectory(realoutput);
                FileExtras.MergeDirectories(realoutput, outputtemp);

                FileExtras.DeleteDirectory(outputtemp);
                ChangeStatusText(sf, Resources.ready);
            }

            catch (Exception ex)
            {
                MessageBox.Show("An error occured:" + ex);
                return(false);
            }

            return(true);
        }