///////////////////////////////////////////////////////////////////////////// // FILE : ppFaxOutboundRoutingRule.cpp // // // // DESCRIPTION : prop pages of Outbound Routing Methods // // // // AUTHOR : yossg // // // // HISTORY : // // Jan 9 2000 yossg Created // // 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 "MSFxsSnp.h" #include "ppFaxOutboundRoutingRule.h" #include "DlgSelectCountry.h" #include "FaxMMCGlobals.h" #include "FaxServer.h" #include "FaxServerNode.h" #include "dlgutils.h" #include "FaxMMCPropertyChange.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // Constructor // CppFaxOutboundRoutingRule::CppFaxOutboundRoutingRule( LONG_PTR hNotificationHandle, CSnapInItem *pNode, BOOL bOwnsNotificationHandle, HINSTANCE hInst) : CPropertyPageExImpl(pNode,NULL) { m_lpNotifyHandle = hNotificationHandle; m_pFaxDevicesConfig = NULL; m_dwNumOfDevices = 0; m_pFaxGroupsConfig = NULL; m_dwNumOfGroups = 0; m_fAllReadyToApply = FALSE; m_dwCountryCode = 0; m_dwAreaCode = 0; m_dwDeviceID = 0; m_bstrGroupName = L""; m_fIsDialogInitiated = FALSE; m_fIsDirty = FALSE; } // // Destructor // CppFaxOutboundRoutingRule::~CppFaxOutboundRoutingRule() { if (NULL != m_pFaxDevicesConfig) FaxFreeBuffer(m_pFaxDevicesConfig); if (NULL != m_pFaxGroupsConfig) FaxFreeBuffer(m_pFaxGroupsConfig); // Note - This needs to be called only once per property sheet. // In our convention called in the general tab. if (NULL != m_lpNotifyHandle) { MMCFreeNotifyHandle(m_lpNotifyHandle); m_lpNotifyHandle = NULL; } } ///////////////////////////////////////////////////////////////////////////// // CppFaxOutboundRoutingRule message handlers /* - CppFaxOutboundRoutingRule::OnInitDialog - * Purpose: * Initiates all controls when dialog is called. * * Arguments: * * Return: * */ LRESULT CppFaxOutboundRoutingRule::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled ) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::PageInitDialog")); UNREFERENCED_PARAMETER( uiMsg ); UNREFERENCED_PARAMETER( wParam ); UNREFERENCED_PARAMETER( lParam ); UNREFERENCED_PARAMETER( fHandled ); HRESULT hRc = S_OK; int k, l; k = l = 0; const int iAllDevicesComboIndex = 0; int iAllDevicesRPCIndex = 0; int iGroupListIndexToSelect = 0; HINSTANCE hInst = _Module.GetResourceInstance(); PFAX_TAPI_LINECOUNTRY_ENTRYW pCountryEntries = NULL; WCHAR buf[FXS_MAX_DISPLAY_NAME_LEN+1]; WCHAR buffAreaCode[FXS_MAX_AREACODE_LEN+1]; int iCount; // // Attach controls // m_CountryCodeEdit.Attach(GetDlgItem(IDC_RULE_COUNTRYCODE_EDIT1)); m_AreaCodeEdit.Attach(GetDlgItem(IDC_RULE_AREACODE_EDIT1)); m_DeviceCombo.Attach(GetDlgItem(IDC_DEVICES4RULE_COMBO1)); m_GroupCombo.Attach(GetDlgItem(IDC_GROUP4RULE_COMBO1)); // // 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 Country code edit box (below) // // // 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_COMBO1), 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; } } // // Moreover we'll pick the the index of selected group // if ( m_fIsGroup) { if ( 0 == wcscmp( m_bstrGroupName, m_pFaxGroupsConfig[l].lpctstrGroupName)) { iGroupListIndexToSelect = l; } } } 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) // // // Select Country in the list // if (ROUTING_RULE_COUNTRY_CODE_ANY != m_dwCountryCode) { int iCountSring = 0; WCHAR szwCountryCode[FXS_MAX_COUNTRYCODE_LEN+1]; iCountSring = swprintf(szwCountryCode, L"%ld", m_dwCountryCode); if( iCountSring <= 0 ) { DebugPrintEx( DEBUG_ERR, TEXT("Fail to read member - m_dwCountryCode.")); PageError(IDS_MEMORY, m_hWnd, hInst); goto Cleanup; } m_CountryCodeEdit.SetWindowText(szwCountryCode); if (ROUTING_RULE_AREA_CODE_ANY == m_dwAreaCode) { CheckDlgButton(IDC_COUNTRY_RADIO1, BST_CHECKED); ::EnableWindow(GetDlgItem(IDC_RULE_AREACODE_EDIT1), FALSE); } else { CheckDlgButton(IDC_AREA_RADIO1, BST_CHECKED); // // Set Area Code // iCount = swprintf(buffAreaCode, L"%ld", m_dwAreaCode); ATLASSERT(iCount > 0); if( iCount > 0 ) { m_AreaCodeEdit.SetWindowText(buffAreaCode); } } } else //m_dwCountryCode == ROUTING_RULE_COUNTRY_CODE_ANY { ::EnableWindow(GetDlgItem(IDC_RULETYPE_FSTATIC), FALSE); ::EnableWindow(GetDlgItem(IDC_COUNTRY1_STATIC), FALSE); ::EnableWindow(GetDlgItem(IDC_AREA_STATIC), FALSE); ::EnableWindow(GetDlgItem(IDC_RULE_AREACODE_EDIT1), FALSE); ::EnableWindow(GetDlgItem(IDC_RULE_SELECT_BUTTON1), FALSE); ::EnableWindow(GetDlgItem(IDC_RULE_COUNTRYCODE_EDIT1), FALSE); ::EnableWindow(GetDlgItem(IDC_COUNTRY_RADIO1), FALSE); ::EnableWindow(GetDlgItem(IDC_AREA_RADIO1), FALSE); } if (!m_fIsGroup) { CheckDlgButton(IDC_DESTINATION_RADIO11, BST_CHECKED); // // Select device in the list // hRc = SelectComboBoxItemData(m_DeviceCombo, m_dwDeviceID); if ( FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to select device in combo box.")); PageError(IDS_FAIL2LOADDEVICELIST, m_hWnd, hInst); ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO1), FALSE); goto Cleanup; } ::EnableWindow(GetDlgItem(IDC_GROUP4RULE_COMBO1), FALSE); } else { CheckDlgButton(IDC_DESTINATION_RADIO21, BST_CHECKED) ; // // Select Group in list // hRc = SelectComboBoxItemData(m_GroupCombo, iGroupListIndexToSelect); if ( FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to select group in combo box.")); PageError(IDS_FAIL2LOADGROUPLIST, m_hWnd, hInst); ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO1), FALSE); goto Cleanup; } ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO1), FALSE); } ATLASSERT(S_OK == hRc); m_fIsDialogInitiated = TRUE; Cleanup: return (1); } /* - CppFaxOutboundRoutingRule::SetProps - * Purpose: * Sets properties on apply. * * Arguments: * pCtrlFocus - focus pointer (int) * * Return: * OLE error code */ HRESULT CppFaxOutboundRoutingRule::SetProps(int *pCtrlFocus) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::SetProps")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; CComBSTR bstrAreaCode; int iCurrentSelectedItem = 0; DWORD dwAreaCode = 0; DWORD dwCountryCode = 0; BOOL bUseGroup; DWORD dwDeviceID = 0; WCHAR lpszGroupName[MAX_ROUTING_GROUP_NAME]; LPCTSTR lpctstrGroupName = NULL; HINSTANCE hInst; hInst = _Module.GetResourceInstance(); CFaxRulePropertyChangeNotification * pRulePropPageNotification = NULL; CComBSTR bstrCountryName; // // Step 0: PreApply Checks // m_fAllReadyToApply = FALSE; if (!AllReadyToApply( FALSE)) { SetModified(FALSE); hRc = E_FAIL; goto Exit; } // // Step 1: get data // if (ROUTING_RULE_COUNTRY_CODE_ANY != m_dwCountryCode) { // // Country Code // CComBSTR bstrCountryCode; 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 replace 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_RADIO1) == BST_CHECKED ) { dwAreaCode = (DWORD)ROUTING_RULE_AREA_CODE_ANY; } else // IsDlgButtonChecked(IDC_AREA_RADIO1) == BST_CHECKED { if ( !m_AreaCodeEdit.GetWindowText(&bstrAreaCode)) { DebugPrintEx( DEBUG_ERR, TEXT("Failed to GetWindowText(&bstrAreaCode)")); PageError(IDS_FAIL2READ_AREACODE, m_hWnd, hInst); ::SetFocus(GetDlgItem(IDC_RULE_AREACODE_EDIT1)); hRc = E_FAIL ; goto Exit; } dwAreaCode = (DWORD)wcstoul( bstrAreaCode, NULL, 10 ); } ATLASSERT(bstrCountryName); } if ( IsDlgButtonChecked(IDC_DESTINATION_RADIO11) == 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_RADIO21) == 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: Configure Rule via RPC call // if ( (dwAreaCode != m_dwAreaCode) || (dwCountryCode != m_dwCountryCode) ) { hRc = FaxReplaceRule( dwAreaCode, dwCountryCode, bUseGroup, dwDeviceID, lpctstrGroupName ); if (FAILED(hRc)) { //DebugPrint and MsgBox by called func. goto Exit; } else { m_dwAreaCode = dwAreaCode; m_dwCountryCode = dwCountryCode; } } else { // //(dwAreaCode == m_dwAreaCode) && //(dwCountryCode == m_dwCountryCode) // hRc = FaxConfigureRule( bUseGroup, dwDeviceID, lpctstrGroupName ); if (FAILED(hRc)) { //DebugPrint and MsgBox by called func. goto Exit; } } // // Step 3: Send notification to cause MMC view refresh // // // Prepare the notification fields before submit // pRulePropPageNotification = new CFaxRulePropertyChangeNotification(); if (!pRulePropPageNotification) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("Out of Memory - fail to operate new")); goto Error; } pRulePropPageNotification->dwAreaCode = dwAreaCode; pRulePropPageNotification->dwCountryCode = dwCountryCode; pRulePropPageNotification->bstrCountryName = bstrCountryName; if (!pRulePropPageNotification->bstrCountryName) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("Out of Memory - fail to load string.")); goto Error; } pRulePropPageNotification->fIsGroup = bUseGroup; if (pRulePropPageNotification->fIsGroup) { pRulePropPageNotification->bstrGroupName = lpctstrGroupName; if (!pRulePropPageNotification->bstrGroupName) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("Out of Memory - fail to load string.")); goto Error; } } else { pRulePropPageNotification->dwDeviceID = dwDeviceID; } pRulePropPageNotification->pItem = (CSnapInItem *)m_pParentNode; pRulePropPageNotification->enumType = RuleFaxPropNotification; // // Notify MMC console thread // hRc = MMCPropertyChangeNotify(m_lpNotifyHandle, reinterpret_cast(pRulePropPageNotification)); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Fail to call MMCPropertyChangeNotify. (hRc: %08X)"), hRc); ATLASSERT(NULL != m_pParentNode); PageError(IDS_FAIL_NOTIFY_MMCPROPCHANGE,m_hWnd); goto Exit; } // // To prevent deletion on error since it will be deleted // by the reciever of the notification. // pRulePropPageNotification = NULL; ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec); m_fIsDirty = FALSE; DebugPrintEx( DEBUG_MSG, _T("The rule was added successfully.")); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); hRc = HRESULT_FROM_WIN32(ec); PropSheet_SetCurSelByID( GetParent(), IDD); ATLASSERT(::IsWindow(m_hWnd)); PageError(GetFaxServerErrorMsg(ec),m_hWnd); if (pRulePropPageNotification) { delete pRulePropPageNotification; pRulePropPageNotification = NULL; } Exit: return(hRc); } /* - CppFaxOutboundRoutingRule::PreApply - * Purpose: * Checks properties before apply. * * Arguments: * * Return: * OLE error code */ HRESULT CppFaxOutboundRoutingRule::PreApply(int *pCtrlFocus) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::PreApply")); HRESULT hRc = S_OK; // // PreApply Checks // m_fAllReadyToApply = FALSE; if (!AllReadyToApply(/*fSilent =*/ FALSE)) { SetModified(FALSE); hRc = E_FAIL ; } else { SetModified(TRUE); } return(hRc); } /* - CppFaxOutboundRoutingRule::OnApply - * Purpose: * Calls PreApply and SetProp to Apply changes. * * Arguments: * * Return: * TRUE or FALSE */ BOOL CppFaxOutboundRoutingRule::OnApply() { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::OnApply")); HRESULT hRc = S_OK; int CtrlFocus = 0; if (!m_fIsDirty) { return TRUE; } hRc = PreApply(&CtrlFocus); if (FAILED(hRc)) { //Error Msg by called func. if (CtrlFocus) { GotoDlgCtrl(GetDlgItem(CtrlFocus)); } return FALSE; } else //(Succeeded(hRc)) { hRc = SetProps(&CtrlFocus); if (FAILED(hRc)) { //Error Msg by called func. if (CtrlFocus) { GotoDlgCtrl(GetDlgItem(CtrlFocus)); } return FALSE; } else //(Succeeded(hRc)) { return TRUE; } } } /* - CppFaxOutboundRoutingRule::SetApplyButton - * Purpose: * set Apply buttom modified. * * Arguments: * * Return: * 1 (0) */ LRESULT CppFaxOutboundRoutingRule::SetApplyButton(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (!m_fIsDialogInitiated) //event receieved in too early stage { return 0; } m_fIsDirty = TRUE; SetModified(TRUE); bHandled = TRUE; return(1); } /* - CppFaxOutboundRoutingRule::OnDestenationRadioClicked - * Purpose: * Gray/Ungray the folder edit box and the * browse button. Enable apply button. * * Arguments: * * Return: * 1 */ LRESULT CppFaxOutboundRoutingRule::OnDestenationRadioClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { BOOL State; if (!m_fIsDialogInitiated) //event receieved in too early stage { return 0; } else { m_fIsDirty = TRUE; } State = ( IsDlgButtonChecked(IDC_DESTINATION_RADIO11) == BST_CHECKED ); ::EnableWindow(GetDlgItem(IDC_DEVICES4RULE_COMBO1), State); ATLASSERT(!State == (IsDlgButtonChecked(IDC_DESTINATION_RADIO21) == BST_CHECKED)); ::EnableWindow(GetDlgItem(IDC_GROUP4RULE_COMBO1), !State); if (State)//IsDlgButtonChecked(IDC_DESTINATION_RADIO11) == BST_CHECKED { if ( CB_ERR == m_DeviceCombo.GetCurSel()) { m_fAllReadyToApply = FALSE; SetModified(FALSE); goto Exit; } //else continue to whole controls check } else //IsDlgButtonChecked(IDC_DESTINATION_RADIO21) == BST_CHECKED { if ( CB_ERR == m_GroupCombo.GetCurSel()) { m_fAllReadyToApply = FALSE; SetModified(FALSE); goto Exit; } //else continue to whole controls check } if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; SetModified(TRUE); } else { //Should be EnableOK(FALSE); } } Exit: return(1); } /* - CppFaxOutboundRoutingRule::OnRuleTypeRadioClicked - * Purpose: * Gray/Ungray the folder edit box and the * browse button. Enable apply button. * * Arguments: * * Return: * 1 */ LRESULT CppFaxOutboundRoutingRule::OnRuleTypeRadioClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { BOOL State; if (!m_fIsDialogInitiated) //event receieved in too early stage { return 0; } else { m_fIsDirty = TRUE; } State = ( IsDlgButtonChecked(IDC_COUNTRY_RADIO1) == BST_CHECKED ); ATLASSERT(!State == ( IsDlgButtonChecked(IDC_AREA_RADIO1) == BST_CHECKED ) ); ::EnableWindow(GetDlgItem(IDC_RULE_AREACODE_EDIT1), !State); if (!State)//IsDlgButtonChecked(IDC_AREA_RADIO1) == BST_CHECKED { if ( !m_AreaCodeEdit.GetWindowTextLength() ) { m_fAllReadyToApply = FALSE; SetModified(FALSE); goto Exit; } //else continue to whole controls check } //else //IsDlgButtonChecked(IDC_COUNTRY_RADIO1) == BST_CHECKED //Do noting - continue to whole controls check if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; SetModified(TRUE); } } Exit: return(1); } /* - CppFaxOutboundRoutingRule::OnComboChanged - * Purpose: * Gray/Ungray the submit button. * * Arguments: * * Return: * 1 */ LRESULT CppFaxOutboundRoutingRule::OnComboChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::OnComboChanged")); if (!m_fIsDialogInitiated) //event receieved in too early stage { return 0; } else { m_fIsDirty = TRUE; } if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; SetModified(TRUE); } } return 0; } /* - CppFaxOutboundRoutingRule::OnTextChanged - * Purpose: * Enable/Disable the submit button. * * Arguments: * * Return: * 1 */ LRESULT CppFaxOutboundRoutingRule::OnTextChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::OnTextChanged")); UINT fEnableOK = 0; if (!m_fIsDialogInitiated) //event receieved in too early stage { return 0; } else { m_fIsDirty = TRUE; } switch (wID) { case IDC_RULE_AREACODE_EDIT1: fEnableOK = ( m_AreaCodeEdit.GetWindowTextLength() ); break; case IDC_RULE_COUNTRYCODE_EDIT1: fEnableOK = ( m_CountryCodeEdit.GetWindowTextLength() ); break; default: ATLASSERT(FALSE); } if(!!fEnableOK) { if (!m_fAllReadyToApply) { if (AllReadyToApply(TRUE)) { m_fAllReadyToApply = TRUE; SetModified(TRUE); } } } else { SetModified(FALSE); m_fAllReadyToApply = FALSE; } return 0; } BOOL CppFaxOutboundRoutingRule::AllReadyToApply(BOOL fSilent) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::AllReadyToApply")); HINSTANCE hInst; hInst = _Module.GetResourceInstance(); if (ROUTING_RULE_COUNTRY_CODE_ANY != m_dwCountryCode) { if ( !m_CountryCodeEdit.GetWindowTextLength() ) { if (!fSilent) { PageError(IDS_ZERO_COUNTRYCODE, m_hWnd, hInst); ::SetFocus(GetDlgItem(IDC_NEWRULE_COUNTRYCODE_EDIT)); } return FALSE; } if ( IsDlgButtonChecked(IDC_AREA_RADIO1) == BST_CHECKED ) { if ( !m_AreaCodeEdit.GetWindowTextLength() ) { if (!fSilent) { PageError(IDS_EMPTY_AREACODE, m_hWnd, hInst); ::SetFocus(GetDlgItem(IDC_RULE_AREACODE_EDIT1)); } return FALSE; } } //else - Do noting } if ( IsDlgButtonChecked(IDC_DESTINATION_RADIO11) == BST_CHECKED ) { if ( CB_ERR == m_DeviceCombo.GetCurSel()) { if (!fSilent) { PageError(IDS_PLEASESELECT_DEVICE, m_hWnd, hInst); ::SetFocus(GetDlgItem(IDC_DEVICES4RULE_COMBO1)); } return FALSE; } } else if ( CB_ERR == m_GroupCombo.GetCurSel()) { if (!fSilent) { PageError(IDS_PLEASESELECT_GROUP, m_hWnd, hInst); ::SetFocus(GetDlgItem(IDC_GROUP4RULE_COMBO1)); } return FALSE; } // // Cheers! // ...every thing ready to apply now. // return TRUE; } HRESULT CppFaxOutboundRoutingRule::InitFaxRulePP(CFaxOutboundRoutingRuleNode * pParentNode) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::InitFaxRulePP")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; // // Step 0: Init Parent // m_pParentNode = pParentNode; // // 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); // // Step 2 : Init members from parent // ATLASSERT(m_pParentNode); m_dwCountryCode = m_pParentNode->GetCountryCode(); m_dwAreaCode = m_pParentNode->GetAreaCode(); m_fIsGroup = m_pParentNode->GetIsGroup(); if (m_fIsGroup) { m_bstrGroupName = m_pParentNode->GetGroupName(); if (!m_bstrGroupName) { hRc = E_OUTOFMEMORY; goto Error; } } else { m_dwDeviceID = m_pParentNode->GetDeviceID(); } 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; } /* - CppFaxOutboundRoutingRule::FaxConfigureRule - * Purpose: * Configure the rule's device or group. * * Arguments: * * Return: * */ HRESULT CppFaxOutboundRoutingRule::FaxConfigureRule( BOOL fNewUseGroup, DWORD dwNewDeviceID, LPCTSTR lpctstrNewGroupName) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::FaxConfigureRule")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; BOOL fSkipMessage = FALSE; FAX_OUTBOUND_ROUTING_RULE FaxRuleConfig; // // Collect all data and init the structure's fields // uses Copy() to copy and also allocate before // ZeroMemory (&FaxRuleConfig, sizeof(FAX_OUTBOUND_ROUTING_RULE)); // // Init the needed fields // FaxRuleConfig.dwSizeOfStruct = sizeof(FAX_OUTBOUND_ROUTING_RULE); FaxRuleConfig.dwAreaCode = m_dwAreaCode; FaxRuleConfig.dwCountryCode = m_dwCountryCode; FaxRuleConfig.bUseGroup = fNewUseGroup; if (fNewUseGroup) { FaxRuleConfig.Destination.lpcstrGroupName = lpctstrNewGroupName; } else { FaxRuleConfig.Destination.dwDeviceId = dwNewDeviceID; } // // get RPC Handle // if (!m_pFaxServer->GetFaxServerHandle()) { ec= GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Failed to GetFaxServerHandle. (ec: %ld)"), ec); goto Error; } // // Configure the rule // if (!FaxSetOutboundRule ( m_pFaxServer->GetFaxServerHandle(), &FaxRuleConfig)) { ec = GetLastError(); // specific 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; } //general DebugPrintEx( DEBUG_ERR, _T("Fail to set rule %ld:%ld. (ec: %ld)"), m_dwCountryCode, m_dwAreaCode, ec); if (IsNetworkError(ec)) { DebugPrintEx( DEBUG_ERR, _T("Network Error was found. (ec: %ld)"), ec); m_pFaxServer->Disconnect(); } goto Error; } ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec); DebugPrintEx( DEBUG_MSG, _T("The rule was configured successfully.")); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); hRc = HRESULT_FROM_WIN32(ec); if (!fSkipMessage) { PageError(GetFaxServerErrorMsg(ec),m_hWnd); } Exit: return(hRc); } /* - CppFaxOutboundRoutingRule::FaxReplaceRule - * Purpose: * Configure the rule's device or group. * * Arguments: * * Return: * */ HRESULT CppFaxOutboundRoutingRule::FaxReplaceRule( DWORD dwNewAreaCode, DWORD dwNewCountryCode, BOOL fNewUseGroup, DWORD dwNewDeviceID, LPCTSTR lpctstrNewGroupName) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::FaxReplaceRule")); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; BOOL fSkipMessage = FALSE; // // 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(), dwNewAreaCode, dwNewCountryCode, dwNewDeviceID, lpctstrNewGroupName, fNewUseGroup)) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to add rule %ld:%ld. (ec: %ld)"), m_dwCountryCode, m_dwAreaCode, 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; } ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec); DebugPrintEx( DEBUG_MSG, _T("Step 1 - The new rule was added successfully.")); if (!FaxRemoveOutboundRule ( m_pFaxServer->GetFaxServerHandle(), m_dwAreaCode, m_dwCountryCode)) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to remove rule. (ec: %ld)"), ec); if (IsNetworkError(ec)) { DebugPrintEx( DEBUG_ERR, _T("Network Error was found. (ec: %ld)"), ec); m_pFaxServer->Disconnect(); } goto Error; } ATLASSERT(S_OK == hRc && ERROR_SUCCESS == ec); DebugPrintEx( DEBUG_MSG, _T("Step 2 - The old rule was removed successfully.")); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); hRc = HRESULT_FROM_WIN32(ec); if (!fSkipMessage) { PageError(GetFaxServerErrorMsg(ec),m_hWnd); } Exit: return(hRc); } /* - CppFaxOutboundRoutingRule::OnSelectCountryCodeClicked - * Purpose: * * * Arguments: * [out] bHandled - Do we handle it? * [in] pRoot - The root node * * Return: * OLE Error code */ LRESULT CppFaxOutboundRoutingRule::OnSelectCountryCodeClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)//(bool &bHandled, CSnapInObjectRootBase *pRoot) { DEBUG_FUNCTION_NAME( _T("CppFaxOutboundRoutingRule::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; SetModified(TRUE); } else { //Should be EnableOK(FALSE); } } Cleanup: return hRc; } ////////////////////////////////////////////////////////////////////////////// /*++ CppFaxServerSentItems::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 CppFaxOutboundRoutingRule::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { DEBUG_FUNCTION_NAME(_T("CppFaxOutboundRoutingRule::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; } /////////////////////////////////////////////////////////////////////////////