Blame src/resourcemgr.cpp

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