Exemple #1
0
        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");
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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;
        }