1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-11 23:54:18 +00:00
JUCE/extras/Projucer/Source/Application/jucer_DownloadCompileEngineThread.cpp

156 lines
4.5 KiB
C++

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2015 - ROLI Ltd.
Permission is granted to use this software under the terms of either:
a) the GPL v2 (or any later version)
b) the Affero GPL v3
Details of these licenses can be found at: www.gnu.org/licenses
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.juce.com for more information.
==============================================================================
*/
#include "../jucer_Headers.h"
#include "jucer_DownloadCompileEngineThread.h"
#include "../LiveBuildEngine/projucer_CompileEngineDLL.h"
bool DownloadCompileEngineThread::downloadAndInstall()
{
DownloadCompileEngineThread d;
if (d.runThread())
{
if (d.result.failed())
return withError (d.result.getErrorMessage());
return true;
}
if (d.cancelledByUser)
return false;
return withError (d.result.getErrorMessage());
}
DownloadCompileEngineThread::DownloadCompileEngineThread()
: ThreadWithProgressWindow ("Downloading live-build engine", true, true),
result (Result::ok()), cancelledByUser (false)
{
}
void DownloadCompileEngineThread::threadComplete (bool userPressedCancel)
{
cancelledByUser = userPressedCancel;
}
void DownloadCompileEngineThread::run()
{
setProgress (-1.0);
setStatusMessage ("Downloading...");
MemoryBlock zipData;
result = download (zipData);
if (result.failed())
return;
setStatusMessage ("Installing...");
File installFolder = getInstallFolder();
if (! installFolder.createDirectory())
{
result = Result::fail ("Install error: cannot create target directory");
return;
}
result = install (zipData, installFolder);
}
Result DownloadCompileEngineThread::download (MemoryBlock& dest)
{
int statusCode = 302;
const int timeoutMs = 10000;
StringPairArray responseHeaders;
URL url = getDownloadUrl();
ScopedPointer<InputStream> in = url.createInputStream (false, nullptr, nullptr,
String(), timeoutMs, &responseHeaders,
&statusCode, 0);
if (in == nullptr || statusCode != 200)
return Result::fail ("Download error: cannot establish connection");
MemoryOutputStream mo (dest, true);
int64 size = in->getTotalLength();
int64 bytesReceived = -1;
String msg("Downloading... (123)");
for (int64 pos = 0; pos < size; pos += bytesReceived)
{
setStatusMessage (msg.replace ("123", File::descriptionOfSizeInBytes (pos)));
if (threadShouldExit())
return Result::fail ("Download error: operation interrupted");
bytesReceived = mo.writeFromInputStream (*in, 8192);
if (bytesReceived == 0)
return Result::fail ("Download error: lost connection");
}
return Result::ok();
}
Result DownloadCompileEngineThread::install (const MemoryBlock& data, File& targetFolder)
{
MemoryInputStream input (data, false);
ZipFile zip (input);
if (zip.getNumEntries() == 0)
return Result::fail ("Install error: downloaded file is corrupt");
if (threadShouldExit())
return Result::fail ("Install error: operation interrupted");
return zip.uncompressTo (targetFolder);
}
URL DownloadCompileEngineThread::getDownloadUrl()
{
String urlStub ("http://assets.roli.com/juce/JUCECompileEngine_");
#if JUCE_MAC
urlStub << "osx_";
#elif JUCE_WINDOWS
urlStub << "windows_";
#else
jassertfalse
#endif
return urlStub + ProjectInfo::versionString + ".zip";
}
File DownloadCompileEngineThread::getInstallFolder()
{
return CompileEngineDLL::getVersionedUserAppSupportFolder();
}
bool DownloadCompileEngineThread::withError(const String& msg)
{
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
"Download and install", msg);
return false;
}