//----------------------------------------------------------------------------- // This files contains the module name for this mini driver. Each mini driver // must have a unique module name. The module name is used to obtain the // module handle of this Mini Driver. The module handle is used by the // generic library to load in tables from the Mini Driver. //----------------------------------------------------------------------------- /*++ Copyright (c) 1996-1999 Microsoft Corporation Module Name: cmdcb.c Abstract: Implementation of GPD command callback for "test.gpd": OEMCommandCallback Environment: Windows NT Unidrv driver Revision History: // NOTICE-2002/3/11-takashim // 04/07/97 -zhanw- // Created it. --*/ #include "pdev.h" ////////////////////////////////////////////////////////////////////////// // Function: BInitOEMExtraData // // Description: Initializes OEM Extra data. // // // Parameters: // // pOEMExtra Pointer to a OEM Extra data. // // dwSize Size of OEM extra data. // // // Returns: TRUE if successful; FALSE otherwise. // // // Comments: // // // History: // NOTICE-2002/3/11-takashim // // 02/11/97 APresley Created. // ////////////////////////////////////////////////////////////////////////// BOOL BInitOEMExtraData(POEMUD_EXTRADATA pOEMExtra) { // Initialize OEM Extra data. pOEMExtra->dmExtraHdr.dwSize = sizeof(OEMUD_EXTRADATA); pOEMExtra->dmExtraHdr.dwSignature = OEM_SIGNATURE; pOEMExtra->dmExtraHdr.dwVersion = OEM_VERSION; return TRUE; } ////////////////////////////////////////////////////////////////////////// // Function: BMergeOEMExtraData // // Description: Validates and merges OEM Extra data. // // // Parameters: // // pdmIn pointer to an input OEM private devmode containing the settings // to be validated and merged. Its size is current. // // pdmOut pointer to the output OEM private devmode containing the // default settings. // // // Returns: TRUE if valid; FALSE otherwise. // // // Comments: // // // History: // NOTICE-2002/3/11-takashim // // 02/11/97 APresley Created. // // 04/08/97 ZhanW Modified the interface // ////////////////////////////////////////////////////////////////////////// BOOL BMergeOEMExtraData( POEMUD_EXTRADATA pdmIn, POEMUD_EXTRADATA pdmOut ) { if(pdmIn) { // // copy over the private fields, if they are valid // } return TRUE; } #define MINJOBLEN 48 #define MAX_NAMELEN 31 #define WRITESPOOLBUF(p, s, n) \ ((p)->pDrvProcs->DrvWriteSpoolBuf(p, s, n)) // // Command callback ID's // // Do not reorder the following CMD_BARCODEPOS_X group. #define CMD_BARCODEPOS_0 100 #define CMD_BARCODEPOS_1 101 #define CMD_BARCODEPOS_2 102 #define CMD_BARCODEPOS_3 103 #define CMD_BARCODEPOS_4 104 #define CMD_BARCODEPOS_5 105 #define CMD_BARCODEPOS_6 106 #define CMD_BARCODEPOS_7 107 #define CMD_BARCODEPOS_8 108 // SECURITY:#553895: Mandatory changes (e.g. strsafe.h) /* * OEMCommandCallback */ INT APIENTRY OEMCommandCallback( PDEVOBJ pdevobj, DWORD dwCmdCbID, DWORD dwCount, PDWORD pdwParams ) { INT iRet = 0; INT iBCID; INT iDocument; INT iDocuTemp; INT iUserName; INT iUserTemp; DWORD cbNeeded = 0; DWORD cReturned = 0; DWORD CmdSize; PBYTE pCmd = NULL; PBYTE pDocument = NULL; PBYTE pUserName = NULL; PBYTE pTemp, pNext, pEnd; PJOB_INFO_1 pJobInfo = NULL; FILETIME ft, lft; SYSTEMTIME st; BYTE ch[MINJOBLEN]; PBYTE pch; VERBOSE(("OEMCommandCallback entry - %d, %d\r\n", dwCmdCbID, dwCount)); ASSERT(VALID_PDEVOBJ(pdevobj)); switch (dwCmdCbID) { case CMD_BARCODEPOS_0: case CMD_BARCODEPOS_1: case CMD_BARCODEPOS_2: case CMD_BARCODEPOS_3: case CMD_BARCODEPOS_4: case CMD_BARCODEPOS_5: case CMD_BARCODEPOS_6: case CMD_BARCODEPOS_7: case CMD_BARCODEPOS_8: iBCID = (dwCmdCbID - CMD_BARCODEPOS_0); // // Get the first JOB info // if (0 != EnumJobs(pdevobj->hPrinter, 0, 1, 1, NULL, 0, &cbNeeded, &cReturned) || ERROR_INSUFFICIENT_BUFFER != GetLastError() || 0 == cbNeeded) { goto out; } if ((pJobInfo = (PJOB_INFO_1)MemAlloc(cbNeeded)) == NULL) goto out; if (!EnumJobs(pdevobj->hPrinter, 0, 1, 1, (LPBYTE)pJobInfo, cbNeeded, &cbNeeded, &cReturned)) goto out; // Convert to multi-byte iDocument = WideCharToMultiByte(CP_ACP, 0, pJobInfo->pDocument, -1, NULL, 0, NULL, NULL); if (!iDocument) goto out; if ((pDocument = (PBYTE)MemAlloc(iDocument)) == NULL) goto out; if (!WideCharToMultiByte(CP_ACP, 0, pJobInfo->pDocument, -1, pDocument, iDocument, NULL, NULL)) goto out; pTemp = pDocument; pEnd = &pDocument[min(iDocument - 1, MAX_NAMELEN)]; while (*pTemp) { // Make sure it is the same context as WideCharTo... pNext = CharNextExA(CP_ACP, pTemp, 0); if (pNext > pEnd) break; pTemp = pNext; } iDocument = (INT)(pTemp - pDocument); pDocument[iDocument] = '\0'; // Convert to multi-byte iUserName = WideCharToMultiByte(CP_ACP, 0, pJobInfo->pUserName, -1, NULL, 0, NULL, NULL); if (!iUserName) goto out; if ((pUserName = (PBYTE)MemAlloc(iUserName)) == NULL) goto out; if (!WideCharToMultiByte(CP_ACP, 0, pJobInfo->pUserName, -1, pUserName, iUserName, NULL, NULL)) goto out; pTemp = pUserName; pEnd = &pUserName[min(iUserName - 1, MAX_NAMELEN)]; while (*pTemp) { // Make sure it is the same context as WideCharTo... pNext = CharNextExA(CP_ACP, pTemp, 0); if (pNext > pEnd) break; pTemp = pNext; } iUserName = (INT)(pTemp - pUserName); pUserName[iUserName] = '\0'; // Convert to local time if (!SystemTimeToFileTime(&pJobInfo->Submitted, &ft) || !FileTimeToLocalFileTime(&ft, &lft) || !FileTimeToSystemTime(&lft, &st)) { goto out; } // Output commands CmdSize = 10 + // barcode position and share iDocument + // document name iUserName + // user name 16 + // Date & Time 32; // Other characters if ((pCmd = (PBYTE)MemAlloc(CmdSize)) == NULL) goto out; if (FAILED(StringCchPrintfExA(pCmd, CmdSize, &pch, NULL, 0, "%d,0,\"%s\",\"%s\",\"%4d/%02d/%02d %02d:%02d\";EXIT;", iBCID, pDocument, pUserName, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute))) goto out; WRITESPOOLBUF(pdevobj, pCmd, (DWORD)(pch - pCmd)); goto done; out: if (FAILED(StringCchPrintfExA(ch, sizeof ch, &pch, NULL, 0, "%d,0,\"Windows2000\",\"Kyocera\",\"\";EXIT;", iBCID))) goto done; WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch - ch)); done: if (pCmd) MemFree(pCmd); if (pUserName) MemFree(pUserName); if (pDocument) MemFree(pDocument); if (pJobInfo) MemFree(pJobInfo); break; } return iRet; }