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

611 lines
19 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
droutpri.cpp
Abstract:
This file contains implementation of
the routing extension priority dialog.
Environment:
WIN32 User Mode
Author:
Darwin Ouyang (t-darouy) 30-Sept-1997
--*/
#include "stdafx.h"
#include "droutpri.h"
#include "faxcompd.h"
#include "faxcomp.h"
#include "inode.h"
#include "idevice.h"
#include "adminhlp.h"
#pragma hdrstop
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Constructor and destructor
//
//
CFaxRoutePriPropSheet::CFaxRoutePriPropSheet(
IN HINSTANCE hInstance,
IN LONG_PTR hMmcNotify,
IN CInternalNode * NodePtr,
IN CFaxComponent * pComp
)
: _hMmcNotify( hMmcNotify ),
_hFaxServer( 0 ),
_pOwnNode( NodePtr ),
_pRoutingMethod( NULL ),
_iRoutingMethodCount( 0 ),
_pRoutingMethodIndex( NULL ),
_pComp( pComp )
/*++
Routine Description:
Constructor
Arguments:
hInstance - the instance pointer
hMmcNotify - the MMC notify handle
NodePtr - a pointer to the owning node
Return Value:
None.
--*/
{
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_DATE_CLASSES;
InitCommonControlsEx(&icex);
DebugPrint(( TEXT("CFaxRoutePriPropSheet Created") ));
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE | PSP_USECALLBACK;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDD_ROUTE_PRI);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDD_ROUTE_PRI_TITLE);
_PropSheet.pfnDlgProc = CFaxRoutePriPropSheet::DlgProc;
_PropSheet.lParam = (LONG_PTR)this;
_PropSheet.pfnCallback = &PropSheetPageProc;
_hPropSheet = NULL;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
assert(_hPropSheet != NULL );
assert( NodePtr != NULL );
_pCompData = NodePtr->m_pCompData;
_hFaxServer = _pCompData->m_FaxHandle;
}
CFaxRoutePriPropSheet::~CFaxRoutePriPropSheet()
/*++
Routine Description:
Destructor
Arguments:
None.
Return Value:
None.
--*/
{
DebugPrint(( TEXT("CFaxRoutePriPropSheet Destroyed") ));
if( _pRoutingMethodIndex != NULL ) {
delete _pRoutingMethodIndex;
_pRoutingMethodIndex = NULL;
_iRoutingMethodIndexCount = 0;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Dialog Proc
//
//
INT_PTR
APIENTRY
CFaxRoutePriPropSheet::DlgProc(
IN HWND hwndDlg,
IN UINT message,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Dialog Procedure
Arguments:
hwndDlg - the hwnd of the dialog
message - the message
wParam, lParam - the window message parameters
Return Value:
BOOL
--*/
{
// DebugPrint(( TEXT("Trace: CFaxRoutePriPropSheet::DlgProc") ));
BOOL fRet = FALSE;
HWND hwnd = NULL;
HWND hwndSheet = NULL;
switch( message ) {
case WM_INITDIALOG:
{
DebugPrint(( TEXT("CFaxRoutePriPropSheet::DlgProc -- WM_INITDIALOG\n") ));
assert( lParam != NULL );
LONG_PTR lthis = ((CFaxRoutePriPropSheet *)lParam)->_PropSheet.lParam;
CFaxRoutePriPropSheet * pthis = (CFaxRoutePriPropSheet *)lthis;
assert( pthis != NULL );
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
if( pthis->_pComp != NULL ) {
pthis->_pComp->IncPropSheetCount();
} else {
pthis->_pCompData->IncPropSheetCount();
}
fRet = TRUE;
break;
}
case WM_COMMAND:
{
// DebugPrint(( TEXT("CFaxRoutePriPropSheet::DlgProc -- WM_COMMAND\n") ));
// activate apply button
WORD wID = LOWORD( wParam );
WORD wCMD = HIWORD( wParam );
DWORD dwSelectedItem;
CFaxRoutePriPropSheet * pthis =
(CFaxRoutePriPropSheet *)GetWindowLongPtr( hwndDlg,
DWLP_USER );
hwnd = GetDlgItem( hwndDlg, IDC_ROUTE_EXTS );
switch( wCMD ) {
case BN_CLICKED:
{
switch( wID ) {
case IDC_ROUTEPRI_UP:
{
DebugPrint(( TEXT(" ++++++++++++++ CFaxRoutePriPropSheet::DlgProc -- UP button pushed \n") ));
//
// handle click here!!
//
PFAX_GLOBAL_ROUTING_INFO tempRM;
dwSelectedItem = (DWORD)SendMessage( hwnd, LB_GETCURSEL, 0, 0 );
SetFocus( hwnd );
if( dwSelectedItem != LB_ERR ) {
if( dwSelectedItem < pthis->_iRoutingMethodIndexCount &&
dwSelectedItem > 0 ) {
tempRM = pthis->_pRoutingMethodIndex[ dwSelectedItem - 1 ];
pthis->_pRoutingMethodIndex[ dwSelectedItem - 1 ] = pthis->_pRoutingMethodIndex[ dwSelectedItem ];
pthis->_pRoutingMethodIndex[ dwSelectedItem ] = tempRM;
hwndSheet = GetParent( hwndDlg );
pthis->PopulateListBox( hwndDlg );
SetFocus( hwnd );
SendMessage( hwnd, LB_SETCURSEL, dwSelectedItem - 1 , 0 );
PropSheet_Changed( hwndSheet, hwndDlg );
}
}
break;
}
case IDC_ROUTEPRI_DOWN:
{
DebugPrint(( TEXT(" ++++++++++++++ CFaxRoutePriPropSheet::DlgProc -- DOWN button pushed \n") ));
//
// handle click here!
//
PFAX_GLOBAL_ROUTING_INFO tempRM;
dwSelectedItem = (DWORD)SendMessage( hwnd, LB_GETCURSEL, 0, 0 );
if( dwSelectedItem != LB_ERR ) {
if( dwSelectedItem < pthis->_iRoutingMethodIndexCount - 1 &&
dwSelectedItem >= 0 ) {
tempRM = pthis->_pRoutingMethodIndex[ dwSelectedItem + 1 ];
pthis->_pRoutingMethodIndex[ dwSelectedItem + 1 ] = pthis->_pRoutingMethodIndex[ dwSelectedItem ];
pthis->_pRoutingMethodIndex[ dwSelectedItem ] = tempRM;
hwndSheet = GetParent( hwndDlg );
pthis->PopulateListBox( hwndDlg );
PropSheet_Changed( hwndSheet, hwndDlg );
SetFocus( hwnd );
SendMessage( hwnd, LB_SETCURSEL, dwSelectedItem + 1 , 0 );
}
}
break;
}
default:
break;
} // switch
break;
}
}
fRet = TRUE;
break;
}
case WM_HELP:
WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle,
FAXCFG_HELP_FILENAME,
HELP_WM_HELP,
(ULONG_PTR) &RoutingPriorityHelpIDs);
fRet = TRUE;
break;
case WM_CONTEXTMENU:
WinHelp((HWND) wParam,
FAXCFG_HELP_FILENAME,
HELP_CONTEXTMENU,
(ULONG_PTR) &RoutingPriorityHelpIDs);
fRet = TRUE;
break;
case WM_NOTIFY:
{
// DebugPrint(( TEXT("CFaxRoutePriPropSheet::DlgProc -- WM_NOTIFY\n") ));
CFaxRoutePriPropSheet * pthis =
(CFaxRoutePriPropSheet *)GetWindowLongPtr( hwndDlg,
DWLP_USER );
switch( ((LPNMHDR) lParam)->code ) {
case PSN_APPLY:
// apply changes here!!
DebugPrint(( TEXT(" ++++++++++++++ CFaxRoutePriPropSheet::DlgProc -- APPLY button pushed \n") ));
if( FAILED( pthis->UpdateData( hwndDlg ) ) ) {
fRet = FALSE;
break;
}
// deactivate apply button
hwndSheet = GetParent( hwndDlg );
PropSheet_UnChanged( hwndSheet, hwndDlg );
fRet = TRUE;
break;
case PSN_SETACTIVE:
// refresh the page in case the user enabled some routing methods
DebugPrint(( TEXT(" ++++++++++++++ CFaxRoutePriPropSheet::DlgProc -- PAGE ACTIVATED \n") ));
if( FAILED( pthis->GetData() ) ) {
fRet = FALSE;
break;
}
pthis->PopulateListBox( hwndDlg );
fRet = TRUE;
break;
} // switch
break;
}
case WM_DESTROY:
{
DebugPrint(( TEXT("CFaxRoutePriPropSheet::DlgProc -- WM_DESTROY\n") ));
CFaxRoutePriPropSheet * pthis =
(CFaxRoutePriPropSheet *)GetWindowLongPtr( hwndDlg,
DWLP_USER );
if( pthis != NULL ) {
// MMCFreeNotifyHandle( pthis->_hMmcNotify );
// BUGBUG MMCFreeNotifyHandle is called from the general property page.
// It can only be called ONCE!!!
if( pthis->_pComp != NULL ) {
pthis->_pComp->DecPropSheetCount();
} else {
pthis->_pCompData->DecPropSheetCount();
}
}
fRet = TRUE;
break;
}
} // switch
return fRet;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Internal Functions.
//
//
HRESULT
CFaxRoutePriPropSheet::UpdateData(
HWND hwndDlg
)
/*++
Routine Description:
This routine writes the data manipulated in the property page out to the
fax service.
The settings are updated in the property sheet because this
allows the property sheet to complete even if the owner node
has already been destroyed.
Arguments:
hwndDlg - the dialog's window handle
Return Value:
HRESULT indicating SUCCEDED() or FAILED()
--*/
{
DebugPrint(( TEXT("Trace: CInternalDevice::UpdateData") ));
HRESULT hr = S_OK;
assert( hwndDlg != NULL );
try {
do {
if( _pCompData->QueryRpcError() == TRUE ) {
assert( FALSE );
hr = E_UNEXPECTED;
break;
}
for( DWORD i = 0; i < _iRoutingMethodIndexCount; i++ ) {
_pRoutingMethodIndex[ i ]->Priority = i + 1;
if( !FaxSetGlobalRoutingInfo( _hFaxServer,
_pRoutingMethodIndex[ i ] )
) {
if (GetLastError() != ERROR_ACCESS_DENIED) {
_pCompData->NotifyRpcError( TRUE );
assert(FALSE);
}
::GlobalStringTable->SystemErrorMsg( GetLastError() );
hr = E_UNEXPECTED;
break;
}
}
} while( 0 );
} catch( ... ) {
_pCompData->NotifyRpcError( TRUE );
assert(FALSE);
::GlobalStringTable->SystemErrorMsg( GetLastError() );
hr = E_UNEXPECTED;
}
return hr;
}
HRESULT
CFaxRoutePriPropSheet::PopulateListBox(
HWND hwndDlg
)
/*++
Routine Description:
Populates the List Box containg the routing extensions.
Arguments:
hwndDlg - the dialog's window handle
Return Value:
HRESULT indicating SUCCEDED() or FAILED()
--*/
{
HRESULT hr = S_OK;
HWND hwnd;
TCHAR buffer[80];
ZeroMemory( (PVOID)buffer, sizeof( TCHAR ) * 80 );
// populate the list box
do {
hwnd = GetDlgItem( hwndDlg, IDC_ROUTE_EXTS );
// clear the list box
SendMessage( hwnd, LB_RESETCONTENT, 0, 0 );
// verify the index has been created
if( _pRoutingMethodIndex == NULL ) {
assert( FALSE );
hr = E_UNEXPECTED;
break;
}
// insert the string into the list box
for( DWORD i = 0; i < _iRoutingMethodIndexCount; i ++ ) {
if( _pRoutingMethodIndex[i] != NULL ) {
SendMessage( hwnd, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) _pRoutingMethodIndex[i]->FriendlyName );
}
}
} while( 0 );
return hr;
}
HRESULT
CFaxRoutePriPropSheet::GetData()
/*++
Routine Description:
Gets data from the fax service.
Arguments:
None.
Return Value:
HRESULT indicating SUCCEDED() or FAILED()
--*/
{
HRESULT hr = S_OK;
try {
do {
if( _pRoutingMethod != NULL ) {
FaxFreeBuffer( (PVOID)_pRoutingMethod );
_pRoutingMethod = NULL;
_iRoutingMethodCount = 0;
}
if( _pRoutingMethodIndex != NULL ) {
delete _pRoutingMethodIndex;
_pRoutingMethodIndex = NULL;
_iRoutingMethodIndexCount = 0;
}
if( _pCompData->QueryRpcError() == TRUE ) {
assert( FALSE );
hr = E_UNEXPECTED;
break;
}
// get the routing methods
if( !FaxEnumGlobalRoutingInfo( _hFaxServer, &_pRoutingMethod, &_iRoutingMethodCount ) ) {
if (GetLastError() != ERROR_ACCESS_DENIED) {
_pCompData->NotifyRpcError( TRUE );
assert(FALSE);
}
::GlobalStringTable->SystemErrorMsg( GetLastError() );
hr = E_UNEXPECTED;
break;
}
// build the index
_iRoutingMethodIndexCount = _iRoutingMethodCount;
_pRoutingMethodIndex = new PFAX_GLOBAL_ROUTING_INFO[ _iRoutingMethodCount ];
if (!_pRoutingMethodIndex) {
hr = E_OUTOFMEMORY;
break;
}
ZeroMemory( (PVOID) _pRoutingMethodIndex,
sizeof( PFAX_GLOBAL_ROUTING_INFO ) * _iRoutingMethodCount );
// setup the index
for( DWORD i = 0; i < _iRoutingMethodCount; i ++ ) {
_pRoutingMethodIndex[i] = &(_pRoutingMethod[i]);
}
} while( 0 );
} catch( ... ) {
_pCompData->NotifyRpcError( TRUE );
assert(FALSE);
::GlobalStringTable->SystemErrorMsg( GetLastError() );
hr = E_UNEXPECTED;
}
return hr;
}
UINT
CALLBACK
CFaxRoutePriPropSheet::PropSheetPageProc(
HWND hwnd,
UINT uMsg,
LPPROPSHEETPAGE ppsp
)
/*++
Routine Description:
Dialog Init and destroy routine
Arguments:
hwndDlg - the hwnd of the dialog - will be NULL
uMsg - the message PSPCB_CREATE or PSPCB_RELEASE
ppsp - pointer to a PROPERTYSHEETPAGE struct
Return Value:
UINT - nonzero to allow, zero to fail
--*/
{
CFaxRoutePriPropSheet * pthis = NULL;
UINT retval = 1;
// release my property sheet
if( uMsg == PSPCB_RELEASE ) {
try {
pthis = (CFaxRoutePriPropSheet * )(ppsp->lParam);
delete pthis;
} catch( ... ) {
assert( FALSE );
retval = 0;
}
}
return retval;
}