/*++ Copyright (c) 1996 Microsoft Corporation Module Name: prnprop.c Abstract: Implementation of DDI entry points: DrvDevicePropertySheets PrinterProperties Environment: Fax driver user interface Revision History: 01/09/96 -davidx- Created it. mm/dd/yy -author- description --*/ #include "faxui.h" #include #include #include #include "resource.h" BOOL g_bUserCanChangeSettings = FALSE; BOOL g_bUserCanQuerySettings = FALSE; HANDLE g_hFaxSvcHandle = NULL; // global fax handle HANDLE g_hFaxActCtx = INVALID_HANDLE_VALUE; BOOL g_bLinkWindowRegistered = FALSE; PFAX_PORT_INFO_EX g_pFaxPortInfo = NULL; DWORD g_dwPortsNum = 0; BOOL g_bPortInfoChanged = FALSE; #define EXTRA_PAGES 3 extern HANDLE g_hModule; HANDLE CreateActivationContextFromResource(LPCTSTR pszResourceName) { TCHAR tszModuleName[MAX_PATH * 2] = {0}; ACTCTX act = {0}; // // Get the name for the module that contains the manifest resource // to create the Activation Context from. // if (!GetModuleFileName(g_hModule, tszModuleName, ARR_SIZE(tszModuleName)-1)) { return INVALID_HANDLE_VALUE; } // // Now let's try to create an activation context from manifest resource. // act.cbSize = sizeof(act); act.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; act.lpResourceName = pszResourceName; act.lpSource = tszModuleName; return CreateActCtx(&act); } // CreateActivationContextFromResource void ReleaseActivationContext() { if (INVALID_HANDLE_VALUE != g_hFaxActCtx) { ReleaseActCtx(g_hFaxActCtx); g_hFaxActCtx = INVALID_HANDLE_VALUE; } } // ReleaseActivationContext BOOL CreateFaxActivationContext() { if(INVALID_HANDLE_VALUE != g_hFaxActCtx) { // // Already created // return TRUE; } g_hFaxActCtx = CreateActivationContextFromResource(MAKEINTRESOURCE(SXS_MANIFEST_RESOURCE_ID)); return (INVALID_HANDLE_VALUE != g_hFaxActCtx); } // CreateFaxActivationContext HANDLE GetFaxActivationContext() { // // Make sure we've created our activation context. // CreateFaxActivationContext(); // Return the global. return g_hFaxActCtx; } // GetFaxActivationContext HPROPSHEETPAGE AddPropertyPage( PPROPSHEETUI_INFO pPSUIInfo, PROPSHEETPAGE *psp ) { HPROPSHEETPAGE hRes; hRes = (HPROPSHEETPAGE)(pPSUIInfo->pfnComPropSheet( pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM) psp, 0)); return hRes; } // AddPropertyPage LONG DrvDevicePropertySheets( PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam ) /*++ Routine Description: Display "Printer Properties" dialog Arguments: pPSUIInfo - Pointer to a PROPSHEETUI_INFO structure lParam - Pointer to a DEVICEPROPERTYHEADER structure Return Value: > 0 if successful, <= 0 if failed [Note:] Please refer to WinNT DDK/SDK documentation for more details. --*/ { PDEVICEPROPERTYHEADER pDPHdr; PROPSHEETPAGE psp[EXTRA_PAGES]={0}; HPROPSHEETPAGE hPropSheetPage; DWORD dwRes = 0; int iRet = 1; HANDLE hActCtx = INVALID_HANDLE_VALUE; // // Do not execute any code before this initialization // if(!InitializeDll()) { return -1; } // // Validate input parameters // if (!pPSUIInfo || !(pDPHdr = (PDEVICEPROPERTYHEADER) pPSUIInfo->lParamInit)) { Assert(FALSE); return -1; } // // Handle various cases for which this function might be called // switch (pPSUIInfo->Reason) { case PROPSHEETUI_REASON_INIT: InitializeStringTable(); memset(psp, 0, sizeof(psp)); // // Need to add a Activation Context so that Compstui will create the property page using // ComCtl v6 (i.e. so it will / can be Themed). // hActCtx = GetFaxActivationContext(); if (INVALID_HANDLE_VALUE != hActCtx) { pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_SET_FUSION_CONTEXT, (LPARAM)hActCtx, 0); } // // if the printer is remote, show a simple page // if(!IsLocalPrinter(pDPHdr->pszPrinterName)) { // // add a simple page because we need to add at least one page // psp[0].dwSize = sizeof(PROPSHEETPAGE); psp[0].hInstance = g_hResource; psp[0].lParam = (LPARAM)pDPHdr->pszPrinterName; psp[0].pszTemplate = MAKEINTRESOURCE(IDD_REMOTE_INFO); psp[0].pfnDlgProc = RemoteInfoDlgProc; if ( hPropSheetPage = AddPropertyPage(pPSUIInfo, &psp[0]) ) { pPSUIInfo->UserData = 0; pPSUIInfo->Result = CPSUI_CANCEL; goto exit; } break; } // // check the user's right to query/modify device setting, if the user doesn't have // modify permission, all controls will be disabled. // if(Connect(NULL, TRUE)) { g_bUserCanQuerySettings = FaxAccessCheckEx(g_hFaxSvcHandle, FAX_ACCESS_QUERY_CONFIG, NULL); if(ERROR_SUCCESS != GetLastError()) { dwRes = GetLastError(); Error(( "FaxAccessCheckEx(FAX_ACCESS_QUERY_CONFIG) failed with %d\n", dwRes)); goto ConnectError; } g_bUserCanChangeSettings = FaxAccessCheckEx(g_hFaxSvcHandle, FAX_ACCESS_MANAGE_CONFIG, NULL); if(ERROR_SUCCESS != GetLastError()) { dwRes = GetLastError(); Error(( "FaxAccessCheckEx(FAX_ACCESS_MANAGE_CONFIG) failed with %d\n", dwRes)); goto ConnectError; } if(g_bUserCanQuerySettings) { g_bPortInfoChanged = FALSE; if(!FaxEnumPortsEx(g_hFaxSvcHandle, &g_pFaxPortInfo, &g_dwPortsNum)) { dwRes = GetLastError(); Error(( "FaxEnumPortsEx failed with %d\n", dwRes)); goto ConnectError; } } DisConnect(); } // // Tracking page - added both in Desktop & Server SKU's // psp[1].dwSize = sizeof(PROPSHEETPAGE); psp[1].hInstance = g_hResource; psp[1].lParam = 0; psp[1].pszTemplate = MAKEINTRESOURCE(IDD_STATUS_OPTIONS); psp[1].pfnDlgProc = StatusOptionDlgProc; if (IsDesktopSKU()) { // // Devices page // psp[0].dwSize = sizeof(PROPSHEETPAGE); psp[0].hInstance = g_hResource; psp[0].lParam = 0; psp[0].pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_INFO); psp[0].pfnDlgProc = DeviceInfoDlgProc; // // Archives page // psp[2].dwSize = sizeof(PROPSHEETPAGE); psp[2].hInstance = g_hResource; psp[2].lParam = 0; psp[2].pszTemplate = MAKEINTRESOURCE(IDD_ARCHIVE_FOLDER); psp[2].pfnDlgProc = ArchiveInfoDlgProc; if(!IsSimpleUI()) { // // Add Fax Security page // hPropSheetPage = CreateFaxSecurityPage(); if(hPropSheetPage) { if(!pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_HPROPSHEETPAGE, (LPARAM)hPropSheetPage, 0)) { Error(("Failed to add Fax Security page.\n")); } } } if(g_bUserCanQuerySettings) { if (!AddPropertyPage(pPSUIInfo, &psp[0])) // Devices(desktop) { Error(("Failed to add property page")); goto exit; } if (!AddPropertyPage(pPSUIInfo, &psp[1])) // Tracking (desktop & server) { Error(("Failed to add Tracking property page")); goto exit; } if (!AddPropertyPage(pPSUIInfo, &psp[2])) // Archives(desktop) { Error(("Failed to add Archives property page")); goto exit; } } } else { // // Case of Server SKU // This page contains link to Admin Console // g_bLinkWindowRegistered = LinkWindow_RegisterClass(); if(!g_bLinkWindowRegistered) { Error(("LinkWindow_RegisterClass() failed - unable to register link window class.\n")); goto exit; } psp[0].dwSize = sizeof(PROPSHEETPAGE); psp[0].hInstance = g_hResource; psp[0].lParam = 0; psp[0].pszTemplate = MAKEINTRESOURCE(IDD_CONFIG_PROP); psp[0].pfnDlgProc = ConfigOptionDlgProc; if (!AddPropertyPage(pPSUIInfo, &psp[0])) // Fax configuration { Error(("Failed to add property page")); goto exit; } if(g_bUserCanQuerySettings) { if (!AddPropertyPage(pPSUIInfo, &psp[1])) // always Tracking { Error(("Failed to add Tracking property page")); goto exit; } } } // Added all needed pages pPSUIInfo->UserData = 0; pPSUIInfo->Result = CPSUI_CANCEL; goto exit; break; ConnectError: DisConnect(); DisplayErrorMessage(NULL, 0, dwRes); 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 = g_hResource; pPSUIHdr->IconID = IDI_CPSUI_FAX; } goto exit; case PROPSHEETUI_REASON_SET_RESULT: pPSUIInfo->Result = ((PSETRESULT_INFO) lParam)->Result; goto exit; case PROPSHEETUI_REASON_DESTROY: DeInitializeStringTable(); g_dwPortsNum = 0; FaxFreeBuffer(g_pFaxPortInfo); g_pFaxPortInfo = NULL; if(g_bLinkWindowRegistered ) { LinkWindow_UnregisterClass( g_hResource ); g_bLinkWindowRegistered = FALSE; } // // Release CFaxSecurity object // ReleaseFaxSecurity(); DisConnect(); goto exit; } exit: return iRet; } // DrvDevicePropertySheets BOOL PrinterProperties( HWND hwnd, HANDLE hPrinter ) /*++ Routine Description: Displays a printer-properties dialog box for the specified printer Arguments: hwnd - Identifies the parent window of the dialog box hPrinter - Identifies a printer object Return Value: If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. [Note:] This is the old entry point for the spooler. Even though no one should be using this, do it for compatibility. --*/ { DEVICEPROPERTYHEADER devPropHdr; DWORD result; // // Do not execute any code before this initialization // if(!InitializeDll()) { return FALSE; } memset(&devPropHdr, 0, sizeof(devPropHdr)); devPropHdr.cbSize = sizeof(devPropHdr); devPropHdr.hPrinter = hPrinter; devPropHdr.pszPrinterName = NULL; // // Decide if the caller has permission to change anything // if (! SetPrinterDataDWord(hPrinter, PRNDATA_PERMISSION, 1)) devPropHdr.Flags |= DPS_NOPERMISSION; CallCompstui(hwnd, DrvDevicePropertySheets, (LPARAM) &devPropHdr, &result); return result > 0; }