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

📄 callforwarding.cpp

📁 一个WinCE6。0下的IP phone的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
#include "callForwarding.hpp"
#include "SettingsApp.hpp"
#include "resource.h"
#include "VoIPNotify.hpp"
#include "ControlDefinitions.h"
#include "Controls.hpp"
#include "CallerIDDisplayItem.hpp"
#include "SettingsApi.hpp"

#define ZONE_SETTING_ERROR  1

HRESULT
GetAutoForward(
    __out_ecount(cchBuffer) WCHAR*  pAutoForward,
    int     cchBuffer
    )
{
    if (pAutoForward == NULL)
        return E_POINTER;     

    WCHAR strForwardingNumbers[MAX_PATH] = L"";  
    HRESULT hr = RegistryGetString(
        SN_VOIP_LISTOFFORWARDINGNUMBER_ROOT, 
        SN_VOIP_LISTOFFORWARDINGNUMBER_PATH, 
        SN_VOIP_LISTOFFORWARDINGNUMBER_VALUE, 
        strForwardingNumbers, 
        _countof(strForwardingNumbers)
        ); 

    if (HRESULT_CODE(hr) == ERROR_FILE_NOT_FOUND)
    {
        StringCchCopy(pAutoForward, cchBuffer, L"");
        hr = S_OK;
    }
    else
    {
        StringCchCopy(pAutoForward, cchBuffer, strForwardingNumbers);
    }

    return hr;
}

/*------------------------------------------------------------------------------
    AddNewAutoForwardString
    
    Helper function to append a forwarding number to the list of forwarding numbers
    (ensures no duplicates) 
    
    Parameters:
        : The new number to add 
    
    Returns (HRESULT): indicating success or failure
------------------------------------------------------------------------------*/
HRESULT AddNewAutoForwardString(
    const WCHAR *c_wszNew
    )
{
    HRESULT hr = S_OK;
    //check params
    if (! c_wszNew)
    {
        ASSERT (FALSE);
        return E_POINTER;
    }

    //Save the original forwarding numbers
    WCHAR wszForwardingNumbers[MAX_PATH] = L"";
    hr = GetAutoForward(wszForwardingNumbers, _countof(wszForwardingNumbers));
    
    WCHAR *pwchCurrent = (WCHAR*)wszForwardingNumbers,
          *pwchNext    = NULL;

    //numbers are separated by semi-colons
    while (pwchCurrent && *pwchCurrent)
    {
        pwchNext = wcschr(pwchCurrent, L';');
        if (! pwchNext)
        {
            pwchNext = pwchCurrent + wcslen(pwchCurrent);
        }

        //if the number is already there, we don't need to append it
        if (wcsnicmp(c_wszNew, pwchCurrent, pwchNext - pwchCurrent) == 0)
        {
            return S_FALSE;
        }

        pwchCurrent = pwchNext;
        if (*pwchCurrent == L';')
            pwchCurrent++;
    }

    //the number was not found in the list, add the number to the front of our list
    ce::wstring wstrNewValue;
    if (! wstrNewValue.assign(c_wszNew) ||
        ! wstrNewValue.append(L";")     ||
        ! wstrNewValue.append(wszForwardingNumbers)
        )
    {
        return E_OUTOFMEMORY;
    }

    hr = RegistrySetString(
        SN_VOIP_LISTOFFORWARDINGNUMBER_ROOT, 
        SN_VOIP_LISTOFFORWARDINGNUMBER_PATH, 
        SN_VOIP_LISTOFFORWARDINGNUMBER_VALUE, 
        wstrNewValue
        ); 
    if (FAILED(hr))
    {
        ASSERT (FALSE);
    }
    
    return hr;

}


