⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serversettings.cpp

📁 一个WinCE6。0下的IP phone的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        return hr; 
    }

    if (*pbstrValue == NULL)
    {
        return E_OUTOFMEMORY; 
    }

    return hr; 

}


HRESULT
GetExchangeProxy(
    IXMLDOMDocument*    pDocument, 
    BSTR*               pbstrValue
    )
{
    if (pbstrValue == NULL)
    {
        return E_INVALIDARG; 
    }
    
    if (pDocument != NULL)
    {
        //getting exchange proxy doesn't need IXMLDOMDocument
        return E_INVALIDARG; 
    }

    *pbstrValue = NULL; 

    WCHAR Value[MAX_PATH] = L""; 
    HRESULT hr = RegistryGetString(
                    SN_VOIP_EXCHANGEPROXY_ROOT, 
                    SN_VOIP_EXCHANGEPROXY_PATH, 
                    SN_VOIP_EXCHANGEPROXY_VALUE, 
                    Value, 
                    _countof(Value)
                    ); 

    if (SUCCEEDED(hr))
    {
        *pbstrValue = SysAllocString(Value); 
    }
    else if (HRESULT_CODE(hr) == ERROR_FILE_NOT_FOUND)
    {
        *pbstrValue = SysAllocString(L"");         
        hr = S_FALSE;
    }
    else if (FAILED(hr))
    {
        return hr; 
    }

    if (*pbstrValue == NULL)
    {
        return E_OUTOFMEMORY; 
    }

    return hr; 

}

const ServerSettings_t::ServerSettingData ServerSettings_t::sc_ServerSettings[] =
{
    {AccountName,           SIPSettings,            GetAccountName,     EIM_SPELL,      0,              IDS_ACCOUNT_LABEL,              IDS_STATUS_HELP_ACCOUNT                 },
    {Password,              SIPSettings,            GetPassword,        EIM_SPELL,      ES_PASSWORD,    IDS_PASSWORD_LABEL,             IDS_STATUS_HELP_PASSWORD                },
    {PhoneNumber,           SIPSettings,            GetUri,             EIM_NUMBERS,      0,              IDS_PHONENUMBER_LABEL,          IDS_STATUS_HELP_PHONENUMBER             },
    {SIPProxy,              SIPSettings,            GetSIPProxy,        EIM_SPELL,      0,              IDS_SIPPROXY_LABEL,             IDS_STATUS_HELP_SIPPROXY                },
    {SIPRegistrar,          SIPSettings,            GetSIPRegistrar,    EIM_SPELL,      0,              IDS_SIPREGISTRAR_LABEL,         IDS_STATUS_HELP_SIPREGISTRAR            },
    {SIPTransport,          SIPSettings,            GetSIPTransport,    EIM_SPELL,      ES_READONLY,    IDS_SIPTRANSPORT_LABEL,         IDS_STATUS_HELP_SIPTRANSPORT            },
    {BackupSIPProxy,        BackupSIPSettings,      GetSIPProxy,        EIM_SPELL,      0,              IDS_BACKUPSIPPROXY_LABEL,       IDS_STATUS_HELP_BACKUPSIPPROXY          },
    {BackupSIPRegistrar,    BackupSIPSettings,      GetSIPRegistrar,    EIM_SPELL,      0,              IDS_BACKUPSIPREGISTRAR_LABEL,   IDS_STATUS_HELP_BACKUPSIPREGISTRAR      },
    {VoicemailProxy,        VoicemailSettings,      GetSIPProxy,        EIM_SPELL,      0,              IDS_VOICEMAILPROXY_LABEL,       IDS_STATUS_HELP_VOICEMAILPROXY          },
    {VoicemailNumber,       ProvisionSettings,      GetVoicemailNumber, EIM_NUMBERS,    ES_NUMBER,      IDS_VOICEMAILNUMBER_LABEL,      IDS_STATUS_HELP_VOICEMAIL               },
    {ExchangeServer,        ExchangeServerSetting,  GetExchangeServer,  EIM_SPELL,      0,              IDS_EXCHANGESERVER_LABEL,       IDS_STATUS_HELP_EXCHANGESERVER          },
    {ExchangeProxy,         ExchangeProxySetting,   GetExchangeProxy,   EIM_SPELL,      0,              IDS_EXCHANGEPROXY_LABEL,        IDS_STATUS_HELP_EXCHANGEPROXY           },
};

