|
|
@@ -157,40 +157,7 @@ static bool loadPlugin(std::string path) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) { |
|
|
|
// Check that "status" is "available" |
|
|
|
json_t *statusJ = json_object_get(manifestJ, "status"); |
|
|
|
if (!statusJ) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
std::string status = json_string_value(statusJ); |
|
|
|
if (status != "available") { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// Get latest version |
|
|
|
json_t *latestVersionJ = json_object_get(manifestJ, "latestVersion"); |
|
|
|
if (!latestVersionJ) { |
|
|
|
WARN("Could not get latest version of plugin %s", slug.c_str()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
std::string latestVersion = json_string_value(latestVersionJ); |
|
|
|
|
|
|
|
// Check whether we already have a plugin with the same slug and version |
|
|
|
Plugin *plugin = getPlugin(slug); |
|
|
|
if (plugin && plugin->version == latestVersion) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
json_t *nameJ = json_object_get(manifestJ, "name"); |
|
|
|
std::string name; |
|
|
|
if (nameJ) { |
|
|
|
name = json_string_value(nameJ); |
|
|
|
} |
|
|
|
else { |
|
|
|
name = slug; |
|
|
|
} |
|
|
|
|
|
|
|
static bool syncPlugin(std::string slug, std::string version) { |
|
|
|
#if defined ARCH_WIN |
|
|
|
std::string arch = "win"; |
|
|
|
#elif ARCH_MAC |
|
|
@@ -199,45 +166,26 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) { |
|
|
|
std::string arch = "lin"; |
|
|
|
#endif |
|
|
|
|
|
|
|
std::string downloadUrl; |
|
|
|
downloadUrl = app::API_URL; |
|
|
|
std::string downloadUrl = app::API_URL; |
|
|
|
downloadUrl += "/download"; |
|
|
|
if (dryRun) { |
|
|
|
downloadUrl += "/available"; |
|
|
|
} |
|
|
|
downloadUrl += "?token=" + network::encodeUrl(settings::token); |
|
|
|
downloadUrl += "&slug=" + network::encodeUrl(slug); |
|
|
|
downloadUrl += "&version=" + network::encodeUrl(latestVersion); |
|
|
|
downloadUrl += "&version=" + network::encodeUrl(version); |
|
|
|
downloadUrl += "&arch=" + network::encodeUrl(arch); |
|
|
|
|
|
|
|
if (dryRun) { |
|
|
|
// Check if available |
|
|
|
json_t *availableResJ = network::requestJson(network::GET, downloadUrl, NULL); |
|
|
|
if (!availableResJ) { |
|
|
|
WARN("Could not check whether download is available"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
DEFER({ |
|
|
|
json_decref(availableResJ); |
|
|
|
}); |
|
|
|
json_t *successJ = json_object_get(availableResJ, "success"); |
|
|
|
return json_boolean_value(successJ); |
|
|
|
} |
|
|
|
else { |
|
|
|
downloadName = name; |
|
|
|
downloadProgress = 0.0; |
|
|
|
INFO("Downloading plugin %s %s %s", slug.c_str(), latestVersion.c_str(), arch.c_str()); |
|
|
|
|
|
|
|
// Download zip |
|
|
|
std::string pluginDest = asset::user("plugins/" + slug + ".zip"); |
|
|
|
if (!network::requestDownload(downloadUrl, pluginDest, &downloadProgress)) { |
|
|
|
WARN("Plugin %s download was unsuccessful", slug.c_str()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
// downloadName = name; |
|
|
|
downloadProgress = 0.0; |
|
|
|
INFO("Downloading plugin %s %s %s", slug.c_str(), version.c_str(), arch.c_str()); |
|
|
|
|
|
|
|
downloadName = ""; |
|
|
|
return true; |
|
|
|
// Download zip |
|
|
|
std::string pluginDest = asset::user("plugins/" + slug + ".zip"); |
|
|
|
if (!network::requestDownload(downloadUrl, pluginDest, &downloadProgress)) { |
|
|
|
WARN("Plugin %s download was unsuccessful", slug.c_str()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// downloadName = ""; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
static void loadPlugins(std::string path) { |
|
|
@@ -519,50 +467,16 @@ void queryUpdates() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void sync() { |
|
|
|
#if 0 |
|
|
|
void syncUpdates() { |
|
|
|
if (settings::token.empty()) |
|
|
|
return false; |
|
|
|
|
|
|
|
if (!dryRun) { |
|
|
|
downloadProgress = 0.0; |
|
|
|
downloadName = "Updating plugins..."; |
|
|
|
} |
|
|
|
|
|
|
|
// Check each plugin in list of plugin slugs |
|
|
|
json_t *pluginsJ = json_object_get(pluginsResJ, "plugins"); |
|
|
|
if (!pluginsJ) { |
|
|
|
WARN("No plugins array"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
json_t *manifestsJ = json_object_get(manifestsResJ, "manifests"); |
|
|
|
if (!manifestsJ) { |
|
|
|
WARN("No manifests object"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
size_t slugIndex; |
|
|
|
json_t *slugJ; |
|
|
|
json_array_foreach(pluginsJ, slugIndex, slugJ) { |
|
|
|
std::string slug = json_string_value(slugJ); |
|
|
|
// Search for slug in manifests |
|
|
|
const char *manifestSlug; |
|
|
|
json_t *manifestJ = NULL; |
|
|
|
json_object_foreach(manifestsJ, manifestSlug, manifestJ) { |
|
|
|
if (slug == std::string(manifestSlug)) |
|
|
|
break; |
|
|
|
} |
|
|
|
return; |
|
|
|
|
|
|
|
if (!manifestJ) |
|
|
|
continue; |
|
|
|
downloadProgress = 0.0; |
|
|
|
downloadName = "Updating plugins..."; |
|
|
|
|
|
|
|
if (syncPlugin(slug, manifestJ, dryRun)) { |
|
|
|
available = true; |
|
|
|
} |
|
|
|
for (const Update &update : updates) { |
|
|
|
syncPlugin(update.pluginSlug, update.version); |
|
|
|
} |
|
|
|
|
|
|
|
return available; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void cancelDownload() { |
|
|
|