|
|
//+-------------------------------------------------------------------------
// Microsoft OLE
// Copyright (C) Microsoft Corporation, 1992 - 1996.
// All rights reserved.
//
// File: util.hxx
//
// Contents: test utility functions
//
// Functions: - AddStorage
// - AddStream
// - CalculateCRCForName
// - CalculateCRCForDataBuffer
// - CalculateInMemoryCRCForStg
// - CalculateInMemoryCRCForStm
// - CalculateDiskCRCForStg
// - CalculateCRCForDocFile
// - CalculateCRCForDocFileStmData
// - CloseRandomVirtualCtrNodeStg
// - DestroyStorage
// - DestroyStream
// - EnumerateInMemoryDocFile
// - EnumerateDiskDocFile
// - GenerateRandomName
// - GenerateVirtualDFFromDiskDF
// - GetVirtualCtrNodeForTest
// - GetVirtualStmNodeForTest
// - OpenRandomVirtualCtrNodeStg
// - ReadAndCalculateDiskCRCForForStm
// - TStringToOleString
// - PrivAtol
// - GenerateRandomString
// - ParseVirtualDFAndOpenAllSubStgsStms
//
// History: Narindk 21-April-96 Created
// SCousens 2-Feb-97 Added 2 funcs. for Conversion
//--------------------------------------------------------------------------
#ifndef __COMMON_UTIL_HXX__
#define __COMMON_UTIL_HXX__
// 32 bit CRC declarations and macro definitions. The logic was taken
// from the book 'C Programmer's Guide to Netbios'.
extern ULONG aulCrc[256];
#define CRC_PRECONDITION 0xFFFFFFFFL
#define CRC_CALC(X,Y) \
{ \ register BYTE ibCrcIndex; \ ibCrcIndex = (BYTE) ((X ^ Y) & 0x000000FFL); \ X = ((X >> 8) & 0x00FFFFFFL) ^ aulCrc[ibCrcIndex]; \ }
// Combine 2 crcs into one. Used when have
// CRC for data and a CRC for name.
#define MUNGECRC(a,b) \
{ \ for (int i=0; i < sizeof(b); i++) \ { \ CRC_CALC(a, (BYTE)((b >> (i<<3)) & 0xff)); \ } \ }
#define DEF_FATNAME_MAXLEN 8 // Default max length for FAT file names
#define FILEEXT_MAXLEN 3 // Max length for file name extensions
#define DEF_OFSNAME_MAXLEN 20 // Default max length for non-FAT file names
#define FAT_CHARSET_SIZE 80 // Buffer size for FAT name char set
#define OFS_CHARSET_SIZE 124 // Buffer size for non-FAT name char set
// Definitions
// Review- The docfile/componnet name lengths can be b/w 1-31 char long. So
// define MAXLENGTH to be 27, since "." and extension (max 3 chars long) is
// also used for names.
#define MAXLENGTH 27
#define MINLENGTH 5
#define STM_BUFLEN 4096
// sector size definitions
#define DEFAULT_SECTOR_SIZE 512
#define LARGE_SECTOR_SIZE 4096
// These macros are used in the GenerateRandomStreamData function.
// CHARSET is the size of our 'alphabet'
// DATABUFFER is the size of our buffer that we reuse to fill huge buffers.
// The smaller this number is the larger the probablity of duplication in
// the stream, but the more efficient we are at not generating chars for fill
#define CB_STMDATA_CHARSET 255 //ASCII 0-255 - printable chars
#define CB_STMDATA_DATABUFFER 255 // may want to try 512
// For hack in function GenerateVirtualDFTreeFromDiskDF
#define NRETRIES 20
#define NWAIT_TIME 100
// Enumeration for use by Verify functions like EnumerateDiskDocFile,
// Calulate CRCForDiskDocFile
typedef enum verifyOp { VERIFY_EXC_TOPSTG_NAME = 0, VERIFY_INC_TOPSTG_NAME = 1, VERIFY_SHORT, VERIFY_DETAIL } VERIFY_OP;
// Flags for stuff to include in CRC calculations
const DWORD CRC_INC_TOPSTG_NAME = 1; const DWORD CRC_INC_STATEBITS = 2;
// Enumeration for use by utility functions like function
// ParseVirtualDFAndCloseOpenStgsStms
typedef enum nodeOp { NODE_INC_TOPSTG, NODE_EXC_TOPSTG } NODE_OP;
// Function Prototypes
// Function to generate a random string.
HRESULT GenerateRandomName( DG_STRING *pgds, ULONG ulMinLen, ULONG ulMaxLen, LPTSTR *pptszName);
// Functions to pick up randomly VirtualCTrNode/VirtualStmNode for tests.
HRESULT GetVirtualCtrNodeForTest( VirtualCtrNode *pVirtualCtrNode, DG_INTEGER *pdgi, ULONG cMin, ULONG cMax, VirtualCtrNode **ppVirtualCtrNodeForTest);
HRESULT GetVirtualCtrNodeForTest( VirtualDF *pVirtualDF, DG_INTEGER *pdgi, ULONG cMin, ULONG cMax, VirtualCtrNode **ppVirtualCtrNodeForTest);
HRESULT GetVirtualStmNodeForTest( VirtualCtrNode *pVirtualCtrNode, DG_INTEGER *pdgi, ULONG cMin, ULONG cMax, VirtualCtrNode **ppVirtualCtrNodeParent, VirtualStmNode **ppVirtualStmNodeForTest);
HRESULT GetVirtualStmNodeForTest( VirtualDF *pVirtualDF, DG_INTEGER *pdgi, ULONG cMin, ULONG cMax, VirtualCtrNode **ppVirtualCtrNodeParent, VirtualStmNode **ppVirtualStmNodeForTest);
// Function to add a VirtualCtrNode and corresponding IStorage to existing
// VirtualDF tree.
HRESULT AddStorage( VirtualDF *pVirtualDF, VirtualCtrNode *pVirtualCtrNode, LPTSTR pName, DWORD grfMode, VirtualCtrNode **ppNewVirtualCtrNode);
// Function to delete a VirtualCtrNode and corresponfing IStorage and readjust
// -ing the VirtualDF tree.
HRESULT DestroyStorage( VirtualDF *pVirtualDF, VirtualCtrNode *pVirtualCtrNode);
// Function to delete a VirtualStmNode and corresponfing IStream and readjust
// -ing the parent VirtualCtrNode in the VirtualDF tree.
HRESULT DestroyStream( VirtualDF *pVirtualDF, VirtualStmNode *pVirtualStmNode);
// Function to add a VirtualStmNode and corresponding IStream to existing
// VirtualCtrNode in VirtualDF tree.
HRESULT AddStream( VirtualDF *pVirtualDF, VirtualCtrNode *pVirtualCtrNode, LPTSTR pName, ULONG cbSize, DWORD grfMode, VirtualStmNode **ppNewVirtualStmNode);
// CRC function to calculate InMemory CRC for a stream both for name and data.
// Function is dependent on VirtualDF tree dependencies.
HRESULT CalculateInMemoryCRCForStm( VirtualStmNode *pvsn, const LPTSTR ptszBuffer, ULONG culBufferSize, DWCRCSTM *pdwCRC);
// Function to calculate CRC for open IStream
HRESULT CalculateStreamDataCRC( IStream *pStm, DWORD dwSize, DWORD *pdwCRC, DWORD dwChunkSize=STM_CHUNK_SIZE);
// CRC function to calculate CRC for a disk stream by stat'ng on it, reading
// its contents and thereny calculating CRC on its name and data. Function is
// dependent on VirtualDF tree dependencies.
HRESULT ReadAndCalculateDiskCRCForStm( VirtualStmNode *pvsn, DWCRCSTM *pdwCRC, DWORD dwChunkSize=STM_CHUNK_SIZE);
// CRC function to calculate CRC for IStorage/IStream name. Function used by
// by other CRC functions. Function independent of VirtualDF tree dependencies.
HRESULT CalculateCRCForName( const LPTSTR ptszName, DWORD *pdwCRCForName);
// CRC function to calculate CRC for a data buffer. Function used by other CRC
// functions. Function independent of VirtualDF tree dependencies.
HRESULT CalculateCRCForDataBuffer( const LPTSTR ptszBuffer, ULONG culBufferSize, DWORD *pdwCRCForName);
// CRC function to calculate InMemory CRC for a storage for its name.
// Function is dependent on VirtualDF tree dependencies.
HRESULT CalculateInMemoryCRCForStg( VirtualCtrNode *pvcn, DWORD *pdwCRC);
// CRC function to calculate CRC for a disk storage by stat'ng on it, thereby
// calculating CRC on its name. Function is dependent on VirtualDF tree
// dependencies.
HRESULT CalculateDiskCRCForStg( VirtualCtrNode *pvcn, DWORD *pdwCRC);
// CRC function to calculate CRC for a disk docfile by enumerating and opening
// up all its substorages/streams and thereby calculating CRC on all of its
// storages and streams. Function independent of VirtualDF tree dependencies
HRESULT CalculateCRCForDocFile( IStorage *pIStorage, DWORD crcflags, DWORD *pdwCRC, DWORD dwChunkSize=STM_CHUNK_SIZE);
// CRC function to calculate CRC for a disk stream by opening and reading its
// contents. Function is independent of VirtualDF tree dependencies.
HRESULT CalculateCRCForDocFileStmData( LPSTORAGE pIStorage, LPTSTR ptcsName, DWORD cbSize, DWORD *pdwCurrStmDataCRC, DWORD dwChunkSize=STM_CHUNK_SIZE);
HRESULT CalculateCRCForDocFileStmData( LPTSTR ptcsName, LPSTREAM pIChildStream, DWORD cbSize, DWORD *pdwCurrStmDataCRC, DWORD dwChunkSize=STM_CHUNK_SIZE);
// Function to enumerate a in memory VirtualDocFile tree anc count the number
// of storages and streams in it.
HRESULT EnumerateInMemoryDocFile( VirtualCtrNode *pvcn, ULONG *pNumStg, ULONG *pNumStm);
// Function to enumerate a disk DocFile tree anc count the number of storages
// and streams in it.
HRESULT EnumerateDiskDocFile( LPSTORAGE pIStorage, VERIFY_OP fVerifyOp, ULONG *pNumStg, ULONG *pNumStm );
// Function to generate a VirtualDocFile tree from a disk DocFile by
// enumerating it.
HRESULT GenerateVirtualDFFromDiskDF( VirtualDF *pNewVirtualDF, LPTSTR ptszRootDFName, DWORD grfMode, VirtualCtrNode **ppvcnRoot, LPSTORAGE pIRootStg = NULL, BOOL fDFOpened = FALSE, ULONG ulSeed = UL_INVALIDSEED);
HRESULT GenerateVirtualDFFromDiskDF( VirtualDF *pNewVirtualDF, LPTSTR ptszRootDFName, DWORD grfMode, VirtualCtrNode **ppvcnRoot, ULONG ulSeed);
// Function to open the storage for a randomly selected VirtualCtrNode. Opens
// all parent storages above it, except root that is assumed opened before this
// call is made.
HRESULT OpenRandomVirtualCtrNodeStg( VirtualCtrNode *pvcn, DWORD grfMode);
// Function to close the storage for a randomly selected VirtualCtrNode opened
// by call to OpenRandomVirtualCtrNodeStg. Closes all parent storages above it
// , except root since that wasn't reopened by open call.
HRESULT CloseRandomVirtualCtrNodeStg(VirtualCtrNode *pvcn);
// Function to close the open IStorage/IStream pointers by parsing the Virtual
// DF tree under the given node
HRESULT ParseVirtualDFAndCloseOpenStgsStms( VirtualCtrNode *pvcn, NODE_OP fNodeOp);
// Function to commit all the open IStorages by parsing the Virtual DF tree
// under the given node
HRESULT ParseVirtualDFAndCommitAllOpenStgs( VirtualCtrNode *pvcn, DWORD grfCommitMode, NODE_OP fNodeOp);
HRESULT PrivAtol(char *pszNum, LONG *plResult);
HRESULT GenerateRandomString( DG_STRING *pgds, ULONG ulMinLen, ULONG ulMaxLen, LPTSTR *pptszName);
HRESULT GenerateRandomStreamData( DG_STRING *pgds, LPTSTR *pptszData, ULONG ulMinLen, ULONG ulMaxLen=0);
// recursively open everything below given VirtualCtrNode
HRESULT ParseVirtualDFAndOpenAllSubStgsStms (VirtualCtrNode * pvcn, DWORD dwStgMode, DWORD dwStmMode);
// get the document name, given the seed
HRESULT GetDocFileName (ULONG ulSeed, LPTSTR *pptszDocName);
// commit the changes all way up to the root
HRESULT CommitRandomVirtualCtrNodeStg(VirtualCtrNode *pvcn, DWORD grfCommitMode);
// functions in createdf.cxx
enum {ALWAYS = -1, NEVER = -2};
HRESULT CreateTestDocfile ( OUT VirtualDF **ppvdf, IN CDFD *pcdfd, IN LPTSTR cmdline=NULL, IN LPTSTR pFileName=NULL);
HRESULT CreateTestDocfile ( OUT VirtualDF **ppvdf, IN DWORD type, IN ULONG ulSeed, IN LPTSTR cmdline=NULL, IN LPTSTR pFileName=NULL);
HRESULT CleanupTestDocfile ( IN VirtualDF *pvdf, IN BOOL fDeleteFile);
#endif // __COMMON_UTIL_HXX__
|