|
|
@@ -68,21 +68,8 @@ public: |
|
|
|
startTimer (100);
|
|
|
|
}
|
|
|
|
|
|
|
|
void downloadNewVersion (URL url)
|
|
|
|
{
|
|
|
|
const ScopedPointer<InputStream> in (getLatestVersionURL().createInputStream (false));
|
|
|
|
|
|
|
|
if (in == nullptr || threadShouldExit())
|
|
|
|
return; // can't connect: fail silently.
|
|
|
|
|
|
|
|
jsonReply = JSON::parse (in->readEntireStreamAsString());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void processResult (var reply)
|
|
|
|
{
|
|
|
|
DBG (JSON::toString (reply));
|
|
|
|
|
|
|
|
if (reply.isArray())
|
|
|
|
{
|
|
|
|
askUserAboutNewVersion (VersionInfo (reply[0]));
|
|
|
@@ -120,50 +107,72 @@ public: |
|
|
|
var()).toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isDifferentVersionToCurrent() const
|
|
|
|
{
|
|
|
|
JUCE_COMPILER_WARNING("testing")
|
|
|
|
return true;
|
|
|
|
return version != JUCE_STRINGIFY(JUCE_MAJOR_VERSION)
|
|
|
|
"." JUCE_STRINGIFY(JUCE_MINOR_VERSION)
|
|
|
|
"." JUCE_STRINGIFY(JUCE_BUILDNUMBER)
|
|
|
|
&& version.containsChar ('.')
|
|
|
|
&& version.length() > 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
String version;
|
|
|
|
URL url;
|
|
|
|
};
|
|
|
|
|
|
|
|
void askUserAboutNewVersion (const VersionInfo& info)
|
|
|
|
{
|
|
|
|
if (info.version != SystemStats::getJUCEVersion()
|
|
|
|
&& info.version.containsChar ('.')
|
|
|
|
&& info.version.length() > 2)
|
|
|
|
if (info.isDifferentVersionToCurrent())
|
|
|
|
{
|
|
|
|
DBG (info.version);
|
|
|
|
DBG (info.url.toString (true));
|
|
|
|
|
|
|
|
if (isRunningFromZipFolder())
|
|
|
|
{
|
|
|
|
JUCE_COMPILER_WARNING("todo")
|
|
|
|
|
|
|
|
// startDownload (info.url);
|
|
|
|
if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon,
|
|
|
|
TRANS("Download JUCE version 123?").replace ("123", info.version),
|
|
|
|
TRANS("A new version of JUCE is available - would you like to overwrite the folder:\n\n"
|
|
|
|
"xfldrx\n\n"
|
|
|
|
" ..with the latest version from juce.com?\n\n"
|
|
|
|
"(Please note that this will overwrite everything in that folder!)")
|
|
|
|
.replace ("xfldrx", getZipFolder().getFullPathName())))
|
|
|
|
{
|
|
|
|
DownloadNewVersionThread::performDownload (info.url, getZipFolder());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
JUCE_COMPILER_WARNING("todo")
|
|
|
|
|
|
|
|
// startDownload (info.url);
|
|
|
|
File targetFolder;
|
|
|
|
|
|
|
|
// FileChooser f;
|
|
|
|
|
|
|
|
DownloadNewVersionThread::performDownload (info.url, targetFolder);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void startDownload (URL url)
|
|
|
|
static bool isZipFolder (const File& f)
|
|
|
|
{
|
|
|
|
jassert (! isThreadRunning());
|
|
|
|
newVersionToDownload = url;
|
|
|
|
startThread (3);
|
|
|
|
JUCE_COMPILER_WARNING("testing")
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return f.getChildFile ("modules").isDirectory()
|
|
|
|
&& f.getChildFile ("extras").isDirectory()
|
|
|
|
&& f.getChildFile ("examples").isDirectory()
|
|
|
|
&& ! f.getChildFile (".git").isDirectory();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isRunningFromZipFolder() const
|
|
|
|
static File getZipFolder()
|
|
|
|
{
|
|
|
|
File appParentFolder (File::getSpecialLocation (File::currentApplicationFile));
|
|
|
|
File appParentFolder (File::getSpecialLocation (File::currentApplicationFile).getParentDirectory());
|
|
|
|
return isZipFolder (appParentFolder) ? appParentFolder : File::nonexistent;
|
|
|
|
}
|
|
|
|
|
|
|
|
return appParentFolder.getChildFile ("modules").isDirectory()
|
|
|
|
&& appParentFolder.getChildFile ("extras").isDirectory()
|
|
|
|
&& appParentFolder.getChildFile ("examples").isDirectory()
|
|
|
|
&& ! appParentFolder.getChildFile (".git").isDirectory();
|
|
|
|
static bool isRunningFromZipFolder()
|
|
|
|
{
|
|
|
|
return getZipFolder() != File::nonexistent;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
@@ -179,10 +188,7 @@ private: |
|
|
|
|
|
|
|
void run() override
|
|
|
|
{
|
|
|
|
if (newVersionToDownload.isEmpty())
|
|
|
|
checkForNewVersion();
|
|
|
|
else
|
|
|
|
downloadNewVersion (newVersionToDownload);
|
|
|
|
checkForNewVersion();
|
|
|
|
}
|
|
|
|
|
|
|
|
var jsonReply;
|
|
|
@@ -193,16 +199,16 @@ private: |
|
|
|
class DownloadNewVersionThread : public ThreadWithProgressWindow
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DownloadNewVersionThread (URL u)
|
|
|
|
DownloadNewVersionThread (URL u, File target)
|
|
|
|
: ThreadWithProgressWindow ("Downloading New Version", true, true),
|
|
|
|
result (Result::ok()),
|
|
|
|
url (u)
|
|
|
|
url (u), targetFolder (target)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void update (URL u)
|
|
|
|
static void performDownload (URL u, File targetFolder)
|
|
|
|
{
|
|
|
|
DownloadNewVersionThread d (u);
|
|
|
|
DownloadNewVersionThread d (u, targetFolder);
|
|
|
|
|
|
|
|
if (d.runThread())
|
|
|
|
{
|
|
|
@@ -221,6 +227,8 @@ JUCE_COMPILER_WARNING("todo") |
|
|
|
|
|
|
|
void run() override
|
|
|
|
{
|
|
|
|
setProgress (-1.0);
|
|
|
|
|
|
|
|
MemoryBlock zipData;
|
|
|
|
result = download (zipData);
|
|
|
|
|
|
|
@@ -234,8 +242,29 @@ JUCE_COMPILER_WARNING("todo") |
|
|
|
|
|
|
|
const ScopedPointer<InputStream> in (url.createInputStream (false, nullptr, nullptr, String::empty, 10000));
|
|
|
|
|
|
|
|
if (in != nullptr && in->readIntoMemoryBlock (dest))
|
|
|
|
if (in != nullptr)
|
|
|
|
{
|
|
|
|
int64 total = 0;
|
|
|
|
MemoryOutputStream mo (dest, true);
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
if (threadShouldExit())
|
|
|
|
return Result::fail ("cancel");
|
|
|
|
|
|
|
|
size_t written = mo.writeFromInputStream (*in, 8192);
|
|
|
|
|
|
|
|
if (written == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
total += written;
|
|
|
|
|
|
|
|
setStatusMessage (String (TRANS ("Downloading... (123)"))
|
|
|
|
.replace ("123", File::descriptionOfSizeInBytes (total)));
|
|
|
|
}
|
|
|
|
|
|
|
|
return Result::ok();
|
|
|
|
}
|
|
|
|
|
|
|
|
return Result::fail ("Failed to download from: " + url.toString (false));
|
|
|
|
}
|
|
|
@@ -244,20 +273,49 @@ JUCE_COMPILER_WARNING("todo") |
|
|
|
{
|
|
|
|
setStatusMessage ("Installing...");
|
|
|
|
|
|
|
|
MemoryInputStream input (data, false);
|
|
|
|
ZipFile zip (input);
|
|
|
|
File tempUnzipped;
|
|
|
|
|
|
|
|
{
|
|
|
|
MemoryInputStream input (data, false);
|
|
|
|
ZipFile zip (input);
|
|
|
|
|
|
|
|
if (zip.getNumEntries() == 0)
|
|
|
|
return Result::fail ("The downloaded file wasn't a valid JUCE file!");
|
|
|
|
|
|
|
|
tempUnzipped = targetFolder.getNonexistentSibling();
|
|
|
|
|
|
|
|
if (zip.getNumEntries() == 0)
|
|
|
|
return Result::fail ("The downloaded file wasn't a valid JUCE file!");
|
|
|
|
if (! tempUnzipped.createDirectory())
|
|
|
|
return Result::fail ("Couldn't create a folder to unzip the new version!");
|
|
|
|
|
|
|
|
Result r (zip.uncompressTo (tempUnzipped));
|
|
|
|
|
|
|
|
if (r.failed())
|
|
|
|
{
|
|
|
|
tempUnzipped.deleteRecursively();
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
File oldFolder (targetFolder.getSiblingFile (targetFolder.getFileNameWithoutExtension() + "_old").getNonexistentSibling());
|
|
|
|
|
|
|
|
if (! targetFolder.moveFileTo (targetFolder.getNonexistentSibling()))
|
|
|
|
{
|
|
|
|
tempUnzipped.deleteRecursively();
|
|
|
|
return Result::fail ("Could not remove the existing folder!");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! tempUnzipped.moveFileTo (targetFolder))
|
|
|
|
{
|
|
|
|
tempUnzipped.deleteRecursively();
|
|
|
|
return Result::fail ("Could not overwrite the existing folder!");
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (! m.getFolder().deleteRecursively())
|
|
|
|
// return Result::fail ("Couldn't delete the existing folder:\n" + m.getFolder().getFullPathName());
|
|
|
|
//
|
|
|
|
// return zip.uncompressTo (m.getFolder().getParentDirectory(), true);
|
|
|
|
return Result::ok();
|
|
|
|
}
|
|
|
|
|
|
|
|
Result result;
|
|
|
|
URL url;
|
|
|
|
File targetFolder;
|
|
|
|
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DownloadNewVersionThread)
|
|
|
|
};
|
|
|
|