|
|
//+---------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1993.
//
// File: $(CTCAIROLE)\filemnk\testsrc\pathgen\pathgen.hxx
//
// Contents: Header file for CPathGen path generator class
//
// Classes: CPathGen
//
// Methods:
// public
// CPathGen
// ~CPathGen
// Dump
// DumpPrefixList
// GetMediaType
// GetName
// GetNumVariations
// GetPath
// GetPrefix
// GetSeed
// GetRedirVolume
// GetVolume
// MangleLongFileName
// SetToRootDirectory
// private
// BuildPrefixList
// BuildUserList
// CreatePathTree
// CreatePathList
// CreatePlayground
// DestroyDiskPathTree
// DestroyDiskPathList
// DestroyMemPathList
// DestroyMemPathTree
// DestroyPrefixes
// DumpTree
// GetPathFromTree
// GetPathFromList
// GenPathTreeElements
// GenPathListElements
// PickBody
// PickFileName
// SetNumVariations
// SetTreeRoot
// SetVolume
//
//
// History: 30-Jun-93 DarrylA Created.
// 22-Nov-94 EricHans Change sharing name to uppercase.
// 15-Dec-95 EricHans Add MangleLongFileName method
//
//----------------------------------------------------------------------
#ifndef _PATHGEN_H_
#define _PATHGEN_H_
// DECLARE_DEBUG(fmkt);
#define MAX_VARIATIONS 0xffff // this is huge! but possible
// The size of this number must fit in TESTSHARE_CREATION_STRING
#define MAX_SHARE_INDEX ULONG_MAX
// The format size for the %u should be at least large enough for
// MAX_SHARE_INDEX which is currently 8 decimal places so that we
// stay below the LM2.0 limit which is currently 12 chars long
#define TESTSHARE_CREATION_STRINGW L"CPG%08X"
#define TESTSHARE_CREATION_STRINGA "CPG%08X"
#ifndef MINLEVELLENGTH
#define MINLEVELLENGTH 1 // length of minimum path
#endif
#ifndef MAXFSLEN
#define MAXFSLEN sizeof(L"HPFS")
#endif
#ifndef MIN_BIND_NAME_LEN
#define MIN_BIND_NAME_LEN (sizeof("z.ext") - 1)
#endif
// the drive letter c is insignificant
#define VOLROOT_NAMELEN (sizeof("c:\\") - 1)
#ifndef BIGBUF
#define BIGBUF 2048
#endif
#define TREE 1
#define LIST 2
// BUGBUG - there is a bug in the NT file system handling that does not
// allow it to utilize the entire length of MAX_PATH_LEN. The number 15
// used here was determined experimentally.
#ifndef MAX_PATH_LEN
#define MAX_PATH_LEN _MAX_DIR - 15
#endif
typedef enum PREFIXTYPES // pfxt
{ PREFIX_NONE = 0, PREFIX_RELATIVE_ROOT, PREFIX_RELATIVE_PATH, PREFIX_LOCAL_ROOT, PREFIX_LOCAL_VOLUME, PREFIX_UNC_BKSLSH, PREFIX_UNC_EXMRK, PREFIX_RELATIVE_SHARE, PREFIX_ABSOLUTE_SHARE, PREFIX_DFS_MACHINE, PREFIX_DFS_DOMAIN, PREFIX_DFS_ORG, PREFIX_NUM_DEF_PREFIXES, PREFIX_RANDOM // used to tell enumerator to return random prefix
} PrefixTypes;
// Enumerated disk media types
enum MediaType { FAT, HPFS, NTFS, OFS, UNKNOWN, UNINIT, FATEXTENDED };
typedef struct PATHBINTREE // pbt
{ ULONG ulPosition; LPWSTR wcsPathElement; struct PATHBINTREE *pbtLeft; struct PATHBINTREE *pbtRight; } PathBinTree, *LPPathBinTree;
#ifndef _BUGBUG_CAIRO_
// Need to define DFS_ROOT to satisfy compiler in non-Cairo builds
enum DFS_ROOT { DFS_ROOT_MACH, DFS_ROOT_DOM, DFS_ROOT_ORG }; #endif
// Global flag used to externally enable the use of an unmappable wchar in
// the character set passed to datagen
extern BOOL fUseUnicodeUnmappableWCHAR;
// Helper functions
BOOL CreateDir(LPWSTR wcsPath); ULONG FindItemCount(LPWSTR wcsItems, WCHAR wcDelim); LPWSTR FixupUNCName(LPWSTR wcsPath); HRESULT GetDfsBasedPath(LPWSTR wcsPath, LPWSTR *wcsDFSPath, DFS_ROOT dfsRoot); LPWSTR GetMachineName(void); LPWSTR wcsNEWdup(LPWSTR wcs);
class CPathGen { public: CPathGen(ULONG ulNumVariations, ULONG ulSeed, WCHAR wcVolume, LPWSTR wcsTreeRoot, ULONG ulNumDirs, LPWSTR wcsUserPaths, LPWSTR wcsUserPrefixes, BOOL fCreateStorage, HRESULT *hrStatus);
~CPathGen();
void Dump(void); void DumpPrefixList(void); MediaType GetMediaType(void); HRESULT GetName(LPWSTR *pwcsName, ULONG ulMaxLen); HRESULT GetName(LPWSTR *pwcsName, ULONG ulMaxLen, ULONG ulExtLen); HRESULT GetName(LPWSTR *pwcsName, ULONG ulMaxLen, LPCWSTR pwcsExt); inline ULONG GetNumVariations(void) { return m_culNumVariations; } LPWSTR GetPath(ULONG ulPath); LPWSTR GetPrefix(ULONG ulPrefix); inline ULONG GetSeed(void) { return m_ulSeed; } WCHAR GetRedirVolume(void); inline WCHAR GetVolume(void) { return m_wcVolume; } HRESULT MangleLongFileName(LPCWSTR wcsLongName, LPWSTR wcsMangledName); void SetToRootDirectory(void);
private: void BuildPrefixList(LPWSTR wcsUserPrefixes); ULONG BuildUserList(LPWSTR wcsUserPrefixes, LPWSTR **wcsList); LPPathBinTree CreatePathTree(ULONG culSize, ULONG ulNewPosition, ULONG ulCurrentLevel, ULONG culLengthSoFar); HRESULT CreatePathList(ULONG culLengthSoFar, LPWSTR wcsPath, PULONG pulCount); void CreatePlayground(DWORD dwType, LPWSTR wcsUserPaths); void DestroyDiskPathTree(LPPathBinTree ppbtTree); void DestroyDiskPathList(LPWSTR *wcsPathList); void DestroyMemPathList(void); void DestroyMemPathTree(LPPathBinTree ppbtTree); void DestroyPrefixes(void); void DumpTree(LPPathBinTree ppbtTree); void GetPathFromTree(ULONG ulPath, LPPathBinTree ppbtTree, LPWSTR wcsPath); void GetPathFromList(ULONG ulPath, LPWSTR wcsPath); void GenPathTreeElements(LPPathBinTree pbtPathTree); void GenPathListElements(LPWSTR *pwcsPathList); ULONG PickBody(void); ULONG PickFileName(void); void SetNumVariations(ULONG ulNumVariations); void SetTreeRoot(LPWSTR wcsTreeRoot); void SetVolume(WCHAR wcVolume);
// Member variables
BOOL m_fDefPrefixes; // are we using our default prefixes
DG_UNICODE m_dguNames; // string generator
DG_INTEGER m_dgiIndex; // index generator
MediaType m_mtMedia; // file system of test root
LPPathBinTree m_ppbtPathTree; // binary tree of path info
LPWSTR *m_pwcsPathList; // array of directory strings
LPWSTR *m_pwcsPrefixList; // array of prefix strings
LPWSTR m_wcsTreeRoot; // root of test tree
WCHAR m_wcVolume; // volume letter of test root
ULONG m_ulSeed; // seed used by data generators
ULONG m_culBasePathLen; // length of longest prefix + other
// things that can be predetermined
ULONG m_culNumDirs; // number of directories to create
ULONG m_culNumLevels; // number of levels in tree
ULONG m_culNumVariations; // number of variations to create
ULONG m_culNumPrefixes; // number of prefixes available
ULONG *m_aulFirstElement; // element # of top dir in dir list
BOOL m_fCreateStorage; // should we create dirs on disk
LPWSTR m_wcsValidCharSet; // pointer to valid set for this media
LPWSTR m_wcsTestShare; // sharename
};
//+---------------------------------------------------------------------
//
// Function: NumLevels
//
// Synopsis: returns number of levels required in a binary tree
//
// Arguments: [ulNum] -- number of items going into tree
//
// History: 25-Aug-93 DarrylA Created.
//
//----------------------------------------------------------------------
inline ULONG NumLevels(ULONG ulNum) { ULONG ulLevels = 0;
while(0 != ulNum) { ++ulLevels; ulNum >>= 1; }
return ulLevels; }
//+---------------------------------------------------------------------
//
// Function: AdjustToNextPowerOf2
//
// Synopsis: returns next power of 2 > ul
//
// Arguments: [ul] -- number to convert
//
// History: 25-Aug-93 DarrylA Created.
//
//----------------------------------------------------------------------
inline ULONG AdjustToNextPowerOf2(ULONG ul) { ULONG ulNum = 1L;
// if ul > msb set on a ULONG, next power of 2 is > ULONG
if((~(ULONG_MAX >> 1) < ul)) { RaiseException((ULONG) E_FAIL, 0, 0, NULL); } // We need to return a power of 2 that is GREATER than ul so we can
// subtract 1 and still get at least ul variations
while(ulNum <= ul && ulNum != 0L) { ulNum <<= 1; } return ulNum; }
#endif // _PATHGEN_H_
|