/*++ 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 #include #include /* 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); }