diff options
Diffstat (limited to 'src/resourcemgr.cpp')
-rw-r--r-- | src/resourcemgr.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/resourcemgr.cpp b/src/resourcemgr.cpp new file mode 100644 index 0000000..a15a702 --- /dev/null +++ b/src/resourcemgr.cpp @@ -0,0 +1,183 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ +#include <qdict.h> +#include <qfile.h> +#include <qcstring.h> +#include <qglobal.h> +#include <string.h> + +#include "resourcemgr.h" +#include "util.h" +#include "version.h" +#include "ftextstream.h" +#include "message.h" +#include "config.h" + +class ResourceMgr::Private +{ + public: + Private() : resources(257) {} + QDict<Resource> resources; +}; + +ResourceMgr &ResourceMgr::instance() +{ + static ResourceMgr theInstance; + return theInstance; +} + +ResourceMgr::ResourceMgr() +{ + p = new Private; +} + +ResourceMgr::~ResourceMgr() +{ + delete p; +} + +void ResourceMgr::registerResources(const Resource resources[],int numResources) +{ + for (int i=0;i<numResources;i++) + { + p->resources.insert(resources[i].name,&resources[i]); + } +} + +bool ResourceMgr::copyCategory(const char *categoryName,const char *targetDir) const +{ + QDictIterator<Resource> it(p->resources); + const Resource *res; + for (it.toFirst();(res=it.current());++it) + { + if (qstrcmp(res->category,categoryName)==0) + { + if (!copyResource(res->name,targetDir)) + { + return FALSE; + } + } + } + return TRUE; +} + +bool ResourceMgr::copyResourceAs(const char *name,const char *targetDir,const char *targetName) const +{ + QCString pathName = QCString(targetDir)+"/"+targetName; + const Resource *res = get(name); + if (res) + { + switch (res->type) + { + case Resource::Verbatim: + { + QFile f(pathName); + if (f.open(IO_WriteOnly) && f.writeBlock((const char *)res->data,res->size)==res->size) + { + return TRUE; + } + } + break; + case Resource::Luminance: + { + QCString n = name; + n = n.left(n.length()-4)+".png"; // replace .lum by .png + uchar *p = (uchar*)res->data; + int width = (p[0]<<8)+p[1]; + int height = (p[2]<<8)+p[3]; + ColoredImgDataItem images[2]; + images[0].name = n; + images[0].width = width; + images[0].height = height; + images[0].content = &p[4]; + images[0].alpha = 0; + images[1].name = 0; // terminator + writeColoredImgData(targetDir,images); + return TRUE; + } + break; + case Resource::LumAlpha: + { + QCString n = name; + n = n.left(n.length()-5)+".png"; // replace .luma by .png + uchar *p = (uchar*)res->data; + int width = (p[0]<<8)+p[1]; + int height = (p[2]<<8)+p[3]; + ColoredImgDataItem images[2]; + images[0].name = n; + images[0].width = width; + images[0].height = height; + images[0].content = &p[4]; + images[0].alpha = &p[4+width*height]; + images[1].name = 0; // terminator + writeColoredImgData(targetDir,images); + return TRUE; + } + break; + case Resource::CSS: + { + QFile f(pathName); + if (f.open(IO_WriteOnly)) + { + QCString buf(res->size+1); + memcpy(buf.data(),res->data,res->size); + FTextStream t(&f); + buf = replaceColorMarkers(buf); + if (qstrcmp(name,"navtree.css")==0) + { + t << substitute(buf,"$width",QCString().setNum(Config_getInt("TREEVIEW_WIDTH"))+"px"); + } + else + { + t << substitute(buf,"$doxygenversion",versionString); + } + return TRUE; + } + } + break; + } + } + else + { + err("requested resource '%s' not compiled in!\n",name); + } + return FALSE; +} + +bool ResourceMgr::copyResource(const char *name,const char *targetDir) const +{ + return copyResourceAs(name,targetDir,name); +} + +const Resource *ResourceMgr::get(const char *name) const +{ + return p->resources.find(name); +} + +QCString ResourceMgr::getAsString(const char *name) const +{ + const Resource *res = get(name); + if (res) + { + QCString result(res->size+1); + memcpy(result.data(),res->data,res->size); + return result; + } + else + { + return QCString(); + } +} + |