本文整理汇总了C++中IOStream::StreamDataLeft方法的典型用法代码示例。如果您正苦于以下问题:C++ IOStream::StreamDataLeft方法的具体用法?C++ IOStream::StreamDataLeft怎么用?C++ IOStream::StreamDataLeft使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IOStream
的用法示例。
在下文中一共展示了IOStream::StreamDataLeft方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LoadIndex
// --------------------------------------------------------------------------
//
// Function
// Name: static LoadIndex(IOStream &, int64_t, BlocksAvailableEntry **, int64_t, bool &)
// Purpose: Read in an index, and decrypt, and store in the in memory block format.
// rCanDiffFromThis is set to false if the version of the from file is too old.
// Created: 12/1/04
//
// --------------------------------------------------------------------------
static void LoadIndex(IOStream &rBlockIndex, int64_t ThisID, BlocksAvailableEntry **ppIndex, int64_t &rNumBlocksOut, int Timeout, bool &rCanDiffFromThis)
{
// Reset
rNumBlocksOut = 0;
rCanDiffFromThis = false;
// Read header
file_BlockIndexHeader hdr;
if(!rBlockIndex.ReadFullBuffer(&hdr, sizeof(hdr), 0 /* not interested in bytes read if this fails */, Timeout))
{
// Couldn't read header
THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
}
#ifndef BOX_DISABLE_BACKWARDS_COMPATIBILITY_BACKUPSTOREFILE
// Check against backwards comptaibility stuff
if(hdr.mMagicValue == (int32_t)htonl(OBJECTMAGIC_FILE_BLOCKS_MAGIC_VALUE_V0))
{
// Won't diff against old version
// Absorb rest of stream
char buffer[2048];
while(rBlockIndex.StreamDataLeft())
{
rBlockIndex.Read(buffer, sizeof(buffer), 1000 /* 1 sec timeout */);
}
// Tell caller
rCanDiffFromThis = false;
return;
}
#endif
// Check magic
if(hdr.mMagicValue != (int32_t)htonl(OBJECTMAGIC_FILE_BLOCKS_MAGIC_VALUE_V1))
{
THROW_EXCEPTION(BackupStoreException, BadBackupStoreFile)
}
// Check that we're not trying to diff against a file which references blocks from another file
if(((int64_t)box_ntoh64(hdr.mOtherFileID)) != 0)
{
THROW_EXCEPTION(BackupStoreException, CannotDiffAnIncompleteStoreFile)
}
// Mark as an acceptable diff.
rCanDiffFromThis = true;
// Get basic information
int64_t numBlocks = box_ntoh64(hdr.mNumBlocks);
uint64_t entryIVBase = box_ntoh64(hdr.mEntryIVBase);
//TODO: Verify that these sizes look reasonable
// Allocate space for the index
BlocksAvailableEntry *pindex = (BlocksAvailableEntry*)::malloc(sizeof(BlocksAvailableEntry) * numBlocks);
if(pindex == 0)
{
throw std::bad_alloc();
}
try
{
for(int64_t b = 0; b < numBlocks; ++b)
{
// Read an entry from the stream
file_BlockIndexEntry entry;
if(!rBlockIndex.ReadFullBuffer(&entry, sizeof(entry), 0 /* not interested in bytes read if this fails */, Timeout))
{
// Couldn't read entry
THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
}
// Calculate IV for this entry
uint64_t iv = entryIVBase;
iv += b;
// Network byte order
iv = box_hton64(iv);
sBlowfishDecryptBlockEntry.SetIV(&iv);
// Decrypt the encrypted section
file_BlockIndexEntryEnc entryEnc;
int sectionSize = sBlowfishDecryptBlockEntry.TransformBlock(&entryEnc, sizeof(entryEnc),
entry.mEnEnc, sizeof(entry.mEnEnc));
if(sectionSize != sizeof(entryEnc))
{
THROW_EXCEPTION(BackupStoreException, BlockEntryEncodingDidntGiveExpectedLength)
}
// Check that we're not trying to diff against a file which references blocks from another file
if(((int64_t)box_ntoh64(entry.mEncodedSize)) <= 0)
//.........这里部分代码省略.........