From 561c58de198e4e56d5c82f4d85ba40bbf263a8df Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Mon, 5 Oct 2015 08:48:22 -0500 Subject: Use unified LoadFileToBuffer function Create a single function for loading xml files to a memory buffer to reduce code duplication. Change-Id: I0ff64463072118f61a2eb8052f74019715020253 --- gui/pages.cpp | 159 +++++++++++++++++++++++++++++----------------------------- gui/pages.hpp | 1 + 2 files changed, 81 insertions(+), 79 deletions(-) diff --git a/gui/pages.cpp b/gui/pages.cpp index 4c98a7233..374a431a8 100644 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -807,48 +807,15 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) // We can try to load the XML directly... filename = TWRES; filename += attr->value(); - LOGINFO("PageSet::CheckInclude loading filename: '%s'\n", filename.c_str()); - struct stat st; - if(stat(filename.c_str(),&st) != 0) { - LOGERR("Unable to locate '%s'\n", filename.c_str()); - return -1; - } - - len = st.st_size; - xmlFile = (char*) malloc(len + 1); - if (!xmlFile) - return -1; - - int fd = open(filename.c_str(), O_RDONLY); - if (fd == -1) - return -1; - - read(fd, xmlFile, len); - close(fd); } else { filename += attr->value(); - LOGINFO("PageSet::CheckInclude loading filename: '%s'\n", filename.c_str()); - const ZipEntry* ui_xml = mzFindZipEntry(package, filename.c_str()); - if (ui_xml == NULL) - { - LOGERR("Unable to locate '%s' in zip file\n", filename.c_str()); - return -1; - } - - // Allocate the buffer for the file - len = mzGetZipEntryUncompLen(ui_xml); - xmlFile = (char*) malloc(len + 1); - if (!xmlFile) - return -1; - - if (!mzExtractZipEntryToBuffer(package, ui_xml, (unsigned char*) xmlFile)) - { - LOGERR("Unable to extract '%s'\n", filename.c_str()); - return -1; - } + } + xmlFile = PageManager::LoadFileToBuffer(filename, package); + if (xmlFile == NULL) { + LOGERR("PageSet::CheckInclude unable to load '%s'\n", filename.c_str()); + return -1; } - xmlFile[len] = '\0'; doc = new xml_document<>(); doc->parse<0>(xmlFile); @@ -889,17 +856,21 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) templates.pop_back(); doc->clear(); delete doc; + free(xmlFile); return -1; } mIncludedDocs.push_back(doc); - if (CheckInclude(package, doc)) + if (CheckInclude(package, doc)) { + free(xmlFile); return -1; + } chld = chld->next_sibling("xmlfile"); } - + if (xmlFile) + free(xmlFile); return 0; } @@ -1144,6 +1115,66 @@ int PageSet::NotifyVarChange(std::string varName, std::string value) return (mCurrentPage ? mCurrentPage->NotifyVarChange(varName, value) : -1); } +char* PageManager::LoadFileToBuffer(std::string filename, ZipArchive* package) { + size_t len; + char* buffer = NULL; + + if (!package) { + // We can try to load the XML directly... + LOGINFO("PageManager::LoadFileToBuffer loading filename: '%s' directly\n", filename.c_str()); + struct stat st; + if(stat(filename.c_str(),&st) != 0) { + // This isn't always an error, sometimes we request files that don't exist. + return NULL; + } + + len = (size_t)st.st_size; + + buffer = (char*) malloc(len + 1); + if (!buffer) { + LOGERR("PageManager::LoadFileToBuffer failed to malloc\n"); + return NULL; + } + + int fd = open(filename.c_str(), O_RDONLY); + if (fd == -1) { + LOGERR("PageManager::LoadFileToBuffer failed to open '%s' - (%s)\n", filename.c_str(), strerror(errno)); + free(buffer); + return NULL; + } + + if (read(fd, buffer, len) < 0) { + LOGERR("PageManager::LoadFileToBuffer failed to read '%s' - (%s)\n", filename.c_str(), strerror(errno)); + free(buffer); + close(fd); + return NULL; + } + close(fd); + } else { + LOGINFO("PageManager::LoadFileToBuffer loading filename: '%s' from zip\n", filename.c_str()); + const ZipEntry* zipentry = mzFindZipEntry(package, filename.c_str()); + if (zipentry == NULL) { + LOGERR("Unable to locate '%s' in zip file\n", filename.c_str()); + return NULL; + } + + // Allocate the buffer for the file + len = mzGetZipEntryUncompLen(zipentry); + buffer = (char*) malloc(len + 1); + if (!buffer) + return NULL; + + if (!mzExtractZipEntryToBuffer(package, zipentry, (unsigned char*) buffer)) { + LOGERR("Unable to extract '%s'\n", filename.c_str()); + free(buffer); + return NULL; + } + } + // NULL-terminate the string + buffer[len] = 0x00; + return buffer; +} + int PageManager::LoadPackage(std::string name, std::string package, std::string startpage) { int fd; @@ -1161,22 +1192,6 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string LOGINFO("Load XML directly\n"); tw_x_offset = TW_X_OFFSET; tw_y_offset = TW_Y_OFFSET; - // We can try to load the XML directly... - struct stat st; - if(stat(package.c_str(),&st) != 0) - return -1; - - len = st.st_size; - xmlFile = (char*) malloc(len + 1); - if (!xmlFile) - return -1; - - fd = open(package.c_str(), O_RDONLY); - if (fd == -1) - goto error; - - read(fd, xmlFile, len); - close(fd); } else { @@ -1187,36 +1202,21 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string return -1; if (sysMapFile(package.c_str(), &map) != 0) { LOGERR("Failed to map '%s'\n", package.c_str()); - return -1; + goto error; } if (mzOpenZipArchive(map.addr, map.length, &zip)) { LOGERR("Unable to open zip archive '%s'\n", package.c_str()); sysReleaseMap(&map); - return -1; - } - pZip = &zip; - const ZipEntry* ui_xml = mzFindZipEntry(&zip, "ui.xml"); - if (ui_xml == NULL) - { - LOGERR("Unable to locate ui.xml in zip file\n"); - goto error; - } - - // Allocate the buffer for the file - len = mzGetZipEntryUncompLen(ui_xml); - xmlFile = (char*) malloc(len + 1); - if (!xmlFile) - goto error; - - if (!mzExtractZipEntryToBuffer(&zip, ui_xml, (unsigned char*) xmlFile)) - { - LOGERR("Unable to extract ui.xml\n"); goto error; } + pZip = &zip; + package = "ui.xml"; } - // NULL-terminate the string - xmlFile[len] = 0x00; + xmlFile = LoadFileToBuffer(package, pZip); + if (xmlFile == NULL) { + goto error; + } // Before loading, mCurrentSet must be the loading package so we can find resources pageSet = mCurrentSet; @@ -1243,10 +1243,11 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string mzCloseZipArchive(pZip); sysReleaseMap(&map); } + free(xmlFile); return ret; error: - LOGERR("An internal error has occurred.\n"); + // Sometimes we get here without a real error if (pZip) { mzCloseZipArchive(pZip); sysReleaseMap(&map); diff --git a/gui/pages.hpp b/gui/pages.hpp index 81112f979..03fb0e5de 100644 --- a/gui/pages.hpp +++ b/gui/pages.hpp @@ -123,6 +123,7 @@ class PageManager { public: // Used by GUI + static char* LoadFileToBuffer(std::string filename, ZipArchive* package); static int LoadPackage(std::string name, std::string package, std::string startpage); static PageSet* SelectPackage(std::string name); static int ReloadPackage(std::string name, std::string package); -- cgit v1.2.3