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.

123 lines
3.8KB

  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 Thread
  22. {
  23. public:
  24. NetworkingDemo()
  25. : Thread ("Network Demo"),
  26. resultsBox (resultsDocument, nullptr)
  27. {
  28. setOpaque (true);
  29. addAndMakeVisible (urlBox);
  30. urlBox.setText ("http://www.google.com");
  31. addAndMakeVisible (fetchButton);
  32. fetchButton.setButtonText ("Download URL Contents");
  33. fetchButton.addListener (this);
  34. addAndMakeVisible (resultsBox);
  35. }
  36. ~NetworkingDemo()
  37. {
  38. fetchButton.removeListener (this);
  39. }
  40. void paint (Graphics& g) override
  41. {
  42. fillStandardDemoBackground (g);
  43. }
  44. void resized() override
  45. {
  46. Rectangle<int> area (getLocalBounds());
  47. {
  48. Rectangle<int> topArea (area.removeFromTop (40));
  49. fetchButton.setBounds (topArea.removeFromRight (180).reduced (8));
  50. urlBox.setBounds (topArea.reduced (8));
  51. }
  52. resultsBox.setBounds (area.reduced (8));
  53. }
  54. void run() override
  55. {
  56. String result (getResultText (urlBox.getText()));
  57. MessageManagerLock mml (this);
  58. if (mml.lockWasGained())
  59. resultsBox.loadContent (result);
  60. }
  61. String getResultText (const URL& url)
  62. {
  63. StringPairArray responseHeaders;
  64. int statusCode = 0;
  65. ScopedPointer<InputStream> stream (url.createInputStream (false, nullptr, nullptr, String(),
  66. 10000, // timeout in millisecs
  67. &responseHeaders, &statusCode));
  68. if (stream != nullptr)
  69. return (statusCode != 0 ? "Status code: " + String (statusCode) + newLine : String())
  70. + "Response headers: " + newLine
  71. + responseHeaders.getDescription() + newLine
  72. + "----------------------------------------------------" + newLine
  73. + stream->readEntireStreamAsString();
  74. if (statusCode != 0)
  75. return "Failed to connect, status code = " + String (statusCode);
  76. return "Failed to connect!";
  77. }
  78. private:
  79. TextEditor urlBox;
  80. TextButton fetchButton;
  81. CodeDocument resultsDocument;
  82. CodeEditorComponent resultsBox;
  83. void buttonClicked (Button* button) override
  84. {
  85. if (button == &fetchButton)
  86. startThread();
  87. }
  88. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NetworkingDemo)
  89. };
  90. // This static object will register this demo type in a global list of demos..
  91. static JuceDemoType<NetworkingDemo> demo ("40 HTTP");