diff options
Diffstat (limited to 'private/mvdm/fax/wowfaxui/wfsheets.c')
-rw-r--r-- | private/mvdm/fax/wowfaxui/wfsheets.c | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/private/mvdm/fax/wowfaxui/wfsheets.c b/private/mvdm/fax/wowfaxui/wfsheets.c new file mode 100644 index 000000000..f5526faed --- /dev/null +++ b/private/mvdm/fax/wowfaxui/wfsheets.c @@ -0,0 +1,405 @@ +//************************************************************************ +// Generic Win 3.1 fax printer driver support. User Interface functions +// which are called by WINSPOOL. Support for Two new entry points required +// by the Win 95 printer UI, DrvDocumentPropertySheets and +// DrvDevicePropertySheets +// +// History: +// 24-Apr-96 reedb created. +// +//************************************************************************ + +#include "windows.h" +#include "wowfaxui.h" +#include "wfsheets.h" +#include "winspool.h" + +//************************************************************************ +// Globals +//************************************************************************ + +extern HINSTANCE ghInst; + +DEVMODEW gdmDefaultDevMode; + +LONG DrvDocumentProperties(HWND hwnd, HANDLE hPrinter, PWSTR pDeviceName, PDEVMODE pdmOut, PDEVMODE pdmIn, DWORD fMode); +LONG SimpleDocumentProperties(PDOCUMENTPROPERTYHEADER pDPHdr); + +//************************************************************************ +// NullDlgProc - Procedure for handling "Printer Properties" property +// sheet page +//************************************************************************ + +BOOL NullDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) +{ + return FALSE; +} + +//************************************************************************ +// FaxOptionsProc - Procedure for handling "Fax Options" property +// sheet page +//************************************************************************ + +BOOL FaxOptionsProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) +{ + PDEVMODE pdmOut = NULL; + PDEVMODE pdmIn = NULL; + PUIDATA pUiData; + TCHAR szFeedBack[WOWFAX_MAX_USER_MSG_LEN]; + + switch (message) { + case WM_INITDIALOG: + SetWindowLong(hDlg, DWL_USER, ((PROPSHEETPAGE *) lParam)->lParam); + return TRUE; + + case WM_COMMAND: + if (wParam == IDOK) { + SetWindowText(GetDlgItem(hDlg, IDC_FEEDBACK), L""); + + pUiData = (PUIDATA) GetWindowLong(hDlg, DWL_USER); + DrvDocumentProperties(hDlg, + pUiData->hPrinter, + pUiData->pDeviceName, + pUiData->pdmOut, + pUiData->pdmIn, + pUiData->fMode); + + // + // Provide user with feedback text. + // + if (LoadString(ghInst, WOWFAX_ENABLE_CONFIG_STR, + szFeedBack, sizeof(szFeedBack))) { + SetWindowText(GetDlgItem(hDlg, IDC_FEEDBACK), szFeedBack); + } + } + break; + + case WM_NOTIFY: + + if (((NMHDR *) lParam)->code == PSN_APPLY) { + + pUiData = (PUIDATA) GetWindowLong(hDlg, DWL_USER); + + // + // HACK: Inform common UI library that user has pressed OK + // + + pUiData->pfnComPropSheet(pUiData->hComPropSheet, + CPSFUNC_SET_RESULT, + (LONG) pUiData->hFaxOptsPage, + CPSUI_OK); + return TRUE; + + } + break; + } + + return FALSE; +} + +//************************************************************************ +// AddDocPropPages -Add our "Document Properties" pages to the property +// sheet. Returns RUE if successful, FALSE otherwise. +//************************************************************************ + +BOOL AddDocPropPages(PUIDATA pUiData) +{ + PROPSHEETPAGE psp; + LONG result; + + // + // "Document Properties" dialog only has one tab - "Fax Options" + // + + memset(&psp, 0, sizeof(psp)); + psp.dwSize = sizeof(PROPSHEETPAGE); + psp.dwFlags = 0; + psp.hInstance = ghInst; + psp.lParam = (LPARAM) pUiData; + psp.pszTemplate = MAKEINTRESOURCE(IDD_DOCPROP); + psp.pfnDlgProc = FaxOptionsProc; + + pUiData->hFaxOptsPage = (HANDLE) + pUiData->pfnComPropSheet(pUiData->hComPropSheet, + CPSFUNC_ADD_PROPSHEETPAGE, + (LPARAM) &psp, + 0); + + return (pUiData->hFaxOptsPage != NULL); +} + + +//************************************************************************ +// MyGetPrinter - Wrapper function for GetPrinter spooler API. Returns +// Pointer to a PRINTER_INFO_x structure, NULL if there is an error +//************************************************************************ + +PVOID MyGetPrinter(HANDLE hPrinter, DWORD level) +{ + PBYTE pPrinterInfo = NULL; + DWORD cbNeeded; + + if (!GetPrinter(hPrinter, level, NULL, 0, &cbNeeded) && + GetLastError() == ERROR_INSUFFICIENT_BUFFER && + (pPrinterInfo = LocalAlloc(LPTR, cbNeeded)) && + GetPrinter(hPrinter, level, pPrinterInfo, cbNeeded, &cbNeeded)) + { + return pPrinterInfo; + } + + LOGDEBUG(0, (L"GetPrinter failed\n")); + LocalFree(pPrinterInfo); + return NULL; +} + +//************************************************************************ +// FreeUiData - Free the data structure used by the fax driver user +// interface. +//************************************************************************ + +PUIDATA FreeUiData(PUIDATA pUiData) +{ + if (pUiData) { + if (pUiData->pDeviceName) LocalFree(pUiData->pDeviceName); + if (pUiData->pDriverName) LocalFree(pUiData->pDriverName); + } + return NULL; +} + +//************************************************************************ +// FillUiData - Fill in the data structure used by the fax driver user +// interface. Returns pointer to UIDATA structure, NULL if error. +//************************************************************************ + +PUIDATA FillUiData(HANDLE hPrinter, PDEVMODE pdmInput, PDEVMODE pdmOutput, DWORD fMode) +{ + PRINTER_INFO_2 *pPrinterInfo2; + PUIDATA pUiData; + + // + // Allocate memory to hold UIDATA structure + // Get printer info from the spooler. Copy the driver name. + // + + if (! (pUiData = LocalAlloc(LPTR, sizeof(UIDATA))) || + ! (pPrinterInfo2 = MyGetPrinter(hPrinter, 2)) || + ! (pUiData->pDeviceName = DupTokenW(pPrinterInfo2->pPrinterName)) || + ! (pUiData->pDriverName = DupTokenW(pPrinterInfo2->pDriverName))) { + + pUiData = FreeUiData(pUiData); + } + else { + pUiData->pdmIn = pdmInput; + pUiData->pdmOut = pdmOutput; + pUiData->fMode = fMode; + + pUiData->startUiData = pUiData->endUiData = pUiData; + pUiData->hPrinter = hPrinter; + } + + if (pPrinterInfo2) + LocalFree(pPrinterInfo2); + + return pUiData; +} + +//************************************************************************ +// DrvDocumentPropertySheets - Display "Document Properties" property +// sheets. Return > 0 if successful, <= 0 if failed. +//************************************************************************ + +LONG DrvDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) +{ + PDOCUMENTPROPERTYHEADER pDPHdr; + PCOMPROPSHEETUI pCompstui; + PUIDATA pUiData; + LONG result; + + // + // Validate input parameters + // + if (! (pDPHdr = (PDOCUMENTPROPERTYHEADER) (pPSUIInfo ? pPSUIInfo->lParamInit : lParam))) { + return -1; + } + + if (pPSUIInfo == NULL) { + return SimpleDocumentProperties(pDPHdr); + } + + // + // Create a UIDATA structure if necessary + // + + pUiData = (pPSUIInfo->Reason == PROPSHEETUI_REASON_INIT) ? + FillUiData(pDPHdr->hPrinter, pDPHdr->pdmIn, pDPHdr->pdmOut, pDPHdr->fMode) : + (PUIDATA) pPSUIInfo->UserData; + + if (! ValidUiData(pUiData)) + return -1; + + // + // Handle various cases for which this function might be called + // + + switch (pPSUIInfo->Reason) { + + case PROPSHEETUI_REASON_INIT: + + pUiData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUiData->hComPropSheet = pPSUIInfo->hComPropSheet; + + // + // Add our page to the property sheet + // + + if (AddDocPropPages(pUiData)) { + + pPSUIInfo->UserData = (DWORD) pUiData; + pPSUIInfo->Result = CPSUI_CANCEL; + return 1; + } + + // + // Clean up properly in case of an error + // + + FreeUiData(pUiData); + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + + { PPROPSHEETUI_INFO_HEADER pPSUIHdr; + + pPSUIHdr = (PPROPSHEETUI_INFO_HEADER) lParam; + pPSUIHdr->Flags = PSUIHDRF_PROPTITLE | PSUIHDRF_NOAPPLYNOW; + pPSUIHdr->pTitle = pDPHdr->pszPrinterName; + pPSUIHdr->hInst = ghInst; + pPSUIHdr->IconID = IDI_CPSUI_PRINTER2; + } + return 1; + + case PROPSHEETUI_REASON_SET_RESULT: + + pPSUIInfo->Result = ((PSETRESULT_INFO) lParam)->Result; + return 1; + + case PROPSHEETUI_REASON_DESTROY: + + // + // Cleanup properly before exiting + // + + FreeUiData(pUiData); + return 1; + } + return -1; +} + +//************************************************************************ +// DrvDevicePropertySheets - Display "Printer Properties" dialog. +// Return > 0 if successful, <= 0 if failed. +//************************************************************************ + +LONG DrvDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) +{ + PDEVICEPROPERTYHEADER pDPHdr; + PCOMPROPSHEETUI pCompstui; + PROPSHEETPAGE psp; + LONG result; + + // + // Validate input parameters + // + LOGDEBUG(1,(L"DrvDevicePropertySheets: %d\n", pPSUIInfo->Reason)); + + if (!pPSUIInfo || !(pDPHdr = (PDEVICEPROPERTYHEADER) pPSUIInfo->lParamInit)) { + return -1; + } + + // + // Handle various cases for which this function might be called + // + + switch (pPSUIInfo->Reason) { + + case PROPSHEETUI_REASON_INIT: + // + // "Printer Properties" dialog only has one dummy tab + // + + memset(&psp, 0, sizeof(psp)); + psp.dwSize = sizeof(PROPSHEETPAGE); + psp.dwFlags = 0; + psp.hInstance = ghInst; + + psp.pszTemplate = MAKEINTRESOURCE(IDD_NULLPROP); + psp.pfnDlgProc = NullDlgProc; + + if (pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, + CPSFUNC_ADD_PROPSHEETPAGE, + (LPARAM) &psp, + 0)) + { + pPSUIInfo->Result = CPSUI_CANCEL; + return 1; + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { PPROPSHEETUI_INFO_HEADER pPSUIHdr; + + pPSUIHdr = (PPROPSHEETUI_INFO_HEADER) lParam; + pPSUIHdr->Flags = PSUIHDRF_PROPTITLE | PSUIHDRF_NOAPPLYNOW; + pPSUIHdr->pTitle = pDPHdr->pszPrinterName; + pPSUIHdr->hInst = ghInst; + pPSUIHdr->IconID = IDI_CPSUI_FAX; + } + return 1; + + case PROPSHEETUI_REASON_SET_RESULT: + pPSUIInfo->Result = ((PSETRESULT_INFO) lParam)->Result; + return 1; + + case PROPSHEETUI_REASON_DESTROY: + return 1; + } + + return -1; +} + +LONG +SimpleDocumentProperties(PDOCUMENTPROPERTYHEADER pDPHdr) + +/*++ + +Routine Description: + + Handle simple "Document Properties" where we don't need to display + a dialog and therefore don't have to have common UI library involved + +Arguments: + + pDPHdr - Points to a DOCUMENTPROPERTYHEADER structure + +Return Value: + + > 0 if successful, <= 0 otherwise + +--*/ + +{ + LONG lRet; + + lRet = DrvDocumentProperties(NULL, + pDPHdr->hPrinter, + pDPHdr->pszPrinterName, + pDPHdr->pdmOut, + pDPHdr->pdmIn, + pDPHdr->fMode); + + if (pDPHdr->fMode == 0 || pDPHdr->pdmOut == NULL) { + pDPHdr->cbOut = lRet; + } + + return lRet; +} |