const unsigned int ServerSettings_t::sc_ServerSettingsItems = _countof(ServerSettings_t::sc_ServerSettings);

const WCHAR ServerSettings_t::sc_QueryXML[] = L"<voip-provision>" 
                                              L"<query name=\"SIPSettings\" />" 
                                              L"<query name=\"VoicemailSettings\" />" 
                                              L"<query name=\"VoicemailNumber\" />" 
                                              L"<query name=\"BackupSIPSettings\" />" 
                                              L"</voip-provision>"; 

const WCHAR ServerSettings_t::sc_NameAttribute[]  = L"name"; 
const WCHAR ServerSettings_t::sc_ValueAttribute[] = L"value"; 

const WCHAR ServerSettings_t::sc_SIPSettings[]        = L"SIPSettings"; 
const WCHAR ServerSettings_t::sc_BackupSIPSettings[]  = L"BackupSIPSettings"; 
const WCHAR ServerSettings_t::sc_VoicemailSettings[]  = L"VoicemailSettings"; 

ce::wstring ServerSettings_t::s_ServerSettings[ServerSettings_t::LastSetting]; 

ServerSettings_t::ServerSettings_t()
{
}

ServerSettings_t::~ServerSettings_t()
{
}

HRESULT 
ServerSettings_t::RetrieveSettingsFromProvision(
    void
    )
{
    HRESULT hr = S_OK;

    //clear up the cached setting values first
    for (unsigned int Index = 0; Index < _countof(s_ServerSettings); Index ++)
    {
        s_ServerSettings[Index].clear(); 
    }
        
    //retrieve XML output from provision
    WCHAR*  pOutputBuffer = NULL; 
    hr = PHProcessProvisionXML(
                    sc_QueryXML, 
                    &pOutputBuffer
                    );
    if (FAILED(hr) || pOutputBuffer == NULL)
    {
        return hr; 
    }

    //allocate a bstr string
    ce::auto_bstr bstrProvisionXML = SysAllocString(pOutputBuffer); 
    delete [] pOutputBuffer; 

    if (bstrProvisionXML == NULL)
    {
        return E_OUTOFMEMORY;  
    }
        
    //retrieve data from xml 
    hr = RetriveDataFromXML(bstrProvisionXML); 
    if (FAILED(hr))
    {
        ASSERT(FALSE); 
        ///TODO: Need to show an error message?
        return hr; 
    }

    return hr;
}

HRESULT
ServerSettings_t::RetriveDataFromXML(
    BSTR    ProvisionXML
    )
{
    if (ProvisionXML == NULL)
    {
        return E_INVALIDARG;         
    }
    
    VARIANT_BOOL varIsSuccessful = VARIANT_FALSE; 
    
    HRESULT hr = m_cpProvision.CoCreateInstance(__uuidof(DOMDocument)); 
    if (FAILED(hr))
    {   
        return hr; 
    }

    hr = m_cpProvision->loadXML(
                            ProvisionXML, 
                            &varIsSuccessful
                            ); 
    if (hr != S_OK || varIsSuccessful == VARIANT_FALSE)
    {
        return E_FAIL; //treate S_FALSE as error
    }

    CComPtr<IXMLDOMNode>    cpXMLRootNode; 
    hr = m_cpProvision->get_firstChild(&cpXMLRootNode); 
    if (FAILED(hr))
    {
        return hr; 
    }

    if (cpXMLRootNode == NULL)
    {
        ASSERT(FALSE);          //no root node? 
        return E_UNEXPECTED; 
    }

    //start our first round of parsing, dispatch each settings to corresponding IXMLDOMDocument
    CComPtr<IXMLDOMNode>    cpXMLNode;     
    hr = cpXMLRootNode->get_firstChild(&cpXMLNode); 
    while (hr == S_OK)
    {
        hr = DispatchSettings(cpXMLNode); 
        if (FAILED(hr))
        {
            return hr; 
        }

        //get next sibling
        hr = cpXMLNode->get_nextSibling(&cpXMLNode);         
    }

    return ParseEachSetting(); 

}

