|
|
@@ -10,287 +10,288 @@ namespace oxygine
|
|
|
{
|
|
|
namespace file
|
|
|
{
|
|
|
- bool sortFiles(const file_entry& ob1, const file_entry& ob2)
|
|
|
- {
|
|
|
- return strcmp_cns(ob1.name, ob2.name) < 0;
|
|
|
- }
|
|
|
+ bool sortFiles(const file_entry& ob1, const file_entry& ob2)
|
|
|
+ {
|
|
|
+ return strcmp_cns(ob1.name, ob2.name) < 0;
|
|
|
+ }
|
|
|
|
|
|
- bool readEntry(const file_entry* entry, file::buffer& bf)
|
|
|
- {
|
|
|
- bf.data.clear();
|
|
|
- int r = unzGoToFilePos(entry->zp, const_cast<unz_file_pos*>(&entry->pos));
|
|
|
- OX_ASSERT(r == UNZ_OK);
|
|
|
+ bool readEntry(const file_entry* entry, file::buffer& bf)
|
|
|
+ {
|
|
|
+ bf.data.clear();
|
|
|
+ int r = unzGoToFilePos(entry->zp, const_cast<unz_file_pos*>(&entry->pos));
|
|
|
+ OX_ASSERT(r == UNZ_OK);
|
|
|
|
|
|
- unz_file_info file_info;
|
|
|
- r = unzGetCurrentFileInfo(entry->zp, &file_info, 0, 0, 0, 0, 0, 0);
|
|
|
- OX_ASSERT(r == UNZ_OK);
|
|
|
+ unz_file_info file_info;
|
|
|
+ r = unzGetCurrentFileInfo(entry->zp, &file_info, 0, 0, 0, 0, 0, 0);
|
|
|
+ OX_ASSERT(r == UNZ_OK);
|
|
|
|
|
|
- unzOpenCurrentFile(entry->zp);
|
|
|
+ unzOpenCurrentFile(entry->zp);
|
|
|
|
|
|
- bf.data.resize(file_info.uncompressed_size);
|
|
|
- r = unzReadCurrentFile(entry->zp, &bf.data.front(), (int)bf.data.size());
|
|
|
- OX_ASSERT(r == (int)file_info.uncompressed_size);
|
|
|
+ bf.data.resize(file_info.uncompressed_size);
|
|
|
+ r = unzReadCurrentFile(entry->zp, &bf.data.front(), (int)bf.data.size());
|
|
|
+ OX_ASSERT(r == (int)file_info.uncompressed_size);
|
|
|
|
|
|
- unzCloseCurrentFile(entry->zp);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- Zips::Zips() : _lock(true)
|
|
|
- {
|
|
|
+ unzCloseCurrentFile(entry->zp);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ Zips::Zips() : _lock(true)
|
|
|
+ {
|
|
|
|
|
|
- Zips::~Zips()
|
|
|
- {
|
|
|
- reset();
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- void Zips::read(unzFile zp)
|
|
|
- {
|
|
|
- //MutexAutoLock al(_lock);
|
|
|
+ Zips::~Zips()
|
|
|
+ {
|
|
|
+ reset();
|
|
|
+ }
|
|
|
|
|
|
- do
|
|
|
+ void Zips::read(unzFile zp)
|
|
|
{
|
|
|
- unz_file_pos pos;
|
|
|
- unzGetFilePos(zp, &pos);
|
|
|
+ //MutexAutoLock al(_lock);
|
|
|
|
|
|
- file_entry entry;
|
|
|
- unzGetCurrentFileInfo(zp, 0, entry.name, sizeof(entry.name) - 1, 0, 0, 0, 0);
|
|
|
- entry.refs = 0;
|
|
|
- entry.pos = pos;
|
|
|
- entry.zp = zp;
|
|
|
+ do
|
|
|
+ {
|
|
|
+ unz_file_pos pos;
|
|
|
+ unzGetFilePos(zp, &pos);
|
|
|
|
|
|
- char* str = entry.name;
|
|
|
- for (int i = 0; str[i]; i++)
|
|
|
- str[i] = tolower(str[i]);
|
|
|
+ file_entry entry;
|
|
|
+ unzGetCurrentFileInfo(zp, 0, entry.name, sizeof(entry.name) - 1, 0, 0, 0, 0);
|
|
|
+ entry.refs = 0;
|
|
|
+ entry.pos = pos;
|
|
|
+ entry.zp = zp;
|
|
|
|
|
|
+ char* str = entry.name;
|
|
|
+ for (int i = 0; str[i]; i++)
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
|
|
|
- OX_ASSERT(_files.find(entry.name) == _files.end());
|
|
|
|
|
|
- _files[entry.name] = entry;
|
|
|
+ OX_ASSERT(_files.find(entry.name) == _files.end());
|
|
|
|
|
|
- } while (unzGoToNextFile(zp) != UNZ_END_OF_LIST_OF_FILE);
|
|
|
+ _files[entry.name] = entry;
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
+ while (unzGoToNextFile(zp) != UNZ_END_OF_LIST_OF_FILE);
|
|
|
|
|
|
- void Zips::add(const unsigned char* data, unsigned int size)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
+ }
|
|
|
|
|
|
- zlib_filefunc_def ff;
|
|
|
- fill_memory_filefunc(&ff);
|
|
|
+ void Zips::add(const unsigned char* data, unsigned int size)
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
|
|
|
- zmemdata dta;
|
|
|
- dta.data = (char*)data;
|
|
|
- dta.size = size;
|
|
|
+ zlib_filefunc_def ff;
|
|
|
+ fill_memory_filefunc(&ff);
|
|
|
|
|
|
- unzFile zp = unzOpen2((const char*)&dta, &ff);
|
|
|
- OX_ASSERT(zp);
|
|
|
- if (!zp)
|
|
|
- return;
|
|
|
+ zmemdata dta;
|
|
|
+ dta.data = (char*)data;
|
|
|
+ dta.size = size;
|
|
|
|
|
|
+ unzFile zp = unzOpen2((const char*)&dta, &ff);
|
|
|
+ OX_ASSERT(zp);
|
|
|
+ if (!zp)
|
|
|
+ return;
|
|
|
|
|
|
- zpitem item;
|
|
|
- item.handle = zp;
|
|
|
- _zps.push_back(item);
|
|
|
|
|
|
- read(zp);
|
|
|
- }
|
|
|
+ zpitem item;
|
|
|
+ item.handle = zp;
|
|
|
+ _zps.push_back(item);
|
|
|
|
|
|
- void Zips::add(std::vector<char>& data)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
+ read(zp);
|
|
|
+ }
|
|
|
|
|
|
- zlib_filefunc_def ff;
|
|
|
- fill_memory_filefunc(&ff);
|
|
|
+ void Zips::add(std::vector<char>& data)
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
|
|
|
- zmemdata dta;
|
|
|
- dta.data = (char*)&data.front();
|
|
|
- dta.size = data.size();
|
|
|
+ zlib_filefunc_def ff;
|
|
|
+ fill_memory_filefunc(&ff);
|
|
|
|
|
|
- unzFile zp = unzOpen2((const char*)&dta, &ff);
|
|
|
- OX_ASSERT(zp);
|
|
|
- if (!zp)
|
|
|
- return;
|
|
|
+ zmemdata dta;
|
|
|
+ dta.data = (char*)&data.front();
|
|
|
+ dta.size = data.size();
|
|
|
|
|
|
- _zps.push_back(zpitem());
|
|
|
- zpitem& item = _zps.back();
|
|
|
- item.handle = zp;
|
|
|
- std::swap(item.data, data);
|
|
|
+ unzFile zp = unzOpen2((const char*)&dta, &ff);
|
|
|
+ OX_ASSERT(zp);
|
|
|
+ if (!zp)
|
|
|
+ return;
|
|
|
|
|
|
- read(zp);
|
|
|
- }
|
|
|
+ _zps.push_back(zpitem());
|
|
|
+ zpitem& item = _zps.back();
|
|
|
+ item.handle = zp;
|
|
|
+ std::swap(item.data, data);
|
|
|
|
|
|
- voidpf ZCALLBACK ox_fopen(voidpf opaque, const char* filename, int mode)
|
|
|
- {
|
|
|
- return file::open(filename, "rb");
|
|
|
- }
|
|
|
+ read(zp);
|
|
|
+ }
|
|
|
|
|
|
- uLong ZCALLBACK ox_fread(voidpf opaque, voidpf stream, void* buf, uLong size)
|
|
|
- {
|
|
|
- return file::read((handle)stream, buf, (unsigned int)size);
|
|
|
- }
|
|
|
+ voidpf ZCALLBACK ox_fopen(voidpf opaque, const char* filename, int mode)
|
|
|
+ {
|
|
|
+ return file::open(filename, "rb");
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- uLong ZCALLBACK ox_fwriteOF(voidpf opaque, voidpf stream, const void* buf, uLong size)
|
|
|
- {
|
|
|
+ uLong ZCALLBACK ox_fread(voidpf opaque, voidpf stream, void* buf, uLong size)
|
|
|
+ {
|
|
|
+ return file::read((handle)stream, buf, (unsigned int)size);
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
- */
|
|
|
+ /*
|
|
|
+ uLong ZCALLBACK ox_fwriteOF(voidpf opaque, voidpf stream, const void* buf, uLong size)
|
|
|
+ {
|
|
|
|
|
|
- long ZCALLBACK ox_ftell(voidpf opaque, voidpf stream)
|
|
|
- {
|
|
|
- return file::tell((handle)stream);
|
|
|
- }
|
|
|
+ }
|
|
|
+ */
|
|
|
|
|
|
- long ZCALLBACK ox_fseek(voidpf opaque, voidpf stream, uLong offset, int origin)
|
|
|
- {
|
|
|
- file::seek((handle)stream, (unsigned int)offset, origin);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ long ZCALLBACK ox_ftell(voidpf opaque, voidpf stream)
|
|
|
+ {
|
|
|
+ return file::tell((handle)stream);
|
|
|
+ }
|
|
|
|
|
|
- int ZCALLBACK ox_fclose(voidpf opaque, voidpf stream)
|
|
|
- {
|
|
|
- file::close((handle)stream);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ long ZCALLBACK ox_fseek(voidpf opaque, voidpf stream, uLong offset, int origin)
|
|
|
+ {
|
|
|
+ file::seek((handle)stream, (unsigned int)offset, origin);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- int ZCALLBACK ox_ferror(voidpf opaque, voidpf stream)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ int ZCALLBACK ox_fclose(voidpf opaque, voidpf stream)
|
|
|
+ {
|
|
|
+ file::close((handle)stream);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- void Zips::remove(const char* name)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
+ int ZCALLBACK ox_ferror(voidpf opaque, voidpf stream)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- for (size_t i = 0; i < _zps.size(); ++i)
|
|
|
+ void Zips::remove(const char* name)
|
|
|
{
|
|
|
- zpitem& item = _zps[i];
|
|
|
- if (!strcmp(item.name, name))
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
+
|
|
|
+ for (size_t i = 0; i < _zps.size(); ++i)
|
|
|
{
|
|
|
- for (files::iterator it = _files.begin(); it != _files.end();)
|
|
|
+ zpitem& item = _zps[i];
|
|
|
+ if (!strcmp(item.name, name))
|
|
|
{
|
|
|
- file_entry& entry = it->second;
|
|
|
- if (entry.zp == item.handle)
|
|
|
+ for (files::iterator it = _files.begin(); it != _files.end();)
|
|
|
{
|
|
|
- OX_ASSERT(entry.refs == 0);
|
|
|
- it = _files.erase(it);
|
|
|
+ file_entry& entry = it->second;
|
|
|
+ if (entry.zp == item.handle)
|
|
|
+ {
|
|
|
+ OX_ASSERT(entry.refs == 0);
|
|
|
+ it = _files.erase(it);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ ++it;
|
|
|
}
|
|
|
- else
|
|
|
- ++it;
|
|
|
- }
|
|
|
|
|
|
- unzClose(item.handle);
|
|
|
+ unzClose(item.handle);
|
|
|
|
|
|
- _zps.erase(_zps.begin() + i);
|
|
|
- break;
|
|
|
+ _zps.erase(_zps.begin() + i);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- void Zips::add(const char* name)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
-
|
|
|
- zlib_filefunc_def zpfs;
|
|
|
- memset(&zpfs, 0, sizeof(zpfs));
|
|
|
-
|
|
|
- zpfs.zopen_file = ox_fopen;
|
|
|
- zpfs.zread_file = ox_fread;
|
|
|
- zpfs.zwrite_file = 0;
|
|
|
- zpfs.ztell_file = ox_ftell;
|
|
|
- zpfs.zseek_file = ox_fseek;
|
|
|
- zpfs.zclose_file = ox_fclose;
|
|
|
- zpfs.zerror_file = ox_ferror;
|
|
|
- zpfs.opaque = (void*)_zps.size();
|
|
|
- //zpfs.opaque = name;
|
|
|
-
|
|
|
- unzFile zp = unzOpen2(name, &zpfs);//todo, optimize search in zip
|
|
|
- OX_ASSERT(zp);
|
|
|
- if (!zp)
|
|
|
- return;
|
|
|
-
|
|
|
- zpitem item;
|
|
|
- item.handle = zp;
|
|
|
- strcpy(item.name, name);
|
|
|
- _zps.push_back(item);
|
|
|
-
|
|
|
- read(zp);
|
|
|
- }
|
|
|
|
|
|
- bool Zips::isExists(const char* name)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
- return getEntryByName(name) != 0;
|
|
|
- }
|
|
|
+ void Zips::add(const char* name)
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
+
|
|
|
+ zlib_filefunc_def zpfs;
|
|
|
+ memset(&zpfs, 0, sizeof(zpfs));
|
|
|
+
|
|
|
+ zpfs.zopen_file = ox_fopen;
|
|
|
+ zpfs.zread_file = ox_fread;
|
|
|
+ zpfs.zwrite_file = 0;
|
|
|
+ zpfs.ztell_file = ox_ftell;
|
|
|
+ zpfs.zseek_file = ox_fseek;
|
|
|
+ zpfs.zclose_file = ox_fclose;
|
|
|
+ zpfs.zerror_file = ox_ferror;
|
|
|
+ zpfs.opaque = (void*)_zps.size();
|
|
|
+ //zpfs.opaque = name;
|
|
|
+
|
|
|
+ unzFile zp = unzOpen2(name, &zpfs);//todo, optimize search in zip
|
|
|
+ OX_ASSERT(zp);
|
|
|
+ if (!zp)
|
|
|
+ return;
|
|
|
+
|
|
|
+ zpitem item;
|
|
|
+ item.handle = zp;
|
|
|
+ strcpy(item.name, name);
|
|
|
+ _zps.push_back(item);
|
|
|
+
|
|
|
+ read(zp);
|
|
|
+ }
|
|
|
|
|
|
- bool Zips::read(const char* name, file::buffer& bf)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
+ bool Zips::isExists(const char* name)
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
+ return getEntryByName(name) != 0;
|
|
|
+ }
|
|
|
|
|
|
- const file_entry* entry = getEntryByName(name);
|
|
|
- if (!entry)
|
|
|
- return false;
|
|
|
- return readEntry(entry, bf);
|
|
|
- }
|
|
|
+ bool Zips::read(const char* name, file::buffer& bf)
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
|
|
|
- bool Zips::read(const file_entry* entry, file::buffer& bf)
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
- return readEntry(entry, bf);
|
|
|
- }
|
|
|
+ const file_entry* entry = getEntryByName(name);
|
|
|
+ if (!entry)
|
|
|
+ return false;
|
|
|
+ return readEntry(entry, bf);
|
|
|
+ }
|
|
|
|
|
|
- void Zips::reset()
|
|
|
- {
|
|
|
- MutexAutoLock al(_lock);
|
|
|
- for (zips::iterator i = _zps.begin(); i != _zps.end(); ++i)
|
|
|
+ bool Zips::read(const file_entry* entry, file::buffer& bf)
|
|
|
{
|
|
|
- zpitem& f = *i;
|
|
|
- unzClose(f.handle);
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
+ return readEntry(entry, bf);
|
|
|
}
|
|
|
|
|
|
+ void Zips::reset()
|
|
|
+ {
|
|
|
+ MutexAutoLock al(_lock);
|
|
|
+ for (zips::iterator i = _zps.begin(); i != _zps.end(); ++i)
|
|
|
+ {
|
|
|
+ zpitem& f = *i;
|
|
|
+ unzClose(f.handle);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
#ifdef OX_DEBUG
|
|
|
- for (files::iterator i = _files.begin(); i != _files.end(); ++i)
|
|
|
- {
|
|
|
- OX_ASSERT(i->second.refs == 0);
|
|
|
- }
|
|
|
+ for (files::iterator i = _files.begin(); i != _files.end(); ++i)
|
|
|
+ {
|
|
|
+ OX_ASSERT(i->second.refs == 0);
|
|
|
+ }
|
|
|
|
|
|
#endif
|
|
|
- _zps.clear();
|
|
|
- _files.clear();
|
|
|
- }
|
|
|
+ _zps.clear();
|
|
|
+ _files.clear();
|
|
|
+ }
|
|
|
|
|
|
- file_entry* Zips::getEntryByName(const char* name)
|
|
|
- {
|
|
|
- char str[255];
|
|
|
- char* p = str;
|
|
|
- while (*name)
|
|
|
+ file_entry* Zips::getEntryByName(const char* name)
|
|
|
{
|
|
|
- *p = tolower(*name);
|
|
|
- name++;
|
|
|
- ++p;
|
|
|
- }
|
|
|
- *p = 0;
|
|
|
+ char str[255];
|
|
|
+ char* p = str;
|
|
|
+ while (*name)
|
|
|
+ {
|
|
|
+ *p = tolower(*name);
|
|
|
+ name++;
|
|
|
+ ++p;
|
|
|
+ }
|
|
|
+ *p = 0;
|
|
|
|
|
|
- files::iterator it = _files.find(str);
|
|
|
- if (it != _files.end())
|
|
|
- return &it->second;
|
|
|
+ files::iterator it = _files.find(str);
|
|
|
+ if (it != _files.end())
|
|
|
+ return &it->second;
|
|
|
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- const file_entry* Zips::getEntry(int index)
|
|
|
- {
|
|
|
- return &_files[index];
|
|
|
- }
|
|
|
+ /*
|
|
|
+ const file_entry* Zips::getEntry(int index)
|
|
|
+ {
|
|
|
+ return &_files[index];
|
|
|
+ }
|
|
|
|
|
|
- size_t Zips::getNumEntries() const
|
|
|
- {
|
|
|
- return _files.size();
|
|
|
+ size_t Zips::getNumEntries() const
|
|
|
+ {
|
|
|
+ return _files.size();
|
|
|
+ }
|
|
|
+ */
|
|
|
}
|
|
|
- */
|
|
|
- }
|
|
|
}
|