/// <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);
}
}
}