/*++ Copyright (c) 1990 - 2000 Microsoft Corporation Module Name: filepool.cxx Abstract: Contains the headers for handling Filepools for the Spooler. Contains the C++ object definitions and the C wrapper function headers. Author: Bryan Kilian (BryanKil) 5-Apr-1995 Revision History: --*/ #ifdef __cplusplus extern "C" { #endif #define FP_LARGE_SIZE 200*1024 // 200K HRESULT CreateFilePool( HANDLE * FilePoolHandle, LPCTSTR BasePath, LPCTSTR PreNumStr, LPCTSTR SplExt, LPCTSTR ShdExt, DWORD PoolTimeout, DWORD MaxFiles ); HRESULT GetFileItemHandle( HANDLE FilePoolHandle, HANDLE * FileItem, LPWSTR FromFilename ); HRESULT GetNameFromHandle( HANDLE FileItem, PWSTR * FileNameStr, BOOL IsSpool ); HANDLE GetCurrentWriter( HANDLE FileItem, BOOL IsSpool ); HRESULT GetWriterFromHandle( HANDLE FileItem, HANDLE * File, BOOL IsSpool ); HRESULT GetReaderFromHandle( HANDLE FileItem, HANDLE * File ); HRESULT FinishedReading( HANDLE FileItem ); HRESULT FinishedWriting( HANDLE FileItem, BOOL IsSpool ); HRESULT ReleasePoolHandle( HANDLE * FileItem ); HRESULT RemoveFromFilePool( HANDLE* FileItem, BOOL Delete ); VOID CloseFiles( HANDLE FileItem, BOOL CloseShad ); HRESULT ForceCloseJobPoolFiles( HANDLE FileItem ); VOID CloseFilesCheck( struct FileListItem *pItem, enum ECloseHandle eCloseHandle ); HRESULT ChangeFilePoolBasePath( HANDLE * FilePoolHandle, LPCTSTR BasePath ); HRESULT DestroyFilePool( HANDLE* FilePool, BOOL DeleteFiles ); BOOL TrimPool( HANDLE FilePoolHandle ); HRESULT ConvertFileExt( PWSTR Filename, PCWSTR ExtFrom, PCWSTR ExtTo ); typedef enum { kDontRecycle } EFileItemState; HRESULT SetFileItemState( IN HANDLE hFileItem, IN EFileItemState eState ); // Returns bitmap indicating which files needed to be opened. Bitmap reset when // the pool handle is released. // Indicates which files in the pool item needed creating. #define FP_SPL_READER_CREATED 0x00000001 #define FP_SPL_WRITER_CREATED 0x00000002 #define FP_SHD_CREATED 0x00000004 #define FP_ALL_FILES_CREATED (FP_SPL_READER_CREATED | \ FP_SPL_WRITER_CREATED | \ FP_SHD_CREATED) HRESULT GetFileCreationInfo( HANDLE FileItem, PDWORD BitMap ); #ifdef __cplusplus } enum ECloseHandle { kCloseWriteHandle, kCloseReadHandle, kCloseShdHandle }; struct Modes { DWORD Mode; DWORD Flags; DWORD ShareMode; DWORD Disp; }; struct FileListItem { struct FileListItem * FLNext; struct FileListItem * FLPrev; class FilePool * FP; VOID EnterCritSec(); VOID LeaveCritSec(); CRITICAL_SECTION CritSec; DWORD Status; DWORD TimeStamp; LPWSTR SplFilename; LPWSTR ShdFilename; HANDLE SplWriteHandle; HANDLE SplReadHandle; HANDLE ShdWriteHandle; // // Indicates whether or not the spool and/or shadow file was created for the // client of this pool item. // DWORD CreateInfo; }; #define FP_STATUS_SPL_WRITING 0x00000001 #define FP_STATUS_SPL_READING 0x00000002 #define FP_STATUS_SHD_WRITING 0x00000004 #define FP_STATUS_SPL_READ_CLOSED 0x00000008 #define FP_STATUS_SPL_WRITE_CLOSED 0x00000010 #define FP_STATUS_SHD_CLOSED 0x00000020 #define FP_STATUS_ITEM_DONT_RECYCLE 0x00000040 class FilePool { CRITICAL_SECTION FilePoolCritSec; struct FileListItem * FreeFiles; struct FileListItem * FileInUse; struct FileListItem * EndUsedFiles; struct FileListItem * EndFreeFiles; struct Modes SplModes; struct Modes ShdModes; LPWSTR FilePreNumStr; LPWSTR SplFileExt; LPWSTR ShdFileExt; DWORD CurrentNum; DWORD PoolTimeout; LONG MaxFiles; LONG FreeSize; LONG UsedSize; HRESULT InitFilePoolVars(); LPWSTR GetNextFileName(); HRESULT GetNextFileNameNoAlloc(PWSTR Filename, SIZE_T cchFilename); HRESULT CreatePoolFile(struct FileListItem ** Item, PWSTR Filename); public: BOOL DeleteEmptyFilesOnClose; LPWSTR FileBase; FilePool( DWORD PTimeout, DWORD MaxFreeFiles ); ~FilePool(); HRESULT AllocInit( LPCTSTR BasePath, LPCTSTR PreNumStr, LPCTSTR SplExt, LPCTSTR ShdExt ); HRESULT GetWriteFileStruct(struct FileListItem ** File, PWSTR Filename); HRESULT ReleasePoolHandle(struct FileListItem * File); HRESULT CreateSplReader(struct FileListItem * Item); HRESULT CreateSplWriter(struct FileListItem * Item); HRESULT CreateShdWriter(struct FileListItem * Item); HRESULT RemoveFromPool(struct FileListItem * File, BOOL Delete); BOOL TrimPool(VOID); VOID EnterCritSec(); VOID LeaveCritSec(); void* operator new(size_t n); void operator delete(void* p, size_t n); }; HRESULT FPSetFileItemState( IN FileListItem *pItem, IN EFileItemState eFileItemState ); #endif