tree changes

This commit is contained in:
2020-08-19 00:47:05 +03:00
parent c582d8ff46
commit ccd6a9888f
240 changed files with 30 additions and 12 deletions

View File

@@ -0,0 +1,50 @@
/*
PIP - Platform Independent Primitives
Resources subsystem
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piresources.h"
#include "piresourcesstorage.h"
PIResources::PIResources() {
}
PIByteArray PIResources::get(const PIString & section, const PIString & name) {
return PIResourcesStorage::instance()->get(section, name);
}
PIByteArray PIResources::get(const PIString & name) {
return PIResourcesStorage::instance()->get(name);
}
void PIResources::dump() {
auto si = PIResourcesStorage::instance()->sections.makeIterator();
while (si.next()) {
piCout << "Section [" << si.key() << "]";
if (!si.value()) continue;
auto fi = si.value()->entries.makeIterator();
while (fi.next()) {
PIString s = fi.key() + ": ";
s << (fi.value() ? fi.value()->size_s() : 0) << " b";
piCout << " " << s;
}
}
}

View File

@@ -0,0 +1,44 @@
/*! \file piresources.h
* \brief Resources subsystem
*/
/*
PIP - Platform Independent Primitives
Resources subsystem
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIRESOURCES_H
#define PIRESOURCES_H
#include "pistring.h"
#define INIT_RESOURCE(name) {extern void _pirc_##name##_init_(); _pirc_##name##_init_();}
class PIP_EXPORT PIResources {
public:
//!
static PIByteArray get(const PIString & section, const PIString & name);
static PIByteArray get(const PIString & name);
static void dump();
private:
PIResources();
};
#endif // PIRESOURCES_H

View File

@@ -0,0 +1,170 @@
/*
PIP - Platform Independent Primitives
Resources subsystem
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piresourcesstorage.h"
#include "pichunkstream.h"
#include "piset.h"
PIResourcesStorage::Section::Section() {
}
PIResourcesStorage::Section::~Section() {
}
void PIResourcesStorage::Section::add(const PIResourcesStorage::Section & s) {
auto i = s.entries.makeIterator();
while (i.next()) {
if (!i.value()) continue;
if (entries.value(i.key(), 0)) continue;
entries[i.key()] = i.value();
}
}
void PIResourcesStorage::Section::purge() {
PIVector<PIByteArray * > bav = entries.values();
PISet<PIByteArray * > bas;
piForeach (PIByteArray * i, bav) {
if (i)
bas << i;
}
bav = bas.toVector();
piForeach (PIByteArray * i, bav)
delete i;
entries.clear();
}
PIResourcesStorage::PIResourcesStorage() {
}
PIResourcesStorage::~PIResourcesStorage() {
clear();
}
void PIResourcesStorage::registerSection(const PIString & section_name, const PIResourcesStorage::Section & data) {
Section * s = sections.value(section_name, 0);
if (!s) {
s = new Section();
sections[section_name] = s;
}
s->add(data);
}
void PIResourcesStorage::registerSection(const uchar * rc_data, const uchar * rc_desc, int rc_desc_size) {
//piCout << "registerSection" << this;
PIByteArray dba(rc_desc, rc_desc_size);
PIVector<PIResourcesStorage::__RCEntry> el;
dba >> el;
PIMap<PIString, PIVector<PIResourcesStorage::__RCEntry> > ebs;
piForeachC (PIResourcesStorage::__RCEntry & e, el) {
ebs[e.section] << e;
}
auto it = ebs.makeIterator();
while (it.next()) {
PIResourcesStorage::Section s;
const PIVector<PIResourcesStorage::__RCEntry> & itv(it.value());
piForeachC (PIResourcesStorage::__RCEntry & e, itv) {
//piCout << "add" << e.name << e.alias << PIString::readableSize(e.size);
PIByteArray * eba = new PIByteArray(&(rc_data[e.offset]), e.size);
s.entries[e.name] = eba;
if (!e.alias.isEmpty() && e.alias != e.name)
s.entries[e.alias] = eba;
}
registerSection(it.key(), s);
}
}
PIResourcesStorage::Section * PIResourcesStorage::section(const PIString & section_name) const {
return sections.value(section_name, 0);
}
PIByteArray PIResourcesStorage::get(const PIString & section_name, const PIString & entry_name) const {
Section * s = sections.value(section_name, 0);
if (!s) return PIByteArray();
PIByteArray * ba = s->entries.value(entry_name, 0);
if (!ba) return PIByteArray();
return *ba;
}
PIByteArray PIResourcesStorage::get(const PIString & entry_name) const {
auto i = sections.makeIterator();
while (i.next()) {
if (!i.value()) continue;
PIByteArray * ba = i.value()->entries.value(entry_name, 0);
if (!ba) continue;
return *ba;
}
return PIByteArray();
}
void PIResourcesStorage::clear() {
//piCout << "PIResourcesStorage clear";
PIVector<Section * > sv = sections.values();
piForeach (Section * i, sv) {
if (i)
i->purge();
}
sections.clear();
}
PIResourcesStorage * PIResourcesStorage::instance() {
static PIResourcesStorage * ret = new PIResourcesStorage();
return ret;
}
PIByteArray & operator <<(PIByteArray & b, const PIResourcesStorage::__RCEntry & v) {
PIChunkStream cs;
cs << cs.chunk(1, v.section) << cs.chunk(2, v.name) << cs.chunk(3, v.file)
<< cs.chunk(4, v.size) << cs.chunk(5, v.offset) << cs.chunk(6, v.flags)
<< cs.chunk(7, v.alias);
b << cs.data();
return b;
}
PIByteArray & operator >>(PIByteArray & b, PIResourcesStorage::__RCEntry & v) {
PIByteArray ba; b >> ba;
PIChunkStream cs(ba);
while (!cs.atEnd()) {
switch (cs.read()) {
case 1: cs.get(v.section); break;
case 2: cs.get(v.name); break;
case 3: cs.get(v.file); break;
case 4: cs.get(v.size); break;
case 5: cs.get(v.offset); break;
case 6: cs.get(v.flags); break;
case 7: cs.get(v.alias); break;
}
}
return b;
}

View File

@@ -0,0 +1,82 @@
/*
PIP - Platform Independent Primitives
Resources subsystem
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIRESOURCES_P_H
#define PIRESOURCES_P_H
#include "pistring.h"
#include "pimap.h"
class PIResources;
class PIP_EXPORT PIResourcesStorage {
friend class PIResources;
public:
static PIResourcesStorage * instance();
struct PIP_EXPORT Section {
Section();
~Section();
void add(const Section & s);
void purge();
PIMap<PIString, PIByteArray * > entries;
};
struct PIP_EXPORT __RCEntry {
__RCEntry(const PIString & s = PIString(), const PIString & n = PIString(), const PIString & a = PIString(),
const PIString & f = PIString(), llong o = 0, llong si = 0, int fl = 0) {
section = s;
name = n;
alias = a;
file = f;
offset = o;
size = si;
flags = fl;
}
PIString section;
PIString name;
PIString alias;
PIString file;
llong offset;
llong size;
int flags;
};
void registerSection(const PIString & section_name, const Section & data);
void registerSection(const uchar * rc_data, const uchar * rc_desc, int rc_desc_size);
Section * section(const PIString & section_name) const;
PIByteArray get(const PIString & section_name, const PIString & entry_name) const;
PIByteArray get(const PIString & entry_name) const;
void clear();
private:
PIResourcesStorage();
~PIResourcesStorage();
PIMap<PIString, Section * > sections;
};
PIP_EXPORT PIByteArray & operator <<(PIByteArray & b, const PIResourcesStorage::__RCEntry & v);
PIP_EXPORT PIByteArray & operator >>(PIByteArray & b, PIResourcesStorage::__RCEntry & v);
#endif // PIRESOURCES_H