summaryrefslogtreecommitdiffstats
path: root/private/mvdm/fax/wowfaxui/wfupgrad.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/fax/wowfaxui/wfupgrad.c')
-rw-r--r--private/mvdm/fax/wowfaxui/wfupgrad.c264
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);
+}
+