windows-nt/Source/XPSP1/NT/com/oleutest/stgbvt/comtools/h/pathgen.hxx

292 lines
8.9 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------
//
// 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_