HRESULT
ServerSettings_t::DispatchSettings(
    IXMLDOMNode* pCurrentNode
    )
{
    if (pCurrentNode == NULL)
    {
        return E_INVALIDARG; 
    }

    ce::auto_bstr bstrName; 
    HRESULT hr = GetAttributeValue(
                    pCurrentNode, 
                    sc_NameAttribute, 
                    &bstrName
                    ); 
    if (hr != S_OK)
    {
        return hr; 
    }

    ce::auto_bstr bstrValue; 
    hr = GetAttributeValue(
            pCurrentNode, 
            sc_ValueAttribute, 
            &bstrValue
            ); 
    if (hr != S_OK)
    {
        return hr; 
    }
    
    //dispath other settings to corresponding IXMLDOMDocument object
    VARIANT_BOOL varIsSuccessful = VARIANT_FALSE; 

    ///TODO: abstract below duplicate logic into a macro
    if (wcsicmp(bstrName, sc_SIPSettings) == 0)
    {
        if (m_cpSIPSettings == NULL)
        {
            hr = m_cpSIPSettings.CoCreateInstance(__uuidof(DOMDocument)); 
            if (FAILED(hr))
            {
                return hr; 
            }
        }

        return m_cpSIPSettings->loadXML(
                                    bstrValue, 
                                    &varIsSuccessful
                                    ); 
    }        


    if (wcsicmp(bstrName, sc_VoicemailSettings) == 0)
    {
        if (m_cpVoicemailSettings == NULL)
        {
            hr = m_cpVoicemailSettings.CoCreateInstance(__uuidof(DOMDocument)); 
            if (FAILED(hr))
            {
                return hr; 
            }
        }

        return m_cpVoicemailSettings->loadXML(
                                    bstrValue, 
                                    &varIsSuccessful
                                    ); 
    }        
    
    if (wcsicmp(bstrName, sc_BackupSIPSettings) == 0)
    {
        if (m_cpBackupSIPSettings == NULL)
        {
            hr = m_cpBackupSIPSettings.CoCreateInstance(__uuidof(DOMDocument)); 
            if (FAILED(hr))
            {
                return hr; 
            }
        }

        return m_cpBackupSIPSettings->loadXML(
                                        bstrValue, 
                                        &varIsSuccessful
                                        ); 
    }

    return hr; 
}


HRESULT
ServerSettings_t::ParseEachSetting(
    void
    )
{
    HRESULT hr = S_OK; 

    IXMLDOMDocument* CategoryMappings[] = {    //MUST be sync with the order of SettingCagetory_e
        m_cpSIPSettings,            // sip settings
        m_cpVoicemailSettings,      // voicemail settings
        m_cpBackupSIPSettings,      // backup sip settings
        m_cpProvision,              // provision settings
        NULL,                       // Exchange Server setting
        NULL,                       // Exchange Proxy setting
    }; 

    ce::auto_bstr bstrValue; 
    
    for (unsigned int Index = 0; Index < _countof(sc_ServerSettings); Index ++)
    {
        hr = sc_ServerSettings[Index].GetSettingValue(
                                        CategoryMappings[sc_ServerSettings[Index].Category], 
                                        &bstrValue
                                        ); 
        if (FAILED(hr))
        {
            return hr; 
        }

        if (!s_ServerSettings[Index].assign(bstrValue == NULL ? L"" : bstrValue))
        {
            return E_OUTOFMEMORY; 
        }

        bstrValue = NULL; 
    }

    return S_OK; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -