30 #include "vfs/raw/rawdata.h"
31 #include "util/base/exception.h"
32 #include "util/log/logger.h"
37 static Logger _log(LM_FO_LOADERS);
40 FL_LOG(_log,
LMsg(
"MFFalloutDAT1")
41 <<
"loading: " << file
42 <<
" filesize: " << m_data->getDataLength());
46 const uint32_t dircount = m_data->read32Big();
47 m_data->moveIndex(4*3);
49 FL_LOG(_log,
LMsg(
"MFFalloutDAT1")
50 <<
"number of directories " << dircount);
53 if( dircount*16 > m_data->getDataLength() ) {
54 throw InvalidFormat(
"directory count larger than filesize.");
57 std::list<std::string> dir_names;
58 for (uint32_t i = 0; i < dircount; ++i) {
59 std::string name = readString();
63 dir_names.push_back(name);
66 for(std::list<std::string>::iterator i= dir_names.begin(); i!= dir_names.end(); ++i)
70 void DAT1::loadFileList(
const std::string& dirname) {
71 const uint32_t filecount = m_data->read32Big();
72 m_data->moveIndex(4*3);
73 for (uint32_t i = 0; i < filecount; ++i) {
75 info.name = fixPath(dirname +
"/" + readString());
76 info.type = m_data->read32Big();
77 info.offset = m_data->read32Big();
78 info.unpackedLength = m_data->read32Big();
79 info.packedLength = m_data->read32Big();
81 m_filelist.insert(std::make_pair(info.name, info));
85 std::string DAT1::readString() {
86 uint8_t length = m_data->read8();
87 return m_data->readString(length);
96 return m_filelist.find(name) != m_filelist.end();
100 type_filelist::const_iterator i = m_filelist.find(name);
101 if (i == m_filelist.end())
102 throw NotFound(name);
108 return list(pathstr,
false);
112 return list(pathstr,
true);
115 std::set<std::string> DAT1::list(
const std::string& pathstr,
bool dirs)
const {
116 std::set<std::string> list;
117 std::string path = pathstr;
120 if (path.find(
"./") == 0) {
124 int lastIndex = path.size() - 1;
125 if ((lastIndex != -1) && path[lastIndex] !=
'/') {
129 type_filelist::const_iterator end = m_filelist.end();
130 for (type_filelist::const_iterator i = m_filelist.begin(); i != end; ++i) {
131 const std::string& file = i->first;
132 if (file.find(path) == 0) {
133 std::string cleanedfile = file.substr(path.size(), file.size());
134 bool isdir = cleanedfile.find(
'/') != std::string::npos;
137 cleanedfile = cleanedfile.substr(0, cleanedfile.find(
'/'));
138 if (cleanedfile.find(
'/') != cleanedfile.rfind(
'/')) {
145 list.insert(cleanedfile);