Browse Source

Implement plugin downloading and unzipping

tags/v0.3.0
Andrew Belt 7 years ago
parent
commit
345fcf7c9b
1 changed files with 45 additions and 58 deletions
  1. +45
    -58
      src/plugin.cpp

+ 45
- 58
src/plugin.cpp View File

@@ -126,17 +126,22 @@ void pluginDestroy() {
////////////////////


static void extract_zip(const char *dir, int zipfd) {
static void extractZip(const char *filename, const char *dir) {
int err = 0;
zip_t *za = zip_fdopen(zipfd, 0, &err);
zip_t *za = zip_open(filename, 0, &err);
printf("err: %d\n", err);
printf("0\n");
if (!za) return;
printf("1\n");
if (err) goto cleanup;
printf("2\n");

for (int i = 0; i < zip_get_num_entries(za, 0); i++) {
zip_stat_t zs;
err = zip_stat_index(za, i, 0, &zs);
if (err) goto cleanup;
int nameLen = strlen(zs.name);
printf("3\n");

char path[MAXPATHLEN];
snprintf(path, sizeof(path), "%s/%s", dir, zs.name);
@@ -152,6 +157,7 @@ static void extract_zip(const char *dir, int zipfd) {
int out = open(path, O_RDWR | O_TRUNC | O_CREAT, 0644);
assert(out != -1);

printf("4\n");
while (1) {
char buffer[4096];
int len = zip_fread(zf, buffer, sizeof(buffer));
@@ -167,6 +173,7 @@ static void extract_zip(const char *dir, int zipfd) {
}

cleanup:
printf("5\n");
zip_close(za);
}

@@ -181,9 +188,9 @@ void pluginLogIn(std::string email, std::string password) {
json_object_set(reqJ, "email", json_string(email.c_str()));
json_object_set(reqJ, "password", json_string(password.c_str()));
json_t *resJ = requestJson(POST_METHOD, apiHost + "/token", reqJ);
json_decref(reqJ);

if (resJ) {
// TODO parse response
json_t *errorJ = json_object_get(resJ, "error");
if (errorJ) {
const char *errorStr = json_string_value(errorJ);
@@ -199,7 +206,6 @@ void pluginLogIn(std::string email, std::string password) {
}
json_decref(resJ);
}
json_decref(reqJ);
}

void pluginLogOut() {
@@ -207,94 +213,75 @@ void pluginLogOut() {
}

static void pluginRefreshPlugin(json_t *pluginJ) {
// TODO
// Refactor

json_t *slugJ = json_object_get(pluginJ, "slug");
if (!slugJ) return;
std::string slug = json_string_value(slugJ);
const char *slug = json_string_value(slugJ);

json_t *nameJ = json_object_get(pluginJ, "name");
if (!nameJ) return;
std::string name = json_string_value(nameJ);
const char *name = json_string_value(nameJ);

json_t *urlJ = json_object_get(pluginJ, "download");
if (!urlJ) return;
std::string url = json_string_value(urlJ);
json_t *downloadJ = json_object_get(pluginJ, "download");
if (!downloadJ) return;
const char *download = json_string_value(downloadJ);

// Find slug in plugins list
for (Plugin *p : gPlugins) {
if (p->slug == slug) {
return;
// return;
}
}

// If plugin is not loaded, download the zip file to /plugins
fprintf(stderr, "Downloading %s from %s\n", name.c_str(), url.c_str());
downloadName = name;
downloadProgress = 0.0;

const char *dir = "plugins";
char path[MAXPATHLEN];
snprintf(path, sizeof(path), "%s/%s.zip", dir, slug.c_str());
int zip = open(path, O_RDWR | O_TRUNC | O_CREAT, 0644);
// Download zip
// download_file(zip, url.c_str());
// Unzip file
lseek(zip, 0, SEEK_SET);
extract_zip(dir, zip);
// Close file
close(zip);
downloadName = "";
std::string filename = "plugins/";
filename += slug;
filename += ".zip";
bool success = requestDownload(download, filename, &downloadProgress);
if (success) {
// Unzip file
extractZip(filename.c_str(), "plugins");
// Load plugin
loadPlugin(slug);
}

// Load plugin
downloadName = "";
}

void pluginRefresh() {
// TODO
// Refactor with requestJson()

if (token.empty())
return;

/*
isDownloading = true;
downloadProgress = 0.0;
downloadName = "";

// Get plugin list from /plugin
CURL *curl = curl_easy_init();
assert(curl);

std::string url = apiUrl + "/plugins?token=" + token;
std::string resText;

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_string_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);

if (res == CURLE_OK) {
// Parse JSON response
json_error_t error;
json_t *rootJ = json_loads(resText.c_str(), 0, &error);
if (rootJ) {
json_t *pluginsJ = json_object_get(rootJ, "plugins");
if (pluginsJ) {
// Iterate through each plugin object
size_t index;
json_t *pluginJ;
json_array_foreach(pluginsJ, index, pluginJ) {
pluginRefreshPlugin(pluginJ);
}
json_t *reqJ = json_object();
json_object_set(reqJ, "token", json_string(token.c_str()));
json_t *resJ = requestJson(GET_METHOD, apiHost + "/purchases", reqJ);
json_decref(reqJ);

if (resJ) {
json_t *errorJ = json_object_get(resJ, "error");
if (errorJ) {
const char *errorStr = json_string_value(errorJ);
printf("Plugin refresh error: %s\n", errorStr);
}
else {
json_t *purchasesJ = json_object_get(resJ, "purchases");
size_t index;
json_t *purchaseJ;
json_array_foreach(purchasesJ, index, purchaseJ) {
pluginRefreshPlugin(purchaseJ);
}
json_decref(rootJ);
}
json_decref(resJ);
}

isDownloading = false;
*/
}

void pluginCancelDownload() {


Loading…
Cancel
Save