diff options
Diffstat (limited to 'private/mvdm/fax/wowfaxui/wfupgrad.c')
-rw-r--r-- | private/mvdm/fax/wowfaxui/wfupgrad.c | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/private/mvdm/fax/wowfaxui/wfupgrad.c b/private/mvdm/fax/wowfaxui/wfupgrad.c new file mode 100644 index 000000000..b382d605e --- /dev/null +++ b/private/mvdm/fax/wowfaxui/wfupgrad.c @@ -0,0 +1,264 @@ +//************************************************************************ +// Generic Win 3.1 fax printer driver support. User Interface helper +// functions which are called in WOWFAXUI.C, helpers used during upgrade. +// +// History: +// 14-mar-95 reedb Created. These were moved from WOWFAXUI.C. +// +//************************************************************************ + +#include "windows.h" +#include "wowfaxui.h" +#include "winspool.h" + +extern LPCRITICAL_SECTION lpCriticalSection; +extern HINSTANCE ghInst; + +//************************************************************************ +// AllocPathW - Helper for DrvUpgradePrinter and friends. +//************************************************************************ + +PWSTR AllocPathW(VOID) +{ + PWSTR szTmp; + + szTmp = WFLOCALALLOC((MAX_PATH+1) * sizeof(TCHAR), L"AllocPathW"); + return(szTmp); +} + +//************************************************************************ +// BuildPathW - Helper for DrvUpgradePrinter and friends. +//************************************************************************ + +PWSTR BuildPathW(PWSTR szPath, PWSTR szFileName) +{ + PWSTR szTmp; + + if ((szTmp = WFLOCALALLOC((MAX_PATH+1) * sizeof(TCHAR), L"BuildPathW")) != NULL) { + wcscpy(szTmp, szPath); + wcscat(szTmp, L"\\"); + wcscat(szTmp, szFileName); + return(szTmp); + } + else { + return(NULL); + } +} + +//************************************************************************ +// MyGetFileTime - Helper for DrvUpgradePrinter and friends. +//************************************************************************ + +BOOL MyGetFileTime(PWSTR szDir, PWSTR szName, LPFILETIME lpFileTime) +{ + LPWIN32_FIND_DATA lpfd; + HANDLE hfd; + PWSTR szTmp; + BOOL bRet = FALSE; + + + szTmp = BuildPathW(szDir, szName); + lpfd = WFLOCALALLOC(sizeof(WIN32_FIND_DATA), L"MyGetFileTime"); + + if ((szTmp) && (lpfd)) { + LOGDEBUG(1, (L"WOWFAXUI!GetFileTime, szTmp: %s\n", szTmp)); + if ((hfd = FindFirstFile(szTmp, lpfd)) != INVALID_HANDLE_VALUE) { + memcpy(lpFileTime, &(lpfd->ftLastWriteTime), sizeof(FILETIME)); + FindClose(hfd); + bRet = TRUE; + LOGDEBUG(1, (L"WOWFAXUI!GetFileTime, FileTimeHi: %X FileTimeLo: %X\n", lpFileTime->dwHighDateTime, lpFileTime->dwLowDateTime)); + } + else { + LOGDEBUG(0, (L"WOWFAXUI!GetFileTime, file not found: %s\n", szTmp)); + } + } + + if (szTmp) { + LocalFree(szTmp); + } + if (lpfd) { + LocalFree(lpfd); + } + return(bRet); +} + +//************************************************************************ +// CheckForNewerFiles - Helper for DrvUpgradePrinter. Compares the date/time +// of wowfaxui.dll and wowfax.dll in the two passed directories. Returns +// FALSE if files in szOldDriverDir are the same or newer than those +// in szSysDir. Otherwise returns non-zero. +//************************************************************************ + +BOOL CheckForNewerFiles(PWSTR szOldDriverDir, PWSTR szSysDir) +{ + FILETIME ftSourceDriver, ftCurrentDriver; + BOOL bRet = FALSE; + + if ((szOldDriverDir) && (szSysDir)) { + if (MyGetFileTime(szOldDriverDir, L"wowfax.dll", &ftCurrentDriver)) { + if (MyGetFileTime(szSysDir, L"wowfax.dll", &ftSourceDriver)) { + // Check time/date to see if we need to update the drivers. + if (CompareFileTime(&ftSourceDriver, &ftCurrentDriver) > 0) { + bRet = TRUE; + } + } + } + if (MyGetFileTime(szOldDriverDir, L"wowfaxui.dll", &ftCurrentDriver)) { + if (MyGetFileTime(szSysDir, L"wowfaxui.dll", &ftSourceDriver)) { + if (CompareFileTime(&ftSourceDriver, &ftCurrentDriver) > 0) { + bRet = TRUE; + } + } + } + } + else { + LOGDEBUG(0, (L"WOWFAXUI!CheckForNewerFiles: NULL directory parameters\n")); + } + + return(bRet); +} + +//************************************************************************ +// DoUpgradePrinter - Called by DrvUpgradePrinter which is called in the +// system context by the spooler. +//************************************************************************ + +BOOL DoUpgradePrinter(DWORD dwLevel, LPDRIVER_UPGRADE_INFO_1W lpDrvUpgradeInfo) +{ + static BOOL bDrvUpgradePrinterLock = FALSE; + HANDLE hPrinter = NULL; + DRIVER_INFO_2 DriverInfo, *pDriverInfo = NULL; + DWORD dwNeeded = 0; + PWSTR szSysDir = NULL; + PWSTR szDstDir = NULL; + PWSTR szSrcPath = NULL; + PWCHAR pwc; + BOOL bRet = FALSE; + TCHAR szName[WOWFAX_MAX_USER_MSG_LEN] = L""; + + // Check for correct level for upgrade. + if (dwLevel != 1) { + LOGDEBUG(0, (L"WOWFAXUI!DrvUpgradePrinter, Bad input Level\n")); + SetLastError(ERROR_INVALID_LEVEL); + goto DoUpgradePrinterExit; + } + + szDstDir = AllocPathW(); + szSysDir = AllocPathW(); + if (!szDstDir || !szSysDir) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, work space allocation failed\n")); + goto DoUpgradePrinterExit; + } + + if (!GetSystemDirectory(szSysDir, MAX_PATH+1)) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetSystemDirectory failed\n")); + goto DoUpgradePrinterExit; + } + + if (!lpDrvUpgradeInfo->pPrinterName) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, pPrinterName is NULL\n")); + goto DoUpgradePrinterExit; + } + + // Get the paths to the old printer drivers. + if (!OpenPrinter(lpDrvUpgradeInfo->pPrinterName, &hPrinter, NULL)) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, Unable to open: %s\n", lpDrvUpgradeInfo->pPrinterName)); + goto DoUpgradePrinterExit; + } + + GetPrinterDriver(hPrinter, NULL, 2, (LPBYTE) pDriverInfo, 0, &dwNeeded); + + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriver failed\n")); + goto DoUpgradePrinterExit; + } + + if ((pDriverInfo = WFLOCALALLOC(dwNeeded, L"DoUpgradePrinter")) == NULL) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, work space allocation failed\n")); + goto DoUpgradePrinterExit; + } + + if (!GetPrinterDriver(hPrinter, NULL, 2, (LPBYTE) pDriverInfo, dwNeeded, &dwNeeded)) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriver failed, GetLastError: %d\n", GetLastError())); + goto DoUpgradePrinterExit; + } + ClosePrinter(hPrinter); + + // Strip off the file name. + if ((pwc = wcsrchr(pDriverInfo->pDriverPath, L'\\')) == NULL) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, unable to strip file name\n")); + goto DoUpgradePrinterExit; + } + *pwc = UNICODE_NULL; + + // Install new printer driver if it's more recent than the old one. + if (CheckForNewerFiles(pDriverInfo->pDriverPath, szSysDir)) { + LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, Doing driver update\n")); + memset(&DriverInfo, 0, sizeof(DRIVER_INFO_2)); + + if (!GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE) szDstDir, MAX_PATH, &dwNeeded)) { + LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriverDirectory failed\n")); + goto DoUpgradePrinterExit; + } + + // This is a dummy. We've no data file, but spooler won't take NULL. + DriverInfo.pDataFile = BuildPathW(szDstDir, WOWFAX_DLL_NAME); + DriverInfo.pDriverPath = BuildPathW(szDstDir, WOWFAX_DLL_NAME); + LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, pDriverPath = %s\n", DriverInfo.pDataFile)); + if (DriverInfo.pDriverPath) { + szSrcPath = BuildPathW(szSysDir, WOWFAX_DLL_NAME); + if (szSrcPath) { + CopyFile(szSrcPath, DriverInfo.pDriverPath, FALSE); + LocalFree(szSrcPath); + } + } + + DriverInfo.pConfigFile = BuildPathW(szDstDir, WOWFAXUI_DLL_NAME); + szSrcPath = BuildPathW(szSysDir, WOWFAXUI_DLL_NAME); + if (DriverInfo.pConfigFile) { + if (szSrcPath) { + CopyFile(szSrcPath, DriverInfo.pConfigFile, FALSE); + LocalFree(szSrcPath); + } + } + + // Install the printer driver. + DriverInfo.cVersion = 1; + if (LoadString(ghInst, WOWFAX_NAME_STR, szName, WOWFAX_MAX_USER_MSG_LEN)) { + DriverInfo.pName = szName; + if (AddPrinterDriver(NULL, 2, (LPBYTE) &DriverInfo) == FALSE) { + bRet = (GetLastError() == ERROR_PRINTER_DRIVER_ALREADY_INSTALLED); + } + else { + bRet = TRUE; + } + } + if (DriverInfo.pDataFile) { + LocalFree(DriverInfo.pDataFile); + } + if (DriverInfo.pDriverPath) { + LocalFree(DriverInfo.pDriverPath); + } + if (DriverInfo.pConfigFile) { + LocalFree(DriverInfo.pConfigFile); + } + } + else { + LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, No driver update\n")); + bRet = TRUE; + } + +DoUpgradePrinterExit: + if (szDstDir) { + LocalFree(szDstDir); + } + if (szSysDir) { + LocalFree(szSysDir); + } + if (pDriverInfo) { + LocalFree(pDriverInfo); + } + + return(bRet); +} + |