|
- /*
- ==============================================================================
-
- 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;
- }
|