Пример #1
0
        public IActionResult GetDeviceScreenshotById(string id)
        {
            LogRequestToDebug();

            var device = _devicesRepository.Find(id);

            if (device == null)
            {
                return(NotFoundExtension("Device not found in database."));
            }

            if (device.Status == DeviceStatus.Offline || device.Status == DeviceStatus.FailedToInitialize ||
                device.Status == DeviceStatus.LockedOffline)
            {
                try
                {
                    return(_screenshotService.LoadScreenshotForOfflineDevice(device));
                }
                catch (Exception e)
                {
                    return(StatusCodeExtension(500, e.Message));
                }
            }

            var start = DateTime.Now;

            while (ScreenshotLocked.Contains(device.Id))
            {
                if (start + TimeSpan.FromMilliseconds(ScreenshotLockedTimeout) <= DateTime.Now)
                {
                    throw new TimeoutException($"Too many requests for screenshots on device {device.Id}.");
                }

                Thread.Sleep(100);
            }

            ScreenshotLocked.Add(device.Id);

            try
            {
                switch (device.Type)
                {
                case DeviceType.IOS:
                    return(_screenshotService.TakeScreenshotIosDevice(device));

                case DeviceType.Android:
                    return(_screenshotService.TakeScreenshotAndroidDevice(device));

                case DeviceType.Unspecified:
                    return(NotFoundExtension($"{device.Type} devices are not supported for screenshots."));

                default:
                    return(NotFoundExtension($"{device.Type} devices are not supported for screenshots."));
                }
            }
            catch (Exception e)
            {
                return(StatusCodeExtension(500, e.Message));
            }
            finally
            {
                ScreenshotLocked.Remove(device.Id);
            }
        }