|
|
1.1 root 1: //--------------------------------------------------------------------------
2: //
3: // Module Name: PPD.C
4: //
5: // Brief Description: This module contains the PSCRIPT driver's PPD
6: // Compiler.
7: //
8: // Author: Kent Settle (kentse)
9: // Created: 20-Mar-1991
10: //
11: // Copyright (c) 1991 Microsoft Corporation
12: //
13: // This module contains routines which will take an Adobe PPD (printer
14: //--------------------------------------------------------------------------
15:
16: #include "string.h"
17: #include "pscript.h"
18: #include "pscrptui.h"
19:
20: #define TESTING 0
21:
22: // declarations of routines residing within this module.
23:
24: PNTPD UIGetNTPD(PWSTR);
25:
26: // external declarations.
27:
28: extern VOID InitNTPD(PNTPD);
29: extern VOID ParsePPD(PNTPD, PTMP_NTPD, PPARSEDATA);
30: extern VOID BuildNTPD(PNTPD, PTMP_NTPD);
31: extern DWORD SizeNTPD(PNTPD, PTMP_NTPD);
32:
33: extern TABLE_ENTRY KeywordTable[];
34: extern TABLE_ENTRY SecondKeyTable[];
35: extern TABLE_ENTRY FontTable[];
36:
37: //--------------------------------------------------------------------------
38: // PNTPD UIGetNTPD(pwstrPPDFile)
39: // PWSTR pwstrPPDFile;
40: //
41: // This is the routine which does all the work. It Parses the PPD file
42: // a line at a time, looking for keywords, then acting appropriately.
43: //
44: // Returns:
45: // This routine returns TRUE for success, FALSE otherwise.
46: //
47: // History:
48: // 04-Aug-1992 -by- Kent Settle (kentse)
49: // Integrated into driver, rather than stand alone exe.
50: // 22-Mar-1991 -by- Kent Settle (kentse)
51: // Wrote it.
52: //--------------------------------------------------------------------------
53:
54: PNTPD UIGetNTPD(pwstrPPDFile)
55: PWSTR pwstrPPDFile;
56: {
57: PNTPD pntpd, pstub;
58: PTMP_NTPD ptmp;
59: PPARSEDATA pdata;
60: NTPD ntpdStub;
61: DWORD dwSize;
62: #if DBG
63: UNALIGNED DWORD *pID;
64: #endif
65:
66: // allocate some memory to build the TMP_NTPD structure.
67:
68: if (!(ptmp = (PTMP_NTPD)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
69: sizeof(TMP_NTPD))))
70: {
71: RIP("PSCRPTUI!UIGetNTPD: GlobalAlloc for ptmp failed.\n");
72: return((PNTPD)NULL);
73: }
74:
75: // allocate some memory for parsing data structure.
76:
77: if (!(pdata = (PPARSEDATA)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
78: sizeof(PARSEDATA))))
79: {
80: RIP("PSCRPTUI!UIGetNTPD: GlobalAlloc for ptmp failed.\n");
81: return((PNTPD)NULL);
82: }
83:
84: // open PPD file for input.
85:
86: pdata->fEOF = FALSE;
87: pdata->hFile = CreateFile(pwstrPPDFile, GENERIC_READ,
88: FILE_SHARE_READ, NULL, OPEN_EXISTING,
89: FILE_ATTRIBUTE_NORMAL, NULL);
90:
91: if (pdata->hFile == INVALID_HANDLE_VALUE)
92: {
93: RIP("PSCRPTUI!UIGetNTPD: failed to open PPD file.\n");
94: return((PNTPD)NULL);
95: }
96:
97: // now parse the PPD file, building the TMP_NTPD structure.
98:
99: pstub = &ntpdStub;
100: memset(pstub, 0, sizeof(ntpdStub));
101:
102: InitNTPD(pstub);
103:
104: ParsePPD(pstub, ptmp, pdata);
105:
106: // we are done with the PPD file, so close it.
107:
108: CloseHandle(pdata->hFile);
109: GlobalFree((HGLOBAL)pdata);
110:
111: // find out how big the NTPD structure will be for this printer.
112:
113: if (!(dwSize = SizeNTPD(pstub, ptmp)))
114: {
115: GlobalFree((HGLOBAL)ptmp);
116: RIP("PSCRPTUI!UIGetNTPD: SizeNTPD failed.\n");
117: return((PNTPD)NULL);
118: }
119:
120: #if DBG
121: // attach our driver signature to the end of the NTPD structure, and
122: // make sure it does not get overwritten.
123:
124: dwSize += sizeof(DWORD);
125: #endif
126:
127: // allocate some memory to build the NTPD structure in.
128:
129: if (!(pntpd = (PNTPD)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, dwSize)))
130: {
131: GlobalFree((HGLOBAL)ptmp);
132: RIP("PSCRPTUI!UIGetNTPD: GlobalAlloc for pntpd failed.\n");
133: return((PNTPD)NULL);
134: }
135:
136: // ParsePPD will have filled in the NTPD stub structure, so copy
137: // it to the real NTPD structure, then call BuildNTPD to add to
138: // it.
139:
140: memcpy(pntpd, pstub, sizeof(ntpdStub));
141:
142: #if DBG
143: pID = (UNALIGNED DWORD *)((CHAR *)pntpd + pntpd->cjThis);
144:
145: *pID = DRIVER_ID;
146: #endif
147:
148: // now move data from the TMP_NTPD structure, into the more compact
149: // NTPD structure.
150:
151: BuildNTPD(pntpd, ptmp);
152:
153: #if DBG
154: // do a little sanity checking.
155:
156: pID = (UNALIGNED DWORD *)((CHAR *)pntpd + pntpd->cjThis);
157:
158: ASSERTPS((*pID != DRIVER_ID),
159: "PSCRPTUI!UIGetNTPD: NTPD structure overran buffer!!!\n");
160: #endif
161:
162: // free up temporary memory.
163:
164: GlobalFree((HGLOBAL)ptmp);
165:
166: return(pntpd); // success
167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.