The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.9KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2015 - ROLI Ltd.
  5. Permission is granted to use this software under the terms of either:
  6. a) the GPL v2 (or any later version)
  7. b) the Affero GPL v3
  8. Details of these licenses can be found at: www.gnu.org/licenses
  9. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  11. A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  12. ------------------------------------------------------------------------------
  13. To release a closed-source product which uses JUCE, commercial licenses are
  14. available: visit www.juce.com for more information.
  15. ==============================================================================
  16. */
  17. #include "../JuceDemoHeader.h"
  18. //==============================================================================
  19. class NetworkingDemo : public Component,
  20. private Button::Listener,
  21. private TextEditor::Listener,
  22. private Thread
  23. {
  24. public:
  25. NetworkingDemo()
  26. : Thread ("Network Demo"),
  27. resultsBox (resultsDocument, nullptr)
  28. {
  29. setOpaque (true);
  30. addAndMakeVisible (urlBox);
  31. urlBox.setText ("https://www.google.com");
  32. urlBox.addListener (this);
  33. addAndMakeVisible (fetchButton);
  34. fetchButton.setButtonText ("Download URL Contents");
  35. fetchButton.addListener (this);
  36. addAndMakeVisible (resultsBox);
  37. }
  38. void paint (Graphics& g) override
  39. {
  40. fillStandardDemoBackground (g);
  41. }
  42. void resized() override
  43. {
  44. Rectangle<int> area (getLocalBounds());
  45. {
  46. Rectangle<int> topArea (area.removeFromTop (40));
  47. fetchButton.setBounds (topArea.removeFromRight (180).reduced (8));
  48. urlBox.setBounds (topArea.reduced (8));
  49. }
  50. resultsBox.setBounds (area.reduced (8));
  51. }
  52. void run() override
  53. {
  54. String result (getResultText (urlBox.getText()));
  55. MessageManagerLock mml (this);
  56. if (mml.lockWasGained())
  57. resultsBox.loadContent (result);
  58. }
  59. String getResultText (const URL& url)
  60. {
  61. StringPairArray responseHeaders;
  62. int statusCode = 0;
  63. ScopedPointer<InputStream> stream (url.createInputStream (false, nullptr, nullptr, String(),
  64. 10000, // timeout in millisecs
  65. &responseHeaders, &statusCode));
  66. if (stream != nullptr)
  67. return (statusCode != 0 ? "Status code: " + String (statusCode) + newLine : String())
  68. + "Response headers: " + newLine
  69. + responseHeaders.getDescription() + newLine
  70. + "----------------------------------------------------" + newLine
  71. + stream->readEntireStreamAsString();
  72. if (statusCode != 0)
  73. return "Failed to connect, status code = " + String (statusCode);
  74. return "Failed to connect!";
  75. }
  76. private:
  77. TextEditor urlBox;
  78. TextButton fetchButton;
  79. CodeDocument resultsDocument;
  80. CodeEditorComponent resultsBox;
  81. void buttonClicked (Button* button) override
  82. {
  83. if (button == &fetchButton)
  84. startThread();
  85. }
  86. void textEditorReturnKeyPressed (TextEditor&) override
  87. {
  88. fetchButton.triggerClick();
  89. }
  90. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NetworkingDemo)
  91. };
  92. // This static object will register this demo type in a global list of demos..
  93. static JuceDemoType<NetworkingDemo> demo ("40 HTTP");