|
|
/*
* stock.h - Stock header file. */
/* Constants
************/
#define INVALID_SEEK_POSITION (0xffffffff)
#define EMPTY_STRING TEXT("")
#define SLASH_SLASH TEXT("\\\\")
#define EQUAL TEXT('=')
#define SPACE TEXT(' ')
#define TAB TEXT('\t')
#define COLON TEXT(':')
#define COMMA TEXT(',')
#define PERIOD TEXT('.')
#define SLASH TEXT('\\')
#define BACKSLASH TEXT('/')
#define ASTERISK TEXT('*')
#define QMARK TEXT('?')
/* limits */
#define WORD_MAX USHRT_MAX
#define DWORD_MAX ULONG_MAX
#define SIZE_T_MAX DWORD_MAX
#define PTR_MAX ((PCVOID)MAXULONG_PTR)
/* file system constants */
#define MAX_PATH_LEN MAX_PATH
#define MAX_NAME_LEN MAX_PATH
#define MAX_FOLDER_DEPTH (MAX_PATH / 2)
#define DRIVE_ROOT_PATH_LEN (4)
/* size macros */
#define SIZEOF(a) sizeof(a)
/* invalid thread ID */
#define INVALID_THREAD_ID (0xffffffff)
/* file-related flag combinations */
#define ALL_FILE_ACCESS_FLAGS (GENERIC_READ |\
GENERIC_WRITE)
#define ALL_FILE_SHARING_FLAGS (FILE_SHARE_READ |\
FILE_SHARE_WRITE)
#define ALL_FILE_ATTRIBUTES (FILE_ATTRIBUTE_READONLY |\
FILE_ATTRIBUTE_HIDDEN |\ FILE_ATTRIBUTE_SYSTEM |\ FILE_ATTRIBUTE_DIRECTORY |\ FILE_ATTRIBUTE_ARCHIVE |\ FILE_ATTRIBUTE_NORMAL |\ FILE_ATTRIBUTE_TEMPORARY)
#define ALL_FILE_FLAGS (FILE_FLAG_WRITE_THROUGH |\
FILE_FLAG_OVERLAPPED |\ FILE_FLAG_NO_BUFFERING |\ FILE_FLAG_RANDOM_ACCESS |\ FILE_FLAG_SEQUENTIAL_SCAN |\ FILE_FLAG_DELETE_ON_CLOSE |\ FILE_FLAG_BACKUP_SEMANTICS |\ FILE_FLAG_POSIX_SEMANTICS)
#define ALL_FILE_ATTRIBUTES_AND_FLAGS (ALL_FILE_ATTRIBUTES |\
ALL_FILE_FLAGS)
/* Macros
*********/
#ifndef DECLARE_STANDARD_TYPES
/*
* For a type "FOO", define the standard derived types PFOO, CFOO, and PCFOO. */
#define DECLARE_STANDARD_TYPES(type) typedef type *P##type; \
typedef const type C##type; \ typedef const type *PC##type;
#endif
/* character manipulation */
#define IS_SLASH(ch) ((ch) == SLASH || (ch) == BACKSLASH)
/* bit flag manipulation */
#define SET_FLAG(dwAllFlags, dwFlag) ((dwAllFlags) |= (dwFlag))
#define CLEAR_FLAG(dwAllFlags, dwFlag) ((dwAllFlags) &= (~dwFlag))
#define IS_FLAG_SET(dwAllFlags, dwFlag) ((BOOL)((dwAllFlags) & (dwFlag)))
#define IS_FLAG_CLEAR(dwAllFlags, dwFlag) (! (IS_FLAG_SET(dwAllFlags, dwFlag)))
/* array element count */
#define ARRAY_ELEMENTS(rg) (sizeof(rg) / sizeof((rg)[0]))
/* file attribute manipulation */
#define IS_ATTR_DIR(attr) (IS_FLAG_SET((attr), FILE_ATTRIBUTE_DIRECTORY))
#define IS_ATTR_VOLUME(attr) (IS_FLAG_SET((attr), FILE_ATTRIBUTE_VOLUME))
/* Types
********/
typedef const void *PCVOID; typedef const INT CINT; typedef const INT *PCINT; typedef const UINT CUINT; typedef const UINT *PCUINT; typedef const BYTE CBYTE; typedef const BYTE *PCBYTE; typedef const WORD CWORD; typedef const WORD *PCWORD; typedef const DWORD CDWORD; typedef const DWORD *PCDWORD; typedef const CRITICAL_SECTION CCRITICAL_SECTION; typedef const CRITICAL_SECTION *PCCRITICAL_SECTION; typedef const FILETIME CFILETIME; typedef const FILETIME *PCFILETIME; typedef const SECURITY_ATTRIBUTES CSECURITY_ATTRIBUTES; typedef const SECURITY_ATTRIBUTES *PCSECURITY_ATTRIBUTES; typedef const WIN32_FIND_DATA CWIN32_FIND_DATA; typedef const WIN32_FIND_DATA *PCWIN32_FIND_DATA;
DECLARE_STANDARD_TYPES(HICON); DECLARE_STANDARD_TYPES(NMHDR);
#ifndef _COMPARISONRESULT_DEFINED_
/* comparison result */
typedef enum _comparisonresult { CR_FIRST_SMALLER = -1, CR_EQUAL = 0, CR_FIRST_LARGER = +1 } COMPARISONRESULT; DECLARE_STANDARD_TYPES(COMPARISONRESULT);
#define _COMPARISONRESULT_DEFINED_
#endif
/*
* debug.h - Debug macros and their retail translations. */
/* Macros
*********/
/* debug output macros */
/*
* Do not call SPEW_OUT directly. Instead, call TRACE_OUT, WARNING_OUT, * ERROR_OUT, or FATAL_OUT. */
/*
* call like printf(), but with an extra pair of parentheses: * * ERROR_OUT(("'%s' too big by %d bytes.", pszName, nExtra)); */
#ifdef DEBUG
#define SPEW_OUT(args) 0
#define PLAIN_TRACE_OUT(args) 0
#define TRACE_OUT(args) 0
#define WARNING_OUT(args) 0
#define ERROR_OUT(args) 0
#define FATAL_OUT(args) 0
#else
#define PLAIN_TRACE_OUT(args)
#define TRACE_OUT(args)
#define WARNING_OUT(args)
#define ERROR_OUT(args)
#define FATAL_OUT(args)
#endif
/* parameter validation macros */
/*
* call as: * * bPTwinOK = IS_VALID_READ_PTR(ptwin, CTWIN); * * bHTwinOK = IS_VALID_HANDLE(htwin, TWIN); */
#ifdef DEBUG
#define IS_VALID_READ_PTR(ptr, type) \
(IsBadReadPtr((ptr), sizeof(type)) ? \ (ERROR_OUT((TEXT("invalid %s read pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define IS_VALID_WRITE_PTR(ptr, type) \
(IsBadWritePtr((PVOID)(ptr), sizeof(type)) ? \ (ERROR_OUT((TEXT("invalid %s write pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define IS_VALID_STRING_PTRA(ptr, type) \
(IsBadStringPtrA((ptr), (UINT)-1) ? \ (ERROR_OUT((TEXT("invalid %s pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define IS_VALID_STRING_PTRW(ptr, type) \
(IsBadStringPtrW((ptr), (UINT)-1) ? \ (ERROR_OUT((TEXT("invalid %s pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#ifdef UNICODE
#define IS_VALID_STRING_PTR(ptr, type) IS_VALID_STRING_PTRW(ptr, type)
#else
#define IS_VALID_STRING_PTR(ptr, type) IS_VALID_STRING_PTRA(ptr, type)
#endif
#define IS_VALID_CODE_PTR(ptr, type) \
(IsBadCodePtr((PROC)(ptr)) ? \ (ERROR_OUT((TEXT("invalid %s code pointer - %#08lx"), (LPCTSTR)TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
(IsBadReadPtr((ptr), len) ? \ (ERROR_OUT((TEXT("invalid %s read pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
(IsBadWritePtr((ptr), len) ? \ (ERROR_OUT((TEXT("invalid %s write pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \ TRUE)
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? \ (ERROR_OUT((TEXT("invalid flags set - %#08lx"), ((dwFlags) & (~(dwAllFlags))))), FALSE) : \ TRUE)
#else
#define IS_VALID_READ_PTR(ptr, type) \
(! IsBadReadPtr((ptr), sizeof(type)))
#define IS_VALID_WRITE_PTR(ptr, type) \
(! IsBadWritePtr((PVOID)(ptr), sizeof(type)))
#define IS_VALID_STRING_PTR(ptr, type) \
(! IsBadStringPtr((ptr), (UINT)-1))
#define IS_VALID_CODE_PTR(ptr, type) \
(! IsBadCodePtr((PROC)(ptr)))
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
(! IsBadReadPtr((ptr), len))
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
(! IsBadWritePtr((ptr), len))
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? FALSE : TRUE)
#endif
/* handle validation macros */
#define IS_VALID_HANDLE(hnd, type) TRUE
/* structure validation macros */
#ifdef DEBUG
#define IS_VALID_STRUCT_PTR(ptr, type) TRUE
#endif
/* debug assertion macro */
/*
* ASSERT() may only be used as a statement, not as an expression. * * call as: * * ASSERT(pszRest); */ /*
#ifdef DEBUG
#define ASSERT(exp) \
if (exp) \ ; \ else \ MessageBox(NULL, TEXT("assertion failed"), TEXT("TEST"), MB_OK)
#else
*/ //#define ASSERT(exp)
/*
#endif
*/ /* debug evaluation macro */
/*
* EVAL() may be used as an expression. * * call as: * * if (EVAL(pszFoo)) * bResult = TRUE; */
#ifdef DEBUG
#define EVAL(exp) \
((exp) || (ERROR_OUT((TEXT("evaluation failed '%s'"), (LPCTSTR)TEXT(#exp))), 0))
#else
#define EVAL(exp) \
(exp)
#endif
/* debug break */
#ifndef DEBUG
#define DebugBreak()
#endif
/* debug exported function entry */
#define DebugEntry(szFunctionName)
/* debug exported function exit */
#define DebugExitVOID(szFunctionName)
#define DebugExit(szFunctionName, szResult)
#define DebugExitINT(szFunctionName, n)
#define DebugExitULONG(szFunctionName, ul)
#define DebugExitBOOL(szFunctionName, bool)
#define DebugExitHRESULT(szFunctionName, hr)
#define DebugExitCOMPARISONRESULT(szFunctionName, cr)
#define DebugExitTWINRESULT(szFunctionName, tr)
#define DebugExitRECRESULT(szFunctionName, rr)
/* Types
********/
/* GdwSpewFlags flags */
typedef enum _spewflags { SPEW_FL_SPEW_PREFIX = 0x0001,
SPEW_FL_SPEW_LOCATION = 0x0002,
ALL_SPEW_FLAGS = (SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION) } SPEWFLAGS;
/* GuSpewSev values */
typedef enum _spewsev { SPEW_TRACE = 1,
SPEW_WARNING = 2,
SPEW_ERROR = 3,
SPEW_FATAL = 4 } SPEWSEV;
/* Prototypes
*************/
/* debug.c */
#ifdef DEBUG
extern BOOL SetDebugModuleIniSwitches(void); extern BOOL InitDebugModule(void); extern void ExitDebugModule(void); extern void StackEnter(void); extern void StackLeave(void); extern ULONG GetStackDepth(void); extern void __cdecl SpewOut(LPCTSTR pcszFormat, ...);
#endif
/* Global Variables
*******************/
#ifdef DEBUG
/* debug.c */
extern DWORD GdwSpewFlags; extern UINT GuSpewSev; extern UINT GuSpewLine; extern LPCTSTR GpcszSpewFile;
/* defined by client */
extern LPCTSTR GpcszSpewModule;
#endif
/* Prototypes
*************/
/* memmgr.c */
extern COMPARISONRESULT MyMemComp(PCVOID, PCVOID, DWORD); extern BOOL AllocateMemory(DWORD, PVOID *); extern void FreeMemory(PVOID); extern BOOL ReallocateMemory(PVOID, DWORD, DWORD, PVOID *);
/*
* ptrarray.h - Pointer array ADT description. */
/* Constants
************/
/*
* ARRAYINDEX_MAX is set such that (ARRAYINDEX_MAX + 1) does not overflow an * ARRAYINDEX. This guarantee allows GetPtrCount() to return a count of * pointers as an ARRAYINDEX. */
#define ARRAYINDEX_MAX (LONG_MAX - 1)
/* Types
********/
/* handles */
DECLARE_HANDLE(HPTRARRAY); DECLARE_STANDARD_TYPES(HPTRARRAY);
/* array index */
typedef LONG ARRAYINDEX; DECLARE_STANDARD_TYPES(ARRAYINDEX);
/*
* pointer comparison callback function * * In sorting functions, both pointers are pointer array elements. In * searching functions, the first pointer is reference data and the second * pointer is a pointer array element. */
typedef COMPARISONRESULT (*COMPARESORTEDPTRSPROC)(PCVOID, PCVOID);
/*
* pointer comparison callback function * * In searching functions, the first pointer is reference data and the second * pointer is a pointer array element. */
typedef BOOL (*COMPAREUNSORTEDPTRSPROC)(PCVOID, PCVOID);
/* new pointer array flags */
typedef enum _newptrarrayflags { /* Insert elements in sorted order. */
NPA_FL_SORTED_ADD = 0x0001,
/* flag combinations */
ALL_NPA_FLAGS = NPA_FL_SORTED_ADD } NEWPTRARRAYFLAGS;
/* new pointer array description */
typedef struct _newptrarray { DWORD dwFlags;
ARRAYINDEX aicInitialPtrs;
ARRAYINDEX aicAllocGranularity; } NEWPTRARRAY; DECLARE_STANDARD_TYPES(NEWPTRARRAY);
/* Prototypes
*************/
/* ptrarray.c */
extern BOOL CreatePtrArray(PCNEWPTRARRAY, PHPTRARRAY); extern void DestroyPtrArray(HPTRARRAY); extern BOOL InsertPtr(HPTRARRAY, COMPARESORTEDPTRSPROC, ARRAYINDEX, PCVOID); extern BOOL AddPtr(HPTRARRAY, COMPARESORTEDPTRSPROC, PCVOID, PARRAYINDEX); extern void DeletePtr(HPTRARRAY, ARRAYINDEX); extern void DeleteAllPtrs(HPTRARRAY); extern ARRAYINDEX GetPtrCount(HPTRARRAY); extern PVOID GetPtr(HPTRARRAY, ARRAYINDEX); extern void SortPtrArray(HPTRARRAY, COMPARESORTEDPTRSPROC); extern BOOL SearchSortedArray(HPTRARRAY, COMPARESORTEDPTRSPROC, PCVOID, PARRAYINDEX); extern BOOL LinearSearchArray(HPTRARRAY, COMPAREUNSORTEDPTRSPROC, PCVOID, PARRAYINDEX);
extern BOOL IsValidHPTRARRAY(HPTRARRAY);
extern BOOL IsValidHGLOBAL(HGLOBAL);
/*
* list.h - List ADT description. */
/* Types
********/
/* handles */
DECLARE_HANDLE(HLIST); DECLARE_STANDARD_TYPES(HLIST);
DECLARE_HANDLE(HNODE); DECLARE_STANDARD_TYPES(HNODE);
/*
* sorted list node comparison callback function * * The first pointer is reference data and the second pointer is a list node * data element. */
typedef COMPARISONRESULT (*COMPARESORTEDNODESPROC)(PCVOID, PCVOID);
/*
* unsorted list node comparison callback function * * The first pointer is reference data and the second pointer is a list node * data element. */
typedef BOOL (*COMPAREUNSORTEDNODESPROC)(PCVOID, PCVOID);
/*
* WalkList() callback function - called as: * * bContinue = WalkList(pvNodeData, pvRefData); */
typedef BOOL (*WALKLIST)(PVOID, PVOID);
/* new list flags */
typedef enum _newlistflags { /* Insert nodes in sorted order. */
NL_FL_SORTED_ADD = 0x0001,
/* flag combinations */
ALL_NL_FLAGS = NL_FL_SORTED_ADD } NEWLISTFLAGS;
/* new list description */
typedef struct _newlist { DWORD dwFlags; } NEWLIST; DECLARE_STANDARD_TYPES(NEWLIST);
/* Prototypes
*************/
/* list.c */
extern BOOL CreateList(PCNEWLIST, PHLIST); extern void DestroyList(HLIST); extern BOOL AddNode(HLIST, COMPARESORTEDNODESPROC, PCVOID, PHNODE); extern BOOL InsertNodeAtFront(HLIST, COMPARESORTEDNODESPROC, PCVOID, PHNODE); extern BOOL InsertNodeBefore(HNODE, COMPARESORTEDNODESPROC, PCVOID, PHNODE); extern BOOL InsertNodeAfter(HNODE, COMPARESORTEDNODESPROC, PCVOID, PHNODE); extern void DeleteNode(HNODE); extern void DeleteAllNodes(HLIST); extern PVOID GetNodeData(HNODE); extern void SetNodeData(HNODE, PCVOID); extern ULONG GetNodeCount(HLIST); extern BOOL BreifcaseIsListEmpty(HLIST); extern BOOL GetFirstNode(HLIST, PHNODE); extern BOOL GetNextNode(HNODE, PHNODE); extern BOOL GetPrevNode(HNODE, PHNODE); extern void AppendList(HLIST, HLIST); extern BOOL SearchSortedList(HLIST, COMPARESORTEDNODESPROC, PCVOID, PHNODE); extern BOOL SearchUnsortedList(HLIST, COMPAREUNSORTEDNODESPROC, PCVOID, PHNODE); extern BOOL WalkList(HLIST, WALKLIST, PVOID);
#ifdef DEBUG
HLIST GetList(HNODE); #endif
/*
* hndtrans.h - Handle translation description. */
/* Types
********/
/* handles */
DECLARE_HANDLE(HHANDLETRANS); DECLARE_STANDARD_TYPES(HHANDLETRANS);
DECLARE_HANDLE(HGENERIC); DECLARE_STANDARD_TYPES(HGENERIC);
/* Prototypes
*************/
/* hndtrans.c */
extern BOOL CreateHandleTranslator(LONG, PHHANDLETRANS); extern void DestroyHandleTranslator(HHANDLETRANS); extern BOOL AddHandleToHandleTranslator(HHANDLETRANS, HGENERIC, HGENERIC); extern void PrepareForHandleTranslation(HHANDLETRANS); extern BOOL TranslateHandle(HHANDLETRANS, HGENERIC, PHGENERIC);
#ifdef DEBUG
extern BOOL IsValidHHANDLETRANS(HHANDLETRANS);
#endif
/*
* string.h - String table ADT description. */
/* Types
********/
/* handles */
DECLARE_HANDLE(HSTRING); DECLARE_STANDARD_TYPES(HSTRING); DECLARE_HANDLE(HSTRINGTABLE); DECLARE_STANDARD_TYPES(HSTRINGTABLE);
/* count of hash buckets in a string table */
typedef UINT HASHBUCKETCOUNT; DECLARE_STANDARD_TYPES(HASHBUCKETCOUNT);
/* string table hash function */
typedef HASHBUCKETCOUNT (*STRINGTABLEHASHFUNC)(LPCTSTR, HASHBUCKETCOUNT);
/* new string table */
typedef struct _newstringtable { HASHBUCKETCOUNT hbc; } NEWSTRINGTABLE; DECLARE_STANDARD_TYPES(NEWSTRINGTABLE);
/* Prototypes
*************/
/* string.c */
extern BOOL CreateStringTable(PCNEWSTRINGTABLE, PHSTRINGTABLE); extern void DestroyStringTable(HSTRINGTABLE); extern BOOL AddString(LPCTSTR pcsz, HSTRINGTABLE hst, STRINGTABLEHASHFUNC pfnHashFunc, PHSTRING phs); extern void DeleteString(HSTRING); extern void LockString(HSTRING); extern COMPARISONRESULT CompareStringsI(HSTRING, HSTRING); extern LPCTSTR GetBfcString(HSTRING);
extern BOOL IsValidHSTRING(HSTRING); extern BOOL IsValidHSTRINGTABLE(HSTRINGTABLE);
#ifdef DEBUG
extern ULONG GetStringCount(HSTRINGTABLE);
#endif
/*
* comc.h - Shared routines description. */
/* Prototypes
*************/
/* comc.c */
extern void CatPath(LPTSTR, LPCTSTR); extern COMPARISONRESULT MapIntToComparisonResult(int); extern void MyLStrCpyN(LPTSTR, LPCTSTR, int);
#ifdef DEBUG
extern BOOL IsStringContained(LPCTSTR, LPCTSTR);
#endif /* DEBUG */
#if defined(_SYNCENG_) || defined(_LINKINFO_)
extern void DeleteLastPathElement(LPTSTR); extern LONG GetDefaultRegKeyValue(HKEY, LPCTSTR, LPTSTR, PDWORD); extern BOOL StringCopy2(LPCTSTR, LPTSTR *); extern void CopyRootPath(LPCTSTR, LPTSTR); extern COMPARISONRESULT ComparePathStrings(LPCTSTR, LPCTSTR); extern BOOL MyStrChr(LPCTSTR, TCHAR, LPCTSTR *); extern BOOL PathExists(LPCTSTR); extern BOOL IsDrivePath(LPCTSTR);
extern BOOL IsValidDriveType(UINT); extern BOOL IsValidPathSuffix(LPCTSTR);
#ifdef DEBUG
extern BOOL IsRootPath(LPCTSTR); extern BOOL IsTrailingSlashCanonicalized(LPCTSTR); extern BOOL IsFullPath(LPCTSTR); extern BOOL IsCanonicalPath(LPCTSTR); extern BOOL IsValidCOMPARISONRESULT(COMPARISONRESULT);
#endif /* DEBUG */
#endif /* _SYNCENG_ || _LINKINFO_ */
/*
* util.h - Miscellaneous utility functions module description. */
/* Constants
************/
/* maximum length of buffer required by SeparatePath() */
#define MAX_SEPARATED_PATH_LEN (MAX_PATH_LEN + 1)
/* events for NotifyShell */
typedef enum _notifyshellevent { NSE_CREATE_ITEM, NSE_DELETE_ITEM, NSE_CREATE_FOLDER, NSE_DELETE_FOLDER, NSE_UPDATE_ITEM, NSE_UPDATE_FOLDER } NOTIFYSHELLEVENT; DECLARE_STANDARD_TYPES(NOTIFYSHELLEVENT);
/* Prototypes
*************/
/* util.c */
extern void NotifyShell(LPCTSTR, NOTIFYSHELLEVENT); extern COMPARISONRESULT ComparePathStringsByHandle(HSTRING, HSTRING); extern COMPARISONRESULT MyLStrCmpNI(LPCTSTR, LPCTSTR, int); extern void ComposePath(LPTSTR, LPCTSTR, LPCTSTR); extern LPCTSTR ExtractFileName(LPCTSTR); extern LPCTSTR ExtractExtension(LPCTSTR); extern HASHBUCKETCOUNT GetHashBucketIndex(LPCTSTR, HASHBUCKETCOUNT); extern COMPARISONRESULT MyCompareStrings(LPCTSTR, LPCTSTR, BOOL); extern BOOL RegKeyExists(HKEY, LPCTSTR); extern BOOL CopyLinkInfo(PCLINKINFO, PLINKINFO *);
extern BOOL IsValidPCLINKINFO(PCLINKINFO);
/*
* path.h - Path ADT module description. */
/* Types
********/
/* handles */
DECLARE_HANDLE(HPATHLIST); DECLARE_STANDARD_TYPES(HPATHLIST);
DECLARE_HANDLE(HPATH); DECLARE_STANDARD_TYPES(HPATH);
/* path results returned by AddPath() */
typedef enum _pathresult { PR_SUCCESS,
PR_UNAVAILABLE_VOLUME,
PR_OUT_OF_MEMORY,
PR_INVALID_PATH } PATHRESULT; DECLARE_STANDARD_TYPES(PATHRESULT);
/* Prototypes
*************/
/* path.c */
extern BOOL CreatePathList(DWORD, HWND, PHPATHLIST); extern void DestroyPathList(HPATHLIST); extern void InvalidatePathListInfo(HPATHLIST); extern void ClearPathListInfo(HPATHLIST); extern PATHRESULT AddPath(HPATHLIST, LPCTSTR, PHPATH); extern BOOL AddChildPath(HPATHLIST, HPATH, LPCTSTR, PHPATH); extern void DeletePath(HPATH); extern BOOL CopyPath(HPATH, HPATHLIST, PHPATH); extern void GetPathString(HPATH, LPTSTR); extern void GetPathRootString(HPATH, LPTSTR); extern void GetPathSuffixString(HPATH, LPTSTR); extern BOOL AllocatePathString(HPATH, LPTSTR *);
#ifdef DEBUG
extern LPCTSTR DebugGetPathString(HPATH); extern ULONG GetPathCount(HPATHLIST);
#endif
extern BOOL IsPathVolumeAvailable(HPATH); extern HVOLUMEID GetPathVolumeID(HPATH); extern BOOL MyIsPathOnVolume(LPCTSTR, HPATH); extern COMPARISONRESULT ComparePaths(HPATH, HPATH); extern COMPARISONRESULT ComparePathVolumes(HPATH, HPATH); extern BOOL IsPathPrefix(HPATH, HPATH); extern BOOL SubtreesIntersect(HPATH, HPATH); extern LPTSTR FindEndOfRootSpec(LPCTSTR, HPATH); extern COMPARISONRESULT ComparePointers(PCVOID, PCVOID); extern LPTSTR FindChildPathSuffix(HPATH, HPATH, LPTSTR); extern TWINRESULT TWINRESULTFromLastError(TWINRESULT); extern BOOL IsValidHPATH(HPATH); extern BOOL IsValidHVOLUMEID(HVOLUMEID);
extern BOOL IsValidHPATHLIST(HPATHLIST);
/*
* fcache.h - File cache ADT description. */
/* Types
********/
/* return code */
typedef enum _fcresult { FCR_SUCCESS, FCR_OUT_OF_MEMORY, FCR_OPEN_FAILED, FCR_CREATE_FAILED, FCR_WRITE_FAILED, FCR_FILE_LOCKED } FCRESULT; DECLARE_STANDARD_TYPES(FCRESULT);
/* handles */
#ifdef NOFCACHE
typedef HANDLE HCACHEDFILE; #else
DECLARE_HANDLE(HCACHEDFILE); #endif
DECLARE_STANDARD_TYPES(HCACHEDFILE);
/* cached file description */
typedef struct _cachedfile { LPCTSTR pcszPath;
DWORD dwcbDefaultCacheSize;
DWORD dwOpenMode;
DWORD dwSharingMode;
PSECURITY_ATTRIBUTES psa;
DWORD dwCreateMode;
DWORD dwAttrsAndFlags;
HANDLE hTemplateFile; } CACHEDFILE; DECLARE_STANDARD_TYPES(CACHEDFILE);
/* Prototypes
*************/
/* fcache.c */
extern FCRESULT CreateCachedFile(PCCACHEDFILE, PHCACHEDFILE); extern FCRESULT SetCachedFileCacheSize(HCACHEDFILE, DWORD); extern DWORD SeekInCachedFile(HCACHEDFILE, DWORD, DWORD); extern BOOL SetEndOfCachedFile(HCACHEDFILE); extern DWORD GetCachedFilePointerPosition(HCACHEDFILE); extern DWORD GetCachedFileSize(HCACHEDFILE); extern BOOL ReadFromCachedFile(HCACHEDFILE, PVOID, DWORD, PDWORD); extern BOOL WriteToCachedFile(HCACHEDFILE, PCVOID, DWORD, PDWORD); extern BOOL CommitCachedFile(HCACHEDFILE); extern HANDLE GetFileHandle(HCACHEDFILE); extern BOOL CloseCachedFile(HCACHEDFILE); extern HANDLE GetFileHandle(HCACHEDFILE);
extern BOOL IsValidHCACHEDFILE(HCACHEDFILE);
/*
* brfcase.h - Briefcase ADT description. */
/* Prototypes
*************/
/* brfcase.c */
#define BeginExclusiveBriefcaseAccess() TRUE
#define EndExclusiveBriefcaseAccess()
extern BOOL SetBriefcaseModuleIniSwitches(void); extern BOOL InitBriefcaseModule(void); extern void ExitBriefcaseModule(void); extern HSTRINGTABLE GetBriefcaseNameStringTable(HBRFCASE); extern HPTRARRAY GetBriefcaseTwinFamilyPtrArray(HBRFCASE); extern HPTRARRAY GetBriefcaseFolderPairPtrArray(HBRFCASE); extern HPATHLIST GetBriefcasePathList(HBRFCASE);
#ifdef DEBUG
extern BOOL BriefcaseAccessIsExclusive(void);
#endif
extern BOOL IsValidHBRFCASE(HBRFCASE);
/*
* twin.h - Twin ADT description. */
/* Types
********/
/*
* EnumTwins() callback function - called as: * * bContinue = EnumTwinsProc(htwin, pData); */
typedef BOOL (*ENUMTWINSPROC)(HTWIN, LPARAM);
/* Prototypes
*************/
/* twin.c */
extern COMPARISONRESULT CompareNameStrings(LPCTSTR, LPCTSTR); extern COMPARISONRESULT CompareNameStringsByHandle(HSTRING, HSTRING); extern TWINRESULT TranslatePATHRESULTToTWINRESULT(PATHRESULT); extern BOOL CreateTwinFamilyPtrArray(PHPTRARRAY); extern void DestroyTwinFamilyPtrArray(HPTRARRAY); extern HBRFCASE GetTwinBriefcase(HTWIN); extern BOOL FindObjectTwinInList(HLIST, HPATH, PHNODE); extern BOOL EnumTwins(HBRFCASE, ENUMTWINSPROC, LPARAM, PHTWIN); extern BOOL IsValidHTWIN(HTWIN); extern BOOL IsValidHTWINFAMILY(HTWINFAMILY); extern BOOL IsValidHOBJECTTWIN(HOBJECTTWIN);
/*
* foldtwin.h - Folder twin ADT description. */
/* Prototypes
*************/
/* foldtwin.c */
extern BOOL CreateFolderPairPtrArray(PHPTRARRAY); extern void DestroyFolderPairPtrArray(HPTRARRAY); extern TWINRESULT MyTranslateFolder(HBRFCASE, HPATH, HPATH); extern BOOL IsValidHFOLDERTWIN(HFOLDERTWIN);
/*
* db.c - Twin database module description. */
/* Types
********/
/* database header version numbers */
#define HEADER_MAJOR_VER (0x0001)
#define HEADER_MINOR_VER (0x0005)
/* old (but supported) version numbers */
#define HEADER_M8_MINOR_VER (0x0004)
typedef struct _dbversion { DWORD dwMajorVer; DWORD dwMinorVer; } DBVERSION; DECLARE_STANDARD_TYPES(DBVERSION);
/* Prototypes
*************/
/* db.c */
extern TWINRESULT WriteTwinDatabase(HCACHEDFILE, HBRFCASE); extern TWINRESULT ReadTwinDatabase(HBRFCASE, HCACHEDFILE); extern TWINRESULT WriteDBSegmentHeader(HCACHEDFILE, LONG, PCVOID, UINT); extern TWINRESULT TranslateFCRESULTToTWINRESULT(FCRESULT);
/* path.c */
extern TWINRESULT WritePathList(HCACHEDFILE, HPATHLIST); extern TWINRESULT ReadPathList(HCACHEDFILE, HPATHLIST, PHHANDLETRANS);
/* brfcase.c */
extern TWINRESULT WriteBriefcaseInfo(HCACHEDFILE, HBRFCASE); extern TWINRESULT ReadBriefcaseInfo(HCACHEDFILE, HBRFCASE, HHANDLETRANS);
/* string.c */
extern TWINRESULT WriteStringTable(HCACHEDFILE, HSTRINGTABLE); extern TWINRESULT ReadStringTable(HCACHEDFILE, HSTRINGTABLE, PHHANDLETRANS);
/* twin.c */
extern TWINRESULT WriteTwinFamilies(HCACHEDFILE, HPTRARRAY); extern TWINRESULT ReadTwinFamilies(HCACHEDFILE, HBRFCASE, PCDBVERSION, HHANDLETRANS, HHANDLETRANS);
/* foldtwin.c */
extern TWINRESULT WriteFolderPairList(HCACHEDFILE, HPTRARRAY); extern TWINRESULT ReadFolderPairList(HCACHEDFILE, HBRFCASE, HHANDLETRANS, HHANDLETRANS);
/*
* stub.h - Stub ADT description. */
/* Types
********/
/* stub types */
typedef enum _stubtype { ST_OBJECTTWIN,
ST_TWINFAMILY,
ST_FOLDERPAIR } STUBTYPE; DECLARE_STANDARD_TYPES(STUBTYPE);
/* stub flags */
typedef enum _stubflags { /* This stub was marked for deletion while it was locked. */
STUB_FL_UNLINKED = 0x0001,
/* This stub has already been used for some operation. */
STUB_FL_USED = 0x0002,
/*
* The file stamp of this object twin stub is valid. (Only used for object * twins to cache file stamp from folder twin expansion for RECNODE * creation.) */
STUB_FL_FILE_STAMP_VALID = 0x0004,
/*
* This twin family stub or folder twin stub is in the process of being * deleted. (Only used for twin families and folder twins.) */
STUB_FL_BEING_DELETED = 0x0008,
/*
* This folder twin stub is in the process of being translated. (Only used * for folder twins.) */
STUB_FL_BEING_TRANSLATED = 0x0010,
/*
* This object twin stub was explicitly added a an object twin through * AddObjectTwin(). (Only used for object twins.) */
STUB_FL_FROM_OBJECT_TWIN = 0x0100,
/*
* This object twin stub was not reconciled the last time its twin family * was reconciled, and some members of the twin family were known to have * changed. (Only used for object twins.) */
STUB_FL_NOT_RECONCILED = 0x0200,
/*
* The subtree of the root folder of this folder twin stub is to be included * in reconciliation. (Only used for folder twins.) */
STUB_FL_SUBTREE = 0x0400,
/*
* The object twins in this twin family are pending deletion because an * object twin was deleted, and no object twins have changed since that * object twins was deleted. This folder twin is pending deletion because * its folder root is last known deleted. (Only used for twin families and * folder twins.) */
STUB_FL_DELETION_PENDING = 0x0800,
/*
* The client indicated that this object twin should not be deleted. (Only * used for object twins.) */
STUB_FL_KEEP = 0x1000,
/* stub flag combinations */
ALL_STUB_FLAGS = (STUB_FL_UNLINKED | STUB_FL_USED | STUB_FL_FILE_STAMP_VALID | STUB_FL_BEING_DELETED | STUB_FL_BEING_TRANSLATED | STUB_FL_FROM_OBJECT_TWIN | STUB_FL_NOT_RECONCILED | STUB_FL_SUBTREE | STUB_FL_DELETION_PENDING | STUB_FL_KEEP),
ALL_OBJECT_TWIN_FLAGS = (STUB_FL_UNLINKED | STUB_FL_USED | STUB_FL_FILE_STAMP_VALID | STUB_FL_NOT_RECONCILED | STUB_FL_FROM_OBJECT_TWIN | STUB_FL_KEEP),
ALL_TWIN_FAMILY_FLAGS = (STUB_FL_UNLINKED | STUB_FL_USED | STUB_FL_BEING_DELETED | STUB_FL_DELETION_PENDING),
ALL_FOLDER_TWIN_FLAGS = (STUB_FL_UNLINKED | STUB_FL_USED | STUB_FL_BEING_DELETED | STUB_FL_BEING_TRANSLATED | STUB_FL_SUBTREE | STUB_FL_DELETION_PENDING),
/* bit mask used to save stub flags in briefcase database */
DB_STUB_FLAGS_MASK = 0xff00 } STUBFLAGS;
/*
* common stub - These fields must appear at the start of TWINFAMILY, * OBJECTTWIN, and FOLDERPAIR in the same order. */
typedef struct _stub { /* structure tag */
STUBTYPE st;
/* lock count */
ULONG ulcLock;
/* flags */
DWORD dwFlags; } STUB; DECLARE_STANDARD_TYPES(STUB);
/* object twin family */
typedef struct _twinfamily { /* common stub */
STUB stub;
/* handle to name string */
HSTRING hsName;
/* handle to list of object twins */
HLIST hlistObjectTwins;
/* handle to parent briefcase */
HBRFCASE hbr; } TWINFAMILY; DECLARE_STANDARD_TYPES(TWINFAMILY);
/* object twin */
typedef struct _objecttwin { /* common stub */
STUB stub;
/* handle to folder path */
HPATH hpath;
/* file stamp at last reconciliation time */
FILESTAMP fsLastRec;
/* pointer to parent twin family */
PTWINFAMILY ptfParent;
/* source folder twins count */
ULONG ulcSrcFolderTwins;
/*
* current file stamp, only valid if STUB_FL_FILE_STAMP_VALID is set in * stub's flags */
FILESTAMP fsCurrent; } OBJECTTWIN; DECLARE_STANDARD_TYPES(OBJECTTWIN);
/* folder pair data */
typedef struct _folderpairdata { /* handle to name of included objects - may contain wildcards */
HSTRING hsName;
/* attributes to match */
DWORD dwAttributes;
/* handle to parent briefcase */
HBRFCASE hbr; } FOLDERPAIRDATA; DECLARE_STANDARD_TYPES(FOLDERPAIRDATA);
/* folder pair */
typedef struct _folderpair { /* common stub */
STUB stub;
/* handle to folder path */
HPATH hpath;
/* pointer to folder pair data */
PFOLDERPAIRDATA pfpd;
/* pointer to other half of folder pair */
struct _folderpair *pfpOther; } FOLDERPAIR; DECLARE_STANDARD_TYPES(FOLDERPAIR);
/*
* EnumGeneratedObjectTwins() callback function * * Called as: * * bContinue = EnumGeneratedObjectTwinsProc(pot, pvRefData); */
typedef BOOL (*ENUMGENERATEDOBJECTTWINSPROC)(POBJECTTWIN, PVOID);
/*
* EnumGeneratingFolderTwins() callback function * * Called as: * * bContinue = EnumGeneratingFolderTwinsProc(pfp, pvRefData); */
typedef BOOL (*ENUMGENERATINGFOLDERTWINSPROC)(PFOLDERPAIR, PVOID);
/* Prototypes
*************/
/* stub.c */
extern void InitStub(PSTUB, STUBTYPE); extern TWINRESULT DestroyStub(PSTUB); extern void LockStub(PSTUB); extern void UnlockStub(PSTUB); extern DWORD GetStubFlags(PCSTUB); extern void SetStubFlag(PSTUB, DWORD); extern void ClearStubFlag(PSTUB, DWORD); extern BOOL IsStubFlagSet(PCSTUB, DWORD); extern BOOL IsStubFlagClear(PCSTUB, DWORD);
extern BOOL IsValidPCSTUB(PCSTUB);
/* twin.c */
extern BOOL FindObjectTwin(HBRFCASE, HPATH, LPCTSTR, PHNODE); extern BOOL CreateObjectTwin(PTWINFAMILY, HPATH, POBJECTTWIN *); extern TWINRESULT UnlinkObjectTwin(POBJECTTWIN); extern void DestroyObjectTwin(POBJECTTWIN); extern TWINRESULT UnlinkTwinFamily(PTWINFAMILY); extern void MarkTwinFamilyNeverReconciled(PTWINFAMILY); extern void MarkObjectTwinNeverReconciled(PVOID); extern void DestroyTwinFamily(PTWINFAMILY); extern void MarkTwinFamilyDeletionPending(PTWINFAMILY); extern void UnmarkTwinFamilyDeletionPending(PTWINFAMILY); extern BOOL IsTwinFamilyDeletionPending(PCTWINFAMILY); extern void ClearTwinFamilySrcFolderTwinCount(PTWINFAMILY); extern BOOL EnumObjectTwins(HBRFCASE, ENUMGENERATEDOBJECTTWINSPROC, PVOID); extern BOOL ApplyNewFolderTwinsToTwinFamilies(PCFOLDERPAIR); extern TWINRESULT TransplantObjectTwin(POBJECTTWIN, HPATH, HPATH); extern BOOL IsFolderObjectTwinName(LPCTSTR);
extern BOOL IsValidPCTWINFAMILY(PCTWINFAMILY); extern BOOL IsValidPCOBJECTTWIN(PCOBJECTTWIN);
/* foldtwin.c */
extern void LockFolderPair(PFOLDERPAIR); extern void UnlockFolderPair(PFOLDERPAIR); extern TWINRESULT UnlinkFolderPair(PFOLDERPAIR); extern void DestroyFolderPair(PFOLDERPAIR); extern BOOL ApplyNewObjectTwinsToFolderTwins(HLIST); extern BOOL BuildPathForMatchingObjectTwin(PCFOLDERPAIR, PCOBJECTTWIN, HPATHLIST, PHPATH); extern BOOL EnumGeneratedObjectTwins(PCFOLDERPAIR, ENUMGENERATEDOBJECTTWINSPROC, PVOID); extern BOOL EnumGeneratingFolderTwins(PCOBJECTTWIN, ENUMGENERATINGFOLDERTWINSPROC, PVOID, PULONG); extern BOOL FolderTwinGeneratesObjectTwin(PCFOLDERPAIR, HPATH, LPCTSTR);
extern BOOL IsValidPCFOLDERPAIR(PCFOLDERPAIR);
extern void RemoveObjectTwinFromAllFolderPairs(POBJECTTWIN);
/* expandft.c */
extern BOOL ClearStubFlagWrapper(PSTUB, PVOID); extern BOOL SetStubFlagWrapper(PSTUB, PVOID); extern TWINRESULT ExpandIntersectingFolderTwins(PFOLDERPAIR, CREATERECLISTPROC, LPARAM); extern TWINRESULT TryToGenerateObjectTwin(HBRFCASE, HPATH, LPCTSTR, PBOOL, POBJECTTWIN *);
/*
* volume.h - Volume ADT module description. */
/* Types
********/
/* handles */
DECLARE_HANDLE(HVOLUMELIST); DECLARE_STANDARD_TYPES(HVOLUMELIST);
DECLARE_HANDLE(HVOLUME); DECLARE_STANDARD_TYPES(HVOLUME);
/* volume results returned by AddVolume() */
typedef enum _volumeresult { VR_SUCCESS,
VR_UNAVAILABLE_VOLUME,
VR_OUT_OF_MEMORY,
VR_INVALID_PATH } VOLUMERESULT; DECLARE_STANDARD_TYPES(VOLUMERESULT);
/* Prototypes
*************/
/* volume.c */
extern BOOL CreateVolumeList(DWORD, HWND, PHVOLUMELIST); extern void DestroyVolumeList(HVOLUMELIST); extern void InvalidateVolumeListInfo(HVOLUMELIST); void ClearVolumeListInfo(HVOLUMELIST); extern VOLUMERESULT AddVolume(HVOLUMELIST, LPCTSTR, PHVOLUME, LPTSTR); extern void DeleteVolume(HVOLUME); extern COMPARISONRESULT CompareVolumes(HVOLUME, HVOLUME); extern BOOL CopyVolume(HVOLUME, HVOLUMELIST, PHVOLUME); extern BOOL IsVolumeAvailable(HVOLUME); extern void GetVolumeRootPath(HVOLUME, LPTSTR);
#ifdef DEBUG
extern LPTSTR DebugGetVolumeRootPath(HVOLUME, LPTSTR); extern ULONG GetVolumeCount(HVOLUMELIST);
#endif
extern void DescribeVolume(HVOLUME, PVOLUMEDESC); extern TWINRESULT WriteVolumeList(HCACHEDFILE, HVOLUMELIST); extern TWINRESULT ReadVolumeList(HCACHEDFILE, HVOLUMELIST, PHHANDLETRANS); extern BOOL IsValidHVOLUME(HVOLUME);
extern BOOL IsValidHVOLUMELIST(HVOLUMELIST);
/*
* sortsrch.c - Generic array sorting and searching description. */
/* Types
********/
/* array element comparison callback function */
typedef COMPARISONRESULT (*COMPARESORTEDELEMSPROC)(PCVOID, PCVOID);
/* Prototypes
*************/
/* sortsrch.c */
extern void HeapSort(PVOID, LONG, size_t, COMPARESORTEDELEMSPROC, PVOID); extern BOOL BinarySearch(PVOID, LONG, size_t, COMPARESORTEDELEMSPROC, PCVOID, PLONG);
#define WINSHELLAPI DECLSPEC_IMPORT
WINSHELLAPI BOOL SheShortenPathA(LPSTR pPath, BOOL bShorten); WINSHELLAPI BOOL SheShortenPathW(LPWSTR pPath, BOOL bShorten); #ifdef UNICODE
#define SheShortenPath SheShortenPathW
#else
#define SheShortenPath SheShortenPathA
#endif // !UNICODE
typedef struct { HPATHLIST PathList; HPATH Path; TCHAR PathString[MAX_PATH]; ULONG Max; ULONG Index; } BRFPATH_ENUM, *PBRFPATH_ENUM;
extern POOLHANDLE g_BrfcasePool;
BOOL EnumFirstBrfcasePath ( IN HBRFCASE Brfcase, OUT PBRFPATH_ENUM e );
BOOL EnumNextBrfcasePath ( IN OUT PBRFPATH_ENUM e );
BOOL ReplaceBrfcasePath ( IN PBRFPATH_ENUM PathEnum, IN PCTSTR NewPath );
|