async Task SelectFolder(StorageFolder folder) { // Dependency を初期化 await ClearDependency(); // フォルダ内を選択 IReadOnlyList <StorageFile> fileList = await folder.GetFilesAsync(); foreach (var file in fileList) { await SelectFile(file); } // Dependencies フォルダの中を選択 try { var dependenciesFolder = await folder.GetFolderAsync("Dependencies"); if (dependenciesFolder == null) { return; } var folders = await dependenciesFolder.GetFoldersAsync(); foreach (var depFolder in folders) { bool isValid = SupportedArchitectureHelper.IsValidArchitecture(depFolder.Name); if (!isValid) { continue; } var dependencies = await depFolder.GetFilesAsync(); foreach (var dependency in dependencies) { await SelectFile(dependency); } } } catch (Exception e) { Debug.WriteLine("folder not found"); } }
public async Task <(AppInfo appInfo, UploadStatusType status)> Upload(Application application) { try { // Blob にパッケージを保存 CloudBlobContainer container = blobClient.GetContainerReference(PackageContainerName); await container.CreateIfNotExistsAsync(); var appPackageName = GetAppPackageName(application); var appPackageId = $"{appPackageName}_{application.AppPackage.Name}"; CloudBlockBlob blockBlob_upload = container.GetBlockBlobReference(appPackageId); await blockBlob_upload.UploadFromFileAsync(application.AppPackage); // 依存ファイルを保存 var dependencyIds = new List <string>(); foreach (var dep in application.Dependencies) { var parent = System.IO.Directory.GetParent(dep.Path); var architecture = SupportedArchitectureHelper.StringToSupportedArchitectureType(parent.Name); var dependencyId = $"{appPackageName}_{architecture}_{dep.Name}"; dependencyIds.Add(dependencyId); CloudBlockBlob depBlockBlob = container.GetBlockBlobReference(dependencyId); await depBlockBlob.UploadFromFileAsync(dep); } // Table にバージョンごとのパッケージのデータを保存 { CloudTable table = tableClient.GetTableReference(PackageContainerName); await table.CreateIfNotExistsAsync(); // Create the TableOperation object that inserts the customer entity. var appPackageEntity = new AppPackageEntity(application.Name, application.Version.ToString()) { Developer = application.DeveloperName, Name = application.Name, AppVersion = application.Version, AppPackageId = appPackageId, DependencyIds = dependencyIds, SupportedArchitecture = application.SupportedArchitecture }; TableOperation insertOperation = TableOperation.InsertOrReplace(appPackageEntity); // Execute the insert operation. await table.ExecuteAsync(insertOperation); } var isNewlyUploaded = true; AppInfo appInfo; // appinfo テーブルにパッケージのデータを保存 { CloudTable appInfoTable = tableClient.GetTableReference(AppInfoTableName); await appInfoTable.CreateIfNotExistsAsync(); // SupportedArchitecture は最新のものに設定 var appInfoEntry = new AppInfoEntity(application.Name) { Description = "", Developer = application.DeveloperName, SupportedArchitecture = application.SupportedArchitecture }; // すでにデータが保存されているかどうかチェック TableOperation retrieveOperation = TableOperation.Retrieve <AppInfoEntity>(application.Name, ""); TableResult retrievedResult = await appInfoTable.ExecuteAsync(retrieveOperation); AppInfoEntity updateEntity = (AppInfoEntity)retrievedResult.Result; if (updateEntity == null) { appInfoEntry.CreateAt = DateTime.Now; } else { appInfoEntry.CreateAt = updateEntity.CreateAt; appInfoEntry.Description = updateEntity.Description; appInfoEntry.AppVersions = updateEntity.AppVersions; isNewlyUploaded = false; } if (appInfoEntry.AppVersions == null) { appInfoEntry.AppVersions = new HashSet <AppVersion>(); } appInfoEntry.AppVersions.Add(application.Version); TableOperation insertOperation = TableOperation.InsertOrReplace(appInfoEntry); await appInfoTable.ExecuteAsync(insertOperation); appInfo = appInfoEntry.ConvertToAppInfo(); } if (isNewlyUploaded) { return(appInfo, UploadStatusType.NewlyUploaded); } else { return(appInfo, UploadStatusType.Updated); } } catch (Exception e) { Console.WriteLine(e.ToString()); return(null, UploadStatusType.NetworkError); } }
public async Task <(Application app, DownloadErrorType error)> Download(string appName, string version, SupportedArchitectureType desirableArchitecture, bool useCache = true) { try { Application application; // Application の情報を取得 { CloudTable table = tableClient.GetTableReference(PackageContainerName); TableOperation retrieveOperation = TableOperation.Retrieve <AppPackageEntity>(appName, version); // Execute the retrieve operation. TableResult retrievedResult = await table.ExecuteAsync(retrieveOperation); // Print the phone number of the result. if (retrievedResult.Result == null) { return(null, DownloadErrorType.UnknownError); } var appPackageEntity = (AppPackageEntity)retrievedResult.Result; application = appPackageEntity.ConvertToApplication(); } // app package をダウンロード var localFolder = localCacheFolder; var appPackage = await DownloadBrob(localFolder, application.AppPackageId, useCache); if (appPackage == null) { return(null, DownloadErrorType.NetworkError); } else { application.AppPackage = appPackage; } // インストールするアプリのアーキテクチャタイプを決定 var appSupportedArchitecture = application.SupportedArchitecture; SupportedArchitectureType installArchitecture = DecideInstallArchitecture(appSupportedArchitecture, desirableArchitecture); if (installArchitecture == SupportedArchitectureType.None) { return(null, DownloadErrorType.NotSupportedArchitecture); } application.Dependencies = new List <StorageFile>(); foreach (var depId in application.DependencyIds) { // 指定されたアーキテクチャの依存ファイルのみをダウンロード var pattern = @"^.+_(\w+)_([\w\.]+)$"; var match = Regex.Match(depId, pattern); if (!match.Success) { continue; } var architectureString = match.Groups[1].Value; var depArchitecture = SupportedArchitectureHelper.StringToSupportedArchitectureType(architectureString); if (depArchitecture != installArchitecture) { continue; } var dep = await DownloadBrob(localFolder, depId, useCache); if (dep == null) { return(null, DownloadErrorType.NetworkError); } else { application.Dependencies.Add(dep); } } return(application, DownloadErrorType.NoError); } catch (Exception e) { return(null, DownloadErrorType.NetworkError); } }
private async Task UploadPackage() { Uploading = true; SuccessMessage = ""; ErrorMessage = ""; // アップロードするパッケージをクラスに格納 var version = new AppVersion() { Version1 = StringToUint(version1), Version2 = StringToUint(version2), Version3 = StringToUint(version3), Version4 = StringToUint(version4), }; var supportedArchitecture = SupportedArchitectureHelper.GetSupportedArchitectureFromAppPackage(appPackage); // アプリが対応するアーキテクチャ依存ファイルのみをアップロード var dependencies = new List <StorageFile>(); foreach (var dep in dependenciesFiles) { var parent = System.IO.Directory.GetParent(dep.Path); var depArchitecture = SupportedArchitectureHelper.StringToSupportedArchitectureType(parent.Name); if (supportedArchitecture.HasFlag(depArchitecture)) { dependencies.Add(dep); } } var uploadPackage = new Application() { DeveloperName = developerName, Name = name, Version = version, SupportedArchitecture = supportedArchitecture, AppPackage = appPackage, Dependencies = dependencies, }; var r = ResourceLoader.GetForCurrentView(); if (uploadPackage.IsValid) { var uploadingMessageTemplate = r.GetString("Upload_UploadingMessage"); var uploadingMessage = string.Format(uploadingMessageTemplate, uploadPackage.Name); var uploadedMessageTemplate = r.GetString("Upload_SuccessMessage"); var uploadedMessage = string.Format(uploadedMessageTemplate, uploadPackage.Name + " " + uploadPackage.Version.ToString()); indicator?.Hide(); indicator = new BusyIndicator() { Message = uploadingMessage }; indicator.Show(); SuccessMessage = uploadingMessage; var(appInfo, result) = await uploader.Upload(uploadPackage); switch (result) { case UploadStatusType.NewlyUploaded: var app = new AppInfoForInstall() { AppInfo = appInfo }; app.SelectLatestVersion(); NavigationService.Navigate(typeof(EditApplicationPage), app); break; case UploadStatusType.Updated: // 入力項目をクリア Version1 = ""; Version2 = ""; Version3 = ""; Version4 = ""; Name = ""; AppPackage = null; await ClearDependency(); SuccessMessage = uploadedMessage; break; case UploadStatusType.NetworkError: case UploadStatusType.UnknownError: SuccessMessage = ""; ErrorMessage = r.GetString("Upload_FailureMessage"); break; } indicator?.Hide(); } else { ErrorMessage = r.GetString("Upload_MissingMessage"); } Uploading = false; }