예제 #1
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     // We could probably get away with using the server thread here, but the code interacts quite a bit with the
     // current book and other state.
     server.RegisterEndpointHandler("pageTemplates", HandleTemplatesRequest, true);
     // Being on the UI thread causes a deadlock on Linux/Mono.  See https://silbloom.myjetbrains.com/youtrack/issue/BL-3818.
     server.RegisterEndpointHandler("pageTemplateThumbnail", HandleThumbnailRequest, false);
 }
예제 #2
0
        public static string GetString(EnhancedImageServer server, string endPoint, string query = "",
                                       ContentType returnType = ContentType.Text, EndpointHandler handler = null, string endOfUrlForTest = null)
        {
            if (handler != null)
            {
                server.RegisterEndpointHandler(endPoint, handler, true);
            }
            server.StartListening();
            var client = new WebClientWithTimeout
            {
                Timeout = 3000,
            };

            client.Headers[HttpRequestHeader.ContentType] = returnType == ContentType.Text ? "text/plain" : "application/json";

            if (endOfUrlForTest != null)
            {
                return(client.DownloadString(ServerBase.ServerUrlWithBloomPrefixEndingInSlash + "api/" + endOfUrlForTest));
            }
            else
            {
                if (!string.IsNullOrEmpty(query))
                {
                    query = "?" + query;
                }
                return(client.DownloadString(ServerBase.ServerUrlWithBloomPrefixEndingInSlash + "api/" + endPoint + query));
            }
        }
예제 #3
0
 public static void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("help/.*", (request) =>
     {
         var topic = request.LocalPath().Replace("api/help", "");
         Show(Application.OpenForms.Cast <Form>().Last(), topic);
         //if this is called from a simple html anchor, we don't want the browser to do anything
         request.ExternalLinkSucceeded();
     }, true);             // opening a form, definitely UI thread
 }
예제 #4
0
 public static void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("help/.*", (request) =>
     {
         var topic = request.LocalPath().ToLowerInvariant().Replace("api/help", "");
         Show(Application.OpenForms.Cast <Form>().Last(), topic);
         //if this is called from a simple html anchor, we don't want the browser to do anything
         request.SucceededDoNotNavigate();
     });
 }
예제 #5
0
        public void RegisterWithServer(EnhancedImageServer server)
        {
            server.RegisterEndpointHandler("audio/startRecord", HandleStartRecording);
            server.RegisterEndpointHandler("audio/endRecord", HandleEndRecord);
            server.RegisterEndpointHandler("audio/enableListenButton", HandleEnableListenButton);
            server.RegisterEndpointHandler("audio/deleteSegment", HandleDeleteSegment);
            server.RegisterEndpointHandler("audio/currentRecordingDevice", HandleCurrentRecordingDevice);
            server.RegisterEndpointHandler("audio/checkForSegment", HandleCheckForSegment);
            server.RegisterEndpointHandler("audio/devices", HandleAudioDevices);

            Debug.Assert(ServerBase.portForHttp > 0, "Need the server to be listening before this can be registered (BL-3337).");
        }
예제 #6
0
        public void RegisterWithServer(EnhancedImageServer server)
        {
            // I don't know for sure that these need to be on the UI thread, but that was the old default so keeping it for safety.
            server.RegisterEndpointHandler("audio/startRecord", HandleStartRecording, true);
            server.RegisterEndpointHandler("audio/endRecord", HandleEndRecord, true);
            server.RegisterEndpointHandler("audio/enableListenButton", HandleEnableListenButton, true);
            server.RegisterEndpointHandler("audio/deleteSegment", HandleDeleteSegment, true);
            server.RegisterEndpointHandler("audio/currentRecordingDevice", HandleCurrentRecordingDevice, true);
            server.RegisterEndpointHandler("audio/checkForSegment", HandleCheckForSegment, true);
            server.RegisterEndpointHandler("audio/devices", HandleAudioDevices, true);

            Debug.Assert(ServerBase.portForHttp > 0, "Need the server to be listening before this can be registered (BL-3337).");
        }
예제 #7
0
        public static string PostString(EnhancedImageServer server, string endPoint, string data, ContentType returnType,
                                        EndpointHandler handler = null)
        {
            if (handler != null)
            {
                server.RegisterEndpointHandler(endPoint, handler, true);
            }
            server.StartListening();
            var client = new WebClientWithTimeout
            {
                Timeout = 3000
            };

            client.Headers[HttpRequestHeader.ContentType] = returnType == ContentType.Text ? "text/plain" : "application/json";

            return(client.UploadString(ServerBase.ServerUrlWithBloomPrefixEndingInSlash + "api/" + endPoint, "POST", data));
        }