/*------------------------------------------------------------------------------
    DeleteAutoForwardString
    
    Helper function to delete a forwarding number from the list of forwarding numbers
    (ensures no duplicates) 
    
    Parameters:
        : The number to delete 
    
    Returns (HRESULT): indicating success or failure
------------------------------------------------------------------------------*/
HRESULT DeleteAutoForwardString(
    const WCHAR *c_wszExisted
    )
{
    HRESULT hr = S_OK;
    //check params
    if (! c_wszExisted)
    {
        ASSERT (FALSE);
        return E_POINTER;
    }

    //Save the original forwarding numbers
    WCHAR wszForwardingNumbers[MAX_PATH] = L"";
    hr = GetAutoForward(wszForwardingNumbers, _countof(wszForwardingNumbers));
    
    WCHAR *pwchCurrent = (WCHAR*)wszForwardingNumbers,
          *pwchNext    = NULL;

    ce::wstring wstrNewValue;

    //numbers are separated by semi-colons
    while (pwchCurrent && *pwchCurrent)
    {
        pwchNext = wcschr(pwchCurrent, L';');
        if (! pwchNext)
        {
            pwchNext = pwchCurrent + wcslen(pwchCurrent);
        }

        //if the number is already there, we need to remove this number from original string
        if (wcsnicmp(c_wszExisted, pwchCurrent, pwchNext - pwchCurrent) == 0)
        {
            *pwchCurrent = L'\0';

        // Initialize a wstrNewValue
        if (!wstrNewValue.assign(L""))
        {
            return E_OUTOFMEMORY; 
        } 

        // if there is a string before current number, append it to wstrNewValue
        if (wszForwardingNumbers)
        {
            if(!wstrNewValue.append(wszForwardingNumbers))
            {
                return E_OUTOFMEMORY; 
            }
        }

        // if there is a string after current number, append it to wstrNewValue
        if ((pwchNext) && (*(pwchNext + 1)))
        {
            if(!wstrNewValue.append(pwchNext + 1))
            {
                return E_OUTOFMEMORY; 
            }
        }

        hr = RegistrySetString(
            SN_VOIP_LISTOFFORWARDINGNUMBER_ROOT, 
            SN_VOIP_LISTOFFORWARDINGNUMBER_PATH, 
            SN_VOIP_LISTOFFORWARDINGNUMBER_VALUE, 
            wstrNewValue
            ); 
        if (FAILED(hr))
        {
            ASSERT (FALSE);
            return hr;
        }

        return S_OK; 
        }

        pwchCurrent = pwchNext;
        if (*pwchCurrent == L';')
            pwchCurrent++;
    }

    //the number was not found in the list, return S_FALSE
    return S_FALSE; 
}

CallForwardingDialog_t::CallForwardingDialog_t()
{
    m_MessageBox    = NULL;
    m_CurrentMenuId = 0;
}

CallForwardingDialog_t::~CallForwardingDialog_t()
{
    SaveCurrentEntry();
    if (m_MessageBox)
    {
        DestroyWindow(m_MessageBox);
    }
}

HRESULT 
CallForwardingDialog_t::CreateDialogScreen()
{
    UINT    statusHeader;
        
    HRESULT hr = RegistryGetDWORD(
            SN_VOIP_CALLFORWARDING_ROOT, 
            SN_VOIP_CALLFORWARDING_PATH, 
            SN_VOIP_CALLFORWARDING_VALUE, 
            &m_fAutoForwarding
            ); 
    if (HRESULT_CODE(hr) == ERROR_FILE_NOT_FOUND)
    {
        m_fAutoForwarding = 0;
        hr = S_OK;
    }
    if (m_fAutoForwarding == 0)
    {
        hr = RegistrySetString(
            SN_VOIP_FORWARDINGNUMBER_ROOT, 
            SN_VOIP_FORWARDINGNUMBER_PATH, 
            SN_VOIP_FORWARDINGNUMBER_VALUE, 
            L""
            ); 
        if (FAILED(hr))
        {
            ASSERT (FALSE);
        }
    }

    statusHeader = (m_fAutoForwarding) ? 
        IDS_FORWARDENABLED_HEADER : 
        IDS_FORWARDDISABLED_HEADER;
 
    return SettingsDialog_t::CreateDialogScreen(
        statusHeader,
        IDS_CALLFORWARDING_TITLE,
        IDMB_CALLFORWARDING_EMPTY_BUTTONS,
        PHSETTINGS_CALLERFORWARDING_SCREEN_ID
        );
}

HRESULT 
CallForwardingDialog_t::Initialize(
    )
{ 
    HRESULT hr = S_OK;

    hr = OnResetContent();
    if (FAILED(hr))
    {
        goto exit;
    }

    //add the appropriate items
    hr = (m_fAutoForwarding) ? 
        AddForwardingEnabledItems() :
        AddForwardingDisabledItems();
    if (FAILED(hr))
    {
        goto exit;
    }

    UpdateStatusHeader();
    UpdateMenuBar();

    return hr;

exit:
    ASSERT(FALSE);
    return hr;
}

HRESULT 
CallForwardingDialog_t::OnCommand(
    WPARAM              wParam
    )
{ 
    if (HIWORD(wParam) == LBN_SELCHANGE && LOWORD(wParam) == IDC_LISTBOX)
    {
        return UpdateMenuBar();
    }
    switch (wParam) 
    {
    case IDC_INPUT:
        break;
    case IDC_BACKSPACE:
        return SendMessage(
            GetFocus(), 
            WM_CHAR, 
            L'\b',
            0
            );
    case IDC_DELETE:
        return OnDelete();
    case IDC_DELETEALL:
        return OnDeleteAll();
    case IDC_TURNON:
    case IDC_TURNOFF:
        return OnTurnOnOff();
    case IDCANCEL:
        return GetSettingsApp()->GoBackToPreviousScreen();
    default:
        return UpdateMenuBar();
    }    
    return S_OK;
}

HRESULT
CallForwardingDialog_t::OnNotify(
    WPARAM      wParam, 
    LPARAM      lParam
    )
{

    //we only care about NOTIFY when we are waiting for a delete confirmation
    const NMHDR* pNmHdr = reinterpret_cast<const NMHDR*>(lParam);
    if (! pNmHdr)
    {
        ASSERT(FALSE);
        return E_FAIL;
    }

    if (m_MessageBox == NULL)
    {
        return S_FALSE;
    }
    DestroyWindow(m_MessageBox);
    m_MessageBox = NULL;

    //validate the return value...
    switch (LOWORD(wParam))
    {
    case IDC_CONFIRMDELETE_YES:
        return OnClearForwardingList();
    case IDC_CONFIRMDELETE_NO:
    case IDCANCEL:
        return S_OK;
    default:
        //unknown, ignore this...
        return S_FALSE;
    }
}

HRESULT 
CallForwardingDialog_t::AddForwardingDisabledItems(
    void
    )
{
    HRESULT hr = S_OK;
    ListBox_t ListBox;
    ListBox = GetDlgItem (m_DialogScreen, IDC_LISTBOX);
    IVoIPDisplayItem* pLabeledItem;
    WCHAR strForwardingNumbers[MAX_PATH] = L"";  
    WCHAR strRecoverForwardingNumbers[MAX_PATH] = L"";  
    ce::wstring wstrRecoverPartialForwardingEntry;

    hr = GetAutoForward(strForwardingNumbers, _countof(strForwardingNumbers));

    const WCHAR *c_wszPreviousForwardNumbers = strForwardingNumbers;
    WCHAR *pwchCurrentNumber = NULL,
          *pwchNextNumber    = NULL;
    CCallerIDDisplayItem_t *pItem              = NULL;

    hr = PHCreateLabeledEditDisplayItem(
        (const WCHAR*)LoadString(GlobalData_t::s_ModuleInstance, IDS_FORWARDTO_LABEL, 0, 0),
        ES_NUMBER | WS_BORDER,
        MAX_PATH,
        &pLabeledItem,
        -1
        );
    if (FAILED(hr))
    {
        goto exit;
    }

    hr = RegistryGetString(
        SN_VOIP_RECOVERPARTIALFORWARDING_ROOT, 
        SN_VOIP_RECOVERPARTIALFORWARDING_PATH, 
        SN_VOIP_RECOVERPARTIALFORWARDING_VALUE, 
        strRecoverForwardingNumbers, 
        _countof(strRecoverForwardingNumbers)
        ); 

    if (HRESULT_CODE(hr) == ERROR_FILE_NOT_FOUND)
    {
        wstrRecoverPartialForwardingEntry.assign(L"");
        hr = S_OK;
    }
    else
    {
        wstrRecoverPartialForwardingEntry.assign(strRecoverForwardingNumbers);
    }

    hr = pLabeledItem->SetText(wstrRecoverPartialForwardingEntry);         
    if (FAILED(hr))
    {
        delete pLabeledItem;
        goto exit;
    }
    hr = RegistrySetString(
        SN_VOIP_RECOVERPARTIALFORWARDING_ROOT, 
        SN_VOIP_RECOVERPARTIALFORWARDING_PATH, 
        SN_VOIP_RECOVERPARTIALFORWARDING_VALUE, 
        L""
        );
    if (FAILED(hr))
    {
        delete pLabeledItem;
        goto exit;
    }

    hr = ListBox.AddItem(-1, pLabeledItem);
    if (FAILED(hr))
    {
        delete pLabeledItem;
        goto exit;
    }

    //for each previously forwarded number, add the number to list of forwarding numbers
    pwchCurrentNumber = (WCHAR*)c_wszPreviousForwardNumbers;
    while (pwchCurrentNumber && *pwchCurrentNumber)
    {
        pwchNextNumber = wcschr(pwchCurrentNumber, L';');
        if (! pwchNextNumber)
        {
            pwchNextNumber = pwchCurrentNumber + wcslen(pwchCurrentNumber);
        }

        //create the item
        pItem = new CCallerIDDisplayItem_t(
            pwchCurrentNumber, 
            pwchNextNumber - pwchCurrentNumber
            );    
        if (! pItem)
        {
            hr = E_OUTOFMEMORY;

⌨️ 快捷键说明

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