//----------------------------------------------------------------------------- // This files contains the module name for this mini driver. Each mini driver // must have a unique module name. The module name is used to obtain the // module handle of this Mini Driver. The module handle is used by the // generic library to load in tables from the Mini Driver. // It also contains Install() for upgrading 3.0 driver to 3.1. // // //----------------------------------------------------------------------------- #include "strings.h" // #define CONVERT_FROM_WIN30 char *rgchModuleName = "PCL4MSJ"; char szSoftFonts[] = "SoftFonts"; #ifdef CONVERT_FROM_WIN30 char szPrtIndex[] = "prtindex"; char szWinVer[] = "winver"; char sz310[] = "310"; char sz150[] = "150"; char sz75[] = "75"; char szNull[] = ""; char szOrient[] = "orient"; char szOrientation[] = "Orientation"; char szPaper[] = "paper"; char szPaperSize[] = "Paper Size"; char szPrtResFac[] = "prtresfac"; char szPrintQuality[] = "Print Quality"; char szTray[] = "tray"; char szDefaultSource[] = "Default Source"; char szNumCart[] = "numcart"; char szCartIndex[] = "cartindex"; char szCartridge[] = "Cartridge "; char szNumberCart[] = "Number of Cartridges"; char szFsVers[] = "fsvers"; char szFontSummary[] = "Font Summary"; // map old HPPCL's cartindex to unidrv's FONTCART index for newer cartridges. // This mapping table is created based on the old HPPCL .rc file. int rgNewCartMap[9] = {8, 7, 2, 3, 5, 6, 1, 4, 0}; #endif #define PRINTDRIVER #include "print.h" #include "gdidefs.inc" #include "mdevice.h" #define DELETE_OLD #ifndef WINNT HDC FAR PASCAL CreateIC(LPCSTR, LPCSTR, LPCSTR, const VOID FAR*); BOOL FAR PASCAL DeleteDC(HDC); #endif // !WINNT #include "unidrv.h" #ifndef WINNT extern char *rgchModuleName; // global module name // typedef for soft font installer typedef int (FAR PASCAL *SFPROC)(HWND,LPSTR,LPSTR,BOOL,int,int); short NEAR PASCAL MakeAppName(LPSTR,LPCSTR,short); #define SOFT_FONT_THRES 25 // build font summary, if over this limit #define MAX_CART_INDEX 33 #define MAX_OLD_CART 24 #define TMPSIZE 256 HINSTANCE hInst; #ifdef PRTCAPSTUFF char szPrtCaps[] = "prtcaps"; #define MAX_NUM_MODELS 24 #define MAX_MODEL_NAME 29 typedef struct { char szModel[MAX_MODEL_NAME]; int rgIndexLimit[2]; char szPrtCaps[7]; // keep as a string instead of integer to avoid // conversion because itoa doesn't work here. } MODELMAP, FAR * LPMODELMAP; //------------------------------------------------------------------- // Function: DoPrtCapsStuff(lpDevName,lpPort) // // Action: Write out PRTCAPS under [,] section // in order to be backward-compatible with existing font // packages. Note that this code can fail // under extremely low memory conditions, so be sure and check // the return values from the resource calls. //------------------------------------------------------------------- void NEAR PASCAL DoPrtCapsStuff(LPSTR lpDevName, LPSTR lpPort) { char szOldSec[64]; int i; HANDLE hMd; HANDLE hResMap; LPMODELMAP lpModelMap; lstrcpy(szOldSec,lpDevName); MakeAppName((LPSTR)szOldSec,lpPort,sizeof(szOldSec)); hMd=GetModuleHandle((LPSTR)rgchModuleName); hResMap=LoadResource(hMd,FindResource(hMd,MAKEINTRESOURCE(1),RT_RCDATA)); if(hResMap) { if(lpModelMap=(LPMODELMAP)LockResource(hResMap)) { for (i=0;i name for reading the profile data // Return the length of the actual application name. Return -1 if fails. // //------------------------------------------------------------------------------ short NEAR PASCAL MakeAppName(LPSTR lpAppName, LPCSTR lpPortName, short max) { short length, count; LPCSTR lpTmp; LPCSTR lpLastColon = NULL; length = lstrlen(lpAppName); if (!lpPortName) return length; if (length == 0 || length > max - lstrlen(lpPortName)) return -1; // insert the comma lpAppName[length++] = ','; // append the port name but do not want the last ':', if any. for (lpTmp = lpPortName ; *lpTmp; lpTmp++) if (*lpTmp == ':') lpLastColon = lpTmp; if (lpLastColon && lpLastColon == lpTmp - 1) count = lpLastColon - lpPortName; else count = lpTmp - lpPortName; lstrcpy((LPSTR)&lpAppName[length], lpPortName); length += count; lpAppName[length]='\0'; return length; } #ifdef CONVERT_FROM_WIN30 //------------------------------------------------------------------------------ // Function: itoa // // Action: This function converts the given integer into an ASCII string. // // return: The length of the string. //----------------------------------------------------------------------------- short NEAR PASCAL itoa(buf, n) LPSTR buf; short n; { short fNeg; short i, j; if (fNeg = (n < 0)) n = -n; for (i = 0; n; i++) { buf[i] = (char)(n % 10 + '0'); n /= 10; } // n was zero if (i == 0) buf[i++] = '0'; if (fNeg) buf[i++] = '-'; for (j = 0; j < i / 2; j++) { short tmp; tmp = buf[j]; buf[j] = buf[i - j - 1]; buf[i - j - 1] = (char)tmp; } buf[i] = 0; return i; } #endif //-------------------------*DevInstall*--------------------------------------- // Action: De-install, upgrade or install a device. // //---------------------------------------------------------------------------- int FAR PASCAL DevInstall(hWnd, lpDevName, lpOldPort, lpNewPort) HWND hWnd; LPSTR lpDevName; LPSTR lpOldPort, lpNewPort; { char szOldSec[64]; int nReturn=1; if (!lpDevName) return -1; if (!lpOldPort) { #ifdef CONVERT_FROM_WIN30 char szNewSec[64]; char szBuf[32]; int tmp; int i, index; HANDLE hMd; HANDLE hResMap; LPMODELMAP lpModelMap; #endif if (!lpNewPort) return 0; #ifdef CONVERT_FROM_WIN30 // install a device for the first time. Convert old HPPCL settings, // which are still under [,], into equivalent new // UNIDRV settings under [,], if applicable. // All soft fonts are left under the section [,]. lstrcpy(szOldSec,rgchModuleName); MakeAppName((LPSTR)szOldSec, lpNewPort, sizeof(szOldSec)); // if old section exists at all if (!GetProfileString(szOldSec, NULL, NULL, szBuf, sizeof(szBuf))) goto DI_exit; // make sure the old device settings are for this device. // If not, there is nothing to do here. Simply return 1. tmp = GetProfileInt(szOldSec, szPrtIndex, 0); hMd = GetModuleHandle((LPSTR)rgchModuleName); hResMap = LoadResource(hMd, FindResource(hMd, MAKEINTRESOURCE(1), RT_RCDATA)); lpModelMap = (LPMODELMAP)LockResource(hResMap); for (i = 0; i < MAX_NUM_MODELS; i++) { if (!lstrcmp(lpDevName, (LPSTR)lpModelMap[i].szModel)) { if ((tmp < lpModelMap[i].rgIndexLimit[0]) || (tmp > lpModelMap[i].rgIndexLimit[1]) ) i = MAX_NUM_MODELS; // not this model. No conversion. break; } } UnlockResource(hResMap); FreeResource(hResMap); if (i >= MAX_NUM_MODELS) // this model is not even listed in the old HPPCL driver. goto DI_exit; if (GetProfileInt(szOldSec, szWinVer, 0) == 310) goto DI_exit; WriteProfileString(szOldSec, szWinVer, sz310); #ifdef DELETE_OLD WriteProfileString(szOldSec, szPrtIndex, NULL); #endif lstrcpy(szNewSec, lpDevName); MakeAppName((LPSTR)szNewSec, lpNewPort, sizeof(szNewSec)); // convertable device settings include: copies, duplex, orient, // paper, prtresfac, tray, and cartidges. if (GetProfileString(szOldSec, szOrient, szNull, szBuf, sizeof(szBuf)) > 0) { WriteProfileString(szNewSec, szOrientation, szBuf); #ifdef DELETE_OLD WriteProfileString(szOldSec, szOrient, NULL); #endif } if (GetProfileString(szOldSec, szPaper, szNull, szBuf, sizeof(szBuf)) > 0) { WriteProfileString(szNewSec, szPaperSize, szBuf); #ifdef DELETE_OLD WriteProfileString(szOldSec, szPaper, NULL); #endif } // default to 2 if cannot find it tmp = GetProfileInt(szOldSec, szPrtResFac, 2); if (tmp == 1) WriteProfileString(szNewSec, szPrintQuality, sz150); else if (tmp == 2) WriteProfileString(szNewSec, szPrintQuality, sz75); #ifdef DELETE_OLD WriteProfileString(szOldSec, szPrtResFac, NULL); #endif if (GetProfileString(szOldSec, szTray, szNull, szBuf, sizeof(szBuf)) > 0) { WriteProfileString(szNewSec, szDefaultSource, szBuf); #ifdef DELETE_OLD WriteProfileString(szOldSec, szTray, NULL); #endif } // try to convert the cartridge information. if ((tmp = GetProfileInt(szOldSec, szNumCart, 0)) == 0) tmp = 1; // this is executed at least once { char szOldCartKey[16]; char szNewCartKey[16]; char nCart = 0; lstrcpy(szOldCartKey, szCartIndex); for (i = 0; i < tmp; i++) { if (i > 0) itoa((LPSTR)&szOldCartKey[9], i); // compose cartridge keyname under UNIDRV. lstrcpy(szNewCartKey, szCartridge); itoa((LPSTR)&szNewCartKey[10], i + 1); if ((index = GetProfileInt(szOldSec, szOldCartKey, 0)) > 0) { WriteProfileString(szOldSec, szOldCartKey, NULL); nCart++; if (index <= MAX_OLD_CART) { itoa((LPSTR)szBuf, index + 8); WriteProfileString(szNewSec, szNewCartKey, szBuf); } else if (index <= MAX_CART_INDEX) { itoa((LPSTR)szBuf, rgNewCartMap[index - MAX_OLD_CART - 1]); WriteProfileString(szNewSec, szNewCartKey, szBuf); } else { // external cartridges. Simply copy the id over. itoa((LPSTR)szBuf, index); WriteProfileString(szNewSec, szNewCartKey, szBuf); } } } // integer to ASCII string conversion. itoa((LPSTR)szBuf, nCart); WriteProfileString(szNewSec, szNumberCart, szBuf); } // delete the old font summary file WriteProfileString(szOldSec, szFsVers, NULL); if (GetProfileString(szOldSec, szFontSummary, szNull, szBuf, sizeof(szBuf)) > 0) { int hFS; // truncate the old font summary file to zero size. if ((hFS = _lcreat(szBuf, 0)) >= 0) _lclose(hFS); WriteProfileString(szOldSec, szFontSummary, NULL); } // create UNIDRV's font summary file, if there are many soft fonts. if (GetProfileInt(szOldSec, szSoftFonts, 0) > SOFT_FONT_THRES) { HDC hIC; if (hIC = CreateIC("PCL4MSJ", lpDevName, lpNewPort, NULL)) DeleteDC(hIC); } #endif } else { // move device settings from the old port to the new port, or // de-install a device, i.e. remove its device setttings in order // to compress the profile. // First, check if there is any soft font installed under the // old port. If so, warn the user to copy them over. lstrcpy(szOldSec, rgchModuleName); MakeAppName((LPSTR)szOldSec, lpOldPort, sizeof(szOldSec)); if (GetProfileInt(szOldSec, szSoftFonts, 0) > 0 && lpNewPort) { LPBYTE lpTemp; if(lpTemp=GlobalAllocPtr(GMEM_MOVEABLE,TMPSIZE)) { if(LoadString(hInst,IDS_SOFTFONTWARNING,lpTemp,TMPSIZE)) { // Use this API so that the M Box is set to the Foreground MSGBOXPARAMS mbp; mbp.cbSize = sizeof(mbp); mbp.hwndOwner = hWnd; mbp.hInstance = hInst; mbp.lpszText = lpTemp; mbp.lpszCaption = lpOldPort; mbp.dwStyle = MB_SETFOREGROUND | MB_OK | MB_ICONEXCLAMATION; mbp.lpszIcon = NULL; mbp.dwContextHelpId = 0L; mbp.lpfnMsgBoxCallback = NULL; MessageBoxIndirect(&mbp); } GlobalFreePtr (lpTemp); } } nReturn=UniDevInstall(hWnd, lpDevName, lpOldPort, lpNewPort); } #ifdef CONVERT_FROM_WIN30 DI_exit: #endif #ifdef PRTCAPSTUFF DoPrtCapsStuff(lpDevName,lpNewPort); #endif return nReturn; } // the following 3 definitions MUST be compatible with the // HPPCL font installer #define CLASS_LASERJET 0 #define CLASS_DESKJET 1 #define CLASS_DESKJET_PLUS 2 //---------------------------*InstallExtFonts*--------------------------------- // Action: call the specific font installer to add/delete/modify soft fonts // and/or external cartridges. // // Parameters: // HWND hWnd; handle to the parent windows. // LPSTR lpDeviceName; long pointer to the printer name. // LPSTR lpPortName; long pointer to the associated port name. // BOOL bSoftFonts; flag if supporting soft fonts or not. // // Return Value: // > 0 : if the font information has changed; // == 0 : if nothing has changed; // == -1 : if intending to use the universal font installer // (not available now). //------------------------------------------------------------------------- int FAR PASCAL InstallExtFonts(hWnd, lpDeviceName, lpPortName, bSoftFonts) HWND hWnd; LPSTR lpDeviceName; LPSTR lpPortName; BOOL bSoftFonts; { int fsVers; HANDLE hFIlib; SFPROC lpFIns; if ((hFIlib = LoadLibrary((LPSTR)"FINSTALL.DLL")) < 32 || !(lpFIns = (SFPROC)GetProcAddress(hFIlib,"InstallSoftFont"))) { if (hFIlib >= 32) FreeLibrary(hFIlib); #ifdef DEBUG MessageBox(0, "Can't load FINSTALL.DLL or can't get InstallSoftFont", NULL, MB_OK); #endif return TRUE; } // FINSTALL.DLL was loaded properly. Now call InstallSoftFont(). // We choose to ignore the returned fvers. No use of it. fsVers = (*lpFIns)(hWnd, rgchModuleName, lpPortName, (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0), 1, // dummy value for fvers. bSoftFonts ? CLASS_LASERJET : 256 ); FreeLibrary(hFIlib); return fsVers; } #endif // !WINNT