summaryrefslogtreecommitdiff
path: root/lib/backupclient/BackupStoreFileCmbIdx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/backupclient/BackupStoreFileCmbIdx.cpp')
-rw-r--r--lib/backupclient/BackupStoreFileCmbIdx.cpp324
1 files changed, 0 insertions, 324 deletions
diff --git a/lib/backupclient/BackupStoreFileCmbIdx.cpp b/lib/backupclient/BackupStoreFileCmbIdx.cpp
deleted file mode 100644
index c8bcc3b9..00000000
--- a/lib/backupclient/BackupStoreFileCmbIdx.cpp
+++ /dev/null
@@ -1,324 +0,0 @@
-// --------------------------------------------------------------------------
-//
-// File
-// Name: BackupStoreFileCmbIdx.cpp
-// Purpose: Combine indicies of a delta file and the file it's a diff from.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-
-#include "Box.h"
-
-#include <new>
-#include <string.h>
-
-#include "BackupStoreFile.h"
-#include "BackupStoreFileWire.h"
-#include "BackupStoreObjectMagic.h"
-#include "BackupStoreException.h"
-#include "BackupStoreConstants.h"
-#include "BackupStoreFilename.h"
-
-#include "MemLeakFindOn.h"
-
-// Hide from outside world
-namespace
-{
-
-class BSFCombinedIndexStream : public IOStream
-{
-public:
- BSFCombinedIndexStream(IOStream *pDiff);
- ~BSFCombinedIndexStream();
-
- virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
- virtual void Write(const void *pBuffer, int NBytes);
- virtual bool StreamDataLeft();
- virtual bool StreamClosed();
- virtual void Initialise(IOStream &rFrom);
-
-private:
- IOStream *mpDiff;
- bool mIsInitialised;
- bool mHeaderWritten;
- file_BlockIndexHeader mHeader;
- int64_t mNumEntriesToGo;
- int64_t mNumEntriesInFromFile;
- int64_t *mFromBlockSizes; // NOTE: Entries in network byte order
-};
-
-};
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupStoreFile::CombineFileIndices(IOStream &, IOStream &, bool)
-// Purpose: Given a diff file and the file it's a diff from, return a stream from which
-// can be read the index of the combined file, without actually combining them.
-// The stream of the diff must have a lifetime greater than or equal to the
-// lifetime of the returned stream object. The full "from" file stream
-// only needs to exist during the actual function call.
-// If you pass in dodgy files which aren't related, then you will either
-// get an error or bad results. So don't do that.
-// If DiffIsIndexOnly is true, then rDiff is assumed to be a stream positioned
-// at the beginning of the block index. Similarly for FromIsIndexOnly.
-// WARNING: Reads of the returned streams with buffer sizes less than 64 bytes
-// will not return any data.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-std::auto_ptr<IOStream> BackupStoreFile::CombineFileIndices(IOStream &rDiff, IOStream &rFrom, bool DiffIsIndexOnly, bool FromIsIndexOnly)
-{
- // Reposition file pointers?
- if(!DiffIsIndexOnly)
- {
- MoveStreamPositionToBlockIndex(rDiff);
- }
- if(!FromIsIndexOnly)
- {
- MoveStreamPositionToBlockIndex(rFrom);
- }
-
- // Create object
- std::auto_ptr<IOStream> stream(new BSFCombinedIndexStream(&rDiff));
-
- // Initialise it
- ((BSFCombinedIndexStream *)stream.get())->Initialise(rFrom);
-
- // And return the stream
- return stream;
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::BSFCombinedIndexStream()
-// Purpose: Private class. Constructor.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-BSFCombinedIndexStream::BSFCombinedIndexStream(IOStream *pDiff)
- : mpDiff(pDiff),
- mIsInitialised(false),
- mHeaderWritten(false),
- mNumEntriesToGo(0),
- mNumEntriesInFromFile(0),
- mFromBlockSizes(0)
-{
- ASSERT(mpDiff != 0);
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::~BSFCombinedIndexStream()
-// Purpose: Private class. Destructor.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-BSFCombinedIndexStream::~BSFCombinedIndexStream()
-{
- if(mFromBlockSizes != 0)
- {
- ::free(mFromBlockSizes);
- mFromBlockSizes = 0;
- }
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::Initialise(IOStream &)
-// Purpose: Private class. Initalise from the streams (diff passed in constructor).
-// Both streams must have file pointer positioned at the block index.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-void BSFCombinedIndexStream::Initialise(IOStream &rFrom)
-{
- // Paranoia is good.
- if(mIsInitialised)
- {
- THROW_EXCEPTION(BackupStoreException, Internal)
- }
-
- // Look at the diff file: Read in the header
- if(!mpDiff->ReadFullBuffer(&mHeader, sizeof(mHeader), 0))
- {
- THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
- }
- if(ntohl(mHeader.mMagicValue) != OBJECTMAGIC_FILE_BLOCKS_MAGIC_VALUE_V1)
- {
- THROW_EXCEPTION(BackupStoreException, BadBackupStoreFile)
- }
-
- // Read relevant data.
- mNumEntriesToGo = box_ntoh64(mHeader.mNumBlocks);
-
- // Adjust a bit to reflect the fact it's no longer a diff
- mHeader.mOtherFileID = box_hton64(0);
-
- // Now look at the from file: Read header
- file_BlockIndexHeader fromHdr;
- if(!rFrom.ReadFullBuffer(&fromHdr, sizeof(fromHdr), 0))
- {
- THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
- }
- if(ntohl(fromHdr.mMagicValue) != OBJECTMAGIC_FILE_BLOCKS_MAGIC_VALUE_V1)
- {
- THROW_EXCEPTION(BackupStoreException, BadBackupStoreFile)
- }
-
- // Then... allocate memory for the list of sizes
- mNumEntriesInFromFile = box_ntoh64(fromHdr.mNumBlocks);
- mFromBlockSizes = (int64_t*)::malloc(mNumEntriesInFromFile * sizeof(int64_t));
- if(mFromBlockSizes == 0)
- {
- throw std::bad_alloc();
- }
-
- // And read them all in!
- for(int64_t b = 0; b < mNumEntriesInFromFile; ++b)
- {
- file_BlockIndexEntry e;
- if(!rFrom.ReadFullBuffer(&e, sizeof(e), 0))
- {
- THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
- }
-
- // Check that the from file isn't a delta in itself
- if(box_ntoh64(e.mEncodedSize) <= 0)
- {
- THROW_EXCEPTION(BackupStoreException, OnCombineFromFileIsIncomplete)
- }
-
- // Store size (in network byte order)
- mFromBlockSizes[b] = e.mEncodedSize;
- }
-
- // Flag as initialised
- mIsInitialised = true;
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::Read(void *, int, int)
-// Purpose: Private class. As interface.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-int BSFCombinedIndexStream::Read(void *pBuffer, int NBytes, int Timeout)
-{
- // Paranoia is good.
- if(!mIsInitialised || mFromBlockSizes == 0 || mpDiff == 0)
- {
- THROW_EXCEPTION(BackupStoreException, Internal)
- }
-
- int written = 0;
-
- // Header output yet?
- if(!mHeaderWritten)
- {
- // Enough space?
- if(NBytes < (int)sizeof(mHeader)) return 0;
-
- // Copy in
- ::memcpy(pBuffer, &mHeader, sizeof(mHeader));
- NBytes -= sizeof(mHeader);
- written += sizeof(mHeader);
-
- // Flag it's done
- mHeaderWritten = true;
- }
-
- // How many entries can be written?
- int entriesToWrite = NBytes / sizeof(file_BlockIndexEntry);
- if(entriesToWrite > mNumEntriesToGo)
- {
- entriesToWrite = mNumEntriesToGo;
- }
-
- // Setup ready to go
- file_BlockIndexEntry *poutput = (file_BlockIndexEntry*)(((uint8_t*)pBuffer) + written);
-
- // Write entries
- for(int b = 0; b < entriesToWrite; ++b)
- {
- if(!mpDiff->ReadFullBuffer(&(poutput[b]), sizeof(file_BlockIndexEntry), 0))
- {
- THROW_EXCEPTION(BackupStoreException, CouldntReadEntireStructureFromStream)
- }
-
- // Does this need adjusting?
- int s = box_ntoh64(poutput[b].mEncodedSize);
- if(s <= 0)
- {
- // A reference to a block in the from file
- int block = 0 - s;
- ASSERT(block >= 0);
- if(block >= mNumEntriesInFromFile)
- {
- // That's not good, the block doesn't exist
- THROW_EXCEPTION(BackupStoreException, OnCombineFromFileIsIncomplete)
- }
-
- // Adjust the entry in the buffer
- poutput[b].mEncodedSize = mFromBlockSizes[block]; // stored in network byte order, no translation necessary
- }
- }
-
- // Update written count
- written += entriesToWrite * sizeof(file_BlockIndexEntry);
- mNumEntriesToGo -= entriesToWrite;
-
- return written;
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::Write(const void *, int)
-// Purpose: Private class. As interface.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-void BSFCombinedIndexStream::Write(const void *pBuffer, int NBytes)
-{
- THROW_EXCEPTION(BackupStoreException, StreamDoesntHaveRequiredFeatures)
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::StreamDataLeft()
-// Purpose: Private class. As interface
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-bool BSFCombinedIndexStream::StreamDataLeft()
-{
- return (!mHeaderWritten) || (mNumEntriesToGo > 0);
-}
-
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BSFCombinedIndexStream::StreamClosed()
-// Purpose: Private class. As interface.
-// Created: 8/7/04
-//
-// --------------------------------------------------------------------------
-bool BSFCombinedIndexStream::StreamClosed()
-{
- return true; // doesn't do writing
-}
-