📄 editserversettings.cpp
字号:
if (FAILED(hr))
{
return hr;
}
if (!m_NewServerSettings[Index].assign(Text))
{
return E_OUTOFMEMORY;
}
if (m_NewServerSettings[Index] != ServerSettings_t::s_ServerSettings[Index])
{
if (!ServerSettings_t::s_ServerSettings[Index].assign(m_NewServerSettings[Index].get_buffer()))
{
return E_OUTOFMEMORY;
}
UpdateFlags(Index);
}
}
if (m_UpdatedCategoryFlag != 0)
{
hr = ApplyNewSettings();
if (FAILED(hr))
{
///TODO: show up an error message?
ASSERT(FALSE);
return hr;
}
}
return GetSettingsApp()->GoBackToPreviousScreen();
}
void
EditServerSettingsDialog_t::UpdateFlags(
unsigned int Index
)
{
if (Index < 0 || Index >= ServerSettings_t::LastSetting)
{
return;
}
ServerSettings_t::SettingCategory_e Category = ServerSettings_t::sc_ServerSettings[Index].Category;
switch (Category)
{
case ServerSettings_t::SIPSettings:
m_UpdatedCategoryFlag |= VOIP_SIP_SETTINGS_BITMASK;
break;
case ServerSettings_t::VoicemailSettings:
m_UpdatedCategoryFlag |= VOIP_VOICEMAIL_SETTINGS_BITMASK;
break;
case ServerSettings_t::BackupSIPSettings:
m_UpdatedCategoryFlag |= VOIP_BACKUP_SIP_SETTINGS_BITMASK;
break;
case ServerSettings_t::ProvisionSettings:
m_UpdatedCategoryFlag |= VOIP_VOICEMAIL_NUMBER_BITMASK;
break;
case ServerSettings_t::ExchangeProxySetting:
m_UpdatedCategoryFlag |= EXCHANGE_PROXY;
break;
case ServerSettings_t::ExchangeServerSetting:
m_UpdatedCategoryFlag |= EXCHANGE_SERVER;
break;
default:
ASSERT(FALSE);
break;
}
return;
}
HRESULT
EditServerSettingsDialog_t::ApplyNewSettings(
void
)
{
HRESULT hr = S_OK;
WCHAR ProvisionKey[MAX_PATH] = L"";
int ExchangeSettingsChanged = 0;
if (m_UpdatedCategoryFlag & VOIP_SIP_SETTINGS_BITMASK)
{
if (ShouldDeleteSIPSettings())
{
m_pSIPSettings = (WCHAR*)sc_DeleteSIPSettings;
}
else
{
//generate the unique provision key first
StringCchPrintf(
ProvisionKey,
_countof(ProvisionKey),
L"%08x",
GetTickCount()
);
DWORD MessageValues[] =
{
reinterpret_cast<DWORD>(ProvisionKey), // 1 - keyname
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::AccountName].get_buffer())), // 2 - account name
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::Password].get_buffer())), // 3 - password
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::PhoneNumber].get_buffer())), // 4 - uri
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPProxy].get_buffer())), // 5 - sip proxy
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPTransport].get_buffer())),// 6 - protocol
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPRegistrar].get_buffer())),// 7 - sip registrar
};
//come up the sip setting RTC XML
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
sc_SIPSettingsTemplate,
0, 0,
(LPWSTR)&m_pSIPSettings,
0,
reinterpret_cast<va_list*>(MessageValues)
))
{
hr = CommonUtilities_t::GetErrorFromWin32();
goto exit;
}
}
}
if (m_UpdatedCategoryFlag & VOIP_BACKUP_SIP_SETTINGS_BITMASK)
{
if (ShouldDeleteBackupSIPSettings())
{
//we cleared up the back up sip settings, use the delete template
m_pBackupSIPSettings = (WCHAR*)sc_DeleteBackupSIPSettings;
}
else
{
//generate the unique provision key first
StringCchPrintf(
ProvisionKey,
_countof(ProvisionKey),
L"%08x",
GetTickCount()
);
DWORD MessageValues[] =
{
reinterpret_cast<DWORD>(ProvisionKey), // 1 - keyname
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::AccountName].get_buffer())), // 2 - account name
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::Password].get_buffer())), // 3 - password
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::PhoneNumber].get_buffer())), // 4 - uri
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::BackupSIPProxy].get_buffer())), // 5 - backup sip proxy
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPTransport].get_buffer())), // 6 - protocol
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::BackupSIPRegistrar].get_buffer())),// 7 - backup sip registrar
};
//come up the backup sip setting RTC XML
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
sc_BackupSIPSettingsTemplate,
0, 0,
(LPWSTR)&m_pBackupSIPSettings,
0,
reinterpret_cast<va_list*>(MessageValues)
))
{
hr = CommonUtilities_t::GetErrorFromWin32();
goto exit;
}
}
}
if (m_UpdatedCategoryFlag & VOIP_VOICEMAIL_SETTINGS_BITMASK)
{
if (ShouldDeleteVoicemailSettings())
{
//we cleared up the voicemail settings, use the delete voicemail settings template
m_pVoicemailSettings = (WCHAR*)sc_DeleteVoicemailSettings;
}
else
{
//generate the unique provision key first
StringCchPrintf(
ProvisionKey,
_countof(ProvisionKey),
L"%08x",
GetTickCount()
);
DWORD MessageValues[] =
{
reinterpret_cast<DWORD>(ProvisionKey), // 1 - keyname
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::AccountName].get_buffer())), // 2 - account name
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::Password].get_buffer())), // 3 - password
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::PhoneNumber].get_buffer())), // 4 - uri
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::VoicemailProxy].get_buffer())), // 5 - voicemail proxy
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPTransport].get_buffer())), // 6 - protocol
};
//come up the sip setting RTC XML
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
sc_VoicemailSettingsTemplate,
0, 0,
(LPWSTR)&m_pVoicemailSettings,
0,
reinterpret_cast<va_list*>(MessageValues)
))
{
hr = CommonUtilities_t::GetErrorFromWin32();
goto exit;
}
}
}
if (m_UpdatedCategoryFlag & VOIP_VOICEMAIL_NUMBER_BITMASK)
{
if (ShouldDeleteVoicemailNumber())
{
//we cleared up voice mail number, use the delete template
m_pVoicemailNumber = (WCHAR*)sc_DeleteVoicemailNumber;
}
else
{
DWORD MessageValues[] =
{
reinterpret_cast<DWORD>((WCHAR*)(ServerSettings_t::s_ServerSettings[ServerSettings_t::VoicemailNumber].get_buffer())), // 1 - voicemail number
};
//come up the voicemail setting RTC XML
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
sc_VoicemailNumberTemplate,
0, 0,
(LPWSTR)&m_pVoicemailNumber,
0,
reinterpret_cast<va_list*>(MessageValues)
))
{
hr = CommonUtilities_t::GetErrorFromWin32();
goto exit;
}
}
}
if (m_UpdatedCategoryFlag & (VOIP_SIP_SETTINGS_BITMASK | VOIP_BACKUP_SIP_SETTINGS_BITMASK | VOIP_VOICEMAIL_SETTINGS_BITMASK | VOIP_VOICEMAIL_NUMBER_BITMASK))
{
//come up the final master provsion XML
DWORD MessageValues[] =
{
reinterpret_cast<DWORD>(m_pSIPSettings),
reinterpret_cast<DWORD>(m_pVoicemailSettings),
reinterpret_cast<DWORD>(m_pVoicemailNumber),
reinterpret_cast<DWORD>(m_pBackupSIPSettings),
};
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
sc_ProvisionTemplate,
0, 0,
(LPWSTR)&m_pProvisionDocument,
0,
reinterpret_cast<va_list*>(MessageValues)
))
{
hr = CommonUtilities_t::GetErrorFromWin32();
goto exit;
}
hr = PHProcessProvisionXML(
m_pProvisionDocument,
NULL
);
if (FAILED(hr))
{
goto exit;
}
}
if (m_UpdatedCategoryFlag & EXCHANGE_PROXY)
{
hr = RegistrySetString(
SN_VOIP_EXCHANGEPROXY_ROOT,
SN_VOIP_EXCHANGEPROXY_PATH,
SN_VOIP_EXCHANGEPROXY_VALUE,
ServerSettings_t::s_ServerSettings[ServerSettings_t::ExchangeProxy].get_buffer()
);
if (FAILED(hr))
{
goto exit;
}
ExchangeSettingsChanged = ExchangeSettingsChanged | EXCHANGE_PROXY;
}
if (m_UpdatedCategoryFlag & EXCHANGE_SERVER)
{
hr = RegistrySetString(
SN_VOIP_EXCHANGESERVER_ROOT,
SN_VOIP_EXCHANGESERVER_PATH,
SN_VOIP_EXCHANGESERVER_VALUE,
ServerSettings_t::s_ServerSettings[ServerSettings_t::ExchangeServer].get_buffer()
);
if (FAILED(hr))
{
goto exit;
}
ExchangeSettingsChanged = ExchangeSettingsChanged | EXCHANGE_SERVER;
}
exit:
if (ExchangeSettingsChanged != 0)
{
RegistrySetDWORD(
SN_VOIP_UPDATEDEXCHANGESETTINGS_ROOT,
SN_VOIP_UPDATEDEXCHANGESETTINGS_PATH,
SN_VOIP_UPDATEDEXCHANGESETTINGS_VALUE,
ExchangeSettingsChanged
);
}
CleanupAllPointers();
return hr;
}
void
EditServerSettingsDialog_t::CleanupPointer(
WCHAR** ppString
)
{
if (ppString == NULL)
{
return;
}
if (*ppString != sc_EmptyString &&
*ppString != sc_DeleteSIPSettings &&
*ppString != sc_DeleteBackupSIPSettings &&
*ppString != sc_DeleteVoicemailNumber &&
*ppString != sc_DeleteVoicemailSettings)
{
LocalFree(*ppString);
*ppString = (WCHAR*)sc_EmptyString;
}
return;
}
inline
bool
EditServerSettingsDialog_t::ShouldDeleteSIPSettings(
void
)
{
return (ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPProxy].length() == 0 &&
ServerSettings_t::s_ServerSettings[ServerSettings_t::SIPRegistrar].length() == 0 &&
ServerSettings_t::s_ServerSettings[ServerSettings_t::AccountName].length() == 0 &&
ServerSettings_t::s_ServerSettings[ServerSettings_t::PhoneNumber].length() == 0);
}
inline
bool
EditServerSettingsDialog_t::ShouldDeleteBackupSIPSettings(
void
)
{
return (ServerSettings_t::s_ServerSettings[ServerSettings_t::BackupSIPProxy].length() == 0 &&
ServerSettings_t::s_ServerSettings[ServerSettings_t::BackupSIPRegistrar].length() == 0);
}
inline
bool
EditServerSettingsDialog_t::ShouldDeleteVoicemailSettings(
void
)
{
return (ServerSettings_t::s_ServerSettings[ServerSettings_t::VoicemailProxy].length() == 0);
}
inline
bool
EditServerSettingsDialog_t::ShouldDeleteVoicemailNumber(
void
)
{
return (ServerSettings_t::s_ServerSettings[ServerSettings_t::VoicemailNumber].length() == 0);
}
inline
void
EditServerSettingsDialog_t::CleanupAllPointers(
void
)
{
CleanupPointer(&m_pProvisionDocument);
CleanupPointer(&m_pSIPSettings);
CleanupPointer(&m_pVoicemailNumber);
CleanupPointer(&m_pVoicemailSettings);
CleanupPointer(&m_pBackupSIPSettings);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -