windows-nt/Source/XPSP1/NT/printscan/print/spooler/localspl/filepool.hxx
2020-09-26 16:20:57 +08:00

260 lines
4.6 KiB
C++

/*++
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
);
//SetFileModes(
// BOOL Spool,
// DWORD Mode,
// DWORD ShareMode,
// DWORD Disp,
// DWORD Flags
// );
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
ChangeFilePoolBasePath(
HANDLE * FilePoolHandle,
LPCTSTR BasePath
);
HRESULT
DestroyFilePool(
HANDLE* FilePool,
BOOL DeleteFiles
);
BOOL
TrimPool(
HANDLE FilePoolHandle
);
HRESULT
ConvertFileExt(
PWSTR Filename,
PCWSTR ExtFrom,
PCWSTR ExtTo
);
// 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
}
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
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();
VOID GetNextFileNameNoAlloc(PWSTR Filename);
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);
};
#endif