本文整理汇总了C++中MemChunk::read方法的典型用法代码示例。如果您正苦于以下问题:C++ MemChunk::read方法的具体用法?C++ MemChunk::read怎么用?C++ MemChunk::read使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MemChunk
的用法示例。
在下文中一共展示了MemChunk::read方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
/* Wad2Archive::isWad2Archive
* Checks if the given data is a valid Quake wad2 archive
*******************************************************************/
bool Wad2Archive::isWad2Archive(MemChunk& mc)
{
// Check size
if (mc.getSize() < 12)
return false;
// Check for IWAD/PWAD header
if (mc[0] != 'W' || mc[1] != 'A' || mc[2] != 'D' || (mc[3] != '2' && mc[3] != '3'))
return false;
// Get number of lumps and directory offset
int32_t num_lumps = 0;
int32_t dir_offset = 0;
mc.seek(4, SEEK_SET);
mc.read(&num_lumps, 4);
mc.read(&dir_offset, 4);
// Reset MemChunk (just in case)
mc.seek(0, SEEK_SET);
// Byteswap values for big endian if needed
num_lumps = wxINT32_SWAP_ON_BE(num_lumps);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// Check directory offset is decent
if ((unsigned)(dir_offset + (num_lumps * 32)) > mc.getSize() ||
dir_offset < 12)
return false;
// If it's passed to here it's probably a wad2 file
return true;
}
示例2: isChasmBinArchive
/* ChasmBinArchive::isChasmBinArchive
* Checks if the given data is a valid Chasm bin archive
*******************************************************************/
bool ChasmBinArchive::isChasmBinArchive(MemChunk& mc)
{
// Check given data is valid
if (mc.getSize() < HEADER_SIZE)
{
return false;
}
// Read bin header and check it
char magic[4] = {};
mc.read(magic, sizeof magic);
if ( magic[0] != 'C'
|| magic[1] != 'S'
|| magic[2] != 'i'
|| magic[3] != 'd')
{
return false;
}
uint16_t num_entries = 0;
mc.read(&num_entries, sizeof num_entries);
num_entries = wxUINT16_SWAP_ON_BE(num_entries);
return num_entries > MAX_ENTRY_COUNT
|| (HEADER_SIZE + ENTRY_SIZE * MAX_ENTRY_COUNT) <= mc.getSize();
}
示例3: isPakArchive
/* PakArchive::isPakArchive
* Checks if the given data is a valid Quake pak archive
*******************************************************************/
bool PakArchive::isPakArchive(MemChunk& mc)
{
// Check given data is valid
if (mc.getSize() < 12)
return false;
// Read pak header
char pack[4];
long dir_offset;
long dir_size;
mc.seek(0, SEEK_SET);
mc.read(pack, 4);
mc.read(&dir_offset, 4);
mc.read(&dir_size, 4);
// Byteswap values for big endian if needed
dir_size = wxINT32_SWAP_ON_BE(dir_size);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// Check header
if (pack[0] != 'P' || pack[1] != 'A' || pack[2] != 'C' || pack[3] != 'K')
return false;
// Check directory is sane
if (dir_offset < 12 || (unsigned)(dir_offset + dir_size) > mc.getSize())
return false;
// That'll do
return true;
}
示例4: isADatArchive
/* ADatArchive::isADatArchive
* Checks if the given data is a valid Anachronox dat archive
*******************************************************************/
bool ADatArchive::isADatArchive(MemChunk& mc) {
// Check it opened ok
if (mc.getSize() < 16)
return false;
// Read dat header
char magic[4];
long dir_offset;
long dir_size;
long version;
mc.seek(0, SEEK_SET);
mc.read(magic, 4);
mc.read(&dir_offset, 4);
mc.read(&dir_size, 4);
mc.read(&version, 4);
// Byteswap values for big endian if needed
dir_size = wxINT32_SWAP_ON_BE(dir_size);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// Check version
if (wxINT32_SWAP_ON_BE(version) != 9)
return false;
// Check header
if (magic[0] != 'A' || magic[1] != 'D' || magic[2] != 'A' || magic[3] != 'T')
return false;
// Check directory is sane
if (dir_offset < 16 || (unsigned)(dir_offset + dir_size) > mc.getSize())
return false;
// That'll do
return true;
}
示例5: isPodArchive
// -----------------------------------------------------------------------------
// Checks if the given data is a valid pod archive
// -----------------------------------------------------------------------------
bool PodArchive::isPodArchive(MemChunk& mc)
{
// Check size for header
if (mc.size() < 84)
return false;
// Read no. of files
mc.seek(0, 0);
uint32_t num_files;
mc.read(&num_files, 4);
// Read id
char id[80];
mc.read(id, 80);
// Check size for directory
if (mc.size() < 84 + (num_files * 40))
return false;
// Read directory and check offsets
FileEntry entry;
for (unsigned a = 0; a < num_files; a++)
{
mc.read(&entry, 40);
if (entry.offset + entry.size > mc.size())
return false;
}
return true;
}
示例6: isGobArchive
/* GobArchive::isGobArchive
* Checks if the given data is a valid Dark Forces gob archive
*******************************************************************/
bool GobArchive::isGobArchive(MemChunk& mc)
{
// Check size
if (mc.getSize() < 12)
return false;
// Check magic header
if (mc[0] != 'G' || mc[1] != 'O' || mc[2] != 'B' || mc[3] != 0xA)
return false;
// Get directory offset
uint32_t dir_offset = 0;
mc.seek(4, SEEK_SET);
mc.read(&dir_offset, 4);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// Check size
if ((unsigned)mc.getSize() < (dir_offset + 4))
return false;
// Get number of lumps
uint32_t num_lumps = 0;
mc.seek(dir_offset, SEEK_SET);
mc.read(&num_lumps, 4);
num_lumps = wxINT32_SWAP_ON_BE(num_lumps);
// Compute directory size
uint32_t dir_size = (num_lumps * 21) + 4;
if ((unsigned)mc.getSize() < (dir_offset + dir_size))
return false;
// If it's passed to here it's probably a gob file
return true;
}
示例7: open
/* ResArchive::open
* Reads res format data from a MemChunk
* Returns true if successful, false otherwise
*******************************************************************/
bool ResArchive::open(MemChunk& mc)
{
// Check data was given
if (!mc.hasData())
return false;
// Read res header
uint32_t dir_size = 0;
uint32_t dir_offset = 0;
char magic[4] = "";
mc.seek(0, SEEK_SET);
mc.read(&magic, 4); // "Res!"
mc.read(&dir_offset, 4); // Offset to directory
mc.read(&dir_size, 4); // No. of lumps in res
// Byteswap values for big endian if needed
dir_size = wxINT32_SWAP_ON_BE(dir_size);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// Check the header
if (magic[0] != 'R' || magic[1] != 'e' || magic[2] != 's' || magic[3] != '!')
{
LOG_MESSAGE(1, "ResArchive::openFile: File %s has invalid header", filename);
Global::error = "Invalid res header";
return false;
}
if (dir_size % RESDIRENTRYSIZE)
{
LOG_MESSAGE(1, "ResArchive::openFile: File %s has invalid directory size", filename);
Global::error = "Invalid res directory size";
return false;
}
uint32_t num_lumps = dir_size / RESDIRENTRYSIZE;
// Stop announcements (don't want to be announcing modification due to entries being added etc)
setMuted(true);
// Read the directory
mc.seek(dir_offset, SEEK_SET);
UI::setSplashProgressMessage("Reading res archive data");
if (!readDirectory(mc, dir_offset, num_lumps, getRoot()))
return false;
// Detect maps (will detect map entry types)
UI::setSplashProgressMessage("Detecting maps");
detectMaps();
// Setup variables
setMuted(false);
setModified(false);
announce("opened");
UI::setSplashProgressMessage("");
return true;
}
示例8: onAnnouncement
void MapTextureManager::onAnnouncement(Announcer* announcer, string event_name, MemChunk& event_data)
{
// Only interested in the resource manager,
// archive manager and palette chooser.
if (announcer != theResourceManager
&& announcer != thePaletteChooser
&& announcer != theArchiveManager)
return;
// If the map's archive is being closed,
// we need to close the map editor
if (event_name == "archive_closing")
{
event_data.seek(0, SEEK_SET);
int32_t ac_index;
event_data.read(&ac_index, 4);
if (theArchiveManager->getArchive(ac_index) == archive)
{
theMapEditor->Hide();
theMapEditor->mapEditor().clearMap();
archive = NULL;
}
}
// If the resources have been updated
if (event_name == "resources_updated")
refreshResources();
if (event_name == "main_palette_changed")
refreshResources();
}
示例9: onAnnouncement
// -----------------------------------------------------------------------------
// Handles announcements from any announcers listened to
// -----------------------------------------------------------------------------
void MapTextureManager::onAnnouncement(Announcer* announcer, std::string_view event_name, MemChunk& event_data)
{
// Only interested in the resource manager,
// archive manager and palette chooser.
if (announcer != &App::resources() && announcer != theMainWindow->paletteChooser()
&& announcer != &App::archiveManager())
return;
// If the map's archive is being closed,
// we need to close the map editor
if (event_name == "archive_closing")
{
event_data.seek(0, SEEK_SET);
int32_t ac_index;
event_data.read(&ac_index, 4);
if (App::archiveManager().getArchive(ac_index) == archive_)
{
MapEditor::windowWx()->Hide();
MapEditor::editContext().clearMap();
archive_ = nullptr;
}
}
// If the resources have been updated
if (event_name == "resources_updated")
refreshResources();
if (event_name == "main_palette_changed")
refreshResources();
}
示例10: isRffArchive
/* RffArchive::isRffArchive
* Checks if the given data is a valid Duke Nukem 3D grp archive
*******************************************************************/
bool RffArchive::isRffArchive(MemChunk& mc)
{
// Check size
if (mc.getSize() < 12)
return false;
// Read grp header
uint8_t magic[4];
uint32_t version, dir_offset, num_lumps;
mc.seek(0, SEEK_SET);
mc.read(magic, 4); // Should be "RFF\x18"
mc.read(&version, 4); // 0x01 0x03 \x00 \x00
mc.read(&dir_offset, 4); // Offset to directory
mc.read(&num_lumps, 4); // No. of lumps in rff
// Byteswap values for big endian if needed
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
num_lumps = wxINT32_SWAP_ON_BE(num_lumps);
version = wxINT32_SWAP_ON_BE(version);
// Check the header
if (magic[0] != 'R' || magic[1] != 'F' || magic[2] != 'F' || magic[3] != 0x1A || version != 0x301)
return false;
// Compute total size
RFFLump* lumps = new RFFLump[num_lumps];
mc.seek(dir_offset, SEEK_SET);
theSplashWindow->setProgressMessage("Reading rff archive data");
mc.read (lumps, num_lumps * sizeof(RFFLump));
BloodCrypt (lumps, dir_offset, num_lumps * sizeof(RFFLump));
uint32_t totalsize = 12 + num_lumps * sizeof(RFFLump);
uint32_t size = 0;
for (uint32_t a = 0; a < num_lumps; ++a)
{
totalsize += lumps[a].Size;
}
// Check if total size is correct
if (totalsize > mc.getSize())
return false;
// If it's passed to here it's probably a grp file
return true;
}
示例11: isDiskArchive
// -----------------------------------------------------------------------------
// Checks if the given data is a valid Nerve disk archive
// -----------------------------------------------------------------------------
bool DiskArchive::isDiskArchive(MemChunk& mc)
{
// Check given data is valid
size_t mcsize = mc.getSize();
if (mcsize < 80)
return false;
// Read disk header
uint32_t num_entries;
uint32_t size_entries;
mc.seek(0, SEEK_SET);
mc.read(&num_entries, 4);
num_entries = wxUINT32_SWAP_ON_LE(num_entries);
size_t start_offset = (72 * num_entries) + 8;
if (mcsize < start_offset)
return false;
// Read the directory
for (uint32_t d = 0; d < num_entries; d++)
{
// Read entry info
DiskEntry entry;
mc.read(&entry, 72);
// Byteswap if needed
entry.length = wxUINT32_SWAP_ON_LE(entry.length);
entry.offset = wxUINT32_SWAP_ON_LE(entry.offset);
// Increase offset to make it relative to start of archive
entry.offset += start_offset;
// Check offset+size
if (entry.offset + entry.length > mcsize)
return false;
}
mc.read(&size_entries, 4);
size_entries = wxUINT32_SWAP_ON_LE(size_entries);
if (size_entries + start_offset != mcsize)
return false;
// That'll do
return true;
}
示例12: isDatArchive
/* DatArchive::isDatArchive
* Checks if the given data is a valid Shadowcaster dat archive
*******************************************************************/
bool DatArchive::isDatArchive(MemChunk& mc)
{
// Read dat header
mc.seek(0, SEEK_SET);
uint16_t num_lumps;
uint32_t dir_offset, junk;
mc.read(&num_lumps, 2); // Size
mc.read(&dir_offset, 4); // Directory offset
mc.read(&junk, 4); // Unknown value
num_lumps = wxINT16_SWAP_ON_BE(num_lumps);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
junk = wxINT32_SWAP_ON_BE(junk);
if (dir_offset >= mc.getSize())
return false;
// Read the directory
mc.seek(dir_offset, SEEK_SET);
// Read lump info
uint32_t offset = 0;
uint32_t size = 0;
uint16_t nameofs = 0;
uint16_t flags = 0;
mc.read(&offset, 4); // Offset
mc.read(&size, 4); // Size
mc.read(&nameofs, 2); // Name offset
mc.read(&flags, 2); // Flags
// Byteswap values for big endian if needed
offset = wxINT32_SWAP_ON_BE(offset);
size = wxINT32_SWAP_ON_BE(size);
nameofs = wxINT16_SWAP_ON_BE(nameofs);
flags = wxINT16_SWAP_ON_BE(flags);
// The first lump should have a name (subsequent lumps need not have one).
// Also, sanity check the values.
if (nameofs == 0 || nameofs >= mc.getSize() || offset + size >= mc.getSize())
{
return false;
}
size_t len = 1;
size_t start = nameofs+dir_offset;
// Sanity checks again. Make sure there is actually a name.
if (start > mc.getSize() || mc[start] < 33)
return false;
for (size_t i = start; (mc[i] != 0 && i < mc.getSize()); ++i, ++len)
{
// Names should not contain garbage characters
if (mc[i] < 32 || mc[i] > 126)
return false;
}
// Let's be reasonable here. While names aren't limited, if it's too long, it's suspicious.
if (len > 60)
return false;
return true;
}
示例13: onAnnouncement
void onAnnouncement(Announcer* announcer, string event_name, MemChunk& event_data)
{
if (announcer != entry->getParent())
return;
bool finished = false;
// Entry removed
if (event_name == "entry_removed")
{
int index;
wxUIntPtr ptr;
event_data.read(&index, sizeof(int));
event_data.read(&ptr, sizeof(wxUIntPtr));
if (wxUIntToPtr(ptr) == entry)
finished = true;
}
if (finished)
delete this;
}
示例14: readImage
bool readImage(SImage& image, MemChunk& data, int index)
{
// Get info
SImage::info_t info = getInfo(data, index);
// Create image from data
image.create(info.width, info.height, PALMASK);
data.read(imageData(image), info.width * info.height, 0);
image.fillAlpha(255);
return true;
}
示例15: isResArchive
bool ResArchive::isResArchive(MemChunk& mc, size_t& dir_offset, size_t& num_lumps)
{
// Check size
if (mc.getSize() < 12)
return false;
// Check for "Res!" header
if (!(mc[0] == 'R' && mc[1] == 'e' && mc[2] == 's' && mc[3] == '!'))
return false;
// Get number of lumps and directory offset
uint32_t offset_offset = 0;
uint32_t rel_offset = 0;
uint32_t dir_size = 0;
mc.seek(4, SEEK_SET);
mc.read(&dir_offset, 4);
mc.read(&dir_size, 4);
// Byteswap values for big endian if needed
dir_size = wxINT32_SWAP_ON_BE(dir_size);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset);
// A&A contains nested resource files. The offsets are then always relative to
// the top-level file. This causes problem with the embedded archive system
// used by SLADE3. The solution is to compute the offset offset. :)
offset_offset = dir_offset - (mc.getSize() - dir_size);
rel_offset = dir_offset - offset_offset;
// Check directory offset and size are both decent
if (dir_size % RESDIRENTRYSIZE || (rel_offset + dir_size) > mc.getSize())
return false;
num_lumps = dir_size / RESDIRENTRYSIZE;
// Reset MemChunk (just in case)
mc.seek(0, SEEK_SET);
// If it's passed to here it's probably a res file
return true;
}