public object GetLaunchPacket() { var baseUrl = GlobalAttributesCache.Value("PublicApplicationRoot"); var site = MobileHelper.GetCurrentApplicationSite(); var additionalSettings = site?.AdditionalSettings.FromJsonOrNull <AdditionalSiteSettings>(); var person = GetPerson(); var deviceData = Request.GetHeader("X-Rock-DeviceData").FromJsonOrNull <DeviceData>(); if (additionalSettings == null || !additionalSettings.LastDeploymentDate.HasValue) { return(NotFound()); } var launchPacket = new LaunchPackage { LatestVersionId = ( int )(additionalSettings.LastDeploymentDate.Value.ToJavascriptMilliseconds() / 1000), IsSiteAdministrator = site.IsAuthorized(Authorization.EDIT, person) }; if (deviceData.DeviceType == DeviceType.Phone) { launchPacket.LatestVersionSettingsUrl = additionalSettings.PhoneUpdatePackageUrl; } else if (deviceData.DeviceType == DeviceType.Tablet) { launchPacket.LatestVersionSettingsUrl = additionalSettings.TabletUpdatePackageUrl; } else { return(NotFound()); } if (person != null) { var principal = ControllerContext.Request.GetUserPrincipal(); launchPacket.CurrentPerson = MobileHelper.GetMobilePerson(person, site); launchPacket.CurrentPerson.AuthToken = MobileHelper.GetAuthenticationToken(principal.Identity.Name); } return(launchPacket); }
private void Launch(object state) { try { using (LaunchPackage package = (LaunchPackage)state) { try { string workDir = Path.GetDirectoryName(_RequestHandlerFullPath); string exeFile = _RequestHandlerFullPath; string arguments = String.Format("/env:{0} /hiid:{1} /reqid:{2}", EnvHelper.EnvName(package.Client.ClientInfo.ConfigEnv), HostInstance ?? "Default", package.Request.RequestId); ProcessStartInfo psi = new ProcessStartInfo(exeFile, arguments); psi.WorkingDirectory = workDir; psi.UseShellExecute = true; // default - no io redir psi.ErrorDialog = true; psi.WindowStyle = ProcessWindowStyle.Normal; //psi.UserName = xxx; //psi.Password = xxx; Process p = new Process(); p.StartInfo = psi; if (p.Start()) { Logger.LogDebug("{0} Started: {1} {2}", package.Request.RequestId, exeFile, arguments); while (!p.WaitForExit(5000)) // 5 seconds { Logger.LogDebug("{0} Running...", package.Request.RequestId); } // exit codes: // 1 success // 0 failed (exception was published) // -1 catastrophic failure (logged to local file) // -2 catastrophic failure (logged to console only) int exitCode = p.ExitCode; TimeSpan duration = p.ExitTime - p.StartTime; Logger.LogDebug("{0} Stopped: ExitCode={1} (Duration={2})", package.Request.RequestId, exitCode, duration); if (exitCode < 0) { // request handler failed to publish faulted request status - so we do it here throw new ApplicationException(String.Format("Request '{0}' terminated abnormally: {1}", package.Request.RequestId, exitCode)); } } else { throw new ApplicationException(String.Format("Request '{0}' failed to start.", package.Request.RequestId)); } } catch (Exception ex) { Logger.Log(ex); package.Request.Status = RequestStatusEnum.Faulted; package.Request.FaultDetail = new ExceptionDetail(ex); PublishWorkerResponse(package.Client, package.Request, HostInstance); } } } finally { Interlocked.Decrement(ref _HandlersExecuting); Interlocked.Increment(ref _HandlersAvailable); Interlocked.Increment(ref _AvailabilityChangeCount); _EventQueue.Dispatch(null); } }