From fc402d584adde88a2fc29fb871af97a509ee5c5b Mon Sep 17 00:00:00 2001 From: omigamedev Date: Mon, 6 Nov 2017 10:07:19 +0000 Subject: [PATCH] implement download and open from the cloud browser --- engine/app.cpp | 17 +++++++++++++++++ engine/app.h | 3 ++- engine/app_cloud.cpp | 26 ++++++++++++++++---------- engine/app_layout.cpp | 2 +- engine/node_dialog_cloud.cpp | 25 ++++++++++--------------- engine/util.cpp | 7 +++++++ engine/util.h | 1 + 7 files changed, 54 insertions(+), 27 deletions(-) diff --git a/engine/app.cpp b/engine/app.cpp index 7f67c2f..8540260 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -63,6 +63,23 @@ void App::initLog() LogRemote::I.file_init(); } +void App::download(std::string filename) +{ + CURL *curl = curl_easy_init(); + if (curl) + { + auto dest = data_path + "/" + filename; + FILE* fp = fopen(dest.c_str(), "wb"); + std::string url = "http://omigamedev.ddns.net:8080/panoview/cloud-dwl.php?file=" + filename; + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_data_write); + auto err = curl_easy_perform(curl); + curl_easy_cleanup(curl); + fclose(fp); + } +} + void App::upload(std::string filename) { CURL *curl; diff --git a/engine/app.h b/engine/app.h index 0ecacad..f621087 100644 --- a/engine/app.h +++ b/engine/app.h @@ -92,7 +92,6 @@ public: void initShaders(); void initAssets(); void initLayout(); - void upload(std::string filename); void create(); void terminate(); void clear(); @@ -129,6 +128,8 @@ public: void cloud_upload_all(); void cloud_browse(); + void upload(std::string filename); + void download(std::string filename); void brush_update(); diff --git a/engine/app_cloud.cpp b/engine/app_cloud.cpp index 208b017..55f9831 100644 --- a/engine/app_cloud.cpp +++ b/engine/app_cloud.cpp @@ -79,15 +79,21 @@ void App::cloud_browse() dialog->btn_ok->on_click = [this, dialog](Node*) { -// canvas->reset_camera(); -// layers->clear(); -// canvas->m_canvas->project_open(dialog->selected_path); -// doc_name = dialog->selected_name; -// if (auto docname = layout[main_id]->find("txt-docname")) -// docname->set_text(("Panodoc: " + doc_name).c_str()); -// for (auto& i : canvas->m_canvas->m_order) -// layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); - dialog->destroy(); - ActionManager::clear(); + std::thread([this, dialog] { + download(dialog->selected_file); + async_start(); + canvas->reset_camera(); + layers->clear(); + canvas->m_canvas->project_open(dialog->selected_path); + doc_name = dialog->selected_name; + if (auto docname = layout[main_id]->find("txt-docname")) + docname->set_text(("Panodoc: " + doc_name).c_str()); + for (auto& i : canvas->m_canvas->m_order) + layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); + dialog->destroy(); + ActionManager::clear(); + async_update(); + async_end(); + }).detach(); }; } \ No newline at end of file diff --git a/engine/app_layout.cpp b/engine/app_layout.cpp index f24869d..20dd104 100644 --- a/engine/app_layout.cpp +++ b/engine/app_layout.cpp @@ -397,7 +397,7 @@ void App::init_menu_file() std::smatch m; if (std::regex_search(doc_name, m, r)) { - std::string base = m[1].str(); + base = m[1].str(); current = atoi(m[2].str().c_str()); } diff --git a/engine/node_dialog_cloud.cpp b/engine/node_dialog_cloud.cpp index 7d7d4c1..d831a01 100644 --- a/engine/node_dialog_cloud.cpp +++ b/engine/node_dialog_cloud.cpp @@ -89,7 +89,6 @@ void NodeDialogCloud::load_thumbs_thread() thumb.create(width, height); thumb.copy_from((uint8_t*)rgb.data()); - App::I.async_start(); auto node = new NodeDialogCloudItem; node->m_manager = m_manager; @@ -104,20 +103,16 @@ void NodeDialogCloud::load_thumbs_thread() App::I.async_update(); App::I.async_end(); -// node->on_selected = [&](NodeDialogCloudItem* target) { -// if (target == current) -// return; -// selected_path = target->m_path; -// selected_file = target->m_file_name; -// selected_name = selected_file.substr(0, selected_file.length() - 5); -// if (current) -// current->m_selected = false; -// current = target; -// }; - - // load thumb -// ui::Image thumb = ui::Canvas::I->thumbnail_read(node->m_path); - + node->on_selected = [&](NodeDialogCloudItem* target) { + if (target == current) + return; + selected_path = target->m_path; + selected_file = target->m_file_name; + selected_name = selected_file.substr(0, selected_file.length() - 5); + if (current) + current->m_selected = false; + current = target; + }; } curl_easy_cleanup(curl); } diff --git a/engine/util.cpp b/engine/util.cpp index 4ba3805..b6640bd 100644 --- a/engine/util.cpp +++ b/engine/util.cpp @@ -132,6 +132,13 @@ size_t curl_data_handler(void *contents, size_t size, size_t nmemb, void *userp) return size * nmemb; } +size_t curl_data_write(void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t written = fwrite(ptr, size, nmemb, stream); + return written; +} + + #ifdef _DEBUG #define GL(stmt) stmt; CheckOpenGLError(#stmt, __FILE__, __LINE__); #else diff --git a/engine/util.h b/engine/util.h index 1901088..67718fd 100644 --- a/engine/util.h +++ b/engine/util.h @@ -17,6 +17,7 @@ glm::vec3 convert_hsv2rgb(const glm::vec3 c); glm::vec3 convert_rgb2hsv(const glm::vec3 c); size_t curl_data_handler(void *contents, size_t size, size_t nmemb, void *userp); +size_t curl_data_write(void *ptr, size_t size, size_t nmemb, FILE *stream); void check_OpenGLError(const char* stmt, const char* fname, int line); template struct cbuffer