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