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/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp

159 lines
4.6 KiB
C++

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
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 5 End-User License
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
27th April 2017).
End User License Agreement: www.juce.com/juce-5-licence
Privacy Policy: www.juce.com/juce-5-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_DownloadCompileEngineThread.h"
#include "../LiveBuildEngine/jucer_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();
std::unique_ptr<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;
}