1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include "StdAfx.h"
#include "ArchiveHPI.h"
#include <algorithm>
#include <stdexcept>
#include "Util.h"
#include "mmgr.h"
#include "LogOutput.h"
using namespace hpiutil;
CArchiveHPI::CArchiveHPI(const std::string& name):
CArchiveBuffered(name),
curSearchHandle(1)
{
hpi = HPIOpen(name.c_str());
if (hpi == NULL) {
LogObject() << "Error opening " << name;
return;
}
std::vector<hpientry_ptr> ret = HPIGetFiles(*hpi);
for (std::vector<hpientry_ptr>::iterator it = ret.begin(); it != ret.end(); it++) {
if (!(*it)->directory) {
std::string name = StringToLower((*it)->path());
fileSizes[name] = (*it)->size;
}
}
}
CArchiveHPI::~CArchiveHPI(void)
{
if (hpi)
HPIClose(*hpi);
}
bool CArchiveHPI::IsOpen()
{
return (hpi != NULL);
}
ABOpenFile_t* CArchiveHPI::GetEntireFileImpl(const std::string& fileName)
{
std::string name = StringToLower(fileName);
hpientry_ptr f = HPIOpenFile(*hpi, (const char*)name.c_str());
if (!f.get())
return 0;
ABOpenFile_t* of = new ABOpenFile_t;
of->pos = 0;
of->size = f->size;
of->data = (char*)malloc(of->size);
if (HPIGet(of->data, f, 0, of->size) != (unsigned)of->size) {
free(of->data);
delete of;
return 0;
}
HPICloseFile(f);
return of;
}
int CArchiveHPI::FindFiles(int cur, std::string* name, int* size)
{
if (cur == 0) {
curSearchHandle++;
cur = curSearchHandle;
searchHandles[cur] = fileSizes.begin();
}
if (searchHandles.find(cur) == searchHandles.end())
throw std::runtime_error("Unregistered handle. Pass a handle returned by CArchiveHPI::FindFiles.");
if (searchHandles[cur] == fileSizes.end()) {
searchHandles.erase(cur);
return 0;
}
*name = searchHandles[cur]->first;
*size = searchHandles[cur]->second;
searchHandles[cur]++;
return cur;
}
|