Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

316 lines
8.2 KiB

#include "stdafx.h"
#include "RoutingMethodProp.h"
#include "RoutingMethodConfig.h"
#include <faxutil.h>
#include <faxreg.h>
#include <faxres.h>
#include <PrintConfigPage.h>
#include <Util.h>
HRESULT
CPrintConfigPage::Init(
LPCTSTR lpctstrServerName,
DWORD dwDeviceId
)
{
DEBUG_FUNCTION_NAME(TEXT("CPrintConfigPage::Init"));
DWORD ec = ERROR_SUCCESS;
m_bstrServerName = lpctstrServerName;
m_dwDeviceId = dwDeviceId;
if (!m_bstrServerName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Out of memory while copying server name (ec: %ld)")
);
ec = ERROR_NOT_ENOUGH_MEMORY;
DisplayRpcErrorMessage(ERROR_NOT_ENOUGH_MEMORY, IDS_PRINT_TITLE, m_hWnd);
goto exit;
}
if (!FaxConnectFaxServer(lpctstrServerName, &m_hFax))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxConnectFaxServer failed (ec: %ld)"),
ec);
DisplayRpcErrorMessage(ec, IDS_PRINT_TITLE, m_hWnd);
goto exit;
}
//
// Retrieve the data
//
ec = ReadExtStringData (
m_hFax,
m_dwDeviceId,
REGVAL_RM_PRINTING_GUID,
m_bstrPrinter,
TEXT(""),
IDS_PRINT_TITLE,
m_hWnd);
if (ERROR_SUCCESS != ec)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("ReadExtStringData() failed. (ec: %ld)"),
ec);
goto exit;
}
exit:
if ((ERROR_SUCCESS != ec) && m_hFax)
{
if (!FaxClose(m_hFax))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxClose() failed on fax handle (0x%08X : %s). (ec: %ld)"),
m_hFax,
m_bstrServerName,
GetLastError());
}
m_hFax = NULL;
}
return HRESULT_FROM_WIN32(ec);
} // CPrintConfigPage::Init
LRESULT CPrintConfigPage::OnInitDialog(
UINT uiMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& fHandled
)
{
DEBUG_FUNCTION_NAME( _T("CPrintConfigPage::OnInitDialog"));
HINSTANCE hInst = _Module.GetResourceInstance();
SetLTRComboBox(m_hWnd, IDC_PRINTERS_COMBO);
//
// Attach controls
//
m_PrintersCombo.Attach(GetDlgItem(IDC_PRINTERS_COMBO));
m_PrintersCombo.LimitText(MAX_PATH-1);
//
// Init printers drop-down box
//
m_pPrinterNames = CollectPrinterNames (&m_dwNumOfPrinters, TRUE);
if (!m_pPrinterNames)
{
if (ERROR_PRINTER_NOT_FOUND == GetLastError ())
{
//
// No printers
//
}
else
{
//
// Real error
//
}
m_PrintersCombo.SetCurSel(-1);
m_PrintersCombo.SetWindowText(m_bstrPrinter);
}
else
{
//
// Success - fill in the combo-box
//
DWORD dw;
LPCWSTR lpcwstrMatchingText;
for (dw = 0; dw < m_dwNumOfPrinters; dw++)
{
m_PrintersCombo.AddString (m_pPrinterNames[dw].lpcwstrDisplayName);
}
//
// Now find out if we match the data the server has
//
if (lstrlen(m_bstrPrinter))
{
//
// Server has some name for printer
//
lpcwstrMatchingText = FindPrinterNameFromPath (m_pPrinterNames, m_dwNumOfPrinters, m_bstrPrinter);
if (!lpcwstrMatchingText)
{
//
// No match, just fill in the text we got from the server
//
m_PrintersCombo.SetCurSel(-1);
m_PrintersCombo.SetWindowText(m_bstrPrinter);
}
else
{
m_PrintersCombo.SelectString(-1, lpcwstrMatchingText);
}
}
else
{
//
// No server configuation - select nothing
//
}
}
m_fIsDialogInitiated = TRUE;
return 1;
}
BOOL
CPrintConfigPage::OnApply()
{
DEBUG_FUNCTION_NAME(TEXT("CPrintConfigPage::OnApply"));
if (!m_fIsDirty)
{
return TRUE;
}
//
// Get the selected printer name
//
if (!m_PrintersCombo.GetWindowText(&m_bstrPrinter))
{
DebugPrintEx( DEBUG_ERR, _T("Out of Memory - fail to set string."));
DisplayErrorMessage (IDS_PRINT_TITLE, IDS_FAIL2READPRINTER, FALSE, m_hWnd);
return FALSE;
}
//
// Check data validity
//
if (0 == m_bstrPrinter.Length())
{
DebugPrintEx( DEBUG_ERR, _T("Zero length string."));
DisplayErrorMessage (IDS_PRINT_TITLE, IDS_EMPTY_PRINTERNAME, FALSE, m_hWnd);
return FALSE;
}
//
// Attempt to convert printer name to path
//
LPCWSTR lpcwstrPrinterPath = FindPrinterPathFromName (m_pPrinterNames, m_dwNumOfPrinters, m_bstrPrinter);
if (lpcwstrPrinterPath)
{
//
// We have a matching path - replace name with path.
//
m_bstrPrinter = lpcwstrPrinterPath;
if (!m_bstrPrinter)
{
DebugPrintEx( DEBUG_ERR, _T("Out of Memory - fail to alloc string."));
DisplayErrorMessage (IDS_PRINT_TITLE, IDS_FAIL2READPRINTER, FALSE, m_hWnd);
return FALSE;
}
}
//
// Write the data using RPC
//
if (ERROR_SUCCESS != WriteExtData (m_hFax,
m_dwDeviceId,
REGVAL_RM_PRINTING_GUID,
(LPBYTE)(LPCWSTR)m_bstrPrinter,
sizeof (WCHAR) * (1 + m_bstrPrinter.Length()),
IDS_PRINT_TITLE,
m_hWnd))
{
return FALSE;
}
//
// Success
//
m_fIsDirty = FALSE;
return TRUE;
} // CPrintConfigPage::OnApply
/*
+
+
* CPrintConfigPage::OnComboChanged
-
-
*/
LRESULT
CPrintConfigPage::OnComboChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
DEBUG_FUNCTION_NAME( _T("CPrintConfigPage::OnComboChanged"));
if (!m_fIsDialogInitiated) //event was receieved in a too early stage
{
return 0;
}
else
{
switch (wNotifyCode)
{
case CBN_SELCHANGE: //assumption: all the registered printer names are valid
SetModified(TRUE);
m_fIsDirty = TRUE;
break;
case CBN_EDITCHANGE:
if ( 0 == m_PrintersCombo.GetWindowTextLength() )
{
SetModified(FALSE);
}
else
{
SetModified(TRUE);
m_fIsDirty = TRUE;
}
break;
default:
ATLASSERT(FALSE);
}
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CPrintConfigPage::OnHelpRequest
This is called in response to the WM_HELP Notify
message and to the WM_CONTEXTMENU Notify message.
WM_HELP Notify message.
This message is sent when the user presses F1 or <Shift>-F1
over an item or when the user clicks on the ? icon and then
presses the mouse over an item.
WM_CONTEXTMENU Notify message.
This message is sent when the user right clicks over an item
and then clicks "What's this?"
--*/
/////////////////////////////////////////////////////////////////////////////
LRESULT
CPrintConfigPage::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
DEBUG_FUNCTION_NAME(_T("CPrintConfigPage::OnHelpRequest"));
switch (uMsg)
{
case WM_HELP:
WinContextHelp(((LPHELPINFO)lParam)->dwContextId, m_hWnd);
break;
case WM_CONTEXTMENU:
WinContextHelp(::GetWindowContextHelpId((HWND)wParam), m_hWnd);
break;
}
return TRUE;
}