Browse Source

more auto-update work

tags/2021-05-28
jules 10 years ago
parent
commit
41f21aed7e
1 changed files with 108 additions and 50 deletions
  1. +108
    -50
      extras/Introjucer/Source/Application/jucer_AutoUpdater.h

+ 108
- 50
extras/Introjucer/Source/Application/jucer_AutoUpdater.h View File

@@ -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)
};


Loading…
Cancel
Save