Doxygen
Loading...
Searching...
No Matches
resourcemgr.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2015 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#include <map>
17#include <string.h>
18#include <cstdint>
19
20#include "resourcemgr.h"
21#include "util.h"
22#include "version.h"
23#include "message.h"
24#include "config.h"
25#include "portable.h"
26
28{
29 public:
30 std::map<std::string,Resource> resources;
31};
32
34{
35 static ResourceMgr theInstance;
36 return theInstance;
37}
38
39ResourceMgr::ResourceMgr() : p(std::make_unique<Private>())
40{
41}
42
46
47void ResourceMgr::registerResources(std::initializer_list<Resource> resources)
48{
49 for (auto &res : resources)
50 {
51 p->resources.emplace(res.name,res);
52 }
53}
54
55bool ResourceMgr::writeCategory(const QCString &categoryName,const QCString &targetDir) const
56{
57 for (auto &[name,res] : p->resources)
58 {
59 if (res.category==categoryName)
60 {
61 QCString pathName = targetDir+"/"+res.name;
62 std::ofstream f = Portable::openOutputStream(pathName);
63 bool ok=false;
64 if (f.is_open())
65 {
66 f.write(reinterpret_cast<const char *>(res.data),res.size);
67 ok = !f.fail();
68 }
69 if (!ok)
70 {
71 err("Failed to write resource '%s' to directory '%s'\n",res.name,qPrint(targetDir));
72 return FALSE;
73 }
74 }
75 }
76 return TRUE;
77}
78
79bool ResourceMgr::copyResourceAs(const QCString &name,const QCString &targetDir,const QCString &targetName,bool append) const
80{
81 QCString pathName = targetDir+"/"+targetName;
82 const Resource *res = get(name);
83 if (res)
84 {
85 switch (res->type)
86 {
88 {
89 std::ofstream f = Portable::openOutputStream(pathName,append);
90 bool ok=false;
91 if (f.is_open())
92 {
93 f.write(reinterpret_cast<const char *>(res->data),res->size);
94 ok = !f.fail();
95 }
96 if (ok)
97 {
98 return TRUE;
99 }
100 }
101 break;
103 {
104 QCString n = name;
105 n = n.left(n.length()-4)+".png"; // replace .lum by .png
106 const uint8_t *data = res->data;
107 uint16_t width = (data[0]<<8)+data[1];
108 uint16_t height = (data[2]<<8)+data[3];
109 ColoredImgDataItem images[2];
110 images[0].name = n.data();
111 images[0].width = width;
112 images[0].height = height;
113 images[0].content = &data[4];
114 images[0].alpha = nullptr;
115 images[1].name = nullptr; // terminator
116 writeColoredImgData(targetDir,images);
117 return TRUE;
118 }
119 break;
121 {
122 QCString n = name;
123 n = n.left(n.length()-5)+".png"; // replace .luma by .png
124 const uint8_t *data = res->data;
125 uint16_t width = (data[0]<<8)+data[1];
126 uint16_t height = (data[2]<<8)+data[3];
127 ColoredImgDataItem images[2];
128 images[0].name = n.data();
129 images[0].width = width;
130 images[0].height = height;
131 images[0].content = &data[4];
132 images[0].alpha = &data[4+width*height];
133 images[1].name = nullptr; // terminator
134 writeColoredImgData(targetDir,images);
135 return TRUE;
136 }
137 break;
138 case Resource::CSS:
139 {
140 std::ofstream t = Portable::openOutputStream(pathName,append);
141 if (t.is_open())
142 {
143 QCString buf(res->size, QCString::ExplicitSize);
144 memcpy(buf.rawData(),res->data,res->size);
145 buf = replaceColorMarkers(buf);
146 if (name=="navtree.css")
147 {
148 t << substitute(buf,"$width",QCString().setNum(Config_getInt(TREEVIEW_WIDTH))+"px");
149 }
150 else
151 {
152 t << substitute(buf,"$doxygenversion",getDoxygenVersion());
153 }
154 return TRUE;
155 }
156 }
157 break;
158 case Resource::SVG:
159 {
160 std::ofstream t = Portable::openOutputStream(pathName,append);
161 if (t.is_open())
162 {
163 QCString buf(res->size, QCString::ExplicitSize);
164 memcpy(buf.rawData(),res->data,res->size);
165 t << replaceColorMarkers(buf);
166 return TRUE;
167 }
168 }
169 }
170 }
171 else
172 {
173 err("requested resource '%s' not compiled in!\n",qPrint(name));
174 }
175 return FALSE;
176}
177
178bool ResourceMgr::copyResource(const QCString &name,const QCString &targetDir) const
179{
180 return copyResourceAs(name,targetDir,name);
181}
182
183const Resource *ResourceMgr::get(const QCString &name) const
184{
185 auto it = p->resources.find(name.str());
186 if (it!=p->resources.end()) return &it->second;
187 return nullptr;
188}
189
191{
192 const Resource *res = get(name);
193 if (res)
194 {
195 QCString result(res->size, QCString::ExplicitSize);
196 memcpy(result.rawData(),res->data,res->size);
197 return result;
198 }
199 else
200 {
201 return QCString();
202 }
203}
204
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
char * rawData()
Returns a writable pointer to the data.
Definition qcstring.h:165
const std::string & str() const
Definition qcstring.h:526
@ ExplicitSize
Definition qcstring.h:133
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:159
QCString left(size_t len) const
Definition qcstring.h:214
std::map< std::string, Resource > resources
static ResourceMgr & instance()
Returns the one and only instance of this class.
const Resource * get(const QCString &name) const
Returns a pointer to the resource object with the given name.
bool copyResource(const QCString &name, const QCString &targetDir) const
Copies a registered resource to a given target directory.
bool writeCategory(const QCString &categoryName, const QCString &targetDir) const
Writes all resource belonging to a given category to a given target directory.
QCString getAsString(const QCString &name) const
Gets the resource data as a C string.
bool copyResourceAs(const QCString &name, const QCString &targetDir, const QCString &targetName, bool append=false) const
Copies a registered resource to a given target directory under a given target name.
std::unique_ptr< Private > p
Definition resourcemgr.h:66
void registerResources(std::initializer_list< Resource > resources)
Registers an array of resources.
#define Config_getInt(name)
Definition config.h:34
#define err(fmt,...)
Definition message.h:84
std::ofstream openOutputStream(const QCString &name, bool append=false)
Definition portable.cpp:665
Portable versions of functions that are platform dependent.
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:477
const char * qPrint(const char *s)
Definition qcstring.h:661
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
const unsigned char * content
Definition util.h:412
unsigned short height
Definition util.h:411
const unsigned char * alpha
Definition util.h:413
unsigned short width
Definition util.h:410
const char * name
Definition util.h:409
Compiled resource.
Definition resourcemgr.h:26
const unsigned char * data
Definition resourcemgr.h:30
Type type
Definition resourcemgr.h:32
QCString replaceColorMarkers(const QCString &str)
Replaces any markers of the form ##AA in input string str by new markers of the form #AABBCC,...
Definition util.cpp:6118
void writeColoredImgData(const QCString &dir, ColoredImgDataItem data[])
Writes the intensity only bitmap represented by data as an image to directory dir using the colors de...
Definition util.cpp:6094
A bunch of utility functions.