windows-nt/Source/XPSP1/NT/printscan/fax/admin/routeext/route.cpp
2020-09-26 16:20:57 +08:00

779 lines
19 KiB
C++

#include "stdafx.h"
#include "routeext.h"
#include "Route.h"
#include "faxhelp.h"
#include <atl21\atlwin.cpp>
#define MyHideWindow(_hwnd) ::SetWindowLong((_hwnd),GWL_STYLE,::GetWindowLong((_hwnd),GWL_STYLE)&~WS_VISIBLE)
/////////////////////////////////////////////////////////////////////////////
// CRouteComponentData
static const GUID CRouteGUID_NODETYPE =
{ 0xde58ae00, 0x4c0f, 0x11d1, { 0x90, 0x83, 0x0, 0xa0, 0xc9, 0xa, 0xb5, 0x4}};
const GUID* CRouteData::m_NODETYPE = &CRouteGUID_NODETYPE;
const TCHAR* CRouteData::m_SZNODETYPE = _T("de58ae00-4c0f-11d1-9083-00a0c90ab504");
const TCHAR* CRouteData::m_SZDISPLAY_NAME = _T("CRoute");
const CLSID* CRouteData::m_SNAPIN_CLASSID = &CLSID_Route;
static const LPCWSTR RoutingGuids[RM_COUNT] = {
L"{6bbf7bfe-9af2-11d0-abf7-00c04fd91a4e}", // RM_EMAIL
L"{9d3d0c32-9af2-11d0-abf7-00c04fd91a4e}", // RM_INBOX
L"{92041a90-9af2-11d0-abf7-00c04fd91a4e}", // RM_FOLDER
L"{aec1b37c-9af2-11d0-abf7-00c04fd91a4e}" // RM_PRINT
};
static const ULONG_PTR RoutingHelpIds[] = {
IDC_ROUTE_TITLE, IDH_Fax_Modem_Routing_InboundRouting_GRP,
IDC_PRINT, IDH_Fax_Modem_Routing_PrintTo,
IDC_PRINT_TO, IDH_Fax_Modem_Routing_PrintTo,
IDC_SAVE, IDH_Fax_Modem_Routing_SaveInFolder,
IDC_INBOX, IDH_Fax_Modem_Routing_SendToLocalInbox,
IDC_INBOX_PROFILE, IDH_Fax_Modem_Routing_ProfileName,
IDC_INBOX_LABEL, IDH_Fax_Modem_Routing_ProfileName,
IDC_DEST_FOLDER, IDH_Fax_Modem_Routing_SaveInFolder,
IDC_BROWSE_DIR, IDH_Fax_Modem_Routing_SaveInFolder,
IDC_EMAIL, IDH_Fax_Modem_Routing_SendToLocalInbox,
0, 0
};
CRoutePage::CRoutePage(
TCHAR* pTitle,
HANDLE FaxHandle,
DWORD DeviceId,
LPWSTR ComputerName
) : CPropertyPageImpl<CRoutePage> (pTitle)
{
DWORD rc = ERROR_SUCCESS;
DWORD cMethods = 0;
m_FaxHandle = FaxHandle;
m_DeviceId = DeviceId;
m_BaseMethod = NULL;
m_PortHandle = NULL;
wcscpy( m_ComputerName, ComputerName );
m_MapiProfiles = NULL;
if (!FaxGetMapiProfiles(m_FaxHandle, &m_MapiProfiles)) {
m_MapiProfiles = NULL;
}
wcsncpy( m_Title, pTitle, MAX_TITLE_LEN);
m_bChanged = FALSE;
if (!FaxOpenPort( m_FaxHandle, m_DeviceId, PORT_OPEN_QUERY, &m_PortHandle )) {
rc = GetLastError();
goto exit;
}
if (!FaxEnumRoutingMethods( m_PortHandle, &m_BaseMethod, &cMethods )) {
rc = GetLastError();
} else {
DWORD CurrentRM;
DWORD i;
for (CurrentRM = RM_EMAIL; CurrentRM < RM_COUNT; CurrentRM++) {
m_RoutingMethods[CurrentRM] = NULL;
for (i = 0; i < cMethods; i++) {
if (_wcsicmp( m_BaseMethod[i].Guid, RoutingGuids[CurrentRM] ) == 0) {
m_RoutingMethods[CurrentRM] = &m_BaseMethod[i];
if (!FaxGetRoutingInfo( m_PortHandle, m_BaseMethod[i].Guid, &m_RoutingInfo[CurrentRM], &m_RoutingInfoSize[CurrentRM] )) {
m_RoutingMethods[CurrentRM]->Enabled = FALSE;
}
break;
}
}
}
}
exit:
if (rc != ERROR_SUCCESS) {
SystemErrorMsg( rc );
}
if (m_PortHandle) {
FaxClose(m_PortHandle);
m_PortHandle = NULL;
}
}
HRESULT
CRouteData::CreatePropertyPages(
LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle,
IUnknown* pUnk
)
{
UINT cf = RegisterClipboardFormat(L"CF_FAX_DEVICE");
HRESULT hr = S_OK;
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL};
FORMATETC formatetc = { (CLIPFORMAT)cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
LPSTREAM lpStream;
DWORD cbytes;
HANDLE FaxHandle;
DWORD DeviceId;
WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
WCHAR Title[MAX_TITLE_LEN];
do
{
// Allocate memory for the stream
stgmedium.hGlobal = GlobalAlloc(GMEM_SHARE, 128);
if (!stgmedium.hGlobal) {
ATLTRACE(_T("Out of memory\n"));
hr = E_OUTOFMEMORY;
break;
}
hr = m_pDataObject->GetDataHere(&formatetc, &stgmedium);
if (FAILED(hr)) {
break;
}
} while (0);
if (FAILED(hr)) {
return(hr);
}
// this also frees the memory pointed to by stgmedium.hGlobal
CreateStreamOnHGlobal( stgmedium.hGlobal, TRUE, &lpStream );
lpStream->Read( (LPVOID) &FaxHandle, sizeof(DWORD), &cbytes );
lpStream->Read( (LPVOID) &DeviceId, sizeof(DWORD), &cbytes );
lpStream->Read( (LPVOID) ComputerName, sizeof(ComputerName), &cbytes );
lpStream->Release();
LoadString(_Module.m_hInst, IDS_TITLE, Title, MAX_TITLE_LEN);
CRoutePage* pPage = new CRoutePage(Title, FaxHandle, DeviceId, ComputerName);
if (!pPage) {
return(E_OUTOFMEMORY);
}
lpProvider->AddPage(pPage->Create());
return(S_OK);
}
LRESULT
CRoutePage::OnInitDialog(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
for (int i = 0; i < RM_COUNT; i++) {
BOOL Enabled;
LPWSTR CurSel;
HWND hControl;
PPRINTER_INFO_2 pPrinterInfo2, pSaved;
DWORD cPrinters, dwFlags;
Enabled = m_RoutingMethods[i]->Enabled;
CurSel = (LPWSTR) (m_RoutingInfo[i] + sizeof(DWORD));
SetChangedFlag( FALSE );
switch (i) {
case RM_EMAIL:
MyHideWindow( GetDlgItem( IDC_EMAIL ));
break;
if (MAPIENABLED) {
CheckDlgButton( IDC_EMAIL, Enabled ? BST_CHECKED : BST_UNCHECKED );
} else {
MyHideWindow( GetDlgItem( IDC_EMAIL ) );
}
break;
case RM_INBOX:
if (MAPIENABLED) {
::SendMessage( hControl = GetDlgItem( IDC_INBOX_PROFILE ), CB_RESETCONTENT, 0, 0 );
CheckDlgButton( IDC_INBOX, Enabled ? BST_CHECKED : BST_UNCHECKED );
::EnableWindow( GetDlgItem( IDC_INBOX_LABEL ), Enabled );
::EnableWindow( hControl, Enabled );
EnumMapiProfiles( hControl );
::SendMessage( hControl, CB_SETCURSEL, 0, 0 );
if (*CurSel) {
::SendMessage( hControl, CB_SELECTSTRING, 0, (LPARAM) CurSel );
}
} else {
::EnableWindow( GetDlgItem( IDC_INBOX ), FALSE );
::EnableWindow( GetDlgItem( IDC_INBOX_LABEL ), FALSE );
::EnableWindow( GetDlgItem( IDC_INBOX_PROFILE ), FALSE );
}
break;
case RM_FOLDER:
CheckDlgButton( IDC_SAVE, Enabled ? BST_CHECKED : BST_UNCHECKED );
::EnableWindow( GetDlgItem( IDC_DEST_FOLDER ), Enabled );
::EnableWindow( GetDlgItem( IDC_BROWSE_DIR ), Enabled );
SendDlgItemMessage( IDC_DEST_FOLDER, EM_SETLIMITTEXT, MAX_PATH - 16, 0 );
if (*CurSel) {
SetDlgItemText( IDC_DEST_FOLDER, CurSel );
}
break;
case RM_PRINT:
BOOL bPrinters = FALSE;
dwFlags = m_ComputerName[0] ?
PRINTER_ENUM_NAME :
(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS);
hControl = GetDlgItem( IDC_PRINT_TO );
pPrinterInfo2 = (PPRINTER_INFO_2) MyEnumPrinters(m_ComputerName, 2, &cPrinters, dwFlags);
if (pSaved = pPrinterInfo2) {
//
// Filtering out fax printers from the list
//
for ( ; cPrinters--; pPrinterInfo2++) {
if (_wcsicmp(pPrinterInfo2->pDriverName, FAX_DRIVER_NAME) != 0) {
::SendMessage( hControl, CB_ADDSTRING, 0, (LPARAM) pPrinterInfo2->pPrinterName);
bPrinters = TRUE;
}
}
MemFree(pSaved);
}
CheckDlgButton( IDC_PRINT, (Enabled && bPrinters) ? BST_CHECKED : BST_UNCHECKED );
::EnableWindow( GetDlgItem(IDC_PRINT), bPrinters);
if (*CurSel) {
::SendMessage( hControl, CB_SELECTSTRING, 0, (LPARAM) CurSel );
} else {
::SendMessage( hControl, CB_SETCURSEL, 0, 0 );
}
::EnableWindow( GetDlgItem( IDC_PRINT_TO ), (Enabled && bPrinters) );
break;
}
}
::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, PSWIZB_FINISH);
return 1;
}
LRESULT
CRoutePage::OnEmail(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
SetChangedFlag( TRUE );
return 1;
}
LRESULT
CRoutePage::OnPrint(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
::EnableWindow( GetDlgItem( IDC_PRINT_TO ), IsDlgButtonChecked( id ) == BST_CHECKED ? TRUE : FALSE );
SetChangedFlag( TRUE );
return 1;
}
LRESULT
CRoutePage::OnPrintTo(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
if (code == CBN_SELCHANGE) {
SetChangedFlag( TRUE );
}
return 1;
}
LRESULT
CRoutePage::OnSaveTo(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
::EnableWindow( GetDlgItem( IDC_DEST_FOLDER ), IsDlgButtonChecked( id ) == BST_CHECKED ? TRUE : FALSE );
::EnableWindow( GetDlgItem( IDC_BROWSE_DIR ), IsDlgButtonChecked( id ) == BST_CHECKED ? TRUE : FALSE );
SetChangedFlag( TRUE );
return 1;
}
LRESULT
CRoutePage::OnInbox(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
::EnableWindow( GetDlgItem( IDC_INBOX_PROFILE ), IsDlgButtonChecked( id ) == BST_CHECKED ? TRUE : FALSE );
::EnableWindow( GetDlgItem( IDC_INBOX_LABEL ), IsDlgButtonChecked( id ) == BST_CHECKED ? TRUE : FALSE );
SetChangedFlag( TRUE );
return 1;
}
LRESULT
CRoutePage::OnProfile(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
if (code == CBN_SELCHANGE) {
SetChangedFlag( TRUE );
}
return 1;
}
LRESULT
CRoutePage::OnDestDir(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
if (code == EN_UPDATE) {
SetChangedFlag( TRUE );
}
return 1;
}
LRESULT
CRoutePage::OnBrowseDir(
INT code,
INT id,
HWND hwnd,
BOOL& bHandled
)
{
BrowseForDirectory();
return 1;
}
#define INFO_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(DWORD))
BOOL
CRoutePage::OnApply()
{
BYTE SetInfo[RM_COUNT][INFO_SIZE];
LPWSTR lpCurSel;
LPDWORD Enabled;
DWORD ec;
DWORD OneEnabled = 0;
DWORD i;
if (!m_bChanged) {
return TRUE;
}
for (i = 0; i < RM_COUNT; i++) {
INT SelIndex;
HWND hControl;
lpCurSel = (LPWSTR)(SetInfo[i] + sizeof(DWORD));
Enabled = (LPDWORD) SetInfo[i];
*Enabled = 0;
ZeroMemory( lpCurSel, MAX_PATH * sizeof(WCHAR) );
switch (i) {
case RM_PRINT:
*Enabled = (IsDlgButtonChecked( IDC_PRINT ) == BST_CHECKED);
if (*Enabled) {
SelIndex = (INT)::SendMessage( hControl = GetDlgItem( IDC_PRINT_TO ), CB_GETCURSEL, 0, 0 );
if (SelIndex != CB_ERR) {
::SendMessage( hControl, CB_GETLBTEXT, SelIndex, (LPARAM) lpCurSel );
} else {
lpCurSel[0] = 0;
}
if (lpCurSel[0] == 0) {
DisplayMessageDialog( 0, IDS_PRINT_TO );
return FALSE;
}
}
break;
case RM_EMAIL:
if (!MAPIENABLED) {
break;
}
*Enabled = (IsDlgButtonChecked( IDC_EMAIL ) == BST_CHECKED);
break;
case RM_INBOX:
if (!MAPIENABLED) {
break;
}
*Enabled = (IsDlgButtonChecked( IDC_INBOX ) == BST_CHECKED);
if (*Enabled) {
SelIndex = (INT)::SendMessage( hControl = GetDlgItem( IDC_INBOX_PROFILE ), CB_GETCURSEL, 0, 0 );
if (SelIndex != CB_ERR) {
::SendMessage( hControl, CB_GETLBTEXT, SelIndex, (LPARAM) lpCurSel );
} else {
lpCurSel[0] = 0;
}
if (lpCurSel[0] == 0) {
DisplayMessageDialog( 0, IDS_INBOX_PROFILE );
return FALSE;
}
}
break;
case RM_FOLDER:
*Enabled = (IsDlgButtonChecked( IDC_SAVE ) == BST_CHECKED);
if (*Enabled) {
GetDlgItemText( IDC_DEST_FOLDER, lpCurSel, MAX_PATH - 1 );
if (lpCurSel[0] == 0) {
DisplayMessageDialog( 0, IDS_DEST_FOLDER );
return FALSE;
}
}
}
OneEnabled |= *Enabled;
}
if (!OneEnabled) {
DisplayMessageDialog( 0, IDS_ONE_ENABLE );
return FALSE;
}
if (!FaxOpenPort( m_FaxHandle, m_DeviceId, PORT_OPEN_QUERY | PORT_OPEN_MODIFY, &m_PortHandle )) {
ec = GetLastError();
DisplayMessageDialog( 0, IDS_CANT_SAVE );
return FALSE;
}
ec = ERROR_SUCCESS;
for (i = 0; i < RM_COUNT; i++) {
Enabled = (LPDWORD) SetInfo[i];
if (!FaxEnableRoutingMethod(
m_PortHandle,
m_RoutingMethods[i]->Guid,
*Enabled
)) {
ec = GetLastError();
DisplayMessageDialog( 0, IDS_CANT_SAVE );
if (ec == ERROR_ACCESS_DENIED) {
break;
}
}
else if (*Enabled && i!= RM_EMAIL && !FaxSetRoutingInfo(
m_PortHandle,
m_RoutingMethods[i]->Guid,
&SetInfo[i][0],
INFO_SIZE)) {
ec = GetLastError();
DisplayMessageDialog( 0, IDS_CANT_SAVE );
if (ec == ERROR_ACCESS_DENIED) {
break;
}
}
}
if (m_PortHandle) {
FaxClose( m_PortHandle );
m_PortHandle = NULL;
}
return (ec == ERROR_SUCCESS);
}
VOID
CRoutePage::SystemErrorMsg(
DWORD ErrorCode
)
{
LPTSTR lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox( lpMsgBuf, m_Title );
MemFree( lpMsgBuf );
}
VOID
CRoutePage::EnumMapiProfiles(
HWND hwnd
)
/*++
Routine Description:
Put the mapi profiles in the combo box
Arguments:
hwnd - window handle to mapi profiles combo box
Return Value:
NONE
--*/
{
LPWSTR MapiProfiles;
MapiProfiles = (LPWSTR) m_MapiProfiles;
while (MapiProfiles && *MapiProfiles) {
::SendMessage(
hwnd,
CB_ADDSTRING,
0,
(LPARAM) MapiProfiles
);
MapiProfiles += wcslen(MapiProfiles) + 1;
}
}
VOID
CRoutePage::SetChangedFlag(
BOOL Flag
)
{
PropSheet_Changed( GetParent(), m_hWnd );
m_bChanged = TRUE;
}
INT
CRoutePage::DisplayMessageDialog(
INT titleStrId,
INT formatStrId,
UINT type
)
/*++
Routine Description:
Display a message dialog box
Arguments:
hwndParent - Specifies a parent window for the error message dialog
type - Specifies the type of message box to be displayed
titleStrId - Title string (could be a string resource ID)
formatStrId - Message format string (could be a string resource ID)
...
Return Value:
Same as the return value from MessageBox
--*/
{
LPWSTR pTitle, pFormat, pMessage;
INT result;
pTitle = pFormat = pMessage = NULL;
if ((pTitle = (LPWSTR)MemAlloc(MAX_TITLE_LEN * sizeof(WCHAR))) &&
(pFormat = (LPWSTR)MemAlloc(MAX_STRING_LEN * sizeof(WCHAR))) &&
(pMessage = (LPWSTR)MemAlloc(MAX_MESSAGE_LEN * sizeof(WCHAR)))) {
//
// Load dialog box title string resource
//
if (titleStrId == 0)
titleStrId = IDS_ERROR_DLGTITLE;
LoadString(_Module.m_hInst, titleStrId, pTitle, MAX_TITLE_LEN);
//
// Load message format string resource
//
LoadString(_Module.m_hInst, formatStrId, pFormat, MAX_STRING_LEN);
//
// Display the message box
//
result = MessageBox(pFormat, pTitle, type);
} else {
MessageBeep(MB_ICONHAND);
result = 0;
}
MemFree(pTitle);
MemFree(pFormat);
MemFree(pMessage);
return result;
}
BOOL
CRoutePage::BrowseForDirectory(
)
/*++
Routine Description:
Browse for a directory
Arguments:
hDlg - Specifies the dialog window on which the Browse button is displayed
textFieldId - Specifies the text field adjacent to the Browse button
titleStrId - Specifies the title to be displayed in the browse window
Return Value:
TRUE if successful, FALSE if the user presses Cancel
--*/
{
LPITEMIDLIST pidl;
WCHAR buffer[MAX_PATH];
WCHAR title[MAX_TITLE_LEN];
VOID SHFree(LPVOID);
BOOL result = FALSE;
LPMALLOC pMalloc;
BROWSEINFO bi = {
m_hWnd,
NULL,
buffer,
title,
BIF_RETURNONLYFSDIRS,
NULL,
(LPARAM) buffer,
};
if (! LoadString(_Module.m_hInst, IDS_INBOUND_DIR, title, MAX_TITLE_LEN))
title[0] = 0;
if (! GetDlgItemText( IDC_DEST_FOLDER, buffer, MAX_PATH))
buffer[0] = 0;
if (pidl = SHBrowseForFolder(&bi)) {
if (SHGetPathFromIDList(pidl, buffer)) {
if (wcslen(buffer) > MAX_ARCHIVE_DIR)
DisplayMessageDialog(0,IDS_DIR_TOO_LONG);
else {
SetDlgItemText(IDC_DEST_FOLDER, buffer);
result = TRUE;
}
}
SHGetMalloc(&pMalloc);
pMalloc->Free(pidl);
pMalloc->Release();
}
return result;
}
LRESULT
CRoutePage::OnWmHelp(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
::WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle,
FAXCFG_HELP_FILENAME,
HELP_WM_HELP,
(ULONG_PTR) &RoutingHelpIds);
return 1;
}
LRESULT
CRoutePage::OnWmContextHelp(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
::WinHelp((HWND) wParam,
FAXCFG_HELP_FILENAME,
HELP_CONTEXTMENU,
(ULONG_PTR) &RoutingHelpIds);
return 1;
}