|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2022 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 7 End-User License
- Agreement and JUCE Privacy Policy.
-
- End User License Agreement: www.juce.com/juce-7-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- #include "../../Application/jucer_Headers.h"
- #include "jucer_VersionInfo.h"
-
-
- VersionInfo::VersionInfo (String versionIn, String releaseNotesIn, std::vector<Asset> assetsIn)
- : versionString (std::move (versionIn)),
- releaseNotes (std::move (releaseNotesIn)),
- assets (std::move (assetsIn))
- {}
-
- std::unique_ptr<VersionInfo> VersionInfo::fetchFromUpdateServer (const String& versionString)
- {
- return fetch ("tags/" + versionString);
- }
-
- std::unique_ptr<VersionInfo> VersionInfo::fetchLatestFromUpdateServer()
- {
- return fetch ("latest");
- }
-
- std::unique_ptr<InputStream> VersionInfo::createInputStreamForAsset (const Asset& asset, int& statusCode)
- {
- URL downloadUrl (asset.url);
- StringPairArray responseHeaders;
-
- return std::unique_ptr<InputStream> (downloadUrl.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)
- .withExtraHeaders ("Accept: application/octet-stream")
- .withConnectionTimeoutMs (5000)
- .withResponseHeaders (&responseHeaders)
- .withStatusCode (&statusCode)
- .withNumRedirectsToFollow (1)));
- }
-
- bool VersionInfo::isNewerVersionThanCurrent()
- {
- jassert (versionString.isNotEmpty());
-
- auto currentTokens = StringArray::fromTokens (ProjectInfo::versionString, ".", {});
- auto thisTokens = StringArray::fromTokens (versionString, ".", {});
-
- jassert (thisTokens.size() == 3);
-
- if (currentTokens[0].getIntValue() == thisTokens[0].getIntValue())
- {
- if (currentTokens[1].getIntValue() == thisTokens[1].getIntValue())
- return currentTokens[2].getIntValue() < thisTokens[2].getIntValue();
-
- return currentTokens[1].getIntValue() < thisTokens[1].getIntValue();
- }
-
- return currentTokens[0].getIntValue() < thisTokens[0].getIntValue();
- }
-
- std::unique_ptr<VersionInfo> VersionInfo::fetch (const String& endpoint)
- {
- URL latestVersionURL ("https://api.github.com/repos/juce-framework/JUCE/releases/" + endpoint);
-
- std::unique_ptr<InputStream> inStream (latestVersionURL.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)
- .withConnectionTimeoutMs (5000)));
-
- if (inStream == nullptr)
- return nullptr;
-
- auto content = inStream->readEntireStreamAsString();
- auto latestReleaseDetails = JSON::parse (content);
-
- auto* json = latestReleaseDetails.getDynamicObject();
-
- if (json == nullptr)
- return nullptr;
-
- auto versionString = json->getProperty ("tag_name").toString();
-
- if (versionString.isEmpty())
- return nullptr;
-
- auto* assets = json->getProperty ("assets").getArray();
-
- if (assets == nullptr)
- return nullptr;
-
- auto releaseNotes = json->getProperty ("body").toString();
- std::vector<VersionInfo::Asset> parsedAssets;
-
- for (auto& asset : *assets)
- {
- if (auto* assetJson = asset.getDynamicObject())
- {
- parsedAssets.push_back ({ assetJson->getProperty ("name").toString(),
- assetJson->getProperty ("url").toString() });
- jassert (parsedAssets.back().name.isNotEmpty());
- jassert (parsedAssets.back().url.isNotEmpty());
- }
- else
- {
- jassertfalse;
- }
- }
-
- return std::unique_ptr<VersionInfo> (new VersionInfo { versionString, releaseNotes, std::move (parsedAssets) });
- }
|