Skip to content

Commit

Permalink
Refactor|FileSys: Moved "baseOffset" property from AbstractFile to Lu…
Browse files Browse the repository at this point in the history
…mpInfo

Plus some minor cleanup.
  • Loading branch information
danij-deng committed Oct 7, 2012
1 parent bb9250a commit 1c905fc
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 107 deletions.
27 changes: 17 additions & 10 deletions doomsday/engine/portable/include/abstractfile.h
Expand Up @@ -87,25 +87,34 @@ class AbstractFile
*/
filetype_t type() const;

/**
* @return Immutable copy of the info descriptor for this resource.
*/
LumpInfo const& info() const;
/// @return Absolute (i.e., resolved but possibly virtual/mapped) path to this resource.
ddstring_t const* path() const;

/// @return @c true= this file is contained within another.
bool isContained() const;

/// @return The file instance which contains this.
AbstractFile& container() const;

/// @return Absolute (i.e., resolved but possibly virtual/mapped) path to this resource.
ddstring_t const* path() const;

/// @return Load order index for this resource.
uint loadOrderIndex() const;

/**
* @return Immutable copy of the info descriptor for this resource.
*/
LumpInfo const& info() const;

// Convenient lookup method for when only the last-modified property is needed from info().
/// @return "Last modified" timestamp of the resource.
uint lastModified() const;
inline uint lastModified() const {
return info().lastModified;
}

// Convenient lookup method for when only the size property is needed from info().
/// @return Size of the uncompressed resource.
inline uint size() const {
return info().size;
}

/// @return @c true if the resource is marked "startup".
bool hasStartup() const;
Expand All @@ -119,8 +128,6 @@ class AbstractFile
/// Mark this resource as "custom".
AbstractFile& setCustom(bool yes);

size_t baseOffset() const;

DFile* handle();

