///////////////////////////////////////////////////////////////////////////// // FILE : dlgNewRule.cpp // // // // DESCRIPTION : The CDlgNewFaxOutboundRule class implements the // // dialog for additon of new Rule. // // // // AUTHOR : yossg // // // // HISTORY : // // Dec 30 1999 yossg Create // // Jan 25 2000 yossg Change the Dialog Design // // Oct 17 2000 yossg // // // // Copyright (C) 1999 - 2000 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "dlgNewRule.h" #include "DlgSelectCountry.h" #include "FaxServer.h" #include "FaxServerNode.h" #include "FaxMMCUtils.h" #include "dlgutils.h" #include "Helper.h" ///////////////////////////////////////////////////////////////////////////// // CDlgNewFaxOutboundRule CDlgNewFaxOutboundRule::CDlgNewFaxOutboundRule(CFaxServer * pFaxServer) { m_pFaxDevicesConfig = NULL; m_dwNumOfDevices = 0; m_pFaxGroupsConfig = NULL; m_dwNumOfGroups = 0; m_fAllReadyToApply = FALSE; ATLASSERT(pFaxServer); m_pFaxServer = pFaxServer; } CDlgNewFaxOutboundRule::~CDlgNewFaxOutboundRule() { if (NULL != m_pFaxDevicesConfig) FaxFreeBuffer(m_pFaxDevicesConfig); if (NULL != m_pFaxGroupsConfig) FaxFreeBuffer(m_pFaxGroupsConfig); } /* + CDlgNewFaxOutboundRule::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 CDlgNewFaxOutboundRule::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnInitDialog")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; int i , j ,k, l; i = j = k = l = 0; const int iAllDevicesComboIndex = 0; int iAllDevicesRPCIndex = 0; int iGroupListIndexToSelect = 0; HINSTANCE hInst; hInst = _Module.GetResourceInstance(); WCHAR buf[FXS_MAX_DISPLAY_NAME_LEN+1]; // // Attach controls // m_CountryCodeEdit.Attach(GetDlgItem(IDC_NEWRULE_COUNTRYCODE_EDIT)); m_AreaCodeEdit.Attach(GetDlgItem(IDC_RULE_AREACODE_EDIT)); m_DeviceCombo.Attach(GetDlgItem(IDC_DEVICES4RULE_COMBO)); m_GroupCombo.Attach(GetDlgItem(IDC_GROUP4RULE_COMBO)); // // Set length limit to area code // m_CountryCodeEdit.SetLimitText(FXS_MAX_COUNTRYCODE_LEN - 1); m_AreaCodeEdit.SetLimitText(FXS_MAX_AREACODE_LEN-1); // // Step 1: Init Lists // // // Init Devices // for (k = 0; (DWORD)k < m_dwNumOfDevices; k++ ) { hRc = AddComboBoxItem ( m_DeviceCombo, m_pFaxDevicesConfig[k].lpctstrDeviceName, m_pFaxDevicesConfig[k].dwDeviceID, hInst); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to load device list.")); PageError(IDS_FAIL2LOADDEVICELIST, m_hWnd, hInst); ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO), FALSE); goto Cleanup; } } // // Init groups // for (l = 0; (DWORD)l < m_dwNumOfGroups; l++ ) { if ( 0 == wcscmp(ROUTING_GROUP_ALL_DEVICES, m_pFaxGroupsConfig[l].lpctstrGroupName)) { iAllDevicesRPCIndex = l; //Do not do any more; } else { hRc = AddComboBoxItem ( m_GroupCombo, m_pFaxGroupsConfig[l].lpctstrGroupName, (DWORD)l, hInst); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to load group list.")); PageError(IDS_FAIL2LOADDEVICELIST, m_hWnd, hInst); ::EnableWindow(GetDlgItem(IDC_GROUP4RULE_COMBO), FALSE); goto Cleanup; } } } // // Now add "All Devices" Group as the first one // // // Replace string for localization // if (!hInst) { hInst = _Module.GetResourceInstance(); } if (!LoadString(hInst, IDS_ALL_DEVICES, buf, FXS_MAX_DISPLAY_NAME_LEN)) { hRc = E_OUTOFMEMORY; DebugPrintEx( DEBUG_ERR, _T("Fail to load string. Out of memory.")); PageError(IDS_FAXOUTOFMEMORY, m_hWnd, hInst); goto Cleanup; } // // insert "All Devices" Group as the first one in the groups list // ATLASSERT( 0 == iAllDevicesComboIndex ); hRc = SetComboBoxItem ( m_GroupCombo, iAllDevicesComboIndex, buf, iAllDevicesRPCIndex, hInst); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to load group list.")); PageError(IDS_FAIL2LOADGROUPLIST, m_hWnd, hInst); ::EnableWindow(GetDlgItem(IDC_GROUP4RULE_COMBO), FALSE); goto Cleanup; } // // Step 2: Set current status // (Select items in Lists, select radio button etc.) // (Gray/UnGray controls) // m_GroupCombo.SetCurSel (iAllDevicesComboIndex); // // Radio buttons, Gray/UnGray // CheckDlgButton(IDC_COUNTRY_RADIO, BST_CHECKED); ::EnableWindow(GetDlgItem(IDC_RULE_AREACODE_EDIT), FALSE); CheckDlgButton(IDC_DESTINATION_RADIO2, BST_CHECKED) ; ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO), FALSE); Cleanup: EnableOK(FALSE); return 1; // Let the system set the focus } /* + CDlgNewFaxOutboundRule::OnOK + * Purpose: * Submit data * * Arguments: * - Return: - 0 or 1 */ LRESULT CDlgNewFaxOutboundRule::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnOK")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; BOOL fSkipMessage = FALSE; CComBSTR bstrAreaCode; CComBSTR bstrCountryCode; int iCurrentSelectedItem = 0; DWORD dwAreaCode = 0; DWORD dwCountryCode = 0; BOOL bUseGroup; DWORD dwDeviceID = 0; WCHAR lpszGroupName[MAX_ROUTING_GROUP_NAME]; LPCTSTR lpctstrGroupName = NULL; // // Step 0: PreApply Checks // ATLASSERT( TRUE == m_fAllReadyToApply ); if (!AllReadyToApply(/*fSilent =*/ FALSE)) { EnableOK(FALSE); hRc =S_FALSE; goto Exit; } // // Step 1: get data // // // Country Code // if ( !m_CountryCodeEdit.GetWindowText(&bstrCountryCode)) { DebugPrintEx( DEBUG_ERR, TEXT("Failed to GetWindowText(&bstrCountryCode)")); DlgMsgBox(this, IDS_FAIL2READ_COUNTRYCODE); ::SetFocus(GetDlgItem(IDC_RULE_COUNTRYCODE_EDIT)); hRc = S_FALSE; goto Exit; } dwCountryCode = (DWORD)wcstoul( bstrCountryCode, NULL, 10 ); if (ROUTING_RULE_COUNTRY_CODE_ANY == dwCountryCode) { // // The user try to set the country code to zero // DebugPrintEx( DEBUG_ERR, TEXT(" CountryCode == ROUTING_RULE_COUNTRY_CODE_ANY ")); DlgMsgBox(this, IDS_ZERO_COUNTRYCODE); ::SetFocus(GetDlgItem(IDC_RULE_COUNTRYCODE_EDIT)); hRc = S_FALSE; goto Exit; } // // Area Code // if ( IsDlgButtonChecked(IDC_COUNTRY_RADIO) == BST_CHECKED ) { dwAreaCode = (DWORD)ROUTING_RULE_AREA_CODE_ANY; } else // IsDlgButtonChecked(IDC_AREA_RADIO) == BST_CHECKED { if ( !m_AreaCodeEdit.GetWindowText(&bstrAreaCode)) { DebugPrintEx( DEBUG_ERR, TEXT("Failed to GetWindowText(&bstrAreaCode)")); DlgMsgBox(this, IDS_FAIL2READ_AREACODE); ::SetFocus(GetDlgItem(IDC_RULE_AREACODE_EDIT)); hRc = S_FALSE; goto Exit; } dwAreaCode = (DWORD)wcstoul( bstrAreaCode, NULL, 10 ); } if ( IsDlgButtonChecked(IDC_DESTINATION_RADIO1) == BST_CHECKED ) { // // Use Group ? // bUseGroup = FALSE; // // Device // iCurrentSelectedItem = m_DeviceCombo.GetCurSel(); ATLASSERT(iCurrentSelectedItem != CB_ERR); //should be chacked pre apply dwDeviceID = (DWORD)m_DeviceCombo.GetItemData (iCurrentSelectedItem); } else // IsDlgButtonChecked(IDC_DESTINATION_RADIO2) == BST_CHECKED { // // Use Group ? // bUseGroup = TRUE; // // Group // iCurrentSelectedItem = m_GroupCombo.GetCurSel(); //ATLASSERT(iCurrentSelectedItem != CB_ERR); //should be chacked pre apply if (0 == iCurrentSelectedItem) //All Devices { lpctstrGroupName = ROUTING_GROUP_ALL_DEVICES; } else { ATLASSERT(MAX_ROUTING_GROUP_NAME > m_GroupCombo.GetLBTextLen(iCurrentSelectedItem)); //should be chacked by service before m_GroupCombo.GetLBText( iCurrentSelectedItem, lpszGroupName ); lpctstrGroupName = (LPCTSTR)lpszGroupName; } } // // Step 2: Add Rule to service with RPC // // // get RPC Handle // if (!m_pFaxServer->GetFaxServerHandle()) { ec= GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Failed to GetFaxServerHandle. (ec: %ld)"), ec); goto Error; } // // Add the rule // if (!FaxAddOutboundRule ( m_pFaxServer->GetFaxServerHandle(), dwAreaCode, dwCountryCode, dwDeviceID, lpctstrGroupName, bUseGroup)) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to add rule. (ec: %ld)"), ec); if (ERROR_DUP_NAME == ec) { DlgMsgBox(this, IDS_OUTRULE_EXISTS); goto Exit; } if (FAX_ERR_BAD_GROUP_CONFIGURATION == ec) { DebugPrintEx( DEBUG_ERR, _T("The group is empty or none of group devices is valid. (ec: %ld)"), ec); PageError(IDS_BAD_GROUP_CONFIGURATION,m_hWnd); fSkipMessage = TRUE; goto Error; } 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 rule was added successfully.")); EndDialog(wID); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); hRc = HRESULT_FROM_WIN32(ec); if (!fSkipMessage) { PageErrorEx(IDS_FAIL_ADD_RULE, GetFaxServerErrorMsg(ec), m_hWnd); } Exit: return FAILED(hRc) ? 0 : 1; } /* - CDlgNewFaxOutboundRule::OnDestenationRadioClicked - * Purpose: * Gray/Ungray the folder edit box and the * browse button. Enable apply button. * * Arguments: * * Return: * 1 */ LRESULT CDlgNewFaxOutboundRule::OnDestenationRadioClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { BOOL State; State = ( IsDlgButtonChecked(IDC_DESTINATION_RADIO1) == BST_CHECKED ); ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO), State); ATLASSERT(!State == (IsDlgButtonChecked(IDC_DESTINATION_RADIO2) == BST_CHECKED)); ::EnableWindow(GetDlgItem(IDC_GROUP4RULE_COMBO), !State); if (State)//IsDlgButtonChecked(IDC_DESTINATION_RADIO1) == BST_CHECKED { if ( CB_ERR == m_DeviceCombo.GetCurSel()) { m_fAllReadyToApply = FALSE; EnableOK(FALSE); goto Exit; } //else continue to whole controls check } else //IsDlgButtonChecked(IDC_DESTINATION_RADIO2) == BST_CHECKED { if ( CB_ERR == m_GroupCombo.GetCurSel()) { m_fAllReadyToApply = FALSE; EnableOK(FALSE); goto Exit; } //else continue to whole controls check } if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; EnableOK(TRUE); } else { //Should be EnableOK(FALSE); } } Exit: return(1); } /* - CDlgNewFaxOutboundRule::OnRuleTypeRadioClicked - * Purpose: * Gray/Ungray the folder edit box and the * browse button. Enable apply button. * * Arguments: * * Return: * 1 */ LRESULT CDlgNewFaxOutboundRule::OnRuleTypeRadioClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { BOOL State; State = ( IsDlgButtonChecked(IDC_COUNTRY_RADIO) == BST_CHECKED ); ATLASSERT(!State == (IsDlgButtonChecked(IDC_AREA_RADIO) == BST_CHECKED)); ::EnableWindow(GetDlgItem(IDC_RULE_AREACODE_EDIT), !State); if (!State)//IsDlgButtonChecked(IDC_AREA_RADIO) == BST_CHECKED { if ( !m_AreaCodeEdit.GetWindowTextLength() ) { m_fAllReadyToApply = FALSE; EnableOK(FALSE); goto Exit; } //else continue to whole controls check } //else //IsDlgButtonChecked(IDC_COUNTRY_RADIO) == BST_CHECKED //Do noting - continue to whole controls check if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; EnableOK(TRUE); } } Exit: return(1); } /* - CDlgNewFaxOutboundRule::OnComboChanged - * Purpose: * Gray/Ungray the submit button. * * Arguments: * * Return: * 1 */ LRESULT CDlgNewFaxOutboundRule::OnComboChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnComboChanged")); if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; EnableOK(TRUE); } } return 1; } /* - CDlgNewFaxOutboundRule::OnTextChanged - * Purpose: * Enable/Disable the submit button. * * Arguments: * * Return: * 1 */ LRESULT CDlgNewFaxOutboundRule::OnTextChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnTextChanged")); UINT fEnableOK = 0; switch (wID) { case IDC_RULE_AREACODE_EDIT: fEnableOK = ( m_AreaCodeEdit.GetWindowTextLength() ); break; case IDC_NEWRULE_COUNTRYCODE_EDIT: fEnableOK = ( m_CountryCodeEdit.GetWindowTextLength() ); break; default: ATLASSERT(FALSE); } if(!!fEnableOK) { if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; EnableOK(TRUE); } } } else { EnableOK(FALSE); m_fAllReadyToApply = FALSE; } return 1; } /* - CDlgNewFaxOutboundRule::AllReadyToApply - * Purpose: * Enable/Disable the submit button. * * Arguments: * * Return: * TRUE if all ready to apply, else FALSE. */ BOOL CDlgNewFaxOutboundRule::AllReadyToApply(BOOL fSilent) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::AllReadyToApply")); if ( !m_CountryCodeEdit.GetWindowTextLength() ) { if (!fSilent) { DlgMsgBox(this, IDS_ZERO_COUNTRYCODE); ::SetFocus(GetDlgItem(IDC_NEWRULE_COUNTRYCODE_EDIT)); } return FALSE; } if ( IsDlgButtonChecked(IDC_AREA_RADIO) == BST_CHECKED ) { if ( !m_AreaCodeEdit.GetWindowTextLength() ) { if (!fSilent) { DlgMsgBox(this, IDS_EMPTY_AREACODE); ::SetFocus(GetDlgItem(IDC_RULE_AREACODE_EDIT)); } return FALSE; } } //else do noting. if ( IsDlgButtonChecked(IDC_DESTINATION_RADIO1) == BST_CHECKED ) { if ( CB_ERR == m_DeviceCombo.GetCurSel()) { if (!fSilent) { DlgMsgBox(this, IDS_PLEASESELECT_DEVICE); ::SetFocus(GetDlgItem(IDC_DEVICES4RULE_COMBO)); } return FALSE; } } else if ( CB_ERR == m_GroupCombo.GetCurSel()) { if (!fSilent) { DlgMsgBox(this, IDS_PLEASESELECT_GROUP); ::SetFocus(GetDlgItem(IDC_GROUP4RULE_COMBO)); } return FALSE; } // // Cheers! // ...every thing ready to apply now. // return TRUE; } /* - CDlgNewFaxOutboundRule::EnableOK - * Purpose: * Enable/Disable the submit button. * * Arguments: * [in] fEnable - boolen value tells * to Enable or Disable the OK button. * * Return: * VOID */ VOID CDlgNewFaxOutboundRule::EnableOK(BOOL fEnable) { HWND hwndOK = GetDlgItem(IDOK); ::EnableWindow(hwndOK, fEnable); } /* - CDlgNewFaxOutboundRule::OnCancel - * Purpose: * End the dialog. * * Arguments: * * Return: * 0 */ LRESULT CDlgNewFaxOutboundRule::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnCancel")); EndDialog(wID); return 0; } /* - CDlgNewFaxOutboundRule::InitRuleDlg - * Purpose: * Init all the members as country list pointer and * device list pointer * * Arguments: * No. * * Return: * 0 */ HRESULT CDlgNewFaxOutboundRule::InitRuleDlg() { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::InitRuleDlg")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; // // Step 1: Init Lists from RPC // // // get Fax Handle // if (!m_pFaxServer->GetFaxServerHandle()) { ec= GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Failed to GetFaxServerHandle. (ec: %ld)"), ec); goto Error; } // // Devices (id, name) // if (!FaxEnumPortsEx(m_pFaxServer->GetFaxServerHandle(), &m_pFaxDevicesConfig, &m_dwNumOfDevices)) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to get devices configuration. (ec: %ld)"), ec); if (IsNetworkError(ec)) { DebugPrintEx( DEBUG_ERR, _T("Network Error was found. (ec: %ld)"), ec); m_pFaxServer->Disconnect(); } goto Error; } ATLASSERT(m_pFaxDevicesConfig); // // Groups (names) // if (!FaxEnumOutboundGroups(m_pFaxServer->GetFaxServerHandle(), &m_pFaxGroupsConfig, &m_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; } ATLASSERT(m_pFaxGroupsConfig); ATLASSERT(S_OK == hRc); DebugPrintEx( DEBUG_MSG, _T("Succeed to get all configurations.")); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); hRc = HRESULT_FROM_WIN32(ec); //MsgBox will be done by calling Func. Exit: return hRc; } /* - CDlgNewFaxOutboundRule::OnSelectCountryCodeClicked - * Purpose: * * * Arguments: * [out] bHandled - Do we handle it? * [in] pRoot - The root node * * Return: * OLE Error code */ LRESULT CDlgNewFaxOutboundRule::OnSelectCountryCodeClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CDlgNewFaxOutboundRule::OnSelectCountryCodeClicked")); HRESULT hRc = S_OK; INT_PTR rc = IDOK; int iCount = 0; WCHAR szwCountryCode[FXS_MAX_COUNTRYCODE_LEN+1]; DWORD dwCountryCode = 0; CDlgSelectCountry DlgSelectCountry(m_pFaxServer); hRc = DlgSelectCountry.InitSelectCountryCodeDlg(); if (S_OK != hRc) { //MsgBox + debug print by called func. goto Cleanup; } // // Dialog select country code // rc = DlgSelectCountry.DoModal(); if (rc != IDOK) { goto Cleanup; } // // Retreive CountryCode // dwCountryCode = DlgSelectCountry.GetCountryCode(); iCount = swprintf(szwCountryCode, L"%ld", dwCountryCode); if( iCount <= 0 ) { DebugPrintEx( DEBUG_ERR, TEXT("Fail to read member - m_dwCountryCode.")); goto Cleanup; } m_CountryCodeEdit.SetWindowText(szwCountryCode); // // EnableOK // if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; EnableOK(TRUE); } else { //Should be EnableOK(FALSE); } } Cleanup: return hRc; } ////////////////////////////////////////////////////////////////////////////// /*++ CDlgNewFaxOutboundRule::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 CDlgNewFaxOutboundRule::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { DEBUG_FUNCTION_NAME(_T("CDlgNewFaxOutboundRule::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; } /////////////////////////////////////////////////////////////////////////////