本文整理汇总了C++中MemChunk::seek方法的典型用法代码示例。如果您正苦于以下问题:C++ MemChunk::seek方法的具体用法?C++ MemChunk::seek怎么用?C++ MemChunk::seek使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MemChunk
的用法示例。
在下文中一共展示了MemChunk::seek方法的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: 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;
}
示例3: 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;
}
示例4: 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;
}
示例5: isLfdArchive
// -----------------------------------------------------------------------------
// Checks if the given data is a valid Dark Forces lfd archive
// -----------------------------------------------------------------------------
bool LfdArchive::isLfdArchive(MemChunk& mc)
{
// Check size
if (mc.size() < 12)
return false;
// Check magic header
if (mc[0] != 'R' || mc[1] != 'M' || mc[2] != 'A' || mc[3] != 'P')
return false;
// Get offset of first entry
uint32_t dir_offset = 0;
mc.seek(12, SEEK_SET);
mc.read(&dir_offset, 4);
dir_offset = wxINT32_SWAP_ON_BE(dir_offset) + 16;
if (dir_offset % 16)
return false;
char type1[5];
char type2[5];
char name1[9];
char name2[9];
uint32_t len1;
uint32_t len2;
mc.read(type1, 4);
type1[4] = 0;
mc.read(name1, 8);
name1[8] = 0;
mc.read(&len1, 4);
len1 = wxINT32_SWAP_ON_BE(len1);
// Check size
if ((unsigned)mc.size() < (dir_offset + 16 + len1))
return false;
// Compare
mc.seek(dir_offset, SEEK_SET);
mc.read(type2, 4);
type2[4] = 0;
mc.read(name2, 8);
name2[8] = 0;
mc.read(&len2, 4);
len2 = wxINT32_SWAP_ON_BE(len2);
if (strcmp(type1, type2) != 0 || strcmp(name1, name2) != 0 || len1 != len2)
return false;
// If it's passed to here it's probably a lfd file
return true;
}
示例6: onAnnouncement
// -----------------------------------------------------------------------------
// Called when an announcement is recieved from one of the archives in the list
// -----------------------------------------------------------------------------
void ArchiveManager::onAnnouncement(Announcer* announcer, const string& event_name, MemChunk& event_data)
{
// Reset event data for reading
event_data.seek(0, SEEK_SET);
// Check that the announcement came from an archive in the list
int32_t index = archiveIndex((Archive*)announcer);
if (index >= 0)
{
// If the archive was saved
if (event_name == "saved")
{
MemChunk mc;
mc.write(&index, 4);
announce("archive_saved", mc);
}
// If the archive was modified
if (event_name == "modified" || event_name == "entry_modified")
{
MemChunk mc;
mc.write(&index, 4);
announce("archive_modified", mc);
}
}
}
示例7: 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();
}
示例8: saveEntry
/* SwitchesEntryPanel::saveEntry
* Saves any changes made to the entry
*******************************************************************/
bool SwitchesEntryPanel::saveEntry()
{
MemChunk mc;
mc.seek(0, SEEK_SET);
switches_t swch;
for (uint32_t a = 0; a < switches.nEntries(); a++)
{
SwitchesEntry* ent = switches.getEntry(a);
for (size_t i = 0; i < 9; ++i)
{
if (ent->getOff().length() > i)
swch.off[i] = ent->getOff()[i];
else swch.off[i] = 0;
if (ent->getOn().length() > i)
swch.on[i] = ent->getOn()[i];
else swch.on[i] = 0;
}
swch.type = ent->getType();
mc.write(&swch, 20);
}
memset(&swch, 0, 20);
mc.write(&swch, 20);
bool success = entry->importMemChunk(mc);
if (success)
{
for (uint32_t a = 0; a < switches.nEntries(); a++)
list_entries->setItemStatus(a, LV_STATUS_NORMAL);
}
return success;
}
示例9: saveEntry
/* AnimatedEntryPanel::saveEntry
* Saves any changes made to the entry
*******************************************************************/
bool AnimatedEntryPanel::saveEntry()
{
MemChunk mc;
mc.seek(0, SEEK_SET);
animated_t anim;
for (uint32_t a = 0; a < animated.nEntries(); a++)
{
AnimatedEntry* ent = animated.getEntry(a);
for (size_t i = 0; i < 9; ++i)
{
if (ent->getFirst().length() > i)
anim.first[i] = ent->getFirst()[i];
else anim.first[i] = 0;
if (ent->getLast().length() > i)
anim.last[i] = ent->getLast()[i];
else anim.last[i] = 0;
}
anim.speed = ent->getSpeed();
anim.type = ent->getType();
if (ent->getDecals()) anim.type |= ANIM_DECALS;
mc.write(&anim, 23);
}
anim.type = 255;
mc.write(&anim, 1);
bool success = entry->importMemChunk(mc);
if (success)
{
for (uint32_t a = 0; a < animated.nEntries(); a++)
list_entries->setItemStatus(a, LV_STATUS_NORMAL);
}
return success;
}
示例10: 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;
}
示例11: 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;
}
示例12: 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;
}
示例13: 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();
}
示例14: entryAt
// -----------------------------------------------------------------------------
// Writes the wad archive to a MemChunk
// Returns true if successful, false otherwise
// -----------------------------------------------------------------------------
bool Wad2Archive::write(MemChunk& mc, bool update)
{
// Determine directory offset & individual lump offsets
uint32_t dir_offset = 12;
ArchiveEntry* entry = nullptr;
for (uint32_t l = 0; l < numEntries(); l++)
{
entry = entryAt(l);
entry->exProp("Offset") = (int)dir_offset;
dir_offset += entry->size();
}
// Clear/init MemChunk
mc.clear();
mc.seek(0, SEEK_SET);
mc.reSize(dir_offset + numEntries() * 32);
// Setup wad type
char wad_type[4] = { 'W', 'A', 'D', '2' };
if (wad3_)
wad_type[3] = '3';
// Write the header
uint32_t num_lumps = numEntries();
mc.write(wad_type, 4);
mc.write(&num_lumps, 4);
mc.write(&dir_offset, 4);
// Write the lumps
for (uint32_t l = 0; l < num_lumps; l++)
{
entry = entryAt(l);
mc.write(entry->rawData(), entry->size());
}
// Write the directory
for (uint32_t l = 0; l < num_lumps; l++)
{
entry = entryAt(l);
// Setup directory entry
Wad2Entry info;
memset(info.name, 0, 16);
memcpy(info.name, CHR(entry->name()), entry->name().Len());
info.cmprs = (bool)entry->exProp("W2Comp");
info.dsize = entry->size();
info.size = entry->size();
info.offset = (int)entry->exProp("Offset");
info.type = (int)entry->exProp("W2Type");
// Write it
mc.write(&info, 32);
if (update)
entry->setState(ArchiveEntry::State::Unmodified);
}
return true;
}
示例15: 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;
}