/// <summary> /// Main entry point for handling an install operation /// </summary> /// <param name="portal">DevicePortal reference for communicating with the device.</param> /// <param name="parameters">Parsed command line parameters.</param> public static void HandleOperation(DevicePortal portal, ParameterHelper parameters) { if (parameters.HasFlag(ParameterHelper.HelpFlag)) { Console.WriteLine(XblInstallUsageMessage); return; } InstallOperation operation = new InstallOperation(portal); portal.AppInstallStatus += operation.AppInstallStatusHandler; if (parameters.HasFlag(ParameterHelper.VerboseFlag)) { operation.verbose = true; } List <string> dependencies = new List <string>(); // Build up the list of dependencies. if (parameters.HasParameter("depend")) { dependencies.AddRange(parameters.GetParameterValue("depend").Split(';')); } string certificate = parameters.GetParameterValue("cer"); string appxFile = parameters.GetParameterValue("appx"); string folderPath = parameters.GetParameterValue("folder"); string registerPath = parameters.GetParameterValue("register"); try { if (!string.IsNullOrEmpty(appxFile)) { operation.mreAppInstall.Reset(); Task installTask = portal.InstallApplicationAsync(null, appxFile, dependencies, certificate); operation.mreAppInstall.WaitOne(); if (operation.installResults.Status == ApplicationInstallStatus.Completed) { Console.WriteLine("Install complete."); } else { Console.WriteLine("Install failed in phase {0}. {1}", operation.installResults.Phase, operation.installResults.Message); } } else if (!string.IsNullOrEmpty(folderPath)) { // Install all dependencies one at a time (loose folder doesn't handle dependencies well). foreach (string dependency in dependencies) { operation.mreAppInstall.Reset(); Task installTask = portal.InstallApplicationAsync(null, dependency, new List <string>()); operation.mreAppInstall.WaitOne(); if (operation.installResults.Status != ApplicationInstallStatus.Completed) { Console.WriteLine("Deploy failed during dependency installation. {0}", operation.installResults.Message); return; } } if (!Directory.Exists(folderPath)) { Console.WriteLine("Failed to find provided loose folder."); Console.WriteLine(); Console.WriteLine(XblInstallUsageMessage); return; } // Remove any trailing slash if (folderPath.EndsWith("\\")) { folderPath = folderPath.Remove(folderPath.Length - 1); } string destinationFolderName = parameters.GetParameterValue("destfoldername"); if (string.IsNullOrEmpty(destinationFolderName)) { // Get just the folder name string folderName = folderPath.Substring(folderPath.LastIndexOf('\\') + 1); destinationFolderName = folderName; } string transferType = parameters.GetParameterValue("transfer"); if (string.IsNullOrEmpty(transferType) || string.Equals(transferType, "smb", StringComparison.OrdinalIgnoreCase)) { string shareName = Path.Combine("\\\\", parameters.GetParameterValue(ParameterHelper.IpOrHostname), "DevelopmentFiles"); string destinationFolder = Path.Combine(shareName, "LooseApps", destinationFolderName); try { operation.CopyDirectory(folderPath, destinationFolder); } catch (IOException e) { if (e.HResult == ErrorLogonFailureHresult) { Task <SmbInfo> smbTask = portal.GetSmbShareInfoAsync(); smbTask.Wait(); // Set the username/password for accessing the share. NetworkShare.DisconnectFromShare(shareName, true); int connected = NetworkShare.ConnectToShare(shareName, smbTask.Result.Username, smbTask.Result.Password); if (connected != 0) { Console.WriteLine(string.Format("Failed to connect to the network share: {0}", connected)); return; } operation.CopyDirectory(folderPath, destinationFolder); NetworkShare.DisconnectFromShare(shareName, false); } else { Console.WriteLine(string.Format("Unexpected exception encountered: {0}", e.Message)); return; } } } else if (string.Equals(transferType, "http", StringComparison.OrdinalIgnoreCase)) { operation.UploadDirectoryOverHttp(folderPath, destinationFolderName); } else { Console.WriteLine(string.Format("Unexpected transfer type received: {0}. Expecting one of SMB or HTTP.", transferType)); return; } Task registerTask = portal.RegisterApplicationAsync(destinationFolderName); registerTask.Wait(); Console.WriteLine("Install complete."); } else if (!string.IsNullOrEmpty(registerPath)) { Task registerTask = portal.RegisterApplicationAsync(registerPath); registerTask.Wait(); Console.WriteLine("Registration complete."); } else { Console.WriteLine("Must provide an appx package, loose folder, or path to register."); Console.WriteLine(); Console.WriteLine(XblInstallUsageMessage); return; } } catch (AggregateException e) { if (e.InnerException is DevicePortalException) { DevicePortalException innerException = e.InnerException as DevicePortalException; Console.WriteLine(string.Format("Exception encountered: {0}, hr = 0x{1:X} : {2}", innerException.StatusCode, innerException.HResult, innerException.Reason)); } else if (e.InnerException is OperationCanceledException) { Console.WriteLine("The operation was cancelled."); } else { Console.WriteLine(string.Format("Unexpected exception encountered: {0}", e.Message)); } return; } }