///////////////////////////////////////////////////////////////////////////// // 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 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 -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; } /////////////////////////////////////////////////////////////////////////////