diff options
Diffstat (limited to '')
-rw-r--r-- | resources.cpp | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/resources.cpp b/resources.cpp new file mode 100644 index 000000000..2f2ea95b0 --- /dev/null +++ b/resources.cpp @@ -0,0 +1,280 @@ +// resource.cpp - Source to manage GUI resources + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <sys/reboot.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <time.h> +#include <unistd.h> +#include <stdlib.h> + +#include <string> +#include <sstream> +#include <iostream> +#include <iomanip> + +extern "C" { +#include "../common.h" +#include "../minuitwrp/minui.h" +#include "../recovery_ui.h" +} + +#include "rapidxml.hpp" +#include "objects.hpp" + +#define TMP_RESOURCE_NAME "/tmp/extract.bin" + +Resource::Resource(xml_node<>* node, ZipArchive* pZip) +{ + if (node && node->first_attribute("name")) + mName = node->first_attribute("name")->value(); +} + + +int Resource::ExtractResource(ZipArchive* pZip, + std::string folderName, + std::string fileName, + std::string fileExtn, + std::string destFile) +{ + if (!pZip) return -1; + + std::string src = folderName + "/" + fileName + fileExtn; + + const ZipEntry* binary = mzFindZipEntry(pZip, src.c_str()); + if (binary == NULL) { + return -1; + } + + unlink(destFile.c_str()); + int fd = creat(destFile.c_str(), 0666); + if (fd < 0) + return -1; + + int ret = 0; + if (!mzExtractZipEntryToFile(pZip, binary, fd)) + ret = -1; + + close(fd); + return ret; +} + +FontResource::FontResource(xml_node<>* node, ZipArchive* pZip) + : Resource(node, pZip) +{ + std::string file; + + mFont = NULL; + if (!node) return; + + if (node->first_attribute("filename")) + file = node->first_attribute("filename")->value(); + + if (ExtractResource(pZip, "fonts", file, ".dat", TMP_RESOURCE_NAME) == 0) + { + mFont = gr_loadFont(TMP_RESOURCE_NAME); + unlink(TMP_RESOURCE_NAME); + } + else + { + mFont = gr_loadFont(file.c_str()); + } +} + +FontResource::~FontResource() +{ +} + +ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip) + : Resource(node, pZip) +{ + std::string file; + + mSurface = NULL; + if (!node) return; + + if (node->first_attribute("filename")) + file = node->first_attribute("filename")->value(); + + if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0) + { + res_create_surface(TMP_RESOURCE_NAME, &mSurface); + unlink(TMP_RESOURCE_NAME); + } else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0) + { + // JPG includes the .jpg extension in the filename so extension should be blank + res_create_surface(TMP_RESOURCE_NAME, &mSurface); + unlink(TMP_RESOURCE_NAME); + } + else + res_create_surface(file.c_str(), &mSurface); +} + +ImageResource::~ImageResource() +{ + if (mSurface) + res_free_surface(mSurface); +} + +AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip) + : Resource(node, pZip) +{ + std::string file; + int fileNum = 1; + + if (!node) return; + + if (node->first_attribute("filename")) + file = node->first_attribute("filename")->value(); + + for ( ; ; ) + { + std::ostringstream fileName; + fileName << file << std::setfill ('0') << std::setw (3) << fileNum; + + gr_surface surface; + if (pZip) + { + if (ExtractResource(pZip, "images", fileName.str(), ".png", TMP_RESOURCE_NAME) != 0) + break; + + if (res_create_surface(TMP_RESOURCE_NAME, &surface)) + break; + + unlink(TMP_RESOURCE_NAME); + } + else + { + if (res_create_surface(fileName.str().c_str(), &surface)) + break; + } + mSurfaces.push_back(surface); + fileNum++; + } +} + +AnimationResource::~AnimationResource() +{ + std::vector<gr_surface>::iterator it; + + for (it = mSurfaces.begin(); it != mSurfaces.end(); ++it) + { + res_free_surface(*it); + } + mSurfaces.clear(); +} + +Resource* ResourceManager::FindResource(std::string name) +{ + std::vector<Resource*>::iterator iter; + + for (iter = mResources.begin(); iter != mResources.end(); iter++) + { + if (name == (*iter)->GetName()) + return (*iter); + } + return NULL; +} + +ResourceManager::ResourceManager(xml_node<>* resList, ZipArchive* pZip) +{ + xml_node<>* child; + + if (!resList) return; + + child = resList->first_node("resource"); + while (child != NULL) + { + xml_attribute<>* attr = child->first_attribute("type"); + if (!attr) + break; + + std::string type = attr->value(); + + if (type == "font") + { + FontResource* res = new FontResource(child, pZip); + if (res == NULL || res->GetResource() == NULL) + { + xml_attribute<>* attr_name = child->first_attribute("name"); + + if (!attr_name) { + std::string res_name = attr_name->value(); + LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str()); + } else + LOGE("Resource type (%s) failed to load\n", type.c_str()); + + delete res; + } + else + { + mResources.push_back((Resource*) res); + } + } + else if (type == "image") + { + ImageResource* res = new ImageResource(child, pZip); + if (res == NULL || res->GetResource() == NULL) + { + xml_attribute<>* attr_name = child->first_attribute("name"); + + if (!attr_name) { + std::string res_name = attr_name->value(); + LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str()); + } else + LOGE("Resource type (%s) failed to load\n", type.c_str()); + + delete res; + } + else + { + mResources.push_back((Resource*) res); + } + } + else if (type == "animation") + { + AnimationResource* res = new AnimationResource(child, pZip); + if (res == NULL || res->GetResource() == NULL) + { + xml_attribute<>* attr_name = child->first_attribute("name"); + + if (!attr_name) { + std::string res_name = attr_name->value(); + LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str()); + } else + LOGE("Resource type (%s) failed to load\n", type.c_str()); + + delete res; + } + else + { + mResources.push_back((Resource*) res); + } + } + else + { + LOGE("Resource type (%s) not supported.\n", type.c_str()); + } + + child = child->next_sibling("resource"); + } +} + +ResourceManager::~ResourceManager() +{ + std::vector<Resource*>::iterator iter; + + for (iter = mResources.begin(); iter != mResources.end(); iter++) + { + delete *iter; + } + mResources.clear(); +} + |