diff options
Diffstat (limited to 'lib/backupstore/BackupStoreFile.h')
-rw-r--r-- | lib/backupstore/BackupStoreFile.h | 87 |
1 files changed, 81 insertions, 6 deletions
diff --git a/lib/backupstore/BackupStoreFile.h b/lib/backupstore/BackupStoreFile.h index 7c72e010..fe69caeb 100644 --- a/lib/backupstore/BackupStoreFile.h +++ b/lib/backupstore/BackupStoreFile.h @@ -14,8 +14,11 @@ #include <memory> #include <cstdlib> +#include "autogen_BackupProtocol.h" #include "BackupClientFileAttributes.h" +#include "BackupStoreFileWire.h" #include "BackupStoreFilename.h" +#include "CollectInBufferStream.h" #include "IOStream.h" #include "ReadLoggingStream.h" @@ -26,6 +29,7 @@ typedef struct int64_t mTotalFileStreamSize; } BackupStoreFileStats; +class BackgroundTask; class RunStatusProvider; // Uncomment to disable backwards compatibility @@ -40,6 +44,8 @@ class RunStatusProvider; // Have some memory allocation commands, note closing "Off" at end of file. #include "MemLeakFindOn.h" +class BackupStoreFileEncodeStream; + // -------------------------------------------------------------------------- // // Class @@ -60,8 +66,6 @@ public: virtual bool IsManaged() = 0; }; -class BackupStoreFileEncodeStream; - // -------------------------------------------------------------------------- // // Class @@ -83,9 +87,10 @@ public: public: ~DecodedStream(); - // Stream functions + // Stream functions virtual int Read(void *pBuffer, int NBytes, int Timeout); - virtual void Write(const void *pBuffer, int NBytes); + virtual void Write(const void *pBuffer, int NBytes, + int Timeout = IOStream::TimeOutInfinite); virtual bool StreamDataLeft(); virtual bool StreamClosed(); @@ -119,6 +124,64 @@ public: #endif }; + class VerifyStream : public IOStream + { + private: + enum + { + State_Header = 0, + State_FilenameHeader, + State_Filename, + State_AttributesSize, + State_Attributes, + State_Blocks, + }; + + int mState; + IOStream* mpCopyToStream; + CollectInBufferStream mCurrentUnitData; + size_t mCurrentUnitSize; + int64_t mNumBlocks; + int64_t mBlockIndexSize; + int64_t mCurrentPosition; + int64_t mBlockDataPosition; + bool mCurrentBufferIsAlternate; + CollectInBufferStream mAlternateData; + bool mBlockFromOtherFileReferenced; + int64_t mContainerID; + int64_t mDiffFromObjectID; + + public: + VerifyStream(IOStream* pCopyToStream = NULL) + : mState(State_Header), + mpCopyToStream(pCopyToStream), + mCurrentUnitSize(sizeof(file_StreamFormat)), + mNumBlocks(0), + mBlockIndexSize(0), + mCurrentPosition(0), + mBlockDataPosition(0), + mCurrentBufferIsAlternate(false), + mBlockFromOtherFileReferenced(false), + mContainerID(0), + mDiffFromObjectID(0) + { } + virtual int Read(void *pBuffer, int NBytes, + int Timeout = IOStream::TimeOutInfinite) + { + THROW_EXCEPTION(CommonException, NotSupported); + } + virtual void Write(const void *pBuffer, int NBytes, + int Timeout = IOStream::TimeOutInfinite); + virtual void Close(bool CloseCopyStream = true); + virtual bool StreamDataLeft() + { + THROW_EXCEPTION(CommonException, NotSupported); + } + virtual bool StreamClosed() + { + THROW_EXCEPTION(CommonException, NotSupported); + } + }; // Main interface static std::auto_ptr<BackupStoreFileEncodeStream> EncodeFile @@ -127,7 +190,8 @@ public: int64_t ContainerID, const BackupStoreFilename &rStoreFilename, int64_t *pModificationTime = 0, ReadLoggingStream::Logger* pLogger = NULL, - RunStatusProvider* pRunStatusProvider = NULL + RunStatusProvider* pRunStatusProvider = NULL, + BackgroundTask* pBackgroundTask = NULL ); static std::auto_ptr<BackupStoreFileEncodeStream> EncodeFileDiff ( @@ -137,8 +201,19 @@ public: int Timeout, DiffTimer *pDiffTimer, int64_t *pModificationTime = 0, - bool *pIsCompletelyDifferent = 0 + bool *pIsCompletelyDifferent = 0, + BackgroundTask* pBackgroundTask = NULL ); + // Shortcut interface + static int64_t QueryStoreFileDiff(BackupProtocolCallable& protocol, + const std::string& LocalFilename, int64_t DirectoryObjectID, + int64_t DiffFromFileID, int64_t AttributesHash, + const BackupStoreFilenameClear& StoreFilename, + int Timeout = IOStream::TimeOutInfinite, + DiffTimer *pDiffTimer = NULL, + ReadLoggingStream::Logger* pLogger = NULL, + RunStatusProvider* pRunStatusProvider = NULL); + static bool VerifyEncodedFileFormat(IOStream &rFile, int64_t *pDiffFromObjectIDOut = 0, int64_t *pContainerIDOut = 0); static void CombineFile(IOStream &rDiff, IOStream &rDiff2, IOStream &rFrom, IOStream &rOut); static void CombineDiffs(IOStream &rDiff1, IOStream &rDiff2, IOStream &rDiff2b, IOStream &rOut); |