// DPHttpPage.cpp : implementation file // // Copyright (c) 2000 Microsoft Corporation // // History // // 03/03/00 v-marfin Added code to handle the selection of AuthType from // the combobox. // Changed handler for combobox from ON_CBN_EDITCHANGE // to ON_CBN_SELCHANGE since combobox is not type to // respond to ON_CBN_EDITCHANGE and the Apply button was // not being set. // 03/05/00 v-marfin bug 59643 : Make this the default starting page. // 03/16/00 v-marfin bug 60233 : Added EscapeSpecialChars() and UnEscapeSpecialChars() // functions and used to double any backslashes contained in strings // being passed to WMI in the Path. See OnApply(). And to remove those // double backslashes upon reading back from WMI (see OnInitDialog()) // 03/22/00 v-marfin bug 60632 : converted timeout to a float value and displayed as // seconds, storing and retrieving as milliseconds. // 03/29/00 v-marfin bug 62585 : Set new Data collector's ENABLED to TRUE if user presses OK. // 03/30/00 v-marfin bug 59237 : If user does not change the default name of the data // collector when they first create it, change it for // them to a more meaningful name based on the data // they select in the property pages. // 04/08/00 v-marfin bug 63116 : Convert and unconvert CRLF from post data and extra headers. // // // #include "stdafx.h" #include "snapin.h" #include "DPHttpPage.h" #include "HMObject.h" #include "HttpAdvancedDlg.h" #include #include "SnapinDefines.h" // v-marfin Bug 61451 #include "DataElement.h" #include "DataGroupScopeItem.h" #include "HealthmonResultsPane.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDPHttpPage property page IMPLEMENT_DYNCREATE(CDPHttpPage, CHMPropertyPage) CDPHttpPage::CDPHttpPage() : CHMPropertyPage(CDPHttpPage::IDD) { //{{AFX_DATA_INIT(CDPHttpPage) m_bRequireReset = FALSE; m_bUseProxy = FALSE; m_sAuthentication = _T(""); m_sPassword = _T(""); m_sProxyAddress = _T(""); m_sProxyPort = _T(""); m_fTimeout = 30.0; m_sURL = _T(""); m_sUserName = _T(""); //}}AFX_DATA_INIT m_bFollowRedirects = TRUE; m_sMethod = _T("GET"); m_sHelpTopic = _T("HMon21.chm::/dDEhttp.htm"); m_iAuthType = 0; // v-marfin Bug 61451 } CDPHttpPage::~CDPHttpPage() { } void CDPHttpPage::DoDataExchange(CDataExchange* pDX) { CHMPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDPHttpPage) DDX_Check(pDX, IDC_CHECK_REQUIRE_RESET, m_bRequireReset); DDX_Check(pDX, IDC_CHECK_USE_PROXY, m_bUseProxy); DDX_CBString(pDX, IDC_COMBO_AUTHENTICATION, m_sAuthentication); DDV_MaxChars(pDX, m_sAuthentication, 255); DDX_Text(pDX, IDC_EDIT_PASSWORD, m_sPassword); DDV_MaxChars(pDX, m_sPassword, 255); DDX_Text(pDX, IDC_EDIT_PROXY_ADDRESS, m_sProxyAddress); DDV_MaxChars(pDX, m_sProxyAddress, 255); DDX_Text(pDX, IDC_EDIT_PROXY_PORT, m_sProxyPort); DDV_MaxChars(pDX, m_sProxyPort, 255); DDX_Text(pDX, IDC_EDIT_TIMEOUT, m_fTimeout); DDX_Text(pDX, IDC_EDIT_URL, m_sURL); DDV_MaxChars(pDX, m_sURL, 512); DDX_Text(pDX, IDC_EDIT_USER_NAME, m_sUserName); DDV_MaxChars(pDX, m_sUserName, 255); //}}AFX_DATA_MAP if( m_bUseProxy ) { GetDlgItem(IDC_EDIT_PROXY_ADDRESS)->EnableWindow(); GetDlgItem(IDC_EDIT_PROXY_PORT)->EnableWindow(); } else { GetDlgItem(IDC_EDIT_PROXY_ADDRESS)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PROXY_PORT)->EnableWindow(FALSE); } } BEGIN_MESSAGE_MAP(CDPHttpPage, CHMPropertyPage) //{{AFX_MSG_MAP(CDPHttpPage) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_ADVANCED, OnButtonAdvanced) ON_BN_CLICKED(IDC_CHECK_USE_PROXY, OnCheckUseProxy) ON_BN_CLICKED(IDC_CHECK_REQUIRE_RESET, OnCheckRequireReset) ON_CBN_SELCHANGE(IDC_COMBO_AUTHENTICATION, OnEditchangeComboAuthentication) ON_EN_CHANGE(IDC_EDIT_PASSWORD, OnChangeEditPassword) ON_EN_CHANGE(IDC_EDIT_PROXY_ADDRESS, OnChangeEditProxyAddress) ON_EN_CHANGE(IDC_EDIT_PROXY_PORT, OnChangeEditProxyPort) ON_EN_CHANGE(IDC_EDIT_TIMEOUT, OnChangeEditTimeout) ON_EN_CHANGE(IDC_EDIT_URL, OnChangeEditUrl) ON_EN_CHANGE(IDC_EDIT_USER_NAME, OnChangeEditUserName) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDPHttpPage message handlers BOOL CDPHttpPage::OnInitDialog() { // v-marfin : bug 59643 : This will be the default starting page for the property // sheet so call CnxPropertyPageCreate() to unmarshal the // connection for this thread. This function must be called // by the first page of the property sheet. It used to // be called by the "General" page and its call still remains // there as well in case the general page is loaded by a // different code path that does not also load this page. // The CnxPropertyPageCreate function has been safeguarded // to simply return if the required call has already been made. // CnxPropertyPageDestory() must be called from this page's // OnDestroy function. // unmarshal connmgr CnxPropertyPageCreate(); CHMPropertyPage::OnInitDialog(); // v-marfin Bug 61451 // Load combobox LoadAuthTypeCombo(); CWbemClassObject* pClassObject = GetObjectPtr()->GetClassObject(); if( ! GfxCheckObjPtr(pClassObject,CWbemClassObject) ) { return TRUE; } //------------------------------------------------------------------------- // v-marfin 59237 : Store original name in case this data collector is // just being created. When they save, we will modify the // name if they haven't. pClassObject->GetProperty(IDS_STRING_MOF_NAME,m_sOriginalName); //------------------------------------------------------------------------- CString sPath; pClassObject->GetProperty(IDS_STRING_MOF_PATH,sPath); if( ! sPath.IsEmpty() ) { // parse out the Method property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("Method"),m_sMethod); // v-marfin Bug 61451 // parse out the AuthType property value and set appropriate value // in the dropdown combo CString sAuthType; CWbemClassObject::GetPropertyValueFromString(sPath,_T("AuthType"),sAuthType); if( ! sAuthType.IsEmpty() ) { m_iAuthType = _ttoi(sAuthType); SetAuthTypeCombo(); } // parse out the Url property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("Url"),m_sURL); CSnapInApp* pApp = (CSnapInApp*) AfxGetApp(); m_sURL = pApp->UnEscapeSpecialChars(m_sURL); // v-marfin bug 60233 // parse out the TimeoutSecs property value CString sTimeout; CWbemClassObject::GetPropertyValueFromString(sPath,_T("TimeoutMSecs"),sTimeout); if( ! sTimeout.IsEmpty() ) { // v-marfin: 60632 // timeout is stored in milliseconds but we display in seconds so // adjust accordingly. m_fTimeout = (float) _ttol(sTimeout); m_fTimeout /= 1000; } // parse out the AuthUser property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("AuthUser"),m_sUserName); m_sUserName = pApp->UnEscapeSpecialChars(m_sUserName); // v-marfin bug 60233 // parse out the AuthPassword property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("AuthPassword"),m_sPassword); m_sPassword = pApp->UnEscapeSpecialChars(m_sPassword); // v-marfin bug 60233 // parse out the ProxyServer property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("ProxyServer"),m_sProxyAddress); m_sProxyAddress = pApp->UnEscapeSpecialChars(m_sProxyAddress); // v-marfin bug 60233 if( ! m_sProxyAddress.IsEmpty() ) { int iIndex = -1; m_bUseProxy = m_sProxyAddress.IsEmpty() ? FALSE : TRUE; if( (iIndex = m_sProxyAddress.Find(_T(":"))) != -1 ) { m_sProxyPort = m_sProxyAddress.Right(m_sProxyAddress.GetLength()-iIndex-1); m_sProxyAddress = m_sProxyAddress.Left(iIndex); } } // parse out the ExtraHeaders property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("ExtraHeaders"),m_sExtraHeaders); m_sExtraHeaders = UnconvertSpecialChars(m_sExtraHeaders); // 63116 // parse out the PostData property value CWbemClassObject::GetPropertyValueFromString(sPath,_T("PostData"),m_sPostData); m_sPostData = UnconvertSpecialChars(m_sPostData); // 63116 // parse out the FollowRedirects property value CString sFollowRedirects; CWbemClassObject::GetPropertyValueFromString(sPath,_T("FollowRedirects"),sFollowRedirects); if( ! sFollowRedirects.IsEmpty() ) { m_bFollowRedirects = _ttoi(sFollowRedirects); } } // set require reset bool bReset; pClassObject->GetProperty(IDS_STRING_MOF_REQUIRERESET,bReset); m_bRequireReset = bReset; delete pClassObject; // v-marfin 59579 if (m_iAuthType == 0) { m_sUserName.Empty(); m_sPassword.Empty(); GetDlgItem(IDC_EDIT_USER_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PASSWORD)->EnableWindow(FALSE); } UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDPHttpPage::OnDestroy() { // v-marfin 62585 : For this new data collector, set its Enabled property to TRUE, but // only if the user is not cancelling these property pages. if (m_bOnApplyUsed) { ClearStatistics(); // 62548 CDataElement* pElement = (CDataElement*)GetObjectPtr(); if (pElement && pElement->IsStateSetToEnabledOnOK()) { TRACE(_T("CDPHttpPage::OnDestroy - New Perfmon Collector: Setting to Enabled\n")); pElement->SetStateToEnabledOnOK(FALSE); // don't do this again CWbemClassObject* pClassObject = GetObjectPtr()->GetClassObject(); if( ! GfxCheckObjPtr(pClassObject,CWbemClassObject) ) { TRACE(_T("ERROR: CDPHttpPage::OnDestroy - Failed to GetClassObject()\n")); return; } // Set the new collector to enabled. BOOL bEnabled=TRUE; HRESULT hr = pClassObject->GetProperty(IDS_STRING_MOF_ENABLE,bEnabled); hr = pClassObject->SetProperty(IDS_STRING_MOF_ENABLE,TRUE); if (!CHECKHRESULT(hr)) { TRACE(_T("ERROR: CDPHttpPage::OnOK - Failed to set ENABLED property on new collector\n")); } //------------------------------------------------------------------- // v-marfin 59237 : If the user has not changed the original default // name, do so for them. Compare against original // name we fetched during OnInitDialog. CString sName; pClassObject->GetProperty(IDS_STRING_MOF_NAME,sName); // Did the user change the default name? if (m_sOriginalName.CompareNoCase(sName)==0) { // No, so set the new name if (!m_sURL.IsEmpty()) { // Use parent to ensure name is unique //CDataGroup* pParent = (CDataGroup*) pElement->GetCollectorsParentClassObject(); if(pElement->GetScopeItemCount()) { CDataElementScopeItem* pItem = (CDataElementScopeItem*)pElement->GetScopeItem(0); if( pItem ) { CDataGroupScopeItem* pDGItem = (CDataGroupScopeItem*)pItem->GetParent(); sName = pDGItem->GetUniqueDisplayName(m_sURL); } } // Set the local element's object data pElement->SetName(sName); // Set its WMI property pClassObject->SetProperty(IDS_STRING_MOF_NAME,sName); // Refresh to show the new name in the IU //pElement->Refresh(); // 63005 pElement->UpdateStatus(); // 63005 } } //------------------------------------------------------------------- pClassObject->SaveAllProperties(); delete pClassObject; } // if (pElement && pElement->IsStateSetToEnabledOnOK()) } // if (m_bOnApplyUsed) CHMPropertyPage::OnDestroy(); // v-marfin : bug 59643 : CnxPropertyPageDestory() must be called from this page's // OnDestroy function. CnxPropertyPageDestroy(); } void CDPHttpPage::OnOK() { CHMPropertyPage::OnOK(); } void CDPHttpPage::OnButtonAdvanced() { CHttpAdvancedDlg dlg; dlg.m_bFollowRedirects = m_bFollowRedirects; dlg.m_sExtraHeaders = m_sExtraHeaders; dlg.m_sHTTPMethod = m_sMethod; dlg.m_sPostData = m_sPostData; if( dlg.DoModal() == IDOK ) { m_bFollowRedirects = dlg.m_bFollowRedirects; m_sExtraHeaders = dlg.m_sExtraHeaders; m_sMethod = dlg.m_sHTTPMethod; m_sPostData = dlg.m_sPostData; SetModified(); } } void CDPHttpPage::OnCheckUseProxy() { UpdateData(); SetModified(); } BOOL CDPHttpPage::OnApply() { if( ! CHMPropertyPage::OnApply() ) { return FALSE; } // v-marfin 62585 : So we can set the collector's state to enabled when OK pressed. m_bOnApplyUsed=TRUE; UpdateData(); CWbemClassObject* pClassObject = GetObjectPtr()->GetClassObject(); if( ! GfxCheckObjPtr(pClassObject,CWbemClassObject) ) { return FALSE; } CString sPath = _T("HTTPProvider."); // parse out the Method property value if( ! m_sMethod.IsEmpty() ) { sPath += _T("Method=\""); sPath += m_sMethod; sPath += _T("\","); } CSnapInApp* pApp = (CSnapInApp*) AfxGetApp(); // parse out the Url property value if( ! m_sURL.IsEmpty() ) { sPath += _T("Url=\""); sPath += pApp->EscapeSpecialChars(m_sURL); // v-marfin bug 60233 sPath += _T("\","); } // parse out the TimeoutSecs property value // v-marfin: 60632 // Since timeout is displayed seconds but stored in milliseconds, // we need to multiply it by 1000. m_fTimeout = (float) fabs((double)(m_fTimeout * 1000)); CString sTimeout; sTimeout.Format(_T("%d"),(int)m_fTimeout); sPath += _T("TimeoutMSecs="); sPath += sTimeout; sPath += _T(","); // v-marfin : 60632 // Now put m_fTimeout back to its original m_fTimeout /= 1000; // v-marfin Bug 61451 // parse out the AuthType property value if (GetAuthTypeFromCombo()) { CString sAuthType; sAuthType.Format(_T("%d"),m_iAuthType); sPath += _T("AuthType="); sPath += sAuthType; sPath += _T(","); } // parse out the AuthUser property value if( ! m_sUserName.IsEmpty() ) { sPath += _T("AuthUser=\""); sPath += pApp->EscapeSpecialChars(m_sUserName); // v-marfin bug 60233 sPath += _T("\","); } // parse out the AuthPassword property value if( ! m_sPassword.IsEmpty() ) { sPath += _T("AuthPassword=\""); sPath += pApp->EscapeSpecialChars(m_sPassword); // v-marfin bug 60233 sPath += _T("\","); } // parse out the ProxyServer property value if( ! m_sProxyAddress.IsEmpty() && m_bUseProxy ) { sPath += _T("ProxyServer=\""); sPath += pApp->EscapeSpecialChars(m_sProxyAddress) + _T(":") + m_sProxyPort; // v-marfin bug 60233 sPath += _T("\","); } // parse out the ExtraHeaders property value if( ! m_sExtraHeaders.IsEmpty() ) { sPath += _T("ExtraHeaders=\""); sPath += ConvertSpecialChars(m_sExtraHeaders); // 63116 sPath += _T("\","); } // parse out the PostData property value if( ! m_sPostData.IsEmpty() ) { sPath += _T("PostData=\""); sPath += ConvertSpecialChars(m_sPostData); // 63116 sPath += _T("\","); } // parse out the FollowRedirects property value CString sFollowRedirects; sFollowRedirects.Format(_T("%d"),m_bFollowRedirects); sPath += _T("FollowRedirects="); sPath += sFollowRedirects; pClassObject->SetProperty(IDS_STRING_MOF_PATH,sPath); // set target namespace CString sNamespace = _T("root\\cimv2\\MicrosoftHealthmonitor"); pClassObject->SetProperty(IDS_STRING_MOF_TARGETNAMESPACE,sNamespace); // set statistics properties /* 63128 CStringArray saNames; saNames.Add(_T("StatusCode")); saNames.Add(_T("StatusText")); saNames.Add(_T("ContentLength")); saNames.Add(_T("TextResponse")); saNames.Add(_T("RawHeaders")); saNames.Add(_T("ContentType")); saNames.Add(_T("Cookie")); saNames.Add(_T("LastModified")); saNames.Add(_T("ResponseTime")); pClassObject->SetProperty(IDS_STRING_MOF_STATISTICSPROPERTYNAMES,saNames);*/ bool bReset = m_bRequireReset ? true : false; pClassObject->SetProperty(IDS_STRING_MOF_REQUIRERESET,bReset); pClassObject->SaveAllProperties(); delete pClassObject; SetModified(FALSE); return TRUE; } void CDPHttpPage::OnCheckRequireReset() { SetModified(); } void CDPHttpPage::OnEditchangeComboAuthentication() { // v-marfin 59579 : If "None" selected as authentication, disable the // Username and Password. UpdateData(); GetAuthTypeFromCombo(); BOOL bNoneSelected = (m_iAuthType == 0); if (bNoneSelected) { m_sUserName.Empty(); m_sPassword.Empty(); } UpdateData(FALSE); GetDlgItem(IDC_EDIT_USER_NAME)->EnableWindow(!bNoneSelected); GetDlgItem(IDC_EDIT_PASSWORD)->EnableWindow(!bNoneSelected); SetModified(); } void CDPHttpPage::OnChangeEditPassword() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } void CDPHttpPage::OnChangeEditProxyAddress() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } void CDPHttpPage::OnChangeEditProxyPort() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } void CDPHttpPage::OnChangeEditTimeout() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } void CDPHttpPage::OnChangeEditUrl() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } void CDPHttpPage::OnChangeEditUserName() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CHMPropertyPage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. SetModified(); } // v-marfin Bug 61451 //********************************************************* // SetAuthTypeCombo // // Set the combo box entry to the value corresponding with the // member variable // // Parms: None // Returns: TRUE - success // FALSE - failed //********************************************************* BOOL CDPHttpPage::SetAuthTypeCombo() { int x=0; int nAuthType=0; int nCount=0; // Get a ptr to the combobox CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO_AUTHENTICATION); if (!pBox) { _ASSERTE(FALSE); return FALSE; } // get the number of entries in the combo nCount = pBox->GetCount(); // Search through each entry for (x=0; xGetItemData(x); _ASSERTE(nAuthType != CB_ERR); // Is this entry type the one we want? if (nAuthType == m_iAuthType) { // yes. Set this as the selected item and get out pBox->SetCurSel(x); return TRUE; } } _ASSERTE(FALSE); // should never get here return FALSE; } // v-marfin Bug 61451 //********************************************************* // LoadAuthTypeCombo // // Loads the combo box from predefined values and sets the // data item associated with each item to its associated value. // // Since the combo is NOT sorted, set the 1st entry to "selected" // upon loading it. Later in the initialization, if the user // had saved a previous value it will be set to that. // // Parms: None // Returns: None //********************************************************* void CDPHttpPage::LoadAuthTypeCombo() { int nRet=0; // Load the combo in the following order: /* #define AUTHTYPE_VALUE_NONE_STRING _T("None") #define AUTHTYPE_VALUE_BASIC_STRING _T("Clear Text (Basic)") #define AUTHTYPE_VALUE_NEGOTIATE_STRING _T("Windows Default (Negotiate)") #define AUTHTYPE_VALUE_NTLM_STRING _T("NTLM") #define AUTHTYPE_VALUE_DIGEST_STRING _T("Digest") #define AUTHTYPE_VALUE_KERBEROS_STRING _T("Kerberos") */ // Get a ptr to the combobox CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO_AUTHENTICATION); if (!pBox) { _ASSERTE(FALSE); return; } // Empty it pBox->ResetContent(); // Load it // AuthType None nRet = pBox->AddString(AUTHTYPE_VALUE_NONE_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_NONE); } // AuthType Basic nRet = pBox->AddString(AUTHTYPE_VALUE_BASIC_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_BASIC); } // AuthType Negotiate nRet = pBox->AddString(AUTHTYPE_VALUE_NEGOTIATE_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_NEGOTIATE); } // AuthType NTLM nRet = pBox->AddString(AUTHTYPE_VALUE_NTLM_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_NTLM); } // AuthType Digest nRet = pBox->AddString(AUTHTYPE_VALUE_DIGEST_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_DIGEST); } // AuthType Kerberos nRet = pBox->AddString(AUTHTYPE_VALUE_KERBEROS_STRING); if (nRet == CB_ERR) { _ASSERTE(FALSE); return; } else { pBox->SetItemData(nRet,AUTHTYPE_VALUE_KERBEROS); } // Set the 1st entry as selected by default ("None") pBox->SetCurSel(0); } // v-marfin Bug 61451 //********************************************************* // GetAuthTypeFromCombo // // Gets the numeric value of the currently selected AuthType // from the combobox // // Parms: None // Returns: TRUE - success // FALSE - failed //********************************************************* BOOL CDPHttpPage::GetAuthTypeFromCombo() { // Get a ptr to the combobox CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO_AUTHENTICATION); if (!pBox) { _ASSERTE(FALSE); return FALSE; } // Get the current selection. int nRet = pBox->GetCurSel(); if (nRet == CB_ERR) { _ASSERTE(FALSE); return FALSE; } // Get the authtype of the selected item nRet = (int)pBox->GetItemData(nRet); if (nRet == CB_ERR) { _ASSERTE(FALSE); return FALSE; } // OK. Set our local member to it. m_iAuthType = nRet; return TRUE; } //*************************************************************** // ConvertSpecialChars 63116 Converts \r\n to "%0D%0A" and adds trailing "%0D%0A" //*************************************************************** CString CDPHttpPage::ConvertSpecialChars(const CString &sString) { CString sRet; int nPos=0; CString sCRLF = _T("\r\n"); CString sFormattedCRLF = _T("%0D%0A"); if (sString.IsEmpty()) return sRet; CString sWrk = sString; // remove any leading / trailing crlf while (sWrk.Right(sCRLF.GetLength()).CompareNoCase(sCRLF)==0) { sWrk = sWrk.Left(sWrk.GetLength()-sCRLF.GetLength()); } while (sWrk.Left(sCRLF.GetLength()).CompareNoCase(sCRLF)==0) { sWrk = sWrk.Mid(sCRLF.GetLength()); } while (sWrk.GetLength()) { nPos = sWrk.Find(sCRLF); if (nPos == -1) break; sRet += sWrk.Mid(0,nPos); // take chars before CRLF sRet += sFormattedCRLF; // add "%0D%0A" sWrk = sWrk.Mid(nPos+sCRLF.GetLength()); } // Add final sRet += sWrk; sRet += sFormattedCRLF; return sRet; } //*************************************************************** // UnconvertSpecialChars 63116 converts "%0D%0A" to \r\n and removes trailing "%0D%0A" //*************************************************************** CString CDPHttpPage::UnconvertSpecialChars(const CString &sString) { CString sRet; int nPos=0; CString sCRLF = _T("\r\n"); CString sFormattedCRLF = _T("%0D%0A"); if (sString.IsEmpty()) return sRet; CString sWrk = sString; // remove any leading / trailing "%0D%0A" while (sWrk.Right(sFormattedCRLF.GetLength()).CompareNoCase(sFormattedCRLF)==0) { sWrk = sWrk.Left(sWrk.GetLength()-sFormattedCRLF.GetLength()); } while (sWrk.Left(sFormattedCRLF.GetLength()).CompareNoCase(sFormattedCRLF)==0) { sWrk = sWrk.Mid(sFormattedCRLF.GetLength()); } while (sWrk.GetLength()) { nPos = sWrk.Find(sFormattedCRLF); if (nPos == -1) break; sRet += sWrk.Mid(0,nPos); // take chars before "%0D%0A" sRet += sCRLF; // add "\r\n" sWrk = sWrk.Mid(nPos+sFormattedCRLF.GetLength()); } // Add final sRet += sWrk; // Remove trailing while (sRet.Right(sCRLF.GetLength()).CompareNoCase(sCRLF)==0) { sRet = sRet.Left(sRet.GetLength()-sCRLF.GetLength()); } return sRet; }