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.
 
 
 
 
 
 

826 lines
21 KiB

/////////////////////////////////////////////////////////////////////////////
// FILE : DlgNewDevice.cpp //
// //
// DESCRIPTION : The CDlgNewFaxOutboundDevice class implements the //
// dialog for additon of new Group. //
// //
// AUTHOR : yossg //
// //
// HISTORY : //
// Jan 3 2000 yossg Create //
// //
// Copyright (C) 2000 Microsoft Corporation All Rights Reserved //
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "dlgNewDevice.h"
#include "FaxServer.h"
#include "FaxServerNode.h"
#include "dlgutils.h"
/////////////////////////////////////////////////////////////////////////////
// CDlgNewFaxOutboundDevice
CDlgNewFaxOutboundDevice::CDlgNewFaxOutboundDevice(CFaxServer * pFaxServer)
{
m_lpdwAllDeviceID = NULL;
m_dwNumOfAllDevices = 0;
m_lpdwAssignedDeviceID = NULL;
m_dwNumOfAssignedDevices = 0;
ATLASSERT(pFaxServer);
m_pFaxServer = pFaxServer;
}
CDlgNewFaxOutboundDevice::~CDlgNewFaxOutboundDevice()
{
if (NULL != m_lpdwAllDeviceID)
delete[] m_lpdwAllDeviceID;
if (NULL != m_lpdwAssignedDeviceID)
delete[] m_lpdwAssignedDeviceID;
}
/*
- CDlgNewFaxOutboundDevice::initDevices
-
* Purpose:
* Initiates the configuration structure from RPC get Call,
* and current assined devices own parameters
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CDlgNewFaxOutboundDevice::InitDevices(DWORD dwNumOfDevices, LPDWORD lpdwDeviceID, BSTR bstrGroupName)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::InitDevices"));
HRESULT hRc = S_OK;
m_bstrGroupName = bstrGroupName;
if (!m_bstrGroupName )
{
DebugPrintEx(DEBUG_ERR,
_T("Out of memory - Failed to Init m_bstrGroupName. (ec: %0X8)"), hRc);
//MsgBox by Caller Function
hRc = E_OUTOFMEMORY;
goto Exit;
}
hRc = InitAssignedDevices(dwNumOfDevices, lpdwDeviceID);
if (FAILED(hRc))
{
DebugPrintEx(DEBUG_ERR,
_T("Failed to InitAssignDevices. (ec: %0X8)"), hRc);
//MsgBox by Caller Function
goto Exit;
}
hRc = InitAllDevices( );
if (FAILED(hRc))
{
DebugPrintEx(DEBUG_ERR,
_T("Failed to InitRPC. (ec: %0X8)"), hRc);
//MsgBox by Caller Function
goto Exit;
}
if ( m_dwNumOfAllDevices < m_dwNumOfAssignedDevices)
{
DebugPrintEx(DEBUG_MSG,
_T("+++m_dwNumOfAllDevices <m_dwNumOfAssignedDevices.+++ (ec: %0X8)"), hRc);
hRc = E_UNEXPECTED;
//MsgBox by Caller Function
goto Exit;
}
ATLASSERT(S_OK == hRc);
Exit:
return hRc;
}
/*
- CDlgNewFaxOutboundDevice::initAllDevices
-
* Purpose:
* Initiates the configuration structure from RPC get Call.
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CDlgNewFaxOutboundDevice::InitAllDevices( )
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::InitAllDevices"));
HRESULT hRc = S_OK;
DWORD ec = ERROR_SUCCESS;
PFAX_OUTBOUND_ROUTING_GROUP pFaxGroupsConfig;
DWORD dwNumOfGroups;
DWORD i; //index
BOOL fFound = FALSE;
//
// get Fax Handle
//
if (!m_pFaxServer->GetFaxServerHandle())
{
ec= GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
ec);
goto Error;
}
//
// Retrieve the Outbound Groups configuration
//
if (!FaxEnumOutboundGroups(m_pFaxServer->GetFaxServerHandle(),
&pFaxGroupsConfig,
&dwNumOfGroups))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Fail to get groups configuration. (ec: %ld)"),
ec);
if (IsNetworkError(ec))
{
DebugPrintEx(
DEBUG_ERR,
_T("Network Error was found. (ec: %ld)"),
ec);
m_pFaxServer->Disconnect();
}
goto Error;
}
//For max verification
ATLASSERT(pFaxGroupsConfig);
for ( i =0; i < dwNumOfGroups; i++ )
{
ATLASSERT(NULL != pFaxGroupsConfig);
if(0 == wcscmp(ROUTING_GROUP_ALL_DEVICES, pFaxGroupsConfig->lpctstrGroupName) )
{
fFound = TRUE;
}
else
{
pFaxGroupsConfig++;
}
}
if(fFound)
{
//
// init m_dwNumOfAllDevices
//
m_dwNumOfAllDevices = pFaxGroupsConfig->dwNumDevices;
//
// init m_lpdwAllDeviceID
//
if (0 < m_dwNumOfAllDevices)
{
m_lpdwAllDeviceID = new DWORD[m_dwNumOfAllDevices];
if (NULL == m_lpdwAllDeviceID)
{
DebugPrintEx(
DEBUG_ERR,
_T("Error allocating %ld device ids"),
m_dwNumOfAllDevices);
ec = ERROR_NOT_ENOUGH_MEMORY;
goto Error;
}
memcpy(m_lpdwAllDeviceID, pFaxGroupsConfig->lpdwDevices, sizeof(DWORD)*m_dwNumOfAllDevices) ;
}
else
{
DebugPrintEx( DEBUG_MSG, _T("++Empty List++ List of All Devices found to be currrently empty."));
m_lpdwAllDeviceID = NULL;
}
}
else
{
DebugPrintEx(
DEBUG_ERR,
_T("UNEXPECTED ERROR - ALL DEVICES group was not found."));
ec = ERROR_BAD_UNIT;
goto Error;
}
ATLASSERT(S_OK == hRc);
DebugPrintEx( DEBUG_MSG,
_T("Succeed to init all devices list."));
goto Exit;
Error:
ATLASSERT(ERROR_SUCCESS != ec);
hRc = HRESULT_FROM_WIN32(ec);
//DlgMsgBox -- NodeMsgBox(GetFaxServerErrorMsg(ec));
Exit:
return (hRc);
}
/*
- CDlgNewFaxOutboundDevice::initAssignedDevices
-
* Purpose:
* Initiates the list from given params.
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CDlgNewFaxOutboundDevice::InitAssignedDevices(DWORD dwNumOfDevices, LPDWORD lpdwDeviceID)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::InitAssignedDevices"));
HRESULT hRc = S_OK;
//
// init m_dwNumOfAssignedDevices
//
m_dwNumOfAssignedDevices = dwNumOfDevices;
//
// init m_lpdwAssignedDeviceID
//
if (0 < m_dwNumOfAssignedDevices)
{
m_lpdwAssignedDeviceID = new DWORD[m_dwNumOfAssignedDevices];
if (NULL == m_lpdwAssignedDeviceID)
{
DebugPrintEx(
DEBUG_ERR,
_T("Error allocating %ld device ids"),
m_dwNumOfAssignedDevices);
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
memcpy(m_lpdwAssignedDeviceID, lpdwDeviceID, sizeof(DWORD)*m_dwNumOfAssignedDevices) ;
}
else
{
DebugPrintEx( DEBUG_MSG, _T("List of Assigned devices found to be empty."));
m_lpdwAssignedDeviceID = NULL;
}
return hRc;
}
/*
+ CDlgNewFaxOutboundDevice::OnInitDialog
+
* Purpose:
* Initiate all dialog controls.
*
* Arguments:
* [in] uMsg : Value identifying the event.
* [in] lParam : Message-specific value.
* [in] wParam : Message-specific value.
* [in] bHandled : bool value.
*
- Return:
- 0 or 1
*/
LRESULT
CDlgNewFaxOutboundDevice::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::OnInitDialog"));
HRESULT hRc = S_OK;
BOOL fAssignedDeviceFound;
BOOL fAllAssignedDevicesFound;
LPDWORD lpdwDevice;
LPDWORD lpdwAssignedDevice;
DWORD tmp;
UINT uiFoundIndex;
RECT Rect;
//
// Attach controls
//
m_DeviceList.Attach(GetDlgItem(IDC_DEVICE_LISTVIEW));
m_DeviceList.GetClientRect(&Rect);
m_DeviceList.InsertColumn(1, NULL, LVCFMT_LEFT, (Rect.right-Rect.left), 0);
//
// Fill the Availble Device List
//
fAllAssignedDevicesFound = FALSE;
uiFoundIndex = 0;
lpdwDevice = &m_lpdwAllDeviceID[0];
for ( DWORD i = 0; i < m_dwNumOfAllDevices; i++ )
{
if(!fAllAssignedDevicesFound)
{
fAssignedDeviceFound =FALSE;
lpdwAssignedDevice = &m_lpdwAssignedDeviceID[0];
tmp =0;
for ( DWORD j = 0; j < m_dwNumOfAssignedDevices; j++ )
{
// TO DO create more incremental search here also
ATLASSERT(NULL != lpdwDevice);
ATLASSERT(NULL != lpdwAssignedDevice);
if( *lpdwDevice == *lpdwAssignedDevice )
{
fAssignedDeviceFound = TRUE;
//Skip this device - It was already assigned
lpdwDevice++;
if ( ++tmp == m_dwNumOfAssignedDevices )
fAllAssignedDevicesFound = TRUE;
break;
}
else
{
lpdwAssignedDevice++;
}
}
if (!fAssignedDeviceFound)
{
InsertDeviceToList(uiFoundIndex++ , *lpdwDevice);
lpdwDevice++;
}
}
else //all assigned devices found
{
ATLASSERT(lpdwDevice);
//insert the rest of all devices to list
InsertDeviceToList(uiFoundIndex++ , *lpdwDevice);
lpdwDevice++;
}
}
EnableOK(FALSE);
return 1; // Let the system set the focus
}
/*
- CDlgNewFaxOutboundDevice::InsertDeviceToList
-
* Purpose:
* Populate Avaliable devices list and discovers the devices names
*
* Arguments:
* [in] uiIndex - index
* [in] dwDeviceID - device ID
*
* Return:
* OLE error code
*/
HRESULT CDlgNewFaxOutboundDevice::InsertDeviceToList(UINT uiIndex, DWORD dwDeviceID)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::InsertDeviceToList"));
HRESULT hRc = S_OK;
CComBSTR bstrDeviceName = NULL;
//
// Discover Device Name
//
hRc = InitDeviceNameFromID(dwDeviceID, &bstrDeviceName);
if (FAILED(hRc))
{
//DebugPrint by Called Func.
goto Exit;
}
//
// Insert New line in the list
//
m_DeviceList.InsertItem(uiIndex, bstrDeviceName);
m_DeviceList.SetItemData(uiIndex, dwDeviceID);
Exit:
return hRc;
}
/*
- CDlgNewFaxOutboundDevice::InitDeviceNameFromID
-
* Purpose:
* Transslate Device ID to Device Name and insert the data to
* m_bstrDeviceName
*
* Arguments:
* [in] dwDeviceID - device ID
* [out] bstrDeviceName - device Name
*
* Return:
* OLE error message
*/
HRESULT CDlgNewFaxOutboundDevice::InitDeviceNameFromID(DWORD dwDeviceID, BSTR * pbstrDeviceName)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingRuleNode::GetDeviceNameFromID"));
DWORD ec = ERROR_SUCCESS;
HRESULT hRc = S_OK;
PFAX_PORT_INFO_EX pFaxDeviceConfig = NULL ;
if (!m_pFaxServer->GetFaxServerHandle())
{
ec= GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
ec);
goto Error;
}
//
// Retrieve the Device configuration
//
if (!FaxGetPortEx(m_pFaxServer->GetFaxServerHandle(),
dwDeviceID,
&pFaxDeviceConfig))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Fail to get device configuration. (ec: %ld)"),
ec);
if (IsNetworkError(ec))
{
DebugPrintEx(
DEBUG_ERR,
_T("Network Error was found. (ec: %ld)"),
ec);
m_pFaxServer->Disconnect();
}
goto Error;
}
//For max verification
ATLASSERT(pFaxDeviceConfig);
//
// Main thing - retrieve the Device Name
//
*pbstrDeviceName = SysAllocString(pFaxDeviceConfig->lpctstrDeviceName);
if ( !(*pbstrDeviceName) )
{
ec = ERROR_NOT_ENOUGH_MEMORY;
goto Error;
}
ATLASSERT(ec == ERROR_SUCCESS);
DebugPrintEx( DEBUG_MSG,
_T("Succeed to get device name."));
goto Exit;
Error:
ATLASSERT(ERROR_SUCCESS != ec);
pFaxDeviceConfig = NULL;
if (ERROR_BAD_UNIT != ec)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Device Not Found - Fail to discover device name from device ID."));
}
else
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Fail to discover device name from device ID. (ec: %ld)"),
ec);
}
hRc = HRESULT_FROM_WIN32(ec);
Exit:
if (NULL != pFaxDeviceConfig)
{
FaxFreeBuffer(pFaxDeviceConfig);
}
return hRc;
}
/*
+ CDlgNewFaxOutboundDevice::OnOK
+
* Purpose:
* Initiate all dialog controls.
*
* Arguments:
* [in] uMsg : Value identifying the event.
* [in] lParam : Message-specific value.
* [in] wParam : Message-specific value.
* [in] bHandled : bool value.
*
- Return:
- 0 or 1
*/
LRESULT
CDlgNewFaxOutboundDevice::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::OnOK"));
HRESULT hRc = S_OK;
DWORD ec = ERROR_SUCCESS;
DWORD dwIndex;
UINT uiSelectedCount;
int nItem;
LPDWORD lpdwNewDeviceID;
LPDWORD lpdwTmp;
FAX_OUTBOUND_ROUTING_GROUP FaxGroupConfig;
//
// Step 1: Create the new devices combined list
//
ATLASSERT( m_DeviceList.GetSelectedCount() > 0);
ATLASSERT( m_dwNumOfAssignedDevices >= 0);
uiSelectedCount = m_DeviceList.GetSelectedCount();
m_dwNumOfAllAssignedDevices = (DWORD)uiSelectedCount
+ m_dwNumOfAssignedDevices;
lpdwNewDeviceID = new DWORD[m_dwNumOfAllAssignedDevices];
if (NULL == lpdwNewDeviceID)
{
DebugPrintEx(
DEBUG_ERR,
_T("Error allocating %ld device ids"),
m_dwNumOfAllAssignedDevices);
ec = ERROR_NOT_ENOUGH_MEMORY;
goto Error;
}
lpdwTmp = &lpdwNewDeviceID[0];
DebugPrintEx( DEBUG_MSG,
_T(" NumOfAllAssignedDevices = %ld \n"), m_dwNumOfAllAssignedDevices);
//
// Already assigned part (can be zero size)
//
if (m_dwNumOfAssignedDevices > 0)
{
memcpy( lpdwNewDeviceID, m_lpdwAssignedDeviceID, sizeof(DWORD)*m_dwNumOfAssignedDevices) ;
lpdwTmp = lpdwTmp + (int)m_dwNumOfAssignedDevices;
}
//
// New devices to assign part (cannot be zero size)
//
if (uiSelectedCount > 0)
{
nItem = -1;
for (dwIndex = m_dwNumOfAssignedDevices; dwIndex < m_dwNumOfAllAssignedDevices; dwIndex++)
{
nItem = m_DeviceList.GetNextItem(nItem, LVNI_SELECTED);
ATLASSERT(nItem != -1);
*lpdwTmp = (DWORD)m_DeviceList.GetItemData(nItem);
DebugPrintEx( DEBUG_MSG,
_T(" NewDeviceID = %ld. DeviceOrder=%ld \n"), *lpdwTmp, (dwIndex+1));
++lpdwTmp;
}
}
else
{
ATLASSERT(0); //Never reach here
DlgMsgBox(this, IDS_SELECT_ITEM);
return 0;
}
//
// Step 2: insert the new Id list into the group via RPC call
//
//
// init the group fields and insert the new DeviceIdList
//
ZeroMemory (&FaxGroupConfig, sizeof(FAX_OUTBOUND_ROUTING_GROUP));
FaxGroupConfig.dwSizeOfStruct = sizeof(FAX_OUTBOUND_ROUTING_GROUP);
FaxGroupConfig.lpctstrGroupName = m_bstrGroupName;
FaxGroupConfig.dwNumDevices = m_dwNumOfAllAssignedDevices;
//FaxGroupConfig.Status - actually neglected by the service
FaxGroupConfig.Status = FAX_GROUP_STATUS_ALL_DEV_VALID;
FaxGroupConfig.lpdwDevices = lpdwNewDeviceID;
//
// get RPC Handle
//
if (!m_pFaxServer->GetFaxServerHandle())
{
ec= GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
ec);
goto Error;
}
//
// inject the new device list
//
if (!FaxSetOutboundGroup(
m_pFaxServer->GetFaxServerHandle(),
&FaxGroupConfig))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Fail to set the group with new device list. (ec: %ld)"),
ec);
if (IsNetworkError(ec))
{
DebugPrintEx(
DEBUG_ERR,
_T("Network Error was found. (ec: %ld)"),
ec);
m_pFaxServer->Disconnect();
}
goto Error;
}
//
// Step 3: Close the dialog
//
ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec);
DebugPrintEx( DEBUG_MSG,
_T("The group was added successfully."));
EndDialog(wID);
goto Exit;
Error:
ATLASSERT(ERROR_SUCCESS != ec);
hRc = HRESULT_FROM_WIN32(ec);
PageErrorEx(IDS_FAIL_ADD_DEVICE, GetFaxServerErrorMsg(ec), m_hWnd);
EnableOK(FALSE);
Exit:
return FAILED(hRc) ? 0 : 1;
}
/*
- CDlgNewFaxOutboundDevice::OnListViewItemChanged
-
* Purpose:
* Enable/Disable the submit button.
*
* Arguments:
*
* Return:
* 1
*/
LRESULT
CDlgNewFaxOutboundDevice::OnListViewItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::OnListViewItemChanged"));
EnableOK( m_DeviceList.GetSelectedCount() > 0 );
return 0;
}
/*
- CDlgNewFaxOutboundDevice::EnableOK
-
* Purpose:
* Enable (disable) apply button.
*
* Arguments:
* [in] fEnable - the value to enable the button
*
* Return:
* void
*/
VOID
CDlgNewFaxOutboundDevice::EnableOK(BOOL fEnable)
{
HWND hwndOK = GetDlgItem(IDOK);
::EnableWindow(hwndOK, fEnable);
}
/*
- CDlgNewFaxOutboundDevice::OnCancel
-
* Purpose:
* End dialog OnCancel.
*
* Arguments:
*
* Return:
* 0
*/
LRESULT
CDlgNewFaxOutboundDevice::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundDevice::OnCancel"));
EndDialog(wID);
return 0;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CDlgNewFaxOutboundDevice::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
CDlgNewFaxOutboundDevice::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
DEBUG_FUNCTION_NAME(_T("CDlgNewFaxOutboundDevice::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;
}
/////////////////////////////////////////////////////////////////////////////