📄 callforwarding.cpp
字号:
//
// 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 + -