Exemple #1
0
        private void UnpackPackage(PackageDescription package)
        {
            string cachefile = GetCacheFileName(package);

            try
            {
                using (SHA256 hash = SHA256.Create())
                {
                    using (var fs = new FileStream(cachefile, FileMode.Open, FileAccess.Read))
                    {
                        hash.ComputeHash(fs);
                    }

                    if (!IsHashEqual(hash.Hash, package.Hash))
                    {
                        throw new InvalidPackageHashException("Package " + package.Name + " is invalid");
                    }
                }
            }
            catch
            {
                File.Delete(cachefile);
                throw;
            }

            m_RwLock.AcquireWriterLock(-1);
            try
            {
                package.WriteFile(Path.Combine(InstalledPackagesPath, package.Name + ".spkg"));

                using (var fs = new FileStream(cachefile, FileMode.Open))
                {
                    using (var zip = new ZipArchive(fs))
                    {
                        foreach (ZipArchiveEntry entry in zip.Entries)
                        {
                            using (Stream i = entry.Open())
                            {
                                string targetFile = Path.Combine(InstallRootPath, entry.FullName);
                                if (DoesFileRequireReplacement(entry.FullName))
                                {
                                    if (!File.Exists(targetFile + ".delete") && File.Exists(targetFile))
                                    {
                                        try
                                        {
                                            File.Delete(targetFile);
                                        }
                                        catch
                                        {
                                            File.Move(targetFile, targetFile + ".delete");
                                        }
                                    }
                                    if (File.Exists(targetFile + ".delete"))
                                    {
                                        IsRestartRequired = true;
                                    }
                                }
                                if (File.Exists(targetFile))
                                {
                                    File.Delete(targetFile);
                                }
                                string targetDir = Path.GetFullPath(Path.Combine(targetFile, ".."));
                                if (!Directory.Exists(targetDir))
                                {
                                    Directory.CreateDirectory(targetDir);
                                }
                                using (var o = new FileStream(targetFile, FileMode.Create))
                                {
                                    i.CopyTo(o);
                                }
                            }
                        }
                    }
                }
                m_InstalledPackages[package.Name] = new PackageDescription(package);
            }
            finally
            {
                m_RwLock.ReleaseWriterLock();
            }
        }