|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved.
Module Name:
MTFSessn.h
Abstract:
Definition of the CMTFSession class
Author:
Brian Dodd [brian] 25-Nov-1997
Revision History:
--*/
#if !defined(MTFSessn_H)
#define MTFSessn_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "resource.h" // main symbols
#include "mtfapi.h"
//
// REMOTE_STORAGE_MTF_VENDOR_ID - This is the unique vendor Id assigned for Microsoft Remote Storage.
// Used in Whistler (NT 5.1) and beyond
//
// REMOTE_STORAGE_WIN2K_MTF_VENDOR_ID - This is the unique vendor Id assigned
// to Eastman Software (Spring, 1997), by Seagate.
// Used in Win2K (NT 5.0) Remote Storage
//
#define REMOTE_STORAGE_WIN2K_MTF_VENDOR_ID 0x1300
#define REMOTE_STORAGE_MTF_VENDOR_ID 0x1515
//
// REMOTE_STORAGE_MTF_VENDOR_NAME -- This is the vendor name used for MTF labels.
//
#define REMOTE_STORAGE_MTF_VENDOR_NAME OLESTR("Microsoft Corporation")
//
// REMOTE_STORAGE_MTF_SOFTWARE_VERSION_MJ -- This the the major version number
// for Remote Storage
//
#define REMOTE_STORAGE_MTF_SOFTWARE_VERSION_MJ 1
//
// REMOTE_STORAGE_MTF_SOFTWARE_VERSION_MN -- This the the minor version number
// for Remote Storage
//
#define REMOTE_STORAGE_MTF_SOFTWARE_VERSION_MN 0
/*++
Enumeration Name:
MTFSessionType
Description:
Specifies a type of data set.
--*/ typedef enum MTFSessionType { MTFSessionTypeTransfer = 0, MTFSessionTypeCopy, MTFSessionTypeNormal, MTFSessionTypeDifferential, MTFSessionTypeIncremental, MTFSessionTypeDaily, };
//
// MVR_DEBUG_OUTPUT - Special flag used for outputing extra debug info
//
#ifdef DBG
#define MVR_DEBUG_OUTPUT TRUE
#else
#define MVR_DEBUG_OUTPUT FALSE
#endif
//
// MrvInjectError - Special macro for allowing test running to inject
// device errors at specific location throughout the
// data mover.
//
/*++
Macro Name:
MrvInjectError
Macro Description:
Special macro for allowing test running to inject device errors at specific location throughout the data mover.
Arguments:
injectPoint - A UNICODE string describing the injection point.
--*/
#ifdef DBG
#define MvrInjectError(injectPoint) \
{ \ DWORD size; \ OLECHAR tmpString[256]; \ if (SUCCEEDED(WsbGetRegistryValueString(NULL, RMS_REGISTRY_STRING, injectPoint, tmpString, 256, &size))) { \ DWORD injectHr; \ injectHr = wcstoul(tmpString, NULL, 16); \ if (injectHr) { \ WsbTrace(OLESTR("%ls - Injecting Error <%ls>\n"), injectPoint, WsbHrAsString(injectHr)); \ if (IDOK == MessageBox(NULL, L"Inject error, then press OK. Cancel skips over this injection point.", injectPoint, MB_OKCANCEL)) { \ if (injectHr != S_FALSE) { \ WsbThrow(injectHr); \ } \ } \ } \ } \ } #else
#define MvrInjectError(injectPoint)
#endif
/////////////////////////////////////////////////////////////////////////////
// CMTFSession
class CMTFSession { public: CMTFSession(); ~CMTFSession();
// TODO: Add SetStream() for m_pStream, and replace m_sHints with object that supports IRemoteStorageHint
CComPtr<IStream> m_pStream; // Stream used for I/O.
MVR_REMOTESTORAGE_HINTS m_sHints; // We keep the information need for
// optimized retrieval of the file/data.
HRESULT SetBlockSize(UINT32 blockSize); HRESULT SetUseFlatFileStructure(BOOL val); HRESULT SetUseSoftFilemarks(BOOL val); HRESULT SetUseCaseSensitiveSearch(BOOL val); HRESULT SetCommitFile(BOOL val);
// MTF Formatting methods
HRESULT InitCommonHeader(void); HRESULT DoTapeDblk(IN WCHAR* szLabel, IN ULONG maxIdSize, IN OUT BYTE* pIdentifier, IN OUT ULONG* pIdSize, IN OUT ULONG* pIdType); HRESULT DoSSETDblk(IN WCHAR* szSessionName, IN WCHAR* szSessionDescription, IN MTFSessionType type, IN USHORT nDataSetNumber); HRESULT DoVolumeDblk(IN WCHAR* szPath); HRESULT DoDataSet(IN WCHAR* szPath); HRESULT DoParentDirectories(IN WCHAR* szPath); HRESULT DoDirectoryDblk(IN WCHAR* szPath, IN WIN32_FIND_DATAW* pFindData); HRESULT DoFileDblk(IN WCHAR* szPath, IN WIN32_FIND_DATAW* pFindData); HRESULT DoDataStream(IN HANDLE hStream); HRESULT DoEndOfDataSet(IN USHORT nDataSetNumber); HRESULT ExtendLastPadToNextPBA(void);
// Read methods
HRESULT ReadTapeDblk(OUT WCHAR **pszLabel);
// Validate methods (for Recovery usage)
HRESULT SkipOverTapeDblk(void); HRESULT SkipOverSSETDblk(OUT USHORT* pDataSetNumber); HRESULT SkipToDataSet(void); HRESULT SkipOverDataSet(void); HRESULT SkipOverEndOfDataSet(void); HRESULT PrepareForEndOfDataSet(void);
private: HRESULT PadToNextPBA(void); HRESULT PadToNextFLA(BOOL flush);
// For Recovery usage
HRESULT SkipOverStreams(IN UINT64 uOffsetToFirstStream);
private:
enum { // Class specific constants:
//
Version = 1, // Class version, this should be
// incremented each time the
// the class definition changes.
}; // Session data
UINT32 m_nCurrentBlockId; // Used for "control_block_id" in common header.
// We increment this for each dblk written.
UINT32 m_nDirectoryId; // Tracks the directory id used in DIRB and FILE
// DBLKs. We increment this for each directory
// written.
UINT32 m_nFileId; // Tracks the file id used in FILE dblks. We
// increment this for each file written.
UINT64 m_nFormatLogicalAddress;// We need to keep track of how many alignment
// indicies we are away from the SSET, as this
// info is used in the common block headers.
// We increment this for each alignment index
// written, including streams, to the device.
UINT64 m_nPhysicalBlockAddress;// Hold onto the PBA of the beginning of the SSET.
UINT32 m_nBlockSize; // Physical Block Size of the media used.
MTF_DBLK_SFMB_INFO* m_pSoftFilemarks; // Holds Soft Filemark information.
MTF_DBLK_HDR_INFO m_sHeaderInfo; // We keep one header info struct here,
// fill it in once, and then just make
// changes as necessary as we supply it
// to MTF_Write... calls.
MTF_DBLK_SSET_INFO m_sSetInfo; // We keep the data set info struct to handle
// special case DBLK formatting.
MTF_DBLK_VOLB_INFO m_sVolInfo; // We keep the volume info struct to handle
// special case DBLK formatting.
BYTE * m_pBuffer; // The buffer used to format data (with virtual address aligend to sectore size)
BYTE * m_pRealBuffer; // The actual buffer
size_t m_nBufUsed; // The number of bytes in the buffer with valid data.
size_t m_nBufSize; // The size of the buffer.
size_t m_nStartOfPad; // Holds the location within the transfer buffer
// of the last SPAD.
BOOL m_bUseFlatFileStructure;// If TRUE, Directory information is not written to
// the MTF session, and filenames are mangled
// to preserve uniqueness.
BOOL m_bUseSoftFilemarks; // If TRUE, filemark emulation is turned on.
BOOL m_bUseCaseSensitiveSearch; // If TRUE, all filename queries are case sensitve (i.e. Posix Semantics)
BOOL m_bCommitFile; // If TRUE, flushes devices buffers after file is
// written to the data set.
BOOL m_bSetInitialized; // If TRUE, sSet was initialized (for detecting Recovery)
FILE_BASIC_INFORMATION m_SaveBasicInformation; // Basic info for last file/dir (see notes on CloseStream).
void * m_pvReadContext; // Holds BackupRead context info.
CMTFApi * m_pMTFApi; // Object that implements internal MTF details
// MTF I/O abstracton methods
HRESULT OpenStream(IN WCHAR* szPath, OUT HANDLE *pStreamHandle); HRESULT CloseStream(IN HANDLE hStream);
HRESULT WriteToDataSet(IN BYTE* pBuffer, IN ULONG nBytesToWrite, OUT ULONG* pBytesWritten); HRESULT ReadFromDataSet(IN BYTE* pBuffer, IN ULONG nBytesToRead, OUT ULONG* pBytesRead); HRESULT FlushBuffer(IN BYTE* pBuffer, IN OUT size_t* pBufPosition); HRESULT WriteFilemarks(IN ULONG count); HRESULT GetCurrentPBA(OUT UINT64* pPosition); HRESULT SetCurrentPBA(IN UINT64 position); HRESULT SpaceToEOD(void); HRESULT SpaceToBOD(void);
};
#endif // !defined(MTFSessn_H)
|