windows-nt/Source/XPSP1/NT/net/layer2svc/dialog/wzcdata.cpp
2020-09-26 16:20:57 +08:00

131 lines
4.2 KiB
C++

#include <precomp.h>
#include "eapolcfg.h"
#include "wzcdata.h"
////////////////////////////////////////////////////////////////////////
// CWZCConfig related stuff
//
//+---------------------------------------------------------------------------
// constructor
CWZCConfig::CWZCConfig(DWORD dwFlags, PWZC_WLAN_CONFIG pwzcConfig)
{
m_dwFlags = dwFlags;
CopyMemory(&m_wzcConfig, pwzcConfig, sizeof(WZC_WLAN_CONFIG));
m_pPrev = m_pNext = this;
m_nListIndex = -1;
m_pEapolConfig = NULL;
}
//+---------------------------------------------------------------------------
// destructor
CWZCConfig::~CWZCConfig()
{
// remove the object from the list
m_pPrev->m_pNext = m_pNext;
m_pNext->m_pPrev = m_pPrev;
if (m_pEapolConfig != NULL)
{
delete m_pEapolConfig;
m_pEapolConfig = NULL;
}
}
//+---------------------------------------------------------------------------
// checks whether this configuration matches with the one from pwzcConfig
BOOL
CWZCConfig::Match(PWZC_WLAN_CONFIG pwzcConfig)
{
BOOL bMatch;
// check whether the InfrastructureMode matches
bMatch = (m_wzcConfig.InfrastructureMode == pwzcConfig->InfrastructureMode);
// check whether the SSIDs are of the same length
bMatch = bMatch && (m_wzcConfig.Ssid.SsidLength == pwzcConfig->Ssid.SsidLength);
if (bMatch && m_wzcConfig.Ssid.SsidLength != 0)
{
// in case of Non empty SSIDs, check if they're the same
bMatch = (memcmp(m_wzcConfig.Ssid.Ssid,
pwzcConfig->Ssid.Ssid,
m_wzcConfig.Ssid.SsidLength)) == 0;
}
return bMatch;
}
//+---------------------------------------------------------------------------
// checks whether this configuration is weaker than the one given as parameter
BOOL
CWZCConfig::Weaker(PWZC_WLAN_CONFIG pwzcConfig)
{
BOOL bWeaker = FALSE;
// a configuration is stronger if its privacy bit is set while the matching one is not set
if (m_wzcConfig.Privacy != pwzcConfig->Privacy)
bWeaker = pwzcConfig->Privacy;
// if privacy bits are identical, a configuration is stronger if it has Open Auth mode
else if (m_wzcConfig.AuthenticationMode != pwzcConfig->AuthenticationMode)
bWeaker = (pwzcConfig->AuthenticationMode == Ndis802_11AuthModeOpen);
return bWeaker;
}
DWORD
CWZCConfig::AddConfigToListView(HWND hwndLV, INT nPos)
{
DWORD dwErr = ERROR_SUCCESS;
// ugly but this is life. In order to convert the SSID to LPWSTR we need a buffer.
// We know an SSID can't exceed 32 chars (see NDIS_802_11_SSID from ntddndis.h) so
// make room for the null terminator and that's it. We could do mem alloc but I'm
// not sure it worth the effort (at runtime).
WCHAR wszSSID[33];
UINT nLenSSID = 0;
// convert the LPSTR (original SSID format) to LPWSTR (needed in List Ctrl)
if (m_wzcConfig.Ssid.SsidLength != 0)
{
nLenSSID = MultiByteToWideChar(
CP_ACP,
0,
(LPCSTR)m_wzcConfig.Ssid.Ssid,
m_wzcConfig.Ssid.SsidLength,
wszSSID,
sizeof(wszSSID)/sizeof(WCHAR));
if (nLenSSID == 0)
dwErr = GetLastError();
}
if (dwErr == ERROR_SUCCESS)
{
LVITEM lvi={0};
UINT nImgIdx;
// put the null terminator
wszSSID[nLenSSID]=L'\0';
// get the item's image index
if (m_wzcConfig.InfrastructureMode == Ndis802_11Infrastructure)
{
nImgIdx = (m_dwFlags & WZC_DESCR_ACTIVE) ? WZCIMG_INFRA_ACTIVE :
((m_dwFlags & WZC_DESCR_VISIBLE) ? WZCIMG_INFRA_AIRING : WZCIMG_INFRA_SILENT);
}
else
{
nImgIdx = (m_dwFlags & WZC_DESCR_ACTIVE) ? WZCIMG_ADHOC_ACTIVE :
((m_dwFlags & WZC_DESCR_VISIBLE) ? WZCIMG_ADHOC_AIRING : WZCIMG_ADHOC_SILENT);
}
lvi.iItem = nPos;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.pszText = wszSSID;
lvi.iImage = nImgIdx;
lvi.lParam = (LPARAM)this;
// store the list position in the object
m_nListIndex = ListView_InsertItem(hwndLV, &lvi);
}
return dwErr;
}