/// <summary> /// Downloads and launches the Log file for the target application on the target device. /// </summary> /// <param name="appInfo">Optional cached <see cref="Microsoft.MixedReality.Toolkit.WindowsDevicePortal.ApplicationInfo"/>.</param> /// <returns>The path of the downloaded log file.</returns> public static async Task <string> DownloadLogFileAsync(string packageName, DeviceInfo targetDevice, ApplicationInfo appInfo = null) { Debug.Assert(!string.IsNullOrEmpty(packageName)); if (appInfo == null) { appInfo = await GetApplicationInfoAsync(packageName, targetDevice); } if (appInfo == null) { Debug.LogWarning($"Application '{packageName}' not found"); return(string.Empty); } string logFile = $"{Application.temporaryCachePath}/{targetDevice.MachineName}_{DateTime.Now.Year}{DateTime.Now.Month}{DateTime.Now.Day}{DateTime.Now.Hour}{DateTime.Now.Minute}{DateTime.Now.Second}_player.txt"; var response = await Rest.GetAsync(string.Format(FileQuery, FinalizeUrl(targetDevice.IP), appInfo.PackageFullName), targetDevice.Authorization, readResponseData : true); if (!response.Successful) { if (response.ResponseCode == 403 && await RefreshCsrfTokenAsync(targetDevice)) { return(await DownloadLogFileAsync(packageName, targetDevice)); } Debug.LogError(response.ResponseBody); return(string.Empty); } File.WriteAllText(logFile, response.ResponseBody); return(logFile); }
/// <summary> /// Uninstalls the target application on the target device /// </summary> /// <param name="appInfo">Optional cached <see cref="Microsoft.MixedReality.Toolkit.WindowsDevicePortal.ApplicationInfo"/>.</param> /// <returns>True, if uninstall was a success.</returns> public static async Task <bool> UninstallAppAsync(string packageName, DeviceInfo targetDevice, ApplicationInfo appInfo = null) { Debug.Assert(!string.IsNullOrEmpty(packageName)); if (appInfo == null) { appInfo = await GetApplicationInfoAsync(packageName, targetDevice); } if (appInfo == null) { Debug.LogWarning($"Application '{packageName}' not found"); return(false); } Debug.Log($"Attempting to uninstall {packageName} on {targetDevice.ToString()}..."); string query = $"{string.Format(InstallQuery, FinalizeUrl(targetDevice.IP))}?package={UnityWebRequest.EscapeURL(appInfo.PackageFullName)}"; var response = await Rest.DeleteAsync(query, targetDevice.Authorization, readResponseData : true); if (response.Successful) { Debug.Log($"Successfully uninstalled {packageName} on {targetDevice.ToString()}."); } else if (!response.Successful) { if (response.ResponseCode == 403 && await RefreshCsrfTokenAsync(targetDevice)) { return(await UninstallAppAsync(packageName, targetDevice)); } Debug.LogError($"Failed to uninstall {packageName} on {targetDevice.ToString()}"); Debug.LogError(response.ResponseBody); return(false); } return(true); }
/// <summary> /// Stops the target application on the target device. /// </summary> /// <param name="appInfo">Optional cached <see cref="Microsoft.MixedReality.Toolkit.WindowsDevicePortal.ApplicationInfo"/>.</param> /// <returns>true, if application was successfully stopped.</returns> public static async Task <bool> StopAppAsync(string packageName, DeviceInfo targetDevice, ApplicationInfo appInfo = null) { Debug.Assert(!string.IsNullOrEmpty(packageName)); if (appInfo == null) { appInfo = await GetApplicationInfoAsync(packageName, targetDevice); } if (appInfo == null) { Debug.LogWarning($"Application '{packageName}' not found"); return(false); } string query = $"{string.Format(AppQuery, FinalizeUrl(targetDevice.IP))}?package={UnityWebRequest.EscapeURL(appInfo.PackageFullName.EncodeTo64())}"; Response response = await Rest.DeleteAsync(query, targetDevice.Authorization, readResponseData : true); if (!response.Successful) { if (response.ResponseCode == 403 && await RefreshCsrfTokenAsync(targetDevice)) { return(await StopAppAsync(packageName, targetDevice)); } Debug.LogError(response.ResponseBody); return(false); } while (!await IsAppRunningAsync(packageName, targetDevice, appInfo)) { await new WaitForSeconds(1f); } return(true); }
/// <summary> /// Determines if the target application is running on the target device. /// </summary> /// <param name="appInfo">Optional cached <see cref="Microsoft.MixedReality.Toolkit.WindowsDevicePortal.ApplicationInfo"/>.</param> /// <returns>True, if the application is running.</returns> public static async Task <bool> IsAppRunningAsync(string packageName, DeviceInfo targetDevice, ApplicationInfo appInfo = null) { Debug.Assert(!string.IsNullOrEmpty(packageName)); if (appInfo == null) { appInfo = await GetApplicationInfoAsync(packageName, targetDevice); } if (appInfo == null) { Debug.LogError($"{packageName} not installed."); return(false); } var response = await Rest.GetAsync(string.Format(ProcessQuery, FinalizeUrl(targetDevice.IP)), targetDevice.Authorization, readResponseData : true); if (response.Successful) { var processList = JsonUtility.FromJson <ProcessList>(response.ResponseBody); for (int i = 0; i < processList.Processes.Length; ++i) { if (processList.Processes[i].ImageName.Contains(appInfo.Name)) { return(true); } } return(false); } if (response.ResponseCode == 403 && await RefreshCsrfTokenAsync(targetDevice)) { return(await IsAppRunningAsync(packageName, targetDevice, appInfo)); } Debug.LogError($"{response.ResponseBody}"); return(false); }