/**
Expand Down
1 change: 1 addition & 0 deletions doomsday/engine/portable/include/lumpinfo.h
Expand Up @@ -40,6 +40,7 @@ struct abstractfile_s;
typedef struct {
uint lastModified; /// Unix timestamp.
int lumpIdx; /// Relative index of this lump in the owning package else zero.
size_t baseOffset; /// Offset from the start of the owning package.
size_t size; /// Size of the uncompressed file.
size_t compressedSize; /// Size of the original file compressed.
struct abstractfile_s* container; /// Owning package else @c NULL.
Expand Down
10 changes: 0 additions & 10 deletions doomsday/engine/portable/src/abstractfile.cpp
Expand Up @@ -78,11 +78,6 @@ AbstractFile& AbstractFile::container() const
return *cont;
}

size_t AbstractFile::baseOffset() const
{
return (file? file->baseOffset() : 0);
}

DFile* AbstractFile::handle()
{
return file;
Expand All @@ -98,11 +93,6 @@ uint AbstractFile::loadOrderIndex() const
return order;
}

uint AbstractFile::lastModified() const
{
return info_.lastModified;
}

bool AbstractFile::hasStartup() const
{
return !!flags.startup;
Expand Down
30 changes: 16 additions & 14 deletions doomsday/engine/portable/src/fs_main.cpp
Expand Up @@ -431,16 +431,18 @@ void F_InitLumpInfo(LumpInfo* info)
{
DENG_ASSERT(info);
info->lumpIdx = 0;
info->baseOffset = 0;
info->size = 0;
info->compressedSize = 0;
info->lastModified = 0;
info->container = NULL;
info->container = 0;
}

void F_CopyLumpInfo(LumpInfo* dst, LumpInfo const* src)
{
DENG_ASSERT(dst && src);
dst->lumpIdx = src->lumpIdx;
dst->baseOffset = src->baseOffset;
dst->size = src->size;
dst->compressedSize = src->compressedSize;
dst->lastModified = src->lastModified;
Expand Down Expand Up @@ -763,19 +765,9 @@ LumpInfo const* FS::lumpInfo(lumpnum_t absoluteLumpNum, int* lumpIdx)
if(lumpIdx) *lumpIdx = -1;
return 0;
}
return &ActiveWadLumpIndex->lumpInfo(translated);
}

char const* FS::lumpName(lumpnum_t absoluteLumpNum)
{
LumpInfo const* info = lumpInfo(absoluteLumpNum);
if(info)
{
AbstractFile* container = reinterpret_cast<AbstractFile*>(info->container);
PathDirectoryNode const& node = container->lumpDirectoryNode(info->lumpIdx);
return Str_Text(node.pathFragment());
}
return "";
LumpInfo const& info = ActiveWadLumpIndex->lumpInfo(translated);
if(lumpIdx) *lumpIdx = info.lumpIdx;
return &info;
}

AbstractFile* FS::lumpFile(lumpnum_t absoluteLumpNum, int* lumpIdx)
Expand All @@ -785,6 +777,15 @@ AbstractFile* FS::lumpFile(lumpnum_t absoluteLumpNum, int* lumpIdx)
return reinterpret_cast<AbstractFile*>(info->container);
}

char const* FS::lumpName(lumpnum_t absoluteLumpNum)
{
int lumpIdx;
AbstractFile* file = lumpFile(absoluteLumpNum, &lumpIdx);
if(!file) return "";
PathDirectoryNode const& node = file->lumpDirectoryNode(lumpIdx);
return Str_Text(node.pathFragment());
}

int FS::lumpCount()
{
if(inited) return ActiveWadLumpIndex->size();
Expand Down Expand Up @@ -1395,6 +1396,7 @@ static FILE* findRealFile(char const* path, char const* mymode, ddstring_t** fou

AbstractFile* FS::findLumpFile(char const* path, int* lumpIdx)
{
if(lumpIdx) *lumpIdx = -1;
if(!inited || !path || !path[0]) return 0;

/**
Expand Down
51 changes: 28 additions & 23 deletions doomsday/engine/portable/src/wadfile.cpp
Expand Up @@ -58,18 +58,22 @@ typedef struct {

struct WadLumpRecord
{
size_t baseOffset;
uint crc;
LumpInfo info;
LumpInfo info_;

WadLumpRecord() : baseOffset(0), crc(0)
explicit WadLumpRecord(LumpInfo const& _info) : crc(0)
{
F_InitLumpInfo(&info);
F_CopyLumpInfo(&info_, &_info);
}

~WadLumpRecord()
{
F_DestroyLumpInfo(&info);
F_DestroyLumpInfo(&info_);
}

LumpInfo const& info() const
{
return info_;
}
};

Expand Down Expand Up @@ -227,28 +231,29 @@ struct WadFile::Instance
wadlumprecord_t const* arcRecord = arcRecords;
for(int i = 0; i < arcRecordsCount; ++i, arcRecord++)
{
WadLumpRecord* record = new WadLumpRecord();

record->baseOffset = littleEndianByteOrder.toNative(arcRecord->filePos);
record->info.size = littleEndianByteOrder.toNative(arcRecord->size);
record->info.compressedSize = record->info.size;
record->info.container = reinterpret_cast<abstractfile_s*>(self);
LumpInfo info; F_InitLumpInfo(&info);
info.baseOffset = littleEndianByteOrder.toNative(arcRecord->filePos);
info.size = littleEndianByteOrder.toNative(arcRecord->size);
info.compressedSize = info.size;
info.container = reinterpret_cast<abstractfile_s*>(self);
// The modification date is inherited from the file (note recursion).
record->info.lastModified = self->lastModified();
record->info.lumpIdx = i;
info.lastModified = self->lastModified();
info.lumpIdx = i;

// Determine the name for this lump in the VFS.
normalizeName(*arcRecord, &absPath);
F_PrependBasePath(&absPath, &absPath); // Make it absolute.

// Insert this lump record into the directory.
WadLumpRecord* record = new WadLumpRecord(info);
PathDirectoryNode* node = lumpDirectory->insert(Str_Text(&absPath));
node->setUserData(record);

F_DestroyLumpInfo(&info);

// Calcuate a simple CRC checksum for the lump.
/// @note If we intend to use the CRC for anything meaningful this algorithm
/// should be replaced and execution deferred until the CRC is needed.
record->crc = uint(record->info.size);
record->crc = uint(record->info().size);
int nameLen = nameLength(*arcRecord);
for(int k = 0; k < nameLen; ++k)
{
Expand All @@ -267,8 +272,8 @@ struct WadFile::Instance
PathDirectoryNode* node = reinterpret_cast<PathDirectoryNode*>(_node);
Instance* wadInst = (Instance*)parameters;
WadLumpRecord* lumpRecord = reinterpret_cast<WadLumpRecord*>(node->userData());
DENG2_ASSERT(lumpRecord && wadInst->self->isValidIndex(lumpRecord->info.lumpIdx)); // Sanity check.
(*wadInst->lumpNodeLut)[lumpRecord->info.lumpIdx] = node;
DENG2_ASSERT(lumpRecord && wadInst->self->isValidIndex(lumpRecord->info().lumpIdx)); // Sanity check.
(*wadInst->lumpNodeLut)[lumpRecord->info().lumpIdx] = node;
return 0; // Continue iteration.
}

Expand Down Expand Up @@ -336,15 +341,15 @@ LumpInfo const& WadFile::lumpInfo(int lumpIdx)
LOG_AS("WadFile");
WadLumpRecord* lrec = d->lumpRecord(lumpIdx);
if(!lrec) throw NotFoundError("WadFile::lumpInfo", invalidIndexMessage(lumpIdx, lastIndex()));
return lrec->info;
return lrec->info();
}

size_t WadFile::lumpSize(int lumpIdx)
{
LOG_AS("WadFile");
WadLumpRecord* lrec = d->lumpRecord(lumpIdx);
if(!lrec) throw NotFoundError("WadFile::lumpSize", invalidIndexMessage(lumpIdx, lastIndex()));
return lrec->info.size;
return lrec->info().size;
}

AutoStr* WadFile::composeLumpPath(int lumpIdx, char delimiter)
Expand Down Expand Up @@ -472,8 +477,8 @@ size_t WadFile::readLump(int lumpIdx, uint8_t* buffer, size_t startOffset,
LOG_TRACE("\"%s:%s\" (%lu bytes%s) [%lu +%lu]")
<< F_PrettyPath(Str_Text(path()))
<< F_PrettyPath(Str_Text(composeLumpPath(lumpIdx, '/')))
<< (unsigned long) lrec->info.size
<< (lrec->info.compressedSize != lrec->info.size? ", compressed" : "")
<< (unsigned long) lrec->info().size
<< (lrec->info().compressedSize != lrec->info().size? ", compressed" : "")
<< (unsigned long) startOffset
<< (unsigned long)length;

Expand All @@ -484,13 +489,13 @@ size_t WadFile::readLump(int lumpIdx, uint8_t* buffer, size_t startOffset,
LOG_DEBUG("Cache %s on #%i") << (data? "hit" : "miss") << lumpIdx;
if(data)
{
size_t readBytes = MIN_OF(lrec->info.size, length);
size_t readBytes = MIN_OF(lrec->info().size, length);
memcpy(buffer, data + startOffset, readBytes);
return readBytes;
}
}

file->seek(lrec->baseOffset + startOffset, SeekSet);
file->seek(lrec->info().baseOffset + startOffset, SeekSet);
size_t readBytes = file->read(buffer, length);

/// @todo Do not check the read length here.
Expand Down

0 comments on commit 1c905fc

Please sign in to comment.