string resource_cache (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string resource = request->query ["resource"]; string page; Assets_Header header = Assets_Header (menu_logic_resources_text (), request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; if (request->query.count ("clear")) { sendreceive_resources_clear_all (); } vector <string> resources = Database_Config_General::getResourcesToCache (); if (!resources.empty ()) { view.enable_zone ("scheduled"); view.set_variable ("scheduled", filter_string_implode (resources, " | ")); } vector <string> listed_resources; string block; // Display the available USFM resources. resources = client_logic_usfm_resources_get (); for (auto & resource : resources) { block.append ("<p>"); block.append ("<a href=\"download?name=" + resource + "\">" + resource + "</a>"); block.append ("</p>\n"); } listed_resources.insert (listed_resources.end (), resources.begin (), resources.end ()); // Display the available external resources. resources = resource_external_names (); for (auto & resource : resources) { block.append ("<p>"); block.append ("<a href=\"download?name=" + resource + "\">" + resource + "</a>"); block.append ("</p>\n"); } listed_resources.insert (listed_resources.end (), resources.begin (), resources.end ()); // Display the available SWORD resources. resources = sword_logic_get_available (); for (auto & resource : resources) { string source = sword_logic_get_source (resource); string module = sword_logic_get_remote_module (resource); string name = "[" + source + "][" + module + "]"; block.append ("<p>"); block.append ("<a href=\"download?name=" + name + "\">" + resource + "</a>"); block.append ("</p>\n"); } listed_resources.insert (listed_resources.end (), resources.begin (), resources.end ()); // Display any old USFM resources still available on the client. Database_UsfmResources database_usfmresources; resources = database_usfmresources.getResources (); for (auto & resource : resources) { if (in_array (resource, listed_resources)) continue; block.append ("<p>"); block.append ("<a href=\"download?name=" + resource + "&old=yes\">" + resource + "</a>"); block.append ("</p>\n"); } // Display any offline resources still available on the client. Database_OfflineResources database_offlineresources; resources = database_offlineresources.names (); for (auto & resource : resources) { if (in_array (resource, listed_resources)) continue; block.append ("<p>"); block.append ("<a href=\"download?name=" + resource + "&old=yes\">" + resource + "</a>"); block.append ("</p>\n"); } // Display the list. view.set_variable ("block", block); page += view.render ("resource", "cache"); page += Assets_Page::footer (); return page; }
string resource_download (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_UsfmResources database_usfmresources; string page; Assets_Header header = Assets_Header (translate("Download resource"), request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (resource_cache_url (), menu_logic_resources_text ()); page = header.run (); Assets_View view; string name = request->query["name"]; view.set_variable ("name", name); bool old = request->query.count ("old"); if (old) view.enable_zone ("old"); else view.enable_zone ("current"); if (request->query.count ("clear")) { // The client clears the two older storage locations just to be sure they are gone. database_usfmresources.deleteResource (name); // The client clears the installed resource. Database_Cache::remove (name); } if (request->query.count ("clearold")) { // The client clears the two older storage locations just to be sure they are gone. database_usfmresources.deleteResource (name); redirect_browser (request, resource_cache_url ()); return ""; } if (request->query.count ("download")) { // Trigger caching the resource. // Add the resource to the general configuration to be cached, if it is not already there. vector <string> resources = Database_Config_General::getResourcesToCache (); if (!in_array (name, resources)) { resources.push_back (name); Database_Config_General::setResourcesToCache (resources); } tasks_logic_queue (SYNCRESOURCES); redirect_browser (request, journal_index_url ()); return ""; } int count = 0; if (count == 0) { vector <int> books = database_usfmresources.getBooks (name); for (auto book : books) { vector <int> chapters = database_usfmresources.getChapters (name, book); // Rough average of 20 verses per chapter. count += (20 * chapters.size()); } } if (count == 0) count = Database_Cache::count (name); view.set_variable ("count", convert_to_string (count)); page += view.render ("resource", "download"); page += Assets_Page::footer (); return page; }