Annotation of ntddk/src/print/pscrptui/fontinst.c, revision 1.1.1.1

1.1       root        1: //--------------------------------------------------------------------------
                      2: //
                      3: // Module Name:  FONTINST.C
                      4: //
                      5: // Brief Description:  This module contains the PostScript font installer
                      6: // for Windows NT, and supporting routines.
                      7: //
                      8: // Author:  Kent Settle (kentse)
                      9: // Created: 09-Jan-1992
                     10: //
                     11: // Copyright (c) 1991-1992 Microsoft Corporation
                     12: //--------------------------------------------------------------------------
                     13: 
                     14: #include <stddef.h>
                     15: #include <stdlib.h>
                     16: #include <string.h>
                     17: #include "pscript.h"
                     18: #include <winspool.h>
                     19: #include "dlgdefs.h"
                     20: #include "pscrptui.h"
                     21: #include "help.h"
                     22: 
                     23: extern PVOID MapFile(PWSTR);
                     24: extern BOOL CreatePFMFromAFM(PWSTR, PWSTR);
                     25: extern LPWSTR GetDriverDirectory(HANDLE);
                     26: 
                     27: // declarations of routines defined within this module.
                     28: 
                     29: BOOL InsertInstalledFont(HWND, PWSTR);
                     30: BOOL InsertNewFont(HWND, PWSTR);
                     31: PSTR LocateKeyword(PSTR, PSTR);
                     32: BOOL ExtractFullName(PSTR, PSTR);
                     33: BOOL ExtractFontName(PSZ, PSZ);
                     34: BOOL PFBToPFA(PWSTR, PWSTR);
                     35: BOOL LocateFile(HWND, PWSTR, int, WIN32_FIND_DATA *, HANDLE *);
                     36: 
                     37: // global Data
                     38: 
                     39: WCHAR   wstrFontInstDir[MAX_PATH];
                     40: DWORD   cInstalledFonts, cNewFonts;
                     41: 
                     42: 
                     43: //--------------------------------------------------------------------------
                     44: // BOOL APIENTRY FontInstDlgProc (HWND hwnd, UINT message, DWORD wParam,
                     45: //                             LONG lParam)
                     46: //
                     47: // This function processes messages for the "About" dialog box.
                     48: //
                     49: // Returns:
                     50: //   This function returns TRUE if successful, FALSE otherwise.
                     51: //
                     52: // History:
                     53: //   06-Dec-1991        -by-    Kent Settle     (kentse)
                     54: //  Wrote it.
                     55: //--------------------------------------------------------------------------
                     56: 
                     57: LONG APIENTRY FontInstDlgProc (HWND hwnd, UINT message, DWORD wParam,
                     58:                             LONG lParam)
                     59: {
                     60:     WCHAR               wcbuf[MAX_PATH], wcbuftmp[MAX_PATH];
                     61:     WCHAR               wstringbuf[512];
                     62:     HANDLE              hFile;
                     63:     WIN32_FIND_DATA     FileFindData;
                     64:     PRINTDATA          *pdata;
                     65:     DWORD               cwBuf, i;
                     66:     PWSTR               pwstrPath;
                     67:     HCURSOR             hCursor;
                     68:     BOOL                bFound;
                     69:     DWORD               cToAdd, cToDelete, cSave;
                     70:     int                *pEntries, *pSave;
                     71:     int                 iSelect;
                     72:     LONG                index;
                     73:     PWSTR               pwstrPFAFile;
                     74:     PWSTR               pwstrPFBFile;
                     75:     PWSTR               pwstrAFMFile;
                     76:     PWSTR               pwstrPFMFile;
                     77:     PWSTR               pwstrSave;
                     78:     BOOL                bAllAFMs;
                     79:     BYTE               *pjbitarray;
                     80:     LPWSTR              pDriverDirectory;
                     81: 
                     82: 
                     83:     UNREFERENCED_PARAMETER (lParam);
                     84: 
                     85:     switch (message)
                     86:     {
                     87:         case WM_INITDIALOG:
                     88:             // fill in the default source for new softfonts.
                     89: 
                     90:             SendDlgItemMessage (hwnd, IDD_NEW_FONT_DIR_EDIT_BOX, EM_LIMITTEXT,
                     91:                                 MAX_PATH, 0);
                     92:             LoadString(hModule, (IDS_DEFAULT_FONT_DIR + STRING_BASE),
                     93:                        wstringbuf, (sizeof(wstringbuf) / 2));
                     94:             SetDlgItemText(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX, wstringbuf);
                     95: 
                     96:             // reset the content of the new soft fonts and the installed
                     97:             // soft fonts list boxes.
                     98: 
                     99:             SendDlgItemMessage (hwnd, IDD_NEW_FONT_LIST_BOX, LB_RESETCONTENT,
                    100:                                 0, 0);
                    101:             SendDlgItemMessage (hwnd, IDD_INSTALLED_LIST_BOX, LB_RESETCONTENT,
                    102:                                 0, 0);
                    103: 
                    104:             // call the spooler to get the fully qualified path to search
                    105:             // for installed fonts.
                    106: 
                    107:             pdata = (PRINTDATA *)lParam;
                    108: 
                    109:             // save the PRINTDATA.
                    110: 
                    111:             SetWindowLong(hwnd, GWL_USERDATA, lParam);
                    112: 
                    113:             // copy the fully qualified path name of the data file into
                    114:             // local buffer.  extract the directory name, as this is the
                    115:             // same directory font files will go into.
                    116: 
                    117:             if (!(pDriverDirectory = GetDriverDirectory(pdata->hPrinter)))
                    118:             {
                    119:                 RIP("PSCRPTUI!FontInstDialogProc: GetDriverDirectory failed.\n");
                    120:                 return(FALSE);
                    121:             }
                    122: 
                    123:             wcsncpy(wcbuf, pDriverDirectory, (sizeof(wcbuf) / sizeof(WCHAR)));
                    124: 
                    125:             LocalFree(pDriverDirectory);
                    126: 
                    127:             // add a backslash to the end of the subdirectory.
                    128: 
                    129:             pwstrPath = wcbuf;
                    130:             pwstrPath += wcslen(wcbuf);
                    131: 
                    132:             *pwstrPath++ = '\\';
                    133:             *pwstrPath = '\0';
                    134: 
                    135:             // save a copy of the data file subdirectory for later use.
                    136: 
                    137:             wcsncpy(wstrFontInstDir, wcbuf, (sizeof(wstrFontInstDir) /
                    138:                                              sizeof(WCHAR)));
                    139: 
                    140:             // append *.PFM to qualified path.
                    141: 
                    142:             LoadString(hModule, (IDS_ALL_PFM_FILES + STRING_BASE),
                    143:                        wstringbuf, (sizeof(wstringbuf) / sizeof(WCHAR)));
                    144: 
                    145:             cwBuf = wcslen(wstrFontInstDir);
                    146: 
                    147:             wcsncat(wcbuf, wstringbuf, (sizeof(wcbuf) / sizeof(WCHAR)) - cwBuf);
                    148: 
                    149:             // see if there are any installed fonts.
                    150: 
                    151:             cInstalledFonts = 0;
                    152:             cNewFonts = 0;
                    153: 
                    154:             hFile = FindFirstFile(wcbuf, &FileFindData);
                    155: 
                    156:             if (hFile != (HANDLE)-1)
                    157:             {
                    158:                 // we have at least one installed font.  search for all the
                    159:                 // font files, inserting them into the list box.
                    160:                 // this could take a while, so set the cursor to the hourglass.
                    161: 
                    162:                 hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    163: 
                    164:                 // we could be putting several entries into the list box,
                    165:                 // and it would look bad to redraw after each one, so turn
                    166:                 // off redrawing until we are done.
                    167: 
                    168:                 SendMessage(hwnd, WM_SETREDRAW, FALSE, 0L);
                    169: 
                    170:                 // insert each font name found into the installed fonts
                    171:                 // list box.
                    172: 
                    173:                 bFound = TRUE;
                    174: 
                    175:                 while(bFound)
                    176:                 {
                    177:                     // create the fully qualified path name of the .PFA file to open.
                    178: 
                    179:                     wcsncpy(wcbuf, wstrFontInstDir, (sizeof(wcbuf) / 2));
                    180:                     wcsncat(wcbuf, (PWSTR)FileFindData.cFileName,
                    181:                             (sizeof(wcbuf) / 2) - cwBuf);
                    182: 
                    183:                     // put exception handling around this in case the network
                    184:                     // goes down in the middle of this.
                    185: 
                    186:                     try
                    187:                     {
                    188:                         InsertInstalledFont(hwnd, wcbuf);
                    189:                     }
                    190:                     except (EXCEPTION_EXECUTE_HANDLER)
                    191:                     {
                    192:                         LoadString(hModule,
                    193:                                    (IDS_NETWORK_GONE + STRING_BASE),
                    194:                                    wstringbuf, (sizeof(wstringbuf) / 2));
                    195: 
                    196:                         MessageBox(hwnd, wstringbuf, NULL, MB_ICONSTOP | MB_OK);
                    197: 
                    198:                         return (FALSE);
                    199:                     }
                    200: 
                    201:                     cInstalledFonts++;
                    202: 
                    203:                     bFound = FindNextFile(hFile, &FileFindData);
                    204:                 }
                    205: 
                    206:                 // now that we are done, turn on redrawing.
                    207: 
                    208:                 SendMessage (hwnd, WM_SETREDRAW, TRUE, 0L);
                    209:                 InvalidateRect (hwnd, NULL, TRUE);
                    210: 
                    211:                 // reset the cursor shape to what is was.
                    212: 
                    213:                 SetCursor(hCursor);
                    214:             }
                    215: 
                    216:             if ((hFile == (HANDLE)-1) || (cInstalledFonts == 0))
                    217:             {
                    218:                 // there are no installed soft fonts.
                    219: 
                    220:                 LoadString(hModule, (IDS_NO_INSTALLED + STRING_BASE),
                    221:                            wstringbuf, (sizeof(wstringbuf) / 2));
                    222: 
                    223:                 SendDlgItemMessage (hwnd, IDD_INSTALLED_LIST_BOX, LB_ADDSTRING,
                    224:                                     0, (LONG)wstringbuf);
                    225:             }
                    226: 
                    227:             // disable the delete pushbutton.
                    228: 
                    229:             EnableWindow(GetDlgItem(hwnd, IDD_DELETE_BUTTON), FALSE);
                    230: 
                    231:             // free up file finding resources.
                    232: 
                    233:             FindClose(hFile);
                    234: 
                    235:             // disable the add pushbutton until someone actually has
                    236:             // opened some font files.
                    237: 
                    238:             EnableWindow(GetDlgItem(hwnd, IDD_ADD_BUTTON), FALSE);
                    239: 
                    240:             // intialize the help stuff.
                    241: 
                    242:             vHelpInit();
                    243: 
                    244:             // disable some stuff if the user does not have
                    245:             // permission to change anything.
                    246: 
                    247:             if (!pdata->bPermission)
                    248:             {
                    249:                 EnableWindow(GetDlgItem(hwnd, IDD_OPEN_BUTTON), FALSE);
                    250:                 EnableWindow(GetDlgItem(hwnd, IDD_NEW_FONT_LIST_BOX), FALSE);
                    251:                 EnableWindow(GetDlgItem(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX), FALSE);
                    252:             }
                    253: 
                    254:             return (TRUE);
                    255: 
                    256:         case WM_COMMAND:
                    257:             pdata = (PRINTDATA *)GetWindowLong(hwnd, GWL_USERDATA);
                    258: 
                    259:             switch (LOWORD(wParam))
                    260:             {
                    261:                 case IDD_OPEN_BUTTON:
                    262:                     // this could take a while, so set the cursor to the hourglass.
                    263: 
                    264:                     hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    265: 
                    266:                     // get the supposed path to the new soft fonts provided
                    267:                     // by the user.
                    268: 
                    269:                     cwBuf = GetDlgItemText(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX,
                    270:                                            wcbuf, (sizeof(wcbuf) / 2));
                    271: 
                    272:                     // check to see if it has trailing backslash, and add
                    273:                     // it if not.
                    274: 
                    275:                     pwstrPath = wcbuf + cwBuf - 1;
                    276: 
                    277:                     if (*pwstrPath != '\\')
                    278:                     {
                    279:                         pwstrPath++;
                    280:                         *pwstrPath = '\\';
                    281:                         cwBuf++;
                    282:                     }
                    283: 
                    284:                     pwstrPath++;
                    285:                     *pwstrPath = '\0';
                    286: 
                    287:                     // save a copy of the path to the source for later use.
                    288: 
                    289:                     wcsncpy(wcbuftmp, wcbuf, (sizeof(wcbuftmp) / 2));
                    290: 
                    291:                     // now that we have the source directory, concat "*.PFB"
                    292:                     // to it.
                    293: 
                    294:                     LoadString(hModule, (IDS_ALL_PFB_FILES + STRING_BASE),
                    295:                                wstringbuf, (sizeof(wstringbuf) / 2));
                    296: 
                    297:                     wcsncat(wcbuf, wstringbuf, (sizeof(wcbuf) / 2) - cwBuf);
                    298: 
                    299:                     // find the .PFB files.
                    300: 
                    301:                     if (!LocateFile(hwnd, wcbuf, IDS_PFB_NOT_FOUND,
                    302:                                     &FileFindData, &hFile))
                    303:                     {
                    304:                         SetCursor(hCursor);
                    305:                         return(FALSE);
                    306:                     }
                    307: 
                    308:                     // we could be putting several entries into the list box,
                    309:                     // and it would look bad to redraw after each one, so turn
                    310:                     // off redrawing until we are done.
                    311: 
                    312:                     SendMessage(hwnd, WM_SETREDRAW, FALSE, 0L);
                    313: 
                    314:                     bFound = TRUE;
                    315: 
                    316:                     cwBuf = wcslen(wcbuftmp);
                    317: 
                    318:                     while(bFound)
                    319:                     {
                    320:                         // create the fully qualified path name of the .PFB file to open.
                    321: 
                    322:                         wcsncpy(wcbuf, wcbuftmp, (sizeof(wcbuf) / 2));
                    323:                         wcsncat(wcbuf, (PWSTR)FileFindData.cFileName,
                    324:                                 (sizeof(wcbuf) / 2) - cwBuf);
                    325: 
                    326:                         InsertNewFont(hwnd, wcbuf);
                    327:                         cNewFonts++;
                    328: 
                    329:                         bFound = FindNextFile(hFile, &FileFindData);
                    330:                     }
                    331: 
                    332:                     // free up file finding resources.
                    333: 
                    334:                     FindClose(hFile);
                    335: 
                    336:                     // reset the cursor shape to what it was.
                    337: 
                    338:                     SetCursor(hCursor);
                    339: 
                    340:                     // now that we are done, turn on redrawing.
                    341: 
                    342:                     SendMessage (hwnd, WM_SETREDRAW, TRUE, 0L);
                    343:                     InvalidateRect (hwnd, NULL, TRUE);
                    344: 
                    345:                     return(TRUE);
                    346: 
                    347:                 case IDD_ADD_BUTTON:
                    348:                     // first see how many entries have been selected in
                    349:                     // the new fonts list box.
                    350: 
                    351:                     cToAdd = SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                    352:                                                 LB_GETSELCOUNT, 0, 0);
                    353: 
                    354:                     // nothing to do if no entries selected.
                    355: 
                    356:                     if (cToAdd == 0)
                    357:                         return(TRUE);   //!!! maybe a message box? - kentse.
                    358: 
                    359:                     // first find the .PFB files.
                    360: 
                    361:                     // get the supposed path to the new soft fonts provided
                    362:                     // by the user.
                    363: 
                    364:                     cwBuf = GetDlgItemText(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX,
                    365:                                            wcbuf, (sizeof(wcbuf) / 2));
                    366: 
                    367:                     // check to see if it has trailing backslash, and add
                    368:                     // it if not.
                    369: 
                    370:                     pwstrPath = wcbuf + cwBuf - 1;
                    371: 
                    372:                     if (*pwstrPath != '\\')
                    373:                     {
                    374:                         pwstrPath++;
                    375:                         *pwstrPath = '\\';
                    376:                         cwBuf++;
                    377:                     }
                    378: 
                    379:                     pwstrPath++;
                    380:                     *pwstrPath = '\0';
                    381: 
                    382:                     // save a copy of the path to the source for later use.
                    383: 
                    384:                     wcsncpy(wcbuftmp, wcbuf, (sizeof(wcbuftmp) / 2));
                    385: 
                    386:                     // now that we have the source directory, concat "*.AFM"
                    387:                     // to it.
                    388: 
                    389:                     LoadString(hModule, (IDS_ALL_PFB_FILES + STRING_BASE),
                    390:                                wstringbuf, (sizeof(wstringbuf) / 2));
                    391: 
                    392:                     wcsncat(wcbuf, wstringbuf, (sizeof(wcbuf) / 2) - cwBuf);
                    393: 
                    394:                     if (!LocateFile(hwnd, wcbuf, IDS_PFB_NOT_FOUND,
                    395:                                     &FileFindData, &hFile))
                    396:                         return(FALSE);
                    397: 
                    398:                     // this could take a while, so set the cursor to the hourglass.
                    399: 
                    400:                     hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    401: 
                    402:                     // save the count of new fonts to add.
                    403: 
                    404:                     cSave = cToAdd;
                    405: 
                    406:                     // get the list of selected entries.
                    407: 
                    408:                     if (!(pEntries = (int *)LocalAlloc(LPTR, cToAdd * sizeof(int))))
                    409:                     {
                    410:                         RIP("FontInstDlgProc: LocalAlloc for pEntries failed.\n");
                    411:                         return(FALSE);
                    412:                     }
                    413: 
                    414:                     pSave = pEntries;
                    415: 
                    416:                     SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                    417:                                        LB_GETSELITEMS, cToAdd, (DWORD)pEntries);
                    418: 
                    419:                     // create a new .PFA file from each .PFB file.
                    420: 
                    421:                     while(cToAdd--)
                    422:                     {
                    423:                         // get the index of the new font to add.
                    424: 
                    425:                         index = *pEntries;
                    426: 
                    427:                         // when each entry was added to the new fonts list
                    428:                         // box, memory was allocated to store a pointer
                    429:                         // to the corresponding .PFB filename.
                    430: 
                    431:                         pwstrPFBFile = (PWSTR)SendDlgItemMessage(hwnd,
                    432:                                                      IDD_NEW_FONT_LIST_BOX,
                    433:                                                      LB_GETITEMDATA,
                    434:                                                      index, 0);
                    435: 
                    436:                         if (pwstrPFBFile == (PWSTR)LB_ERR)
                    437:                         {
                    438:                             RIP("FontInstDlgProc: LB_GETITEMDATA failed.");
                    439:                             LocalFree((LOCALHANDLE)pSave);
                    440:                             return(FALSE);
                    441:                         }
                    442: 
                    443:                         // build the fully qualified pathname for the .PFA
                    444:                         // file to create.
                    445: 
                    446:                         ASSERTPS((wcslen(wstrFontInstDir) < MAX_PATH),
                    447:                                  "PSCRPTUI: wstrFontInstDir about to overrun buffer.\n");
                    448:                         wcsncpy(wcbuf, wstrFontInstDir, (sizeof(wcbuf) / 2));
                    449: 
                    450:                         // save a pointer to the fully qualified pathname of
                    451:                         // the .PFB file.
                    452: 
                    453:                         pwstrSave = pwstrPFBFile;
                    454: 
                    455:                         // extract the filename itself.  first, find the end
                    456:                         // of the string, then backup until we find the
                    457:                         // first '\' character.
                    458: 
                    459:                         while (*pwstrPFBFile)
                    460:                             pwstrPFBFile++;
                    461: 
                    462:                         while (*pwstrPFBFile != (WCHAR)'\\')
                    463:                             pwstrPFBFile--;
                    464: 
                    465:                         pwstrPFBFile++;
                    466: 
                    467:                         // pwstrPFBFile now points to the filename itself, so
                    468:                         // concat it with the directory.
                    469: 
                    470:                         cwBuf = wcslen(wcbuf);
                    471: 
                    472:                         wcsncat(wcbuf, pwstrPFBFile, (sizeof(wcbuf) / 2) - cwBuf);
                    473:                         pwstrPFBFile = pwstrSave;
                    474: 
                    475:                         // now change the .PFB to .PFA.
                    476: 
                    477:                         pwstrPFAFile = wcbuf;
                    478: 
                    479:                         while (*pwstrPFAFile)
                    480:                             pwstrPFAFile++;
                    481: 
                    482:                         // back up to the 'B', and overwrite it with 'A'.
                    483: 
                    484:                         pwstrPFAFile--;
                    485:                         *pwstrPFAFile = (WCHAR)'A';
                    486: 
                    487:                         // reset pointer back to start of fully qualified
                    488:                         // pathname.
                    489: 
                    490:                         pwstrPFAFile = wcbuf;
                    491: 
                    492:                         // create a .PFA file from the .PFB file.
                    493: 
                    494:                         // put exception handling around this in case the
                    495:                         // networks goes down in the middle of this.
                    496: 
                    497:                         try
                    498:                         {
                    499:                             if (!PFBToPFA(pwstrPFAFile, pwstrPFBFile))
                    500:                                 return(FALSE);
                    501:                         }
                    502:                         except (EXCEPTION_EXECUTE_HANDLER)
                    503:                         {
                    504:                             LoadString(hModule,
                    505:                                        (IDS_NETWORK_GONE + STRING_BASE),
                    506:                                        wstringbuf, (sizeof(wstringbuf) / 2));
                    507: 
                    508:                             MessageBox(hwnd, wstringbuf, NULL, MB_ICONSTOP | MB_OK);
                    509:                             return (FALSE);
                    510:                         }
                    511: 
                    512:                         // get ready for next selected entry.
                    513: 
                    514:                         pEntries++;
                    515:                     }
                    516: 
                    517:                     // now that we have created the .PFA files from the .PFB
                    518:                     // files, it is time to create the .PFM file from the
                    519:                     // .AFM and .PFA files.
                    520: 
                    521:                     // first find the .AFM files.
                    522: 
                    523:                     // get the supposed path to the new soft fonts provided
                    524:                     // by the user.
                    525: 
                    526:                     cwBuf = GetDlgItemText(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX,
                    527:                                            wcbuf, (sizeof(wcbuf) / 2));
                    528: 
                    529:                     // check to see if it has trailing backslash, and add
                    530:                     // it if not.
                    531: 
                    532:                     pwstrPath = wcbuf + cwBuf - 1;
                    533: 
                    534:                     if (*pwstrPath != (WCHAR)'\\')
                    535:                     {
                    536:                         pwstrPath++;
                    537:                         *pwstrPath = (WCHAR)'\\';
                    538:                         cwBuf++;
                    539:                     }
                    540: 
                    541:                     pwstrPath++;
                    542:                     *pwstrPath = (WCHAR)'\0';
                    543: 
                    544:                     // save a copy of the path to the source for later use.
                    545: 
                    546:                     wcsncpy(wcbuftmp, wcbuf, (sizeof(wcbuftmp) / 2));
                    547: 
                    548:                     // now that we have the source directory, concat "*.AFM"
                    549:                     // to it.
                    550: 
                    551:                     LoadString(hModule, (IDS_ALL_AFM_FILES + STRING_BASE),
                    552:                                wstringbuf, (sizeof(wstringbuf) / 2));
                    553: 
                    554:                     wcsncat(wcbuf, wstringbuf, (sizeof(wcbuf) / 2) - cwBuf);
                    555: 
                    556:                     if (!LocateFile(hwnd, wcbuf, IDS_AFM_NOT_FOUND,
                    557:                                     &FileFindData, &hFile))
                    558:                     {
                    559:                         SetCursor(hCursor);
                    560:                         return(FALSE);
                    561:                     }
                    562: 
                    563:                     // reset values to deal with .AFM files.
                    564: 
                    565:                     cToAdd = cSave;
                    566:                     pEntries = pSave;
                    567: 
                    568:                     // indicate we have not found all the .AFM files.
                    569: 
                    570:                     bAllAFMs = FALSE;
                    571: 
                    572:                     // allocate a bit array to keep track of which
                    573:                     // .AFM files have been found.
                    574: 
                    575:                     pjbitarray = (BYTE *)LocalAlloc(LPTR, (cToAdd + 7) / 8);
                    576: 
                    577:                     if (!pjbitarray)
                    578:                     {
                    579:                         RIP("PSCRPTUI!IDD_ADD_BUTTON: LocalAlloc for pjbitarray failed.\n");
                    580:                         SetCursor(hCursor);
                    581:                         return(FALSE);
                    582:                     }
                    583: 
                    584:                     // initialize all bits to zero.
                    585: 
                    586:                     memset((PVOID)pjbitarray, 0, (cToAdd + 7) / 8);
                    587: 
                    588:                     // create a new .PFM file from each .AFM file and delete
                    589:                     // it's entry from the new fonts list box.
                    590: 
                    591:                     while(!bAllAFMs)
                    592:                     {
                    593:                         // reset pointer.
                    594: 
                    595:                         pEntries = pSave;
                    596: 
                    597:                         for (i = 0; i < cToAdd; i++)
                    598:                         {
                    599:                             // check the bit in the bit array to see if
                    600:                             // this font is already installed.
                    601: 
                    602:                             if ((BYTE)pjbitarray[i >> 3] & (BYTE)(1 << (i & 0x07)))
                    603:                             {
                    604:                                 pEntries++;
                    605:                                 continue;
                    606:                             }
                    607: 
                    608:                             // get the index of the new font to add.
                    609: 
                    610:                             index = *pEntries;
                    611: 
                    612:                             // get the name of the new font to add.
                    613: 
                    614:                             cwBuf = SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                    615:                                                        LB_GETTEXT, index,
                    616:                                                        (DWORD)wcbuftmp);
                    617: 
                    618:                             if (cwBuf == LB_ERR)
                    619:                             {
                    620:                                 RIP("FontInstDlgProc: LB_GETTEXT failed.");
                    621:                                 LocalFree((LOCALHANDLE)pSave);
                    622:                                 return(FALSE);
                    623:                             }
                    624: 
                    625:                             // when each entry was added to the new fonts list
                    626:                             // box, memory was allocated to store a pointer
                    627:                             // to the corresponding .PFB filename. get that
                    628:                             // pointer and create a pointer to .AFM filename.
                    629: 
                    630:                             pwstrAFMFile = (PWSTR)SendDlgItemMessage(hwnd,
                    631:                                                          IDD_NEW_FONT_LIST_BOX,
                    632:                                                          LB_GETITEMDATA,
                    633:                                                          index, 0);
                    634: 
                    635:                             if (pwstrAFMFile == (PWSTR)LB_ERR)
                    636:                             {
                    637:                                 RIP("FontInstDlgProc: LB_GETITEMDATA failed.");
                    638:                                 LocalFree((LOCALHANDLE)pSave);
                    639:                                 return(FALSE);
                    640:                             }
                    641: 
                    642:                             // save pointer to string.
                    643: 
                    644:                             pwstrSave = pwstrAFMFile;
                    645: 
                    646:                             // pwstrAFMFile is actually pointing to the .PFB
                    647:                             // filename. so overwrite the .PFB with .AFM.
                    648: 
                    649:                             while (*pwstrAFMFile)
                    650:                                 pwstrAFMFile++;
                    651: 
                    652:                             // backup and overwrite PFB with AFM.
                    653: 
                    654:                             pwstrAFMFile -= 3;
                    655:                             *pwstrAFMFile++ = (WCHAR)'A';
                    656:                             *pwstrAFMFile++ = (WCHAR)'F';
                    657:                             *pwstrAFMFile = (WCHAR)'M';
                    658: 
                    659:                             // reset pointer to beginning of string.
                    660: 
                    661:                             pwstrAFMFile = pwstrSave;
                    662: 
                    663:                             // build the fully qualified pathname for the .PFM
                    664:                             // file to create.
                    665: 
                    666:                             ASSERTPS((wcslen(wstrFontInstDir) < MAX_PATH),
                    667:                                      "PSCRPTUI: wstrFontInstDir about to overrun buffer.\n");
                    668:                             wcsncpy(wcbuf, wstrFontInstDir, (sizeof(wcbuf) / 2));
                    669: 
                    670:                             // save a pointer to the fully qualified pathname of
                    671:                             // the .AFM file.
                    672: 
                    673:                             pwstrSave = pwstrAFMFile;
                    674: 
                    675:                             // extract the filename itself.  first, find the end
                    676:                             // of the string, then backup until we find the
                    677:                             // first '\' character.
                    678: 
                    679:                             while (*pwstrAFMFile)
                    680:                                 pwstrAFMFile++;
                    681: 
                    682:                             while (*pwstrAFMFile != '\\')
                    683:                                 pwstrAFMFile--;
                    684: 
                    685:                             pwstrAFMFile++;
                    686: 
                    687:                             // pwstrAFMFile now points to the filename itself, so
                    688:                             // concat it with the directory.
                    689: 
                    690:                             cwBuf = wcslen(wcbuf);
                    691: 
                    692:                             wcsncat(wcbuf, pwstrAFMFile, (sizeof(wcbuf) / 2) - cwBuf);
                    693:                             pwstrAFMFile = pwstrSave;
                    694: 
                    695:                             // now change the .AFM to .PFM.
                    696: 
                    697:                             pwstrPFMFile = wcbuf;
                    698: 
                    699:                             while (*pwstrPFMFile)
                    700:                                 pwstrPFMFile++;
                    701: 
                    702:                             // back up to the 'A', and overwrite it with 'P'.
                    703: 
                    704:                             pwstrPFMFile -= 3;
                    705:                             *pwstrPFMFile = (WCHAR)'P';
                    706: 
                    707:                             // reset pointer back to start of fully qualified
                    708:                             // pathname.
                    709: 
                    710:                             pwstrPFMFile = wcbuf;
                    711: 
                    712:                             // create a .PFM file from the .AFM file.  if
                    713:                             // this fails, it is most like due to the fact
                    714:                             // that this .AFM file is on another disk.  so,
                    715:                             // just go to the next one for now.
                    716: 
                    717:                             if (!CreatePFMFromAFM(pwstrAFMFile, pwstrPFMFile))
                    718:                             {
                    719:                                 pEntries++;
                    720:                                 continue;
                    721:                             }
                    722: 
                    723:                             // we have now created both the and .PFM file
                    724:                             // for this font.  we now know that there is at least
                    725:                             // one font installed, so check to see if this is
                    726:                             // this first one.  if so, delete the no installed
                    727:                             // fonts entry from the list box.
                    728: 
                    729:                             if (cInstalledFonts == 0)
                    730:                                 SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    731:                                                    LB_RESETCONTENT, 0, 0);
                    732: 
                    733:                             // associate the pointer to the .PFA file name with it.
                    734:                             // remember, we allocated memory for pwstrPFBFile when this
                    735:                             // font file was opened.  free that memory now.
                    736: 
                    737:                             LocalFree((LOCALHANDLE)pwstrAFMFile);
                    738: 
                    739:                             // allocate memory to store away the .PFM filename.
                    740: 
                    741:                             if (!(pwstrPFMFile = (PWSTR)LocalAlloc(LPTR, wcslen(wcbuf) + 1)))
                    742:                             {
                    743:                                 RIP("PSCRPTUI!IDD_ADD_BUTTON: LocalAlloc failed.\n");
                    744:                                 return(FALSE);
                    745:                             }
                    746: 
                    747:                             // add the font name to the installed fonts dialog box.
                    748: 
                    749:                             index = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    750:                                                        LB_ADDSTRING, 0, (DWORD)wcbuftmp);
                    751: 
                    752:                             // buf currently contains the fully qualified pathname
                    753:                             // of the PFM file.
                    754: 
                    755:                             SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    756:                                                LB_SETITEMDATA, index,
                    757:                                                (DWORD)pwstrPFMFile);
                    758: 
                    759:                             // adjust the counters.
                    760: 
                    761:                             cNewFonts--;
                    762:                             cInstalledFonts++;
                    763: 
                    764:                             // set the bit in the bit array for this
                    765:                             // installed font.
                    766: 
                    767:                             (BYTE)pjbitarray[i >> 3] |= (BYTE)(1 << (i & 0x07));
                    768: 
                    769:                             // get ready for next selected entry.
                    770: 
                    771:                             pEntries++;
                    772:                         }
                    773: 
                    774:                         // see if we have found all the .AFM files.
                    775: 
                    776:                         bAllAFMs = TRUE;
                    777: 
                    778:                         for (i = 0; i < cToAdd; i++)
                    779:                         {
                    780:                             if (!((BYTE)pjbitarray[i >> 3] & (BYTE)(1 << (i & 0x07))))
                    781:                             {
                    782:                                 bAllAFMs = FALSE;
                    783:                                 break;
                    784:                             }
                    785:                         }
                    786: 
                    787:                         // pop up a message box if we have not yet found
                    788:                         // all the .AFM files.
                    789: 
                    790:                         if (!bAllAFMs)
                    791:                         {
                    792:                             LoadString(hModule,
                    793:                                        (IDS_MORE_AFMS_NEEDED + STRING_BASE),
                    794:                                        wstringbuf, (sizeof(wstringbuf) / 2));
                    795: 
                    796:                             iSelect = MessageBox(hwnd, wstringbuf, NULL,
                    797:                                                  MB_ICONSTOP | MB_OKCANCEL);
                    798: 
                    799:                             if (iSelect == IDCANCEL)
                    800:                                 bAllAFMs = TRUE;
                    801:                         }
                    802:                     }
                    803: 
                    804:                     // go backwards through the list, removing each
                    805:                     // item from the new fonts list box.
                    806: 
                    807:                     pEntries--;
                    808: 
                    809:                     while (cSave--)
                    810:                     {
                    811:                         // get the index of the new font to delete.
                    812: 
                    813:                         index = *pEntries;
                    814: 
                    815:                         // delete the entry from the new font list box.
                    816: 
                    817:                         SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                    818:                                            LB_DELETESTRING, index, 0);
                    819: 
                    820:                         pEntries--;
                    821:                     }
                    822: 
                    823:                     // we just added all the selected fonts, therefore,
                    824:                     // there are no fonts selected to add.
                    825: 
                    826:                     EnableWindow(GetDlgItem(hwnd, IDD_ADD_BUTTON), FALSE);
                    827: 
                    828:                     // reset the cursor shape to what it was.
                    829: 
                    830:                     SetCursor(hCursor);
                    831: 
                    832:                     // now that we are done, turn on redrawing.
                    833: 
                    834:                     SendMessage (hwnd, WM_SETREDRAW, TRUE, 0L);
                    835:                     InvalidateRect (hwnd, NULL, TRUE);
                    836: 
                    837:                     // free up memory.
                    838: 
                    839:                     LocalFree((LOCALHANDLE)pSave);
                    840:                     LocalFree((LOCALHANDLE)pjbitarray);
                    841: 
                    842:                     return(TRUE);
                    843: 
                    844:                 case IDD_DELETE_BUTTON:
                    845:                     // first see how many entries have been selected in
                    846:                     // the installed fonts list box.
                    847: 
                    848:                     cToDelete = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    849:                                                 LB_GETSELCOUNT, 0, 0);
                    850: 
                    851:                     // nothing to do if no entries selected.
                    852: 
                    853:                     if (cToDelete == 0)
                    854:                         return(TRUE);   //!!! maybe a message box? - kentse.
                    855: 
                    856:                     // this could take a while, so set the cursor to the hourglass.
                    857: 
                    858:                     hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    859: 
                    860:                     // save the count.
                    861: 
                    862:                     cSave = cToDelete;
                    863: 
                    864:                     // get the list of selected entries.
                    865: 
                    866:                     if (!(pEntries = (int *)LocalAlloc(LPTR, cToDelete * sizeof(int))))
                    867:                     {
                    868:                         RIP("PSCRPTUI!IDD_DELETE_BUTTON: LocalAlloc for pEntries failed.\n");
                    869:                         return(FALSE);
                    870:                     }
                    871: 
                    872:                     pSave = pEntries;
                    873: 
                    874:                     iSelect = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    875:                                                  LB_GETSELITEMS, cToDelete,
                    876:                                                  (DWORD)pEntries);
                    877: 
                    878:                     if ((iSelect != (int)cToDelete) || (iSelect == LB_ERR))
                    879:                     {
                    880:                         RIP("PSCRPTUI!IDD_DELETE_BUTTON: LB_GETSELITEMS failed.\n");
                    881:                         LocalFree((LOCALHANDLE)pEntries);
                    882:                         return(FALSE);
                    883:                     }
                    884: 
                    885:                     while (cToDelete--)
                    886:                     {
                    887:                         // get the index of the new font to add.
                    888: 
                    889:                         index = *pEntries;
                    890: 
                    891:                         // when each entry was added to the installed list
                    892:                         // box, memory was allocated to store a pointer
                    893:                         // to the corresponding .PFM filename.
                    894: 
                    895:                         pwstrPFMFile = (PWSTR)SendDlgItemMessage(hwnd,
                    896:                                                      IDD_INSTALLED_LIST_BOX,
                    897:                                                      LB_GETITEMDATA,
                    898:                                                      index, 0);
                    899: 
                    900:                         if (pwstrPFMFile == (PWSTR)LB_ERR)
                    901:                         {
                    902:                             RIP("PSCRPTUI!IDD_DELETE_BUTTON: LB_GETITEMDATA failed.\n");
                    903:                             LocalFree((LOCALHANDLE)pSave);
                    904:                             return(FALSE);
                    905:                         }
                    906: 
                    907:                         // delete the file associated with the font.
                    908: 
                    909:                         DeleteFile(pwstrPFMFile);
                    910: 
                    911:                         // free up memory allocated when this entry was
                    912:                         // added to the installed fonts list box.
                    913: 
                    914:                         LocalFree((LOCALHANDLE)pwstrPFMFile);
                    915: 
                    916:                         // update the count of installed fonts.
                    917: 
                    918:                         cInstalledFonts--;
                    919: 
                    920:                         // get ready for next selected entry.
                    921: 
                    922:                         pEntries++;
                    923:                     }
                    924: 
                    925:                     // go backwards through the list, removing each
                    926:                     // item from the new fonts list box.
                    927: 
                    928:                     pEntries--;
                    929: 
                    930:                     while (cSave--)
                    931:                     {
                    932:                         // get the index of the new font to delete.
                    933: 
                    934:                         index = *pEntries;
                    935: 
                    936:                         // delete the entry from the new font list box.
                    937: 
                    938:                         SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    939:                                            LB_DELETESTRING, index, 0);
                    940: 
                    941:                         pEntries--;
                    942:                     }
                    943: 
                    944:                     // we just deleted all the selected fonts, therefore,
                    945:                     // there are no fonts selected to delete.
                    946: 
                    947:                     EnableWindow(GetDlgItem(hwnd, IDD_DELETE_BUTTON), FALSE);
                    948: 
                    949:                     // free up memory.
                    950: 
                    951:                     LocalFree((LOCALHANDLE)pSave);
                    952: 
                    953:                     // reset the cursor shape to what it was.
                    954: 
                    955:                     SetCursor(hCursor);
                    956: 
                    957:                     break;
                    958: 
                    959:                 case IDD_NEW_FONT_LIST_BOX:
                    960:                     if (HIWORD (wParam) != LBN_SELCHANGE)
                    961:                         return (FALSE);
                    962: 
                    963:                     // if any of the items in the list box have been selected,
                    964:                     // enable the ADD button.  if non of the items are
                    965:                     // selected, disable the ADD button.
                    966: 
                    967:                     iSelect = SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                    968:                                                  LB_GETSELCOUNT, 0, 0);
                    969: 
                    970:                     if (iSelect == LB_ERR)
                    971:                         return(FALSE);
                    972: 
                    973:                     if (iSelect > 0)
                    974:                         EnableWindow(GetDlgItem(hwnd, IDD_ADD_BUTTON), TRUE);
                    975:                     else
                    976:                         EnableWindow(GetDlgItem(hwnd, IDD_ADD_BUTTON), FALSE);
                    977: 
                    978:                     break;
                    979: 
                    980:                 case IDD_INSTALLED_LIST_BOX:
                    981:                     if (HIWORD (wParam) != LBN_SELCHANGE)
                    982:                         return (FALSE);
                    983: 
                    984:                     // if any of the items in the list box have been selected,
                    985:                     // enable the DELETE button.  if non of the items are
                    986:                     // selected, disable the DELETE button.
                    987: 
                    988:                     iSelect = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                    989:                                                  LB_GETSELCOUNT, 0, 0);
                    990: 
                    991:                     if (iSelect == LB_ERR)
                    992:                         return(FALSE);
                    993: 
                    994: 
                    995:                     if ((iSelect > 0) && (cInstalledFonts > 0) && pdata->bPermission)
                    996:                         EnableWindow(GetDlgItem(hwnd, IDD_DELETE_BUTTON), TRUE);
                    997:                     else
                    998:                         EnableWindow(GetDlgItem(hwnd, IDD_DELETE_BUTTON), FALSE);
                    999: 
                   1000:                     break;
                   1001: 
                   1002:                 case IDD_HELP_BUTTON:
                   1003:                     vShowHelp(hwnd, HELP_CONTEXT, HLP_SFONT_INSTALLER,
                   1004:                               pdata->hPrinter);
                   1005:                     return(TRUE);
                   1006: 
                   1007:                 case IDOK:
                   1008:                     if (pdata->bPermission)
                   1009:                     {
                   1010:                         // see how many entries are left in the new fonts
                   1011:                         // list box.  delete the memory allocated for each
                   1012:                         // entry.
                   1013: 
                   1014:                         cToDelete = SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX,
                   1015:                                                        LB_GETCOUNT, 0, 0);
                   1016: 
                   1017:                         for (i = 0; i < cToDelete; i++)
                   1018:                         {
                   1019:                             pwstrPFBFile = (PWSTR)SendDlgItemMessage(hwnd,
                   1020:                                                          IDD_NEW_FONT_LIST_BOX,
                   1021:                                                          LB_GETITEMDATA, i, 0);
                   1022: 
                   1023:                             if (pwstrPFBFile == (PWSTR)LB_ERR)
                   1024:                             {
                   1025:                                 RIP("PSCRPTUI!IDOK: LB_GETITEMDATA failed.");
                   1026:                                 return(FALSE);
                   1027:                             }
                   1028: 
                   1029:                             LocalFree((LOCALHANDLE)pwstrPFBFile);
                   1030:                         }
                   1031:                     }
                   1032: 
                   1033:                     // do the same for the installed fonts list box.  in this
                   1034:                     // case, the memory will have been allocated whether
                   1035:                     // the user has change permission or not.
                   1036: 
                   1037:                     cToDelete = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX,
                   1038:                                                    LB_GETCOUNT, 0, 0);
                   1039: 
                   1040:                     for (i = 0; i < cToDelete; i++)
                   1041:                     {
                   1042:                         pwstrPFMFile = (PWSTR)SendDlgItemMessage(hwnd,
                   1043:                                                      IDD_INSTALLED_LIST_BOX,
                   1044:                                                      LB_GETITEMDATA, i, 0);
                   1045: 
                   1046:                         if (pwstrPFMFile == (PWSTR)LB_ERR)
                   1047:                         {
                   1048:                             RIP("PSCRPTUI!IDOK: LB_GETITEMDATA failed.");
                   1049:                             return(FALSE);
                   1050:                         }
                   1051: 
                   1052:                         LocalFree((LOCALHANDLE)pwstrPFMFile);
                   1053:                     }
                   1054: 
                   1055:                     // let the world know we may have changed the fonts.
                   1056: 
                   1057:                     if (pdata->bPermission)
                   1058:                     {
                   1059:                         SendMessage((HWND)-1, WM_FONTCHANGE, 0, 0);
                   1060:                     }
                   1061: 
                   1062:                     // end the dialog.
                   1063: 
                   1064:                     EndDialog (hwnd, TRUE);
                   1065:                     return(TRUE);
                   1066: 
                   1067:                 case IDCANCEL:
                   1068:                     EndDialog (hwnd, IDCANCEL);
                   1069:                     return(TRUE);
                   1070: 
                   1071:                 default:
                   1072:                     return(FALSE);
                   1073:             }
                   1074:             break;
                   1075: 
                   1076:         case WM_DESTROY:
                   1077:             // clean up any used help stuff.
                   1078: 
                   1079:             vHelpDone(hwnd);
                   1080:             return (TRUE);
                   1081: 
                   1082:         default:
                   1083:             return (FALSE);
                   1084:     }
                   1085:     return (FALSE);
                   1086: }
                   1087: 
                   1088: 
                   1089: //--------------------------------------------------------------------------
                   1090: // BOOL InsertInstalledFont(hwnd, pwstrPFMFile)
                   1091: // HWND    hwnd;
                   1092: // PWSTR   pwstrPFMFile;
                   1093: //
                   1094: // This function takes a pointer to the filename for a given soft font,
                   1095: // extracts the font name from the file, and insert that into the
                   1096: // Installed Fonts list box.
                   1097: //
                   1098: // Returns:
                   1099: //   This function returns no value.
                   1100: //
                   1101: // History:
                   1102: //   16-Dec-1991        -by-    Kent Settle     (kentse)
                   1103: //  Wrote it.
                   1104: //--------------------------------------------------------------------------
                   1105: 
                   1106: BOOL InsertInstalledFont(hwnd, pwstrPFMFile)
                   1107: HWND    hwnd;
                   1108: PWSTR   pwstrPFMFile;
                   1109: {
                   1110:     CHAR        cbuf[128];
                   1111:     WCHAR       wcbuf[128];
                   1112:     CHAR       *pBuffer;
                   1113:     CHAR       *pSoftFont;
                   1114:     PWSTR       pwstrFileName;
                   1115:     DWORD       index;
                   1116:     PNTFM       pntfm;
                   1117: 
                   1118:     // open the given .PFM file.
                   1119: 
                   1120:     if (!(pntfm = (PNTFM)MapFile(pwstrPFMFile)))
                   1121:     {
                   1122:         RIP("PSCRPTUI!InsertInstalledFont: MapFile failed.\n");
                   1123:         return(FALSE);
                   1124:     }
                   1125: 
                   1126:     // when we created the .PFA file, we stuck the following font information
                   1127:     // at the beginning of each .PFA file: "%Full Name%Font Name%".
                   1128:     // we want to extract the Full Name and insert that into the list
                   1129:     // box.
                   1130: 
                   1131:     pSoftFont = (CHAR *)pntfm + pntfm->loSoftFont;
                   1132: 
                   1133:     // do nothing if this .PFM file does not contain a softfont.
                   1134: 
                   1135:     if (!pSoftFont)
                   1136:     {
                   1137:         UnmapViewOfFile((PVOID)pntfm);
                   1138:         return(TRUE);
                   1139:     }
                   1140: 
                   1141:     // skip over the first '%'.
                   1142: 
                   1143:     pSoftFont++;
                   1144: 
                   1145:     // copy the font name into a local buffer.
                   1146: 
                   1147:     pBuffer = cbuf;
                   1148: 
                   1149:     while (*pSoftFont != '%')
                   1150:         *pBuffer++ = *pSoftFont++;
                   1151: 
                   1152:     // don't forget the NULL terminator.
                   1153: 
                   1154:     *pBuffer = '\0';
                   1155: 
                   1156:     // reset pointer to start of Full Name of font.
                   1157: 
                   1158:     pBuffer = cbuf;
                   1159: 
                   1160:     // insert font name into Installed Fonts list box.
                   1161: 
                   1162:     strcpy2WChar(wcbuf, pBuffer);
                   1163:     index = SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX, LB_ADDSTRING, 0,
                   1164:                                (DWORD)wcbuf);
                   1165: 
                   1166:     if ((index == LB_ERR) || (index == LB_ERRSPACE))
                   1167:     {
                   1168:         RIP("InsertInstalledFont: LB_ADDSTRING failed.\n");
                   1169:         UnmapViewOfFile((PVOID)pntfm);
                   1170:         return(FALSE);
                   1171:     }
                   1172: 
                   1173:     // associate a pointer to the file name with each entry in the listbox.
                   1174:     // create local copy of file name, since the copy pwstrPFMFile will probably
                   1175:     // no longer exist when we need to access it.
                   1176: 
                   1177:     if (!(pwstrFileName = (PWSTR)LocalAlloc(LPTR, (wcslen(pwstrPFMFile) + 1) * 2)))
                   1178:     {
                   1179:         RIP("InsertInstalledFont: LocalAlloc for pwstrFileName failed.\n");
                   1180:         UnmapViewOfFile((PVOID)pntfm);
                   1181:         return(FALSE);
                   1182:     }
                   1183: 
                   1184:     wcsncpy(pwstrFileName, pwstrPFMFile, wcslen(pwstrPFMFile) + 1);
                   1185: 
                   1186:     SendDlgItemMessage(hwnd, IDD_INSTALLED_LIST_BOX, LB_SETITEMDATA, index,
                   1187:                        (DWORD)pwstrFileName);
                   1188: 
                   1189:     // unmap the .PFM file.
                   1190: 
                   1191:     UnmapViewOfFile((PVOID)pntfm);
                   1192: 
                   1193:     return(TRUE);
                   1194: }
                   1195: 
                   1196: 
                   1197: //--------------------------------------------------------------------------
                   1198: // BOOL InsertNewFont(hwnd, pwstrPFBFile)
                   1199: // HWND    hwnd;
                   1200: // PWSTR   pwstrPFBFile;
                   1201: //
                   1202: // This function takes a pointer to the filename for a given soft font,
                   1203: // extracts the font name from the file, and insert that into the
                   1204: // New Fonts list box.
                   1205: //
                   1206: // Returns:
                   1207: //   This function returns no value.
                   1208: //
                   1209: // History:
                   1210: //   23-Dec-1991        -by-    Kent Settle     (kentse)
                   1211: //  Wrote it.
                   1212: //--------------------------------------------------------------------------
                   1213: 
                   1214: BOOL InsertNewFont(hwnd, pwstrPFBFile)
                   1215: HWND    hwnd;
                   1216: PWSTR   pwstrPFBFile;
                   1217: {
                   1218:     CHAR       *pBuffer;
                   1219:     CHAR        strFullName[MAX_FULLNAME];
                   1220:     WCHAR       wstrFullName[MAX_FULLNAME];
                   1221:     PFBHEADER   pfbheader;
                   1222:     HANDLE      hFile;
                   1223:     DWORD       cBytesRead, cb;
                   1224:     BOOL        bRet;
                   1225:     DWORD       dwRet;
                   1226:     PWSTR       pwstrFileName;
                   1227:     DWORD       index;
                   1228: 
                   1229:     // open the given .PFB file.
                   1230: 
                   1231:     hFile = CreateFile(pwstrPFBFile, GENERIC_READ, FILE_SHARE_READ,
                   1232:                                         0, OPEN_EXISTING, 0, 0 );
                   1233:     if (hFile == (HANDLE)-1)
                   1234:     {
                   1235:         RIP("InsertNewFont: CreateFile failed.\n");
                   1236:         return(FALSE);
                   1237:     }
                   1238: 
                   1239:     // read in the PFBHEADER.
                   1240: 
                   1241:     if(!(bRet = ReadFile(hFile, &pfbheader, sizeof(PFBHEADER), &cBytesRead,
                   1242:          NULL) || cBytesRead != sizeof(PFBHEADER)))
                   1243:     {
                   1244:         RIP("InsertNewFont: ReadFile Failed.\n");
                   1245:         CloseHandle(hFile);
                   1246:         return(FALSE);
                   1247:     }
                   1248: 
                   1249:     // make sure we have the header.
                   1250: 
                   1251:     if ((pfbheader.jCheck != CHECK_BYTE) || (pfbheader.jType == EOF_TYPE))
                   1252:     {
                   1253:         RIP("InsertNewFont: PFB Header not found.\n");
                   1254:         SetLastError(ERROR_INVALID_DATA);
                   1255:         CloseHandle(hFile);
                   1256:         return(FALSE);
                   1257:     }
                   1258: 
                   1259:     // find the size of the .PFB file.  allocate memory to copy into,
                   1260:     // leaving room for terminating NULL.
                   1261: 
                   1262:     cb = ((DWORD)pfbheader.ushilength << 16) + pfbheader.uslolength;
                   1263: 
                   1264:     if (!(pBuffer = (CHAR *)LocalAlloc(LPTR, cb + 1)))
                   1265:     {
                   1266:         RIP("InsertNewFont: LocalAlloc failed.\n");
                   1267:         CloseHandle(hFile);
                   1268:         return(FALSE);
                   1269:     }
                   1270: 
                   1271:     // reset the file pointer and read in the entire file.
                   1272: 
                   1273:     dwRet = SetFilePointer(hFile, 0, 0, FILE_BEGIN);
                   1274: 
                   1275:     if (dwRet == -1)
                   1276:     {
                   1277:         RIP("InsertNewFont: SetFilePointer failed.\n");
                   1278:         CloseHandle(hFile);
                   1279:         LocalFree((LOCALHANDLE)pBuffer);
                   1280:         return(FALSE);
                   1281:     }
                   1282: 
                   1283:     if(!(bRet = ReadFile(hFile, pBuffer, cb, &cBytesRead, NULL) ||
                   1284:          cBytesRead != cb))
                   1285:     {
                   1286:         RIP("InsertNewFont: ReadFile Failed.\n");
                   1287:         CloseHandle(hFile);
                   1288:         LocalFree((LOCALHANDLE)pBuffer);
                   1289:         return(FALSE);
                   1290:     }
                   1291: 
                   1292:     // NULL terminate it for good measure.
                   1293: 
                   1294:     *(pBuffer + cb) = '\0';
                   1295: 
                   1296:     // extract the full font name from the .PFB file.  it is designated
                   1297:     // by the /FullName keyword.
                   1298: 
                   1299:     if (!ExtractFullName(pBuffer, strFullName))
                   1300:     {
                   1301:         CloseHandle(hFile);
                   1302:         LocalFree((LOCALHANDLE)pBuffer);
                   1303:         return(FALSE);
                   1304:     }
                   1305: 
                   1306:     // insert font name into New Fonts list box.
                   1307: 
                   1308:     strcpy2WChar(wstrFullName, strFullName);
                   1309: 
                   1310:     index = SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX, LB_ADDSTRING, 0,
                   1311:                                (DWORD)wstrFullName);
                   1312: 
                   1313:     if ((index == LB_ERR) || (index == LB_ERRSPACE))
                   1314:     {
                   1315:         RIP("InsertNewFont: LB_ADDSTRING failed.\n");
                   1316:         CloseHandle(hFile);
                   1317:         return(FALSE);
                   1318:     }
                   1319: 
                   1320:     // associate a pointer to the file name with each entry in the listbox.
                   1321:     // create local copy of file name, since the copy pwstrPFBFile will probably
                   1322:     // no longer exist when we need to access it.
                   1323: 
                   1324:     if (!(pwstrFileName = (PWSTR)LocalAlloc(LPTR, (wcslen(pwstrPFBFile) + 1) * 2)))
                   1325:     {
                   1326:         RIP("InsertNewFont: LocalAlloc for pwstrFileName failed.\n");
                   1327:         CloseHandle(hFile);
                   1328:         return(FALSE);
                   1329:     }
                   1330: 
                   1331:     wcsncpy(pwstrFileName, pwstrPFBFile, wcslen(pwstrPFBFile) + 1);
                   1332: 
                   1333:     SendDlgItemMessage(hwnd, IDD_NEW_FONT_LIST_BOX, LB_SETITEMDATA, index,
                   1334:                        (DWORD)pwstrFileName);
                   1335: 
                   1336:     // free up memory.
                   1337: 
                   1338:     LocalFree((LOCALHANDLE)pBuffer);
                   1339: 
                   1340:     // close the .PFB file.
                   1341: 
                   1342:     CloseHandle(hFile);
                   1343: 
                   1344:     return(TRUE);
                   1345: }
                   1346: 
                   1347: 
                   1348: //--------------------------------------------------------------------------
                   1349: // PSTR LocateKeyword(pBuffer, pstrKeyword)
                   1350: // PSTR    pBuffer;
                   1351: // PSTR    pstrKeyword;
                   1352: //
                   1353: // This function takes a pointer to a buffer, and a pointer to a null
                   1354: // terminated string.  It searches the buffer for the string and returns
                   1355: // a pointer to the string if it is found.
                   1356: //
                   1357: // Returns:
                   1358: //   This function returns a pointer to the keyword if it is found,
                   1359: //   otherwise it returns NULL.
                   1360: //
                   1361: // History:
                   1362: //   03-Jan-1992        -by-    Kent Settle     (kentse)
                   1363: //  Wrote it.
                   1364: //--------------------------------------------------------------------------
                   1365: 
                   1366: PSTR LocateKeyword(pBuffer, pstrKeyword)
                   1367: PSTR    pBuffer;
                   1368: PSTR    pstrKeyword;
                   1369: {
                   1370:     while(*pBuffer != '\0')
                   1371:     {
                   1372:         // search through the buffer until we find the keyword designator '/'.
                   1373: 
                   1374:         while(*pBuffer != '/')
                   1375:             pBuffer++;
                   1376: 
                   1377:         if (!(strncmp(pstrKeyword, pBuffer, strlen(pstrKeyword))))
                   1378:             break;      // we found it.
                   1379: 
                   1380:         // not this keyword, continue the search.
                   1381: 
                   1382:         pBuffer ++;
                   1383:     }
                   1384: 
                   1385:     // we did not find the keyword.
                   1386: 
                   1387:     if (*pBuffer == '\0')
                   1388:         pBuffer = NULL;
                   1389: 
                   1390:     // we did find it, return a pointer to the '/' character at the
                   1391:     // beginning of the keyword.
                   1392: 
                   1393:     return(pBuffer);
                   1394: }
                   1395: 
                   1396: 
                   1397: //--------------------------------------------------------------------------
                   1398: // BOOL ExtractFullName(pBuffer, pszFullName)
                   1399: // PSZ  pBuffer;
                   1400: // PSZ  pszFullName;
                   1401: //
                   1402: // This function takes a pointer to a buffer, and a pointer to a place
                   1403: // to store the actual FullName of the font.
                   1404: //
                   1405: // Returns:
                   1406: //   This function returns TRUE if the fullname is found,
                   1407: //   otherwise it returns FALSE.
                   1408: //
                   1409: // History:
                   1410: //   03-Jan-1992        -by-    Kent Settle     (kentse)
                   1411: //  Wrote it.
                   1412: //--------------------------------------------------------------------------
                   1413: 
                   1414: BOOL ExtractFullName(pBuffer, pstrFullName)
                   1415: PSTR    pBuffer;
                   1416: PSTR    pstrFullName;
                   1417: {
                   1418:     CHAR    buf[32];
                   1419: 
                   1420:     // extract the full font name from the .PFB file.  it is designated
                   1421:     // by the /FullName keyword.
                   1422: 
                   1423: //!!!  I want an ASCII string here.  Should I do a LoadStringA or hardcode it
                   1424: //!!!  or what???  -kentse.
                   1425:     LoadStringA(hModule, IDS_FULLNAME + STRING_BASE, buf, sizeof(buf));
                   1426: 
                   1427:     if (!(pBuffer = LocateKeyword(pBuffer, buf)))
                   1428:     {
                   1429:         RIP("ExtractFullName: /FullName not found.\n");
                   1430:         SetLastError(ERROR_INVALID_DATA);
                   1431:         return(FALSE);
                   1432:     }
                   1433: 
                   1434:     // if we got to this point, pBuffer will be pointing to
                   1435:     // "/FullName (The Full Font Name)".
                   1436: 
                   1437:     // advance to the opening paren.
                   1438: 
                   1439:     while (*pBuffer != '(')
                   1440:         pBuffer++;
                   1441: 
                   1442:     pBuffer++;
                   1443: 
                   1444:     // skip any white space.
                   1445: 
                   1446:     while (*pBuffer == ' ')
                   1447:         pBuffer++;
                   1448: 
                   1449:     // pBuffer is now pointing to the first letter of the actual full name.
                   1450:     // copy the name into our local buffer.
                   1451: 
                   1452:     while (*pBuffer != ')')
                   1453:         *pstrFullName++ = *pBuffer++;
                   1454: 
                   1455:     // null terminate it.
                   1456: 
                   1457:     *pstrFullName = '\0';
                   1458: 
                   1459:     return(TRUE);
                   1460: }
                   1461: 
                   1462: 
                   1463: //--------------------------------------------------------------------------
                   1464: // BOOL ExtractFontName(pBuffer, pszFontName)
                   1465: // PSZ  pBuffer;
                   1466: // PSZ  pszFontName;
                   1467: //
                   1468: // This function takes a pointer to a buffer, and a pointer to a place
                   1469: // to store the actual FontName.
                   1470: //
                   1471: // Returns:
                   1472: //   This function returns TRUE if the fullname is found,
                   1473: //   otherwise it returns FALSE.
                   1474: //
                   1475: // History:
                   1476: //   07-Jan-1992        -by-    Kent Settle     (kentse)
                   1477: //  Wrote it.
                   1478: //--------------------------------------------------------------------------
                   1479: 
                   1480: BOOL ExtractFontName(pBuffer, pszFontName)
                   1481: PSZ     pBuffer;
                   1482: PSZ     pszFontName;
                   1483: {
                   1484:     CHAR    buf[32];
                   1485: 
                   1486:     // extract the font name from the .PFB file.  it is designated
                   1487:     // by the /FontName keyword.
                   1488: 
                   1489: //!!!  I want an ASCII string here.  Should I do a LoadStringA or hardcode it
                   1490: //!!!  or what???  -kentse.
                   1491: 
                   1492:     LoadStringA(hModule, (IDS_FONTNAME + STRING_BASE), buf, sizeof(buf));
                   1493: 
                   1494:     if (!(pBuffer = LocateKeyword(pBuffer, buf)))
                   1495:     {
                   1496:         RIP("ExtractFontName: /FontName not found.\n");
                   1497:         SetLastError(ERROR_INVALID_DATA);
                   1498:         return(FALSE);
                   1499:     }
                   1500: 
                   1501:     // if we got to this point, pBuffer will be pointing to
                   1502:     // "/FontName /The Font Name".
                   1503: 
                   1504:     // advance to the next '/' character.
                   1505: 
                   1506:     pBuffer++;
                   1507: 
                   1508:     while (*pBuffer != '/')
                   1509:         pBuffer++;
                   1510: 
                   1511:     pBuffer++;
                   1512: 
                   1513:     // skip any white space.
                   1514: 
                   1515:     while (*pBuffer == ' ')
                   1516:         pBuffer++;
                   1517: 
                   1518:     // pBuffer is now pointing to the first letter of the actual font name.
                   1519:     // copy the name into our local buffer.
                   1520: 
                   1521:     while (*pBuffer != ' ')
                   1522:         *pszFontName++ = *pBuffer++;
                   1523: 
                   1524:     // null terminate it.
                   1525: 
                   1526:     *pszFontName = '\0';
                   1527: 
                   1528:     return(TRUE);
                   1529: }
                   1530: 
                   1531: 
                   1532: //--------------------------------------------------------------------------
                   1533: // BOOL PFBToPFA(pwstrPFAFile, pwstrPFBFile)
                   1534: // PWSTR     pwstrPFAFile;
                   1535: // PWSTR     pwstrPFBFile;
                   1536: //
                   1537: // This function takes a pointer to a destination .PFA file and a source
                   1538: // .PFB file, then creates the .PFA from the .PFB file.
                   1539: //
                   1540: // Returns:
                   1541: //   This function returns TRUE if the .PFA is successfully created,
                   1542: //   otherwise it returns FALSE.
                   1543: //
                   1544: // History:
                   1545: //   07-Jan-1992        -by-    Kent Settle     (kentse)
                   1546: //  Wrote it.
                   1547: //--------------------------------------------------------------------------
                   1548: 
                   1549: BOOL PFBToPFA(pwstrPFAFile, pwstrPFBFile)
                   1550: PWSTR     pwstrPFAFile;
                   1551: PWSTR     pwstrPFBFile;
                   1552: {
                   1553:     CHAR       *pPFB;
                   1554:     CHAR       *pPFBTemp;
                   1555:     CHAR        szFullName[MAX_FULLNAME];
                   1556:     CHAR        szFontName[MAX_FONTNAME];
                   1557:     HANDLE      hPFAFile;
                   1558:     DWORD       cbToWrite1, cbToWrite2, cbWritten, cbSegment;
                   1559:     DWORD       cbPFA;
                   1560:     CHAR        buf[MAX_FULLNAME + MAX_FONTNAME + 6];
                   1561:     DWORD       i, dwRet;
                   1562:     PFBHEADER   pfbheader;
                   1563:     CHAR       *pSrc;
                   1564:     CHAR       *pDest;
                   1565:     CHAR       *pSave;
                   1566: 
                   1567:     // get a pointer to .PFB file.
                   1568: 
                   1569:     if (!(pPFB = MapFile(pwstrPFBFile)))
                   1570:     {
                   1571:         RIP("PSCRPTUI!PFBToPFA: MapFile failed.\n");
                   1572:         return(FALSE);
                   1573:     }
                   1574: 
                   1575:     // extract the full font name from the .PFB file.  it is designated
                   1576:     // by the /FullName keyword.
                   1577: 
                   1578:     if (!ExtractFullName(pPFB, szFullName))
                   1579:     {
                   1580:         UnmapViewOfFile((PVOID)pPFB);
                   1581:         return(FALSE);
                   1582:     }
                   1583: 
                   1584:     // extract the full font name from the .PFB file.  it is designated
                   1585:     // by the /FontName keyword.
                   1586: 
                   1587:     if (!ExtractFontName(pPFB, szFontName))
                   1588:     {
                   1589:         UnmapViewOfFile((PVOID)pPFB);
                   1590:         return(FALSE);
                   1591:     }
                   1592: 
                   1593:     // create the .PFA file.
                   1594: 
                   1595:     hPFAFile = CreateFile(pwstrPFAFile, GENERIC_WRITE, FILE_SHARE_READ, NULL,
                   1596:                           CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
                   1597: 
                   1598:     if (hPFAFile == INVALID_HANDLE_VALUE)
                   1599:     {
                   1600:         RIP("PSCRPTUI!PFBToPFA: CreateFile for .PFA file failed.\n");
                   1601:         UnmapViewOfFile((PVOID)pPFB);
                   1602:         return(FALSE);
                   1603:     }
                   1604: 
                   1605:     // output a DWORD at the beginning of the file, containing the
                   1606:     // length of the PFA file, NOT including this DWORD.  for now,
                   1607:     // we do not know the length of the file, so write out a place holder.
                   1608: 
                   1609:     cbPFA = 0;
                   1610:     WriteFile(hPFAFile, (PVOID)&cbPFA, (DWORD)sizeof(cbPFA),
                   1611:               (DWORD *)&cbWritten, (LPOVERLAPPED)NULL);
                   1612: 
                   1613:     if (cbWritten != sizeof(cbPFA))
                   1614:     {
                   1615:         RIP("PSCRPTUI!PFBToPFA: WriteFile to .PFA file failed.\n");
                   1616:         CloseHandle(hPFAFile);
                   1617:         UnmapViewOfFile((PVOID)pPFB);
                   1618:         return(FALSE);
                   1619:     }
                   1620: 
                   1621:     // we want to put the following string at the start of the .PFA file:
                   1622:     // "%FullName%FontName%CRLF".  build this string in a buffer.
                   1623: 
                   1624:     buf[0] = '%';
                   1625: 
                   1626:     strncpy(&buf[1], szFullName, strlen(szFullName));
                   1627: 
                   1628:     i = strlen(szFullName) + 1;
                   1629:     buf [i++] = '%';
                   1630: 
                   1631:     strncpy(&buf[i], szFontName, strlen(szFontName));
                   1632: 
                   1633:     i += strlen(szFontName);
                   1634:     buf[i++] = '%';
                   1635:     buf[i++] = 0x0D;    // ASCII carriage return.
                   1636:     buf[i++] = 0x0A;    // ASCII line feed.
                   1637:     buf[i] = '\0';      // NULL terminator.
                   1638: 
                   1639:     // write the buffer to the .PFA file.
                   1640: 
                   1641:     cbToWrite1 = strlen(buf);
                   1642:     cbPFA = cbToWrite1;
                   1643: 
                   1644:     WriteFile(hPFAFile, (PVOID)buf, (DWORD)cbToWrite1,
                   1645:               (DWORD *)&cbWritten, (LPOVERLAPPED)NULL);
                   1646: 
                   1647:     if (cbWritten != cbToWrite1)
                   1648:     {
                   1649:         RIP("PSCRPTUI!PFBToPFA: WriteFile to .PFA file failed.\n");
                   1650:         CloseHandle(hPFAFile);
                   1651:         UnmapViewOfFile((PVOID)pPFB);
                   1652:         return(FALSE);
                   1653:     }
                   1654: 
                   1655:     // The PFB file format is a sequence of segments, each of which has a
                   1656:     // header part and a data part. The header format, defined in the
                   1657:     // struct PFBHEADER below, consists of a one byte sanity check number
                   1658:     // (128) then a one byte segment type and finally a four byte length
                   1659:     // field for the data following data. The length field is stored in
                   1660:     // the file with the least significant byte first.  read in each
                   1661:     // PFBHEADER, then process the data following it until we are done.
                   1662: 
                   1663:     pPFBTemp = pPFB;
                   1664: 
                   1665:     while (TRUE)
                   1666:     {
                   1667:         // read in what should be a PFBHEADER.
                   1668: 
                   1669:         memcpy(&pfbheader, pPFBTemp, sizeof(PFBHEADER));
                   1670: 
                   1671:         // make sure we have the header.
                   1672: 
                   1673:         if (pfbheader.jCheck != CHECK_BYTE)
                   1674:         {
                   1675:             RIP("PSCRPTUI!PFBToPFA: PFB Header not found.\n");
                   1676:             SetLastError(ERROR_INVALID_DATA);
                   1677:             CloseHandle(hPFAFile);
                   1678:             UnmapViewOfFile((PVOID)pPFB);
                   1679:             return(FALSE);
                   1680:         }
                   1681: 
                   1682:         // if we have hit the end of the .PFB file, then we are done.
                   1683: 
                   1684:         if (pfbheader.jType == EOF_TYPE)
                   1685:             break;
                   1686: 
                   1687:         // get the length of the data in this segment.
                   1688: 
                   1689:         cbSegment = ((DWORD)pfbheader.ushilength << 16) + pfbheader.uslolength;
                   1690: 
                   1691:         // get a pointer to the data itself for this segment.
                   1692: 
                   1693:         pSrc = pPFBTemp + sizeof(PFBHEADER);
                   1694: 
                   1695:         // create a buffer to do the conversion into.
                   1696: 
                   1697:         if (!(pDest = (CHAR *)LocalAlloc(LPTR, cbSegment * 3)))
                   1698:         {
                   1699:             RIP("PSCRPTUI!PFBToPFA: LocalAlloc for pDest failed.\n");
                   1700:             CloseHandle(hPFAFile);
                   1701:             UnmapViewOfFile((PVOID)pPFB);
                   1702:             return(FALSE);
                   1703:         }
                   1704: 
                   1705:         // save the pointer for later use.
                   1706: 
                   1707:         pSave = pDest;
                   1708: 
                   1709:         if (pfbheader.jType == ASCII_TYPE)
                   1710:         {
                   1711:             // read in an ASCII block, convert CR's to CR/LF's and
                   1712:             // write out to the .PFA file.
                   1713: 
                   1714:             cbToWrite2 = cbSegment;      // total count of bytes written to buffer.
                   1715: 
                   1716:             for (i = 0; i < cbSegment; i++)
                   1717:             {
                   1718:                 if (0x0D == (*pDest++ = *pSrc++))
                   1719:                 {
                   1720:                     *pDest++ = (BYTE)0x0A;
                   1721:                     cbToWrite2++;
                   1722:                 }
                   1723:             }
                   1724:         }
                   1725:         else if (pfbheader.jType == BINARY_TYPE)
                   1726:         {
                   1727:             // read in a BINARY block, convert it to HEX and write
                   1728:             // out to the .PFA file.
                   1729: 
                   1730:             cbToWrite2 = cbSegment * 2;  // total count of bytes written to buffer.
                   1731: 
                   1732:             for (i = 0; i < cbSegment; i++)
                   1733:             {
                   1734:                 *pDest++ = BinaryToHex((*pSrc >> 4) & 0x0F);
                   1735:                 *pDest++ = BinaryToHex(*pSrc & 0x0F);
                   1736:                 pSrc++;
                   1737: 
                   1738:                 // output a CR/LF ever 64 bytes for readability.
                   1739: 
                   1740:                 if ((i % 32) == 31)
                   1741:                 {
                   1742:                     *pDest++ = (BYTE)0x0D;
                   1743:                     *pDest++ = (BYTE)0x0A;
                   1744:                     cbToWrite2 += 2;
                   1745:                 }
                   1746:             }
                   1747: 
                   1748:             // add a final CR/LF if non 64 byte boundary.
                   1749: 
                   1750:             if ((cbSegment % 32) != 31)
                   1751:             {
                   1752:                 *pDest++ = (BYTE)0x0D;
                   1753:                 *pDest++ = (BYTE)0x0A;
                   1754:                 cbToWrite2 += 2;
                   1755:             }
                   1756:         }
                   1757:         else
                   1758:         {
                   1759:             RIP("PSCRPTUI!PFBToPFA: PFB Header type invalid.\n");
                   1760:             SetLastError(ERROR_INVALID_DATA);
                   1761:             CloseHandle(hPFAFile);
                   1762:             UnmapViewOfFile((PVOID)pPFB);
                   1763:             LocalFree((LOCALHANDLE)pDest);
                   1764:             return(FALSE);
                   1765:         }
                   1766: 
                   1767:         // reset pointer to start of buffer.
                   1768: 
                   1769:         pDest = pSave;
                   1770: 
                   1771:         // write the buffer to the .PFA file.
                   1772: 
                   1773:         WriteFile(hPFAFile, (PVOID)pDest, (DWORD)cbToWrite2,
                   1774:                   (DWORD *)&cbWritten, (LPOVERLAPPED)NULL);
                   1775: 
                   1776:         if (cbWritten != cbToWrite2)
                   1777:         {
                   1778:             RIP("PSCRPTUI!PFBToPFA: WriteFile block to .PFA file failed.\n");
                   1779:             CloseHandle(hPFAFile);
                   1780:             UnmapViewOfFile((PVOID)pPFB);
                   1781:             LocalFree((LOCALHANDLE)pDest);
                   1782:             return(FALSE);
                   1783:         }
                   1784: 
                   1785:         // update the counter of BYTES written out to the file.
                   1786: 
                   1787:         cbPFA += cbToWrite2;
                   1788: 
                   1789:         // point to the next PFBHEADER.
                   1790: 
                   1791:         pPFBTemp += cbSegment + sizeof(PFBHEADER);
                   1792: 
                   1793:         // free up memory.
                   1794: 
                   1795:         LocalFree((LOCALHANDLE)pDest);
                   1796:     }
                   1797: 
                   1798:     // set file pointer back to the beginning of the file, and write out
                   1799:     // the size of the file as the first DWORD of the file.
                   1800: 
                   1801:     dwRet = SetFilePointer(hPFAFile, 0, 0, FILE_BEGIN);
                   1802: 
                   1803:     if (dwRet == -1)
                   1804:     {
                   1805:         RIP("PSCRPTUIPFBToPFA: SetFilePointer failed.\n");
                   1806:         CloseHandle(hPFAFile);
                   1807:         UnmapViewOfFile((PVOID)pPFB);
                   1808:         LocalFree((LOCALHANDLE)pDest);
                   1809:         return(FALSE);
                   1810:     }
                   1811: 
                   1812:     WriteFile(hPFAFile, (PVOID)&cbPFA, (DWORD)sizeof(cbPFA),
                   1813:               (DWORD *)&cbWritten, (LPOVERLAPPED)NULL);
                   1814: 
                   1815:     if (cbWritten != sizeof(cbPFA))
                   1816:     {
                   1817:         RIP("PSCRPTUI!PFBToPFA: WriteFile to .PFA file failed.\n");
                   1818:         CloseHandle(hPFAFile);
                   1819:         UnmapViewOfFile((PVOID)pPFB);
                   1820:         LocalFree((LOCALHANDLE)pDest);
                   1821:         return(FALSE);
                   1822:     }
                   1823: 
                   1824:     // close the .PFA file.
                   1825: 
                   1826:     CloseHandle(hPFAFile);
                   1827: 
                   1828:     if (!UnmapViewOfFile((PVOID)pPFB))
                   1829:         RIP("PSCRPTUI!PFBToPFA: UnmapViewOfFile failed.\n");
                   1830: 
                   1831:     return(TRUE);
                   1832: }
                   1833: 
                   1834: 
                   1835: BOOL LocateFile(hwnd, pwstrSearchFile, idString, pFileFindData, phFile)
                   1836: HWND                hwnd;
                   1837: PWSTR               pwstrSearchFile;
                   1838: int                 idString;
                   1839: WIN32_FIND_DATA    *pFileFindData;
                   1840: HANDLE             *phFile;
                   1841: {
                   1842:     WCHAR   wstringbuf[256];
                   1843:     DWORD   Value;
                   1844:     DWORD   Error;
                   1845: 
                   1846:     // see if there are any specified files in the specified directory.
                   1847: 
                   1848:     while (TRUE)
                   1849:     {
                   1850:         *phFile = FindFirstFile(pwstrSearchFile, pFileFindData);
                   1851: 
                   1852:         // if FindFirstFile failed, try to figure out why.
                   1853: 
                   1854:         if (*phFile == (HANDLE)-1)
                   1855:         {
                   1856:             Error = GetLastError();
                   1857: 
                   1858:             if ((Error == ERROR_NOT_READY) ||
                   1859:                 (Error == ERROR_NO_MEDIA_IN_DRIVE))
                   1860:                 return(FALSE);
                   1861: 
                   1862:             if (Error == ERROR_FILE_NOT_FOUND)
                   1863:             {
                   1864:                 LoadString(hModule,
                   1865:                            (idString + STRING_BASE),
                   1866:                            wstringbuf, (sizeof(wstringbuf) / 2));
                   1867: 
                   1868:                 Value = MessageBox(hwnd, wstringbuf, NULL,
                   1869:                              MB_ICONSTOP | MB_RETRYCANCEL);
                   1870: 
                   1871:                 if (Value == IDCANCEL)
                   1872:                     return(FALSE);
                   1873:             }
                   1874: 
                   1875:             if (Error == ERROR_PATH_NOT_FOUND)
                   1876:             {
                   1877:                 LoadString(hModule,
                   1878:                            (IDS_PATH_NOT_FOUND + STRING_BASE),
                   1879:                            wstringbuf, (sizeof(wstringbuf) / 2));
                   1880: 
                   1881:                 Value = MessageBox(hwnd, wstringbuf, NULL,
                   1882:                              MB_ICONSTOP | MB_RETRYCANCEL);
                   1883: 
                   1884:                 if (Value == IDCANCEL)
                   1885:                     return(FALSE);
                   1886:             }
                   1887: 
                   1888: 
                   1889: //!!! isn't this how to highlight the text in the edit box??? - kentse
                   1890: 
                   1891:             // highlight the current text in the edit box.
                   1892: 
                   1893:             SendDlgItemMessage(hwnd, IDD_NEW_FONT_DIR_EDIT_BOX,
                   1894:                                EM_SETSEL, 0, 0x7FFF0000L);
                   1895:         }
                   1896:         else
                   1897:         {
                   1898:             // FindFirstFile must have worked, continue on.
                   1899: 
                   1900:             return(TRUE);
                   1901:         }
                   1902:     }
                   1903: }

unix.superglobalmegacorp.com

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