예제 #8
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("keyboarding/useLongpress", (ApiRequest request) =>
     {
         try
         {
             //detect if some keyboarding system is active, e.g. KeyMan. If it is, don't enable LongPress
             var form = Application.OpenForms.Cast <Form>().Last();
             request.ReplyWithText(SIL.Windows.Forms.Keyboarding.KeyboardController.IsFormUsingInputProcessor(form)
                                         ? "false"
                                         : "true");
         }
         catch (Exception error)
         {
             request.ReplyWithText("true");                     // This is arbitrary. I don't know if it's better to assume keyman, or not.
             NonFatalProblem.Report(ModalIf.None, PassiveIf.All, "Error checking for keyman", "", error);
         }
     }, handleOnUiThread: false);
 }
예제 #9
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("addPage", HandleAddPage);
     server.RegisterEndpointHandler("changeLayout", HandleChangeLayout);
 }
예제 #10
0
 public static void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("toolbox/settings", HandleSettings, false);
 }
예제 #11
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     // These are both just retrieving information about files, apart from using _bookSelection.CurrentSelection.FolderPath.
     server.RegisterEndpointHandler("image/info", HandleImageInfo, false);
     server.RegisterEndpointHandler("image/imageCreditsForWholeBook", HandleCopyImageCreditsForWholeBook, false);
 }
예제 #12
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("image/info", HandleImageInfo);
     server.RegisterEndpointHandler("image/imageCreditsForWholeBook", HandleCopyImageCreditsForWholeBook);
 }
        public void RegisterWithServer(EnhancedImageServer server)
        {
            // This is just for storing the user preference of method
            // If we had a couple of these, we could just have a generic preferences api
            // that browser-side code could use.
            server.RegisterEndpointHandler(kApiUrlPart + "method", request =>
            {
                if (request.HttpMethod == HttpMethods.Get)
                {
                    var method = Settings.Default.PublishAndroidMethod;
                    if (!new string[] { "wifi", "usb", "file" }.Contains(method))
                    {
                        method = "wifi";
                    }
                    request.ReplyWithText(method);
                }
                else                 // post
                {
                    Settings.Default.PublishAndroidMethod = request.RequiredPostString();
#if __MonoCS__
                    if (Settings.Default.PublishAndroidMethod == "usb")
                    {
                        _progress.MessageWithoutLocalizing("Sorry, this method is not available on Linux yet.");
                    }
#endif
                    request.PostSucceeded();
                }
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "backColor", request =>
            {
                if (request.HttpMethod == HttpMethods.Get)
                {
                    if (request.CurrentBook != _coverColorSourceBook)
                    {
                        _coverColorSourceBook = request.CurrentBook;
                        TryCssColorFromString(request.CurrentBook?.GetCoverColor() ?? "", out _thumbnailBackgroundColor);
                    }
                    request.ReplyWithText(ToCssColorString(_thumbnailBackgroundColor));
                }
                else                 // post
                {
                    // ignore invalid colors (very common while user is editing hex)
                    Color newColor;
                    var newColorAsString = request.RequiredPostString();
                    if (TryCssColorFromString(newColorAsString, out newColor))
                    {
                        _thumbnailBackgroundColor = newColor;
                        request.CurrentBook.SetCoverColor(newColorAsString);
                    }
                    request.PostSucceeded();
                }
            }, true);


            server.RegisterEndpointHandler(kApiUrlPart + "photoStoryMode", request =>
            {
                if (request.HttpMethod == HttpMethods.Get)
                {
                    // this is temporary, just trying to get support for full screen pan & zoom out quickly in 4.2
                    request.ReplyWithText(request.CurrentBook.UsePhotoStoryModeInBloomReader.ToString()
                                          .ToLowerInvariant()); // "false", not "False"
                }
                else                                            // post
                {
                    request.CurrentBook.UsePhotoStoryModeInBloomReader = bool.Parse(request.RequiredPostString());
                    request.PostSucceeded();
                }
            }, true);


            server.RegisterEndpointHandler(kApiUrlPart + "thumbnail", request =>
            {
                var coverImage = request.CurrentBook.GetCoverImagePath();
                if (coverImage == null)
                {
                    request.Failed("no cover image");
                }
                else
                {
                    // We don't care as much about making it resized as making its background transparent.
                    using (var thumbnail = TempFile.CreateAndGetPathButDontMakeTheFile())
                    {
                        if (_thumbnailBackgroundColor == Color.Transparent)
                        {
                            TryCssColorFromString(request.CurrentBook?.GetCoverColor(), out _thumbnailBackgroundColor);
                        }
                        RuntimeImageProcessor.GenerateEBookThumbnail(coverImage, thumbnail.Path, 256, 256, _thumbnailBackgroundColor);
                        request.ReplyWithImage(thumbnail.Path);
                    }
                }
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "usb/start", request =>
            {
#if !__MonoCS__
                SetState("UsbStarted");
                _usbPublisher.Connect(request.CurrentBook, _thumbnailBackgroundColor);
#endif
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "usb/stop", request =>
            {
#if !__MonoCS__
                _usbPublisher.Stop();
                SetState("stopped");
#endif
                request.PostSucceeded();
            }, true);
            server.RegisterEndpointHandler(kApiUrlPart + "wifi/start", request =>
            {
                _wifiPublisher.Start(request.CurrentBook, request.CurrentCollectionSettings, _thumbnailBackgroundColor);
                SetState("ServingOnWifi");
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "wifi/stop", request =>
            {
                _wifiPublisher.Stop();
                SetState("stopped");
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "file/save", request =>
            {
                FilePublisher.Save(request.CurrentBook, _bookServer, _thumbnailBackgroundColor, _progress);
                SetState("stopped");
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "cleanup", request =>
            {
                Stop();
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "textToClipboard", request =>
            {
                PortableClipboard.SetText(request.RequiredPostString());
                request.PostSucceeded();
            }, true);
        }
예제 #14
0
        public void RegisterWithServer(EnhancedImageServer server)
        {
            server.RegisterEndpointHandler(kApiUrlPart + "requestState", request =>
            {
                if (request.HttpMethod == HttpMethods.Get)
                {
                    request.ReplyWithJson(CurrentStateString);
                }
                else                 // post
                {
                    Debug.Fail("We shouldn't ever be using the 'post' version.");
                    request.PostSucceeded();
                }
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "addPage", request =>
            {
                AddPageButton_Click();
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "duplicatePage", request =>
            {
                _editingModel.OnDuplicatePage();
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "deletePage", request =>
            {
                if (ConfirmRemovePageDialog.Confirm())
                {
                    _editingModel.OnDeletePage();
                }
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "lockBook", request =>
            {
                _editingModel.SaveNow();                 // BL-5421 lock and unlock lose typing
                _editingModel.CurrentBook.TemporarilyUnlocked = false;
                request.PostSucceeded();
                UpdateState();                 // because we aren't selecting a new page
                _editingModel.RefreshDisplayOfCurrentPage();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "unlockBook", request =>
            {
                _editingModel.SaveNow();                 // BL-5421 lock and unlock lose typing
                _editingModel.CurrentBook.TemporarilyUnlocked = true;
                request.PostSucceeded();
                UpdateState();                 // because we aren't selecting a new page
                _editingModel.RefreshDisplayOfCurrentPage();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "cleanup", request =>
            {
                SendCleanupState();
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "zoomMinus", request =>
            {
                _editingModel.AdjustPageZoom(-10);
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "zoomPlus", request =>
            {
                _editingModel.AdjustPageZoom(10);
                request.PostSucceeded();
            }, true);

            server.RegisterEndpointHandler(kApiUrlPart + "requestVideoPlaceHolder", request =>
            {
                _editingModel.RequestVideoPlaceHolder();
                request.PostSucceeded();
            }, true);
        }
예제 #15
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("pageTemplates", HandleTemplatesRequest);
     // Being on the UI thread causes a deadlock on Linux/Mono.  See https://silbloom.myjetbrains.com/youtrack/issue/BL-3818.
     server.RegisterEndpointHandler("pageTemplateThumbnail", HandleThumbnailRequest, false);
 }
예제 #16
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     // Both of these display UI, expect to require UI thread.
     server.RegisterEndpointHandler("addPage", HandleAddPage, true);
     server.RegisterEndpointHandler("changeLayout", HandleChangeLayout, true);
 }
예제 #17
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("music/ui/chooseFile", HandleRequest, true);
 }
예제 #18
0
 public void RegisterWithServer(EnhancedImageServer server)
 {
     server.RegisterEndpointHandler("toolbox/enabledTools", HandleEnabledToolsRequest, true);
 }