Annotation of ntddk/src/print/winprint/winprint.c, revision 1.1

1.1     ! root        1: #include <windows.h>
        !             2: #include <winspool.h>
        !             3: #include <winsplp.h>
        !             4: 
        !             5: #include "winprint.h"
        !             6: 
        !             7: #include <excpt.h>
        !             8: #include <string.h>
        !             9: 
        !            10: #define PRINTPROCESSOR_TYPE_RAW     0
        !            11: #define PRINTPROCESSOR_TYPE_JOURNAL 1
        !            12: #define PRINTPROCESSOR_TYPE_TEXT    2
        !            13: #define PRINTPROCESSOR_TYPE_NUM     3
        !            14: 
        !            15: LPWSTR  Datatypes[]={L"RAW", L"NT JNL 1.000", L"TEXT", 0};
        !            16: 
        !            17: LPWSTR
        !            18: AllocStr(
        !            19:     LPWSTR  pString
        !            20: )
        !            21: {
        !            22:     LPWSTR  pNewString;
        !            23: 
        !            24:     if (pString) {
        !            25:         pNewString = LocalAlloc(LMEM_FIXED, (wcslen(pString)+1)*sizeof(WCHAR));
        !            26:         wcscpy(pNewString, pString);
        !            27:         return pNewString;
        !            28:     }
        !            29: 
        !            30:     return NULL;
        !            31: }
        !            32: 
        !            33: BOOL
        !            34: EnumPrintProcessorDatatypes(
        !            35:     LPWSTR  pName,
        !            36:     LPWSTR  pPrintProcessorName,
        !            37:     DWORD   Level,
        !            38:     LPBYTE  pDatatypes,
        !            39:     DWORD   cbBuf,
        !            40:     LPDWORD pcbNeeded,
        !            41:     LPDWORD pcReturned
        !            42: )
        !            43: {
        !            44:     DATATYPES_INFO_1    *pInfo1 = (DATATYPES_INFO_1 *)pDatatypes;
        !            45:     LPWSTR   *pMyDatatypes = Datatypes;
        !            46:     DWORD   cbTotal=0;
        !            47:     LPBYTE  pEnd;
        !            48: 
        !            49:     *pcReturned = 0;
        !            50: 
        !            51:     pEnd = (LPBYTE)pInfo1 + cbBuf;
        !            52: 
        !            53:     while (*pMyDatatypes) {
        !            54: 
        !            55:         cbTotal += wcslen(*pMyDatatypes)*sizeof(WCHAR) + sizeof(WCHAR) +
        !            56:                    sizeof(DATATYPES_INFO_1);
        !            57: 
        !            58:         pMyDatatypes++;
        !            59:     }
        !            60: 
        !            61:     *pcbNeeded = cbTotal;
        !            62: 
        !            63:     if (cbTotal <= cbBuf) {
        !            64: 
        !            65:         pMyDatatypes = Datatypes;
        !            66: 
        !            67:         while (*pMyDatatypes) {
        !            68: 
        !            69:             pEnd -= wcslen(*pMyDatatypes)*sizeof(WCHAR) + sizeof(WCHAR);
        !            70:             wcscpy((LPWSTR)pEnd, *pMyDatatypes);
        !            71:             pInfo1->pName = (LPWSTR)pEnd;
        !            72:             pInfo1++;
        !            73:             (*pcReturned)++;
        !            74: 
        !            75:             pMyDatatypes++;
        !            76:         }
        !            77: 
        !            78:     } else {
        !            79: 
        !            80:         SetLastError(ERROR_INSUFFICIENT_BUFFER);
        !            81:         return FALSE;
        !            82:     }
        !            83: 
        !            84:     return TRUE;
        !            85: }
        !            86: 
        !            87: HANDLE
        !            88: OpenPrintProcessor(
        !            89:     LPWSTR   pPrinterName,
        !            90:     PPRINTPROCESSOROPENDATA pPrintProcessorOpenData
        !            91: )
        !            92: {
        !            93:     PPRINTPROCESSORDATA pData;
        !            94:     LPWSTR   *pMyDatatypes=Datatypes;
        !            95:     DWORD   uDatatype=0;
        !            96:     HANDLE  hPrinter=0;
        !            97:     HDC     hDC;
        !            98: 
        !            99:     while (*pMyDatatypes && wcscmp(*pMyDatatypes,
        !           100:                                     pPrintProcessorOpenData->pDatatype)) {
        !           101:         pMyDatatypes++;
        !           102:         uDatatype++;
        !           103:     }
        !           104: 
        !           105:     switch (uDatatype) {
        !           106: 
        !           107:     case 0:
        !           108:         if (!OpenPrinter(pPrinterName, &hPrinter, NULL))
        !           109:             return FALSE;
        !           110:         break;
        !           111: 
        !           112:     case 1:
        !           113:         if (!(hDC = CreateDC(L"", pPrinterName, L"",
        !           114:                              pPrintProcessorOpenData->pDevMode)))
        !           115:             return FALSE;
        !           116:         break;
        !           117: 
        !           118:     default:
        !           119:         SetLastError(ERROR_INVALID_DATATYPE);
        !           120:         return FALSE;
        !           121:     }
        !           122: 
        !           123:     pData = (PPRINTPROCESSORDATA)LocalAlloc(LPTR, sizeof(PRINTPROCESSORDATA));
        !           124: 
        !           125:     pData->cb          = sizeof(PRINTPROCESSORDATA);
        !           126:     pData->signature   = PRINTPROCESSORDATA_SIGNATURE;
        !           127:     pData->JobId       = pPrintProcessorOpenData->JobId;
        !           128:     pData->hPrinter    = hPrinter;
        !           129:     pData->semPaused   = CreateEvent(NULL, FALSE, TRUE,NULL);
        !           130:     pData->uDatatype   = uDatatype;
        !           131:     pData->hDC         = hDC;
        !           132: 
        !           133:     pData->pPrinterName = AllocStr(pPrinterName);
        !           134:     pData->pDatatype = AllocStr(pPrintProcessorOpenData->pDatatype);
        !           135:     pData->pDocument = AllocStr(pPrintProcessorOpenData->pDocumentName);
        !           136:     pData->pParameters = AllocStr(pPrintProcessorOpenData->pParameters);
        !           137: 
        !           138:     return (HANDLE)pData;
        !           139: }
        !           140: 
        !           141: BOOL
        !           142: PrintDocumentOnPrintProcessor(
        !           143:     HANDLE  hPrintProcessor,
        !           144:     LPWSTR   pDocumentName
        !           145: )
        !           146: {
        !           147:     PPRINTPROCESSORDATA pData;
        !           148:     DOC_INFO_1 DocInfo;
        !           149:     DWORD   rc;
        !           150:     DWORD   NoRead, NoWritten;
        !           151:     HANDLE  hPrinter;
        !           152:     BYTE    Buffer[4096];
        !           153: 
        !           154:     if (!(pData = ValidateHandle(hPrintProcessor))) {
        !           155: 
        !           156:         SetLastError(ERROR_INVALID_HANDLE);
        !           157:         return FALSE;
        !           158:     }
        !           159: 
        !           160:     if (pData->uDatatype == 1) {
        !           161: 
        !           162:         try {
        !           163:                                              //!!! BUG BUG BUG - LPCWSTR
        !           164:             return GdiPlayJournal(pData->hDC, (LPCSTR)pDocumentName, 0, -1);
        !           165: 
        !           166:         } except (TRUE) {
        !           167: 
        !           168:             OutputDebugString(L"GdiPlayJournal gave an exception\n");
        !           169: 
        !           170:             return FALSE;
        !           171:         }
        !           172:     }
        !           173: 
        !           174:     if (!OpenPrinter(pDocumentName, &hPrinter, NULL)) {
        !           175:         return FALSE;
        !           176:     }
        !           177: 
        !           178:     DocInfo.pDocName = pData->pDocument;
        !           179:     DocInfo.pOutputFile = 0;
        !           180:     DocInfo.pDatatype = pData->pDatatype;
        !           181: 
        !           182:     if (!StartDocPrinter(pData->hPrinter, 1, (LPBYTE)&DocInfo)) {
        !           183:         ClosePrinter(hPrinter);
        !           184:         return FALSE;
        !           185:     }
        !           186: 
        !           187:     while ((rc = ReadPrinter(hPrinter, Buffer, sizeof(Buffer), &NoRead)) &&
        !           188:            NoRead) {
        !           189: 
        !           190:         if (pData->fsStatus & PRINTPROCESSOR_PAUSED)
        !           191:             WaitForSingleObject(pData->semPaused, INFINITE);
        !           192: 
        !           193:         if (pData->fsStatus & PRINTPROCESSOR_ABORTED) {
        !           194:             break;
        !           195:         }
        !           196: 
        !           197:         WritePrinter(pData->hPrinter, Buffer, NoRead, &NoWritten);
        !           198:     }
        !           199: 
        !           200:     EndDocPrinter(pData->hPrinter);
        !           201: 
        !           202:     ClosePrinter(hPrinter);
        !           203: 
        !           204:     return TRUE;
        !           205: }
        !           206: 
        !           207: BOOL
        !           208: ClosePrintProcessor(
        !           209:     HANDLE  hPrintProcessor
        !           210: )
        !           211: {
        !           212:     PPRINTPROCESSORDATA pData;
        !           213: 
        !           214:     pData = ValidateHandle(hPrintProcessor);
        !           215: 
        !           216:     if (!pData) {
        !           217:         SetLastError(ERROR_INVALID_HANDLE);
        !           218:         return FALSE;
        !           219:     }
        !           220: 
        !           221:     pData->signature = 0;
        !           222: 
        !           223:     /* Release any allocated resources */
        !           224: 
        !           225:     if (pData->hPrinter)
        !           226:         ClosePrinter(pData->hPrinter);
        !           227: 
        !           228:     if (pData->hDC)
        !           229:         DeleteDC(pData->hDC);
        !           230: 
        !           231:     CloseHandle(pData->semPaused);
        !           232: 
        !           233:     if (pData->pPrinterName)
        !           234:         LocalFree(pData->pPrinterName);
        !           235: 
        !           236:     if (pData->pDatatype)
        !           237:         LocalFree(pData->pDatatype);
        !           238: 
        !           239:     if (pData->pDocument)
        !           240:         LocalFree(pData->pDocument);
        !           241: 
        !           242:     if (pData->pParameters)
        !           243:         LocalFree(pData->pParameters);
        !           244: 
        !           245:     LocalFree(pData);
        !           246: 
        !           247:     return TRUE;
        !           248: }
        !           249: 
        !           250: BOOL
        !           251: ControlPrintProcessor(
        !           252:     HANDLE  hPrintProcessor,
        !           253:     DWORD   Command
        !           254: )
        !           255: {
        !           256:     PPRINTPROCESSORDATA pData;
        !           257: 
        !           258:     if (pData = ValidateHandle(hPrintProcessor)) {
        !           259: 
        !           260:         switch (Command) {
        !           261: 
        !           262:         case JOB_CONTROL_PAUSE:
        !           263: 
        !           264:             ResetEvent(pData->semPaused);
        !           265:             pData->fsStatus |= PRINTPROCESSOR_PAUSED;
        !           266:             return TRUE;
        !           267:             break;
        !           268: 
        !           269:         case JOB_CONTROL_CANCEL:
        !           270: 
        !           271:             pData->fsStatus |= PRINTPROCESSOR_ABORTED;
        !           272: 
        !           273:             if (pData->uDatatype == PRINTPROCESSOR_TYPE_JOURNAL)
        !           274:                 CancelDC(pData->hDC);
        !           275: 
        !           276:             /* fall through to release job if paused */
        !           277: 
        !           278:         case JOB_CONTROL_RESUME:
        !           279: 
        !           280:             if (pData->fsStatus & PRINTPROCESSOR_PAUSED) {
        !           281: 
        !           282:                 SetEvent(pData->semPaused);
        !           283:                 pData->fsStatus &= ~PRINTPROCESSOR_PAUSED;
        !           284:             }
        !           285: 
        !           286:             return TRUE;
        !           287:             break;
        !           288: 
        !           289:         default:
        !           290: 
        !           291:             return FALSE;
        !           292:             break;
        !           293:         }
        !           294: 
        !           295:     }
        !           296: 
        !           297:     return FALSE;
        !           298: }
        !           299: 
        !           300: BOOL
        !           301: InstallPrintProcessor(
        !           302:     HWND    hWnd
        !           303: )
        !           304: {
        !           305:     MessageBox(hWnd, L"WinPrint", L"Print Processor Setup", MB_OK);
        !           306: 
        !           307:     return TRUE;
        !           308: }
        !           309: 
        !           310: PPRINTPROCESSORDATA
        !           311: ValidateHandle(
        !           312:     HANDLE  hQProc
        !           313: )
        !           314: {
        !           315:     PPRINTPROCESSORDATA pData = (PPRINTPROCESSORDATA)hQProc;
        !           316: 
        !           317:     if (pData && pData->signature == PRINTPROCESSORDATA_SIGNATURE)
        !           318:         return( pData );
        !           319: 
        !           320:     return( NULL );
        !           321: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.