diff options
Diffstat (limited to 'private/os2/os2ses/prtrqust.c')
-rw-r--r-- | private/os2/os2ses/prtrqust.c | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/private/os2/os2ses/prtrqust.c b/private/os2/os2ses/prtrqust.c new file mode 100644 index 000000000..1990255ad --- /dev/null +++ b/private/os2/os2ses/prtrqust.c @@ -0,0 +1,327 @@ +/*++ + +Copyright (c) 1989 Microsoft Corporation + +Module Name: + + prtrqust.c + +Abstract: + + This module contains the PRT request handler. + +Author: + + Michael Jarus (mjarus) 1-Oct-1992 + +Environment: + + User Mode Only + +Revision History: + +--*/ + +#define WIN32_ONLY +#include "os2ses.h" +#include "trans.h" +#include "event.h" +#include "os2win.h" +#include <stdio.h> +#include <string.h> +#include <memory.h> + + +/* DosOpen/DosQueryFHState/DosQueryFileInfo et al file attributes; also */ +/* known as Dos File Mode bits... */ + +#define FILE_READONLY 0x0001 +#define FILE_HIDDEN 0x0002 +#define FILE_SYSTEM 0x0004 +#define FILE_DIRECTORY 0x0010 +#define FILE_ARCHIVED 0x0020 + +#define ATTR_CHANGEABLE (FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED) +#define ATTR_ALL (FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED) +#define ATTR_NOT_NORM 0x8000 // do not find normal files + +/* DosOpen() actions */ + +#define FILE_EXISTED 0x0001 +#define FILE_CREATED 0x0002 +#define FILE_TRUNCATED 0x0003 + +/* DosOpen() open flags */ + +#define FILE_OPEN_EXISTING_FILE 0x0001 +#define FILE_TRUNCATE_EXISTING_FILE 0x0002 +#define FILE_CREATE_NEW_FILE 0x0010 +#define OPEN_ACTION_FAIL_IF_EXISTS 0x0000 /* ---- ---- ---- 0000 */ +#define OPEN_ACTION_OPEN_IF_EXISTS 0x0001 /* ---- ---- ---- 0001 */ +#define OPEN_ACTION_REPLACE_IF_EXISTS 0x0002 /* ---- ---- ---- 0010 */ +#define OPEN_ACTION_FAIL_IF_NEW 0x0000 /* ---- ---- 0000 ---- */ +#define OPEN_ACTION_CREATE_IF_NEW 0x0010 /* ---- ---- 0001 ---- */ + +/* DosOpen/DosSetFHState flags */ + +#define OPEN_ACCESS_READONLY 0x00000000 /* ---- ---- ---- -000 */ +#define OPEN_ACCESS_WRITEONLY 0x00000001 /* ---- ---- ---- -001 */ +#define OPEN_ACCESS_READWRITE 0x00000002 /* ---- ---- ---- -010 */ +#define OPEN_SHARE_DENYREADWRITE 0x00000010 /* ---- ---- -001 ---- */ +#define OPEN_SHARE_DENYWRITE 0x00000020 /* ---- ---- -010 ---- */ +#define OPEN_SHARE_DENYREAD 0x00000030 /* ---- ---- -011 ---- */ +#define OPEN_SHARE_DENYNONE 0x00000040 /* ---- ---- -100 ---- */ +#define OPEN_FLAGS_WRITE_THROUGH 0x00004000 /* -1-- ---- ---- ---- */ + +#define ACCESS_FLAGS (OPEN_ACCESS_READONLY | OPEN_ACCESS_WRITEONLY | \ + OPEN_ACCESS_READWRITE) +#define SHARE_FLAGS (OPEN_SHARE_DENYREADWRITE | OPEN_SHARE_DENYWRITE | \ + OPEN_SHARE_DENYREAD | OPEN_SHARE_DENYNONE) + +BOOL +ServePrtRequest(IN PPRTREQUEST PReq, + OUT PVOID PStatus) +{ + DWORD Rc = 0; + + switch (PReq->Request) + { + case PRTOpen: + Rc = Ow2PrintOpen( + PReq->d.Open.Attribute, + PReq->d.Open.OpenFlags, + PReq->d.Open.OpenMode, + PReq->d.Open.PrinterName, + &PReq->hPrinter, + &PReq->d.Open.Action + ); + break; + + case PRTClose: + Rc = Ow2PrintClose( + PReq->hPrinter + ); + break; + + case PRTWrite: + Rc = Ow2PrintWrite( + PReq->hPrinter, + PReq->d.Write.Offset, + &PReq->d.Write.Length + ); + break; + + default: + Rc = (DWORD)-1L; //STATUS_INVALID_PARAMETER; +#if DBG + IF_OD2_DEBUG( OS2_EXE ) + { + DbgPrint("OS2SES(VioRequest): Unknown Vio request = %X\n", + PReq->Request); + } +#endif + } + + if ( Rc == 1 ) + { + Rc = GetLastError(); /* BUGBUG! error code and returned Status are wrong */ + } + + *(PDWORD) PStatus = Rc; + + return(TRUE); // Continue +} + + +DWORD +Ow2PrintOpen( + IN ULONG Attribute, + IN ULONG OpenFlags, + IN ULONG OpenMode, + IN PUCHAR PrinterName, + IN OUT PHANDLE phPrinter, + IN OUT PULONG Action + ) +{ + DWORD Rc = 0, Access, Share = FILE_SHARE_READ | FILE_SHARE_WRITE; + DWORD Create = 0, Attr = FILE_ATTRIBUTE_NORMAL; + ULONG Os2Share; + + /* + * Set CreateFile.fdwAttribute from DosOpen.Attribute + */ + + if (Attribute && FILE_READONLY) + { + Attr |= FILE_ATTRIBUTE_READONLY; + } + if (Attribute && FILE_ARCHIVED) + { + Attr |= FILE_ATTRIBUTE_ARCHIVE; + } + if (Attribute && FILE_HIDDEN) + { + Attr |= FILE_ATTRIBUTE_HIDDEN; + } + if (Attribute && FILE_SYSTEM) + { + Attr |= FILE_ATTRIBUTE_SYSTEM; + } + + /* + * Set CreateFile.fdwCreate from DosOpen.OpenFlags + */ + + if (OpenFlags == OPEN_ACTION_CREATE_IF_NEW) + { + Create = CREATE_NEW; + } else if (OpenFlags == OPEN_ACTION_OPEN_IF_EXISTS) + { + Create = OPEN_EXISTING; + } else if (OpenFlags == OPEN_ACTION_REPLACE_IF_EXISTS) + { + Create = TRUNCATE_EXISTING; + } else if (OpenFlags == + (OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW)) + { + Create = OPEN_ALWAYS; + } else if (OpenFlags == + (OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS)) + { + Create = CREATE_ALWAYS; + } else + { +#if DBG + IF_OD2_DEBUG2( MISC, OS2_EXE ) + DbgPrint("OS2SES(PrtRequest-PrintOpen): illegal Create %lu\n", + Create); +#endif + return(ERROR_INVALID_PARAMETER); + } + + /* + * Set CreateFile.fdwShare from DosOpen.OpenMode + */ + + Os2Share = OpenMode && SHARE_FLAGS; + + if ((Os2Share == OPEN_SHARE_DENYWRITE) || + (Os2Share == OPEN_SHARE_DENYREADWRITE)) + { + Share &= ~FILE_SHARE_WRITE; + } + if ((Os2Share == OPEN_SHARE_DENYREAD) || + (Os2Share == OPEN_SHARE_DENYREADWRITE)) + { + Share &= ~FILE_SHARE_READ; + } + + /* + * Set CreateFile.fdwAccess from DosOpen.OpenMode + */ + + Os2Share = OpenMode && ACCESS_FLAGS; + + if ((OpenMode && ACCESS_FLAGS) == OPEN_ACCESS_WRITEONLY) + { + Access = GENERIC_WRITE; + } else if ((OpenMode && ACCESS_FLAGS) == OPEN_ACCESS_READONLY) + { + Access = GENERIC_READ; + } else if ((OpenMode && ACCESS_FLAGS) == OPEN_ACCESS_READWRITE) + { + Access = GENERIC_READ | GENERIC_WRITE; + } + + /* + * Set CreateFile.fdwAttribute.FILE_FLAG_WRITE_THROUGH + * from DosOpen.Attribute.OPEN_FLAGS_WRITE_THROUGH + */ + + if (OpenMode & OPEN_FLAGS_WRITE_THROUGH) + { + Attr |= FILE_FLAG_WRITE_THROUGH; + } + + *phPrinter = CreateFile( + PrinterName, + Access, + Share, + NULL, + Create, + Attr, + NULL + ); + + if (*phPrinter != NULL) + { + // BUGBUG: set Action + + *Action = FILE_EXISTED; + return(NO_ERROR); + } + if (Rc) + { + Rc = GetLastError(); +#if DBG + IF_OD2_DEBUG2( MISC, OS2_EXE ) + DbgPrint("OS2SES(PrtRequest-PrintOpen): Rc %lu\n", + Rc); +#endif + } + return(Rc); +} + + +DWORD +Ow2PrintClose( + IN HANDLE hPrinter + ) +{ + DWORD Rc; + + Rc = CloseHandle( + hPrinter + ); + + if (Rc) + { + Rc = GetLastError(); +#if DBG + IF_OD2_DEBUG2( MISC, OS2_EXE ) + DbgPrint("OS2SES(PrtRequest-PrintClose): Rc %lu\n", + Rc); +#endif + } + return(Rc); +} + + +DWORD +Ow2PrintWrite( + IN HANDLE hPrinter, + IN PVOID Buffer, + IN OUT PULONG Length + ) +{ + DWORD Rc; + + Rc = WriteFile( + hPrinter, + Buffer, + *Length, + Length, + NULL + ); + + if (Rc) + { + Rc = GetLastError(); +#if DBG + IF_OD2_DEBUG2( MISC, OS2_EXE ) + DbgPrint("OS2SES(PrtRequest-PrintWrite): Rc %lu\n", + Rc); +#endif + } + return(Rc); +} |