/// <summary> /// Unpack zipped package stream /// </summary> /// <param name="sourceUrl"></param> /// <param name="packageZip">Zipped package stream</param> /// <param name="appRootFolder"></param> /// <param name="imageResourceFolder">Folder where app image will be created</param> /// <param name="replace">Replace existing app if any</param> /// <param name="config"></param> public static void Unpack(Stream packageZip, string sourceUrl, string storeUrl, string appRootFolder, string imageResourceFolder, out DeployedConfigFile config) { lock (PackageManager.locker) { if (packageZip == null) throw new ArgumentNullException("packageZip"); if (sourceUrl == null) throw new ArgumentNullException("sourceUrl"); if (storeUrl == null) throw new ArgumentNullException("storeUrl"); if (appRootFolder == null) throw new ArgumentNullException("appRootFolder"); string createdDestinationFolder = null; try { using (ZipArchive archive = new ZipArchive(packageZip, ZipArchiveMode.Read)) { // Get Configuration PackageConfigFile packageConfig; ReadConfiguration(archive, out packageConfig); // Validate configuration ValidateConfiguration(archive, packageConfig); // Prepare to extract package string destinationFolder = Path.Combine(appRootFolder, packageConfig.Namespace); destinationFolder = Path.Combine(destinationFolder, packageConfig.Channel); destinationFolder = Path.Combine(destinationFolder, packageConfig.Version); try { if (Directory.Exists(destinationFolder)) { throw new InvalidOperationException("Application already installed.", new InvalidOperationException(string.Format("Destination folder exists, {0}", destinationFolder))); } createdDestinationFolder = Utils.CreateDirectory(destinationFolder); // Extract package archive.ExtractToDirectory(destinationFolder); string imageUri = string.Empty; // Unpack app image to starcounter admin folder UnpackAppImage(archive, packageConfig, imageResourceFolder, out imageUri); // Create app configuration file //config = new DeployedConfigFile(); CreateConfig(packageConfig, sourceUrl, storeUrl, imageUri, out config); //Uri u = new Uri(sourceUrl); //if (u.IsFile) { // config.SourceID = string.Format("{0:X8}", u.LocalPath.GetHashCode()); //} //else { // config.SourceID = u.Segments[u.Segments.Length - 1]; //} //config.SourceUrl = sourceUrl; //config.ImageUri = imageUri; // Save Application configuration string configFile = Path.Combine(destinationFolder, config.Namespace + PackageManager.deployedConfigurationFileExtention); config.Save(configFile); } catch (Exception) { if (createdDestinationFolder != null) { Directory.Delete(createdDestinationFolder, true); } throw; } } } catch (InvalidDataException e) { throw new InvalidOperationException("Failed to install package, Invalid package format", e); } catch (Exception e) { throw new InvalidOperationException("Failed to install package, " + e.Message, e); } } }