WifiStatus.dll: Updated to new API.

This commit is contained in:
spx 2012-04-19 07:49:35 -07:00
parent a96ebff1ee
commit d74ddda1b2
2 changed files with 408 additions and 412 deletions

View File

@ -105,6 +105,7 @@
<TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>..\..\Library\x32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<AdditionalDependencies>Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -136,6 +137,7 @@
<TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>..\..\Library\x64\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<AdditionalDependencies>Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -154,7 +156,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>Rainmeter.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../TestBench/x32/Release/Plugins/WifiStatus.dll</OutputFile>
<AdditionalLibraryDirectories>..\..\Library\x32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
@ -183,7 +185,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>Rainmeter.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../TestBench/x64/Release/Plugins/WifiStatus.dll</OutputFile>
<AdditionalLibraryDirectories>..\..\Library\x64\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<RandomizedBaseAddress>false</RandomizedBaseAddress>

View File

@ -16,349 +16,376 @@
*/
#include <windows.h>
#include <map>
#include <string>
#include <math.h>
#include <wlanapi.h>
#pragma comment( lib, "wlanapi.lib")
#include "../../Library/Export.h" // Rainmeter's exported functions
#include "../API/RainmeterAPI.h"
#include "../../Library/DisableThreadLibraryCalls.h" // contains DllMain entry point
/* The exported functions */
extern "C"
{
__declspec( dllexport ) UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id);
__declspec( dllexport ) void Finalize(HMODULE instance, UINT id);
__declspec( dllexport ) UINT Update(UINT id);
__declspec( dllexport ) LPCTSTR GetString(UINT id, UINT flags);
__declspec( dllexport ) UINT GetPluginVersion();
__declspec( dllexport ) LPCTSTR GetPluginAuthor();
}
//Function that translates DOT11 ENUMs to output strings
LPCTSTR getDot11str(int,int);
enum MEASURETYPE
{
UNINITIALIZED,
UNKNOWN,
SSID,
QUALITY,
ENCRYPTION,
AUTH,
LIST,
PHY,
PHY
};
//Struct for storing current meter's settings
typedef struct meas_data {
struct MeasureData
{
MEASURETYPE type;
UINT listStyle;
UINT listMax;
WCHAR * netlist;
bool listInit;
} meas_data_t;
std::wstring statusString;
MeasureData() : type(UNINITIALIZED), listStyle(), listMax(5) {}
};
std::map<UINT, meas_data_t> g_meas_data;
int g_Instances = 0;
/* Globals that store system's wifi interface/adapter structs */
/* These are initialized in Initialize(), used during each update*/
HANDLE hClient = NULL;
PWLAN_INTERFACE_INFO pInterface = NULL;
PWLAN_INTERFACE_INFO_LIST pIntfList = NULL;
UINT g_Instances = 0;
/*
This function is called when the measure is initialized.
The function must return the maximum value that can be measured.
The return value can also be 0, which means that Rainmeter will
track the maximum value automatically. The parameters for this
function are:
// Globals that store system's wifi interface/adapter structs
// These are initialized in Initialize(), used during each update
HANDLE g_hClient = NULL;
PWLAN_INTERFACE_INFO g_pInterface = NULL;
PWLAN_INTERFACE_INFO_LIST g_pIntfList = NULL;
instance The instance of this DLL
iniFile The name of the ini-file (usually Rainmeter.ini)
section The name of the section in the ini-file for this measure
id The identifier for the measure. This is used to identify the measures that use the same plugin.
*/
UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id)
// Function that translates DOT11 ENUMs to output strings
LPCWSTR GetDot11Str(int, int);
std::wstring ConvertToWide(LPCSTR str, int strLen)
{
/* initialize interface/adapter structs */
DWORD dwNegotiatedVersion = 0;
DWORD dwErr;
g_Instances++;
std::wstring szWide;
if (str && *str)
{
int bufLen = MultiByteToWideChar(CP_ACP, 0, str, strLen, NULL, 0);
if (bufLen > 0)
{
szWide.resize(bufLen);
MultiByteToWideChar(CP_ACP, 0, str, strLen, &szWide[0], bufLen);
}
}
return szWide;
}
void FinalizeHandle()
{
g_pInterface = NULL;
if (g_pIntfList != NULL)
{
WlanFreeMemory(g_pIntfList);
g_pIntfList = NULL;
}
if (g_hClient != NULL)
{
WlanCloseHandle(g_hClient, NULL);
g_hClient = NULL;
}
}
PLUGIN_EXPORT void Initialize(void** data, void* rm)
{
MeasureData* measure = new MeasureData;
*data = measure;
++g_Instances;
if (g_Instances == 1)
{
WCHAR buffer[256];
// Create WINLAN API Handle
if (hClient == NULL){
dwErr = WlanOpenHandle( WLAN_API_VERSION, NULL, &dwNegotiatedVersion, &hClient );
if ( ERROR_SUCCESS != dwErr ){
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: Unable to open WLAN API Handle. Error code (%d): %s",(int)dwErr,getDot11str(dwErr,5));
LSLog(LOG_ERROR, NULL, buffer);
return 0;
if (g_hClient == NULL)
{
DWORD dwNegotiatedVersion = 0;
DWORD dwErr = WlanOpenHandle(WLAN_API_VERSION, NULL, &dwNegotiatedVersion, &g_hClient);
if (ERROR_SUCCESS != dwErr)
{
FinalizeHandle();
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Unable to open WLAN API Handle. Error code (%u): %s", dwErr, GetDot11Str((int)dwErr, 5));
RmLog(LOG_ERROR, buffer);
return;
}
}
// Query list of WLAN interfaces
if (pIntfList == NULL){
dwErr= WlanEnumInterfaces(hClient, NULL, &pIntfList);
if (( ERROR_SUCCESS != dwErr) || (&pIntfList->dwNumberOfItems <= 0)){
if (g_pIntfList == NULL)
{
DWORD dwErr = WlanEnumInterfaces(g_hClient, NULL, &g_pIntfList);
if (ERROR_SUCCESS != dwErr)
{
FinalizeHandle();
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Unable to find any WLAN interfaces/adapters. Error code %u", dwErr);
RmLog(LOG_ERROR, buffer);
return;
}
else if (g_pIntfList->dwNumberOfItems == 0)
{
FinalizeHandle();
RmLog(LOG_ERROR, L"WifiStatus.dll: No WLAN interfaces/adapters available.");
return;
}
}
}
}
PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue)
{
if (g_hClient == NULL) return;
MeasureData* measure = (MeasureData*)data;
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: Unable to find any WLAN interfaces/adapters. Error code %d",(int) dwErr);
LSLog(LOG_ERROR, NULL, buffer);
return 0;
}
}
bool changed = false;
// Select a WLAN interface, default 0.
LPCTSTR data = ReadConfigString(section, L"WifiIntfID", L"");
int value = RmReadInt(rm, L"WifiIntfID", 0);
if (value >= (int)g_pIntfList->dwNumberOfItems)
{
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Adapter (WifiIntfID=%i) not valid.", value);
RmLog(LOG_ERROR, buffer);
if ((data != NULL) && *data){
if (_wtoi(data) < (int)pIntfList->dwNumberOfItems){
pInterface = &pIntfList->InterfaceInfo[_wtoi(data)];
} else {
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: Adapter (WifiIntfID=%s) not valid", data);
LSLog(LOG_ERROR, NULL, buffer);
pInterface = &pIntfList->InterfaceInfo[0];
}
} else {
pInterface = &pIntfList->InterfaceInfo[0];
value = 0;
}
g_pInterface = &g_pIntfList->InterfaceInfo[value];
// Select LIST style
data = ReadConfigString(section, L"WifiListStyle", L"");
value = RmReadInt(rm, L"WifiListStyle", 0);
if (value < 0 || value > 3)
{
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiListStyle=%i not valid.", value);
RmLog(LOG_WARNING, buffer);
if ((data != NULL) && *data){
if ( (_wtoi(data) >= 0) && (_wtoi(data) <= 3)){
g_meas_data[id].listStyle = _wtoi(data);
} else {
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: WifiListStyle=%s not valid",data);
LSLog(LOG_WARNING, NULL, buffer);
g_meas_data[id].listStyle = 0;
}
} else {
g_meas_data[id].listStyle = 0;
value = 0;
}
measure->listStyle = value;
// Set maxmimum number of list items
data = ReadConfigString(section, L"WifiListLimit", L"");
g_meas_data[id].listInit = false;
if ((data != NULL) && *data){
if (_wtoi(data) > 0){
g_meas_data[id].listMax = _wtoi(data);
} else {
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: WifiListLimit=%s not valid.",data);
LSLog(LOG_WARNING, NULL, buffer);
g_meas_data[id].listMax = 5;
}
} else {
g_meas_data[id].listMax = 5;
value = RmReadInt(rm, L"WifiListLimit", 5);
if (value <= 0)
{
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiListLimit=%i not valid.", data);
RmLog(LOG_WARNING, buffer);
value = 5;
}
measure->listMax = value;
// Select type of measure
MEASURETYPE infoType = UNKNOWN;
LPCTSTR type = ReadConfigString(section, L"WifiInfoType", L"");
if (type){
if (_wcsicmp(L"SSID", type) == 0){
LPCWSTR type = RmReadString(rm, L"WifiInfoType", L"");
if (_wcsicmp(L"SSID", type) == 0)
{
infoType = SSID;
}
else if (_wcsicmp(L"QUALITY", type) == 0){
else if (_wcsicmp(L"QUALITY", type) == 0)
{
infoType = QUALITY;
}
else if (_wcsicmp(L"ENCRYPTION", type) == 0){
else if (_wcsicmp(L"ENCRYPTION", type) == 0)
{
infoType = ENCRYPTION;
}
else if (_wcsicmp(L"AUTH", type) == 0){
else if (_wcsicmp(L"AUTH", type) == 0)
{
infoType = AUTH;
}
else if (_wcsicmp(L"LIST", type) == 0){
else if (_wcsicmp(L"LIST", type) == 0)
{
infoType = LIST;
}
else if (_wcsicmp(L"PHY", type) == 0){
else if (_wcsicmp(L"PHY", type) == 0)
{
infoType = PHY;
} else {
WCHAR buffer[256];
wsprintf(buffer, L"WifiStatus.dll: WifiInfoType=%d not valid",type);
LSLog(LOG_ERROR, NULL, buffer);
}
g_meas_data[id].type = infoType;
else
{
_snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiInfoType=%s not valid.", type);
RmLog(LOG_ERROR, buffer);
}
if (infoType != measure->type)
{
changed = true;
}
measure->type = infoType;
switch(infoType){
if (changed)
{
measure->statusString.clear();
switch (infoType)
{
case SSID:
case ENCRYPTION:
case AUTH:
return 0;
*maxValue = 0;
break;
case QUALITY:
return 100;
*maxValue = 100;
break;
}
}
}
return 0;
}
/*
This function is called when new value should be measured.
The function returns the new value.
*/
UINT Update(UINT id)
PLUGIN_EXPORT double Update(void* data)
{
if (pInterface == NULL) return NULL;
if (g_pInterface == NULL) return 0;
//Get measure id, and identify type
//std::map<UINT, MEASURETYPE>::iterator typeIter = g_Types.find(id);
//if (typeIter == g_Types.end()) return NULL;
MEASURETYPE current_type = g_meas_data[id].type;
switch(current_type)
MeasureData* measure = (MeasureData*)data;
double value = 0;
if (measure->type != UNKNOWN)
{
case QUALITY:
//Set up variables for WLAN query
ULONG outsize = 0;
PWLAN_CONNECTION_ATTRIBUTES wlan_cattr=NULL;
DWORD dwErr;
GUID& intfGUID = pInterface->InterfaceGuid;
dwErr = WlanQueryInterface( hClient, &intfGUID, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL );
if ( ERROR_SUCCESS != dwErr){
return 0;
}
int retval = (int)wlan_cattr->wlanAssociationAttributes.wlanSignalQuality;
if (wlan_cattr!=NULL)WlanFreeMemory(wlan_cattr);
return retval;
//Transfer rates will go here
}
return NULL;
}
LPCTSTR GetString(UINT id, UINT flags)
if (measure->type == LIST)
{
if (pInterface == NULL) return NULL;
//Some variables for data manipulation in this function
static WCHAR buffer[128];
bool bNetList = false; //whether to return buffer or netlist
bool bInvalidType = false;
bool bIntfError = false;
unsigned int listStyle = 0;
memset(buffer,'\0',128);
listStyle = g_meas_data[id].listStyle;
int printed = 0; //count of how many networks have been printed already
//Set up variables for WLAN queries
ULONG outsize = 0;
PWLAN_CONNECTION_ATTRIBUTES wlan_cattr=NULL;
PWLAN_AVAILABLE_NETWORK_LIST pwnl = NULL;
DWORD dwCErr, dwLErr;
GUID& intfGUID = pInterface->InterfaceGuid;
DWORD dwErr = WlanGetAvailableNetworkList(g_hClient, &g_pInterface->InterfaceGuid, NULL, NULL, &pwnl);
//Initialize WLAN structs with queries, break if no interface found
dwCErr= WlanQueryInterface( hClient, &intfGUID, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL );
dwLErr= WlanGetAvailableNetworkList(hClient,&intfGUID,NULL,NULL,&pwnl);
MEASURETYPE current_type = g_meas_data[id].type;
UINT listMax = g_meas_data[id].listMax;
switch(current_type)
if (ERROR_SUCCESS != dwErr)
{
measure->statusString = L"Error";
}
else
{
case LIST:
if (ERROR_SUCCESS != dwLErr){return L"Error";}
if (!g_meas_data[id].listInit){//Check if netlist has memory allocated already
// Size of network name can be up to 64 chars, set to 80 to add room for delimiters
g_meas_data[id].netlist = (WCHAR*)malloc( 80 * sizeof(WCHAR) * g_meas_data[id].listMax);
if (g_meas_data[id].netlist == NULL){
LSLog(LOG_ERROR, NULL, L"WifiStatus.dll: Unable to allocate network list memory");
g_meas_data[id].listInit = false;
free(g_meas_data[id].netlist);
return NULL;
}
g_meas_data[id].listInit = true;
}
measure->statusString.clear();
measure->statusString.reserve(80 * measure->listMax);
memset(g_meas_data[id].netlist,'\0', (80 * sizeof(WCHAR) * g_meas_data[id].listMax));
memset(buffer,'\0',128);
UINT printed = 0; // count of how many networks have been printed already
// Check all items in WLAN NETWORK LIST
for (int i=0; i < (int)pwnl->dwNumberOfItems ; i++){
if (printed == g_meas_data[id].listMax)
break;
for (size_t i = 0; i < pwnl->dwNumberOfItems ; ++i)
{
if (printed == measure->listMax) break;
// SSID is in UCHAR, convert to WCHAR
mbstowcs(buffer,(char*)pwnl->Network[i].dot11Ssid.ucSSID,pwnl->Network[i].dot11Ssid.uSSIDLength);
std::wstring ssid = ConvertToWide((LPCSTR)pwnl->Network[i].dot11Ssid.ucSSID, (int)pwnl->Network[i].dot11Ssid.uSSIDLength);
// Prevent duplicates that result from profiles, check using SSID
if ((wcsstr(g_meas_data[id].netlist,buffer)== NULL)&&(_wcsicmp(L"", buffer) != 0)){
printed++;
if (listStyle > 0){
wsprintf(g_meas_data[id].netlist,L"%s%s",g_meas_data[id].netlist,buffer);
memset(buffer,'\0',128);
if (listStyle == 1 || listStyle == 3){
if (!ssid.empty() && ssid[0] && wcsstr(measure->statusString.c_str(), ssid.c_str()) == NULL)
{
++printed;
measure->statusString += ssid;
if (measure->listStyle > 0)
{
if (measure->listStyle == 1 || measure->listStyle == 3)
{
// ADD PHY type
wsprintf(buffer,L" @%s", getDot11str(pwnl->Network[i].dot11PhyTypes[0],4));
measure->statusString += L" @";
measure->statusString += GetDot11Str(pwnl->Network[i].dot11PhyTypes[0], 4);
}
if (listStyle == 2 || listStyle == 3){
if (measure->listStyle == 2 || measure->listStyle == 3)
{
// ADD cipher and authentication
wsprintf(buffer,L"%s (%s:%s)",buffer,getDot11str(pwnl->Network[i].dot11DefaultCipherAlgorithm,1)
,getDot11str(pwnl->Network[i].dot11DefaultAuthAlgorithm,2));
measure->statusString += L" (";
measure->statusString += GetDot11Str(pwnl->Network[i].dot11DefaultCipherAlgorithm, 1);
measure->statusString += L':';
measure->statusString += GetDot11Str(pwnl->Network[i].dot11DefaultAuthAlgorithm, 2);
measure->statusString += L')';
}
}
wsprintf(g_meas_data[id].netlist,L"%s%s\n",g_meas_data[id].netlist,buffer);
measure->statusString += L'\n';
}
}
memset(buffer,'\0',128);
}//end for
bNetList=true;
WlanFreeMemory(pwnl);
}
}
else
{
ULONG outsize = 0;
PWLAN_CONNECTION_ATTRIBUTES wlan_cattr = NULL;
DWORD dwErr = WlanQueryInterface(g_hClient, &g_pInterface->InterfaceGuid, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL);
if (ERROR_SUCCESS != dwErr)
{
switch (measure->type)
{
case SSID:
case PHY:
case ENCRYPTION:
case AUTH:
measure->statusString = L"-1";
break;
}
}
else
{
switch (measure->type)
{
case QUALITY:
value = (double)wlan_cattr->wlanAssociationAttributes.wlanSignalQuality;
break;
case SSID:
if (ERROR_SUCCESS != dwCErr){
bIntfError = true;
break;
}
// Need to convert ucSSID to wchar from uchar
mbstowcs(buffer,(char *)wlan_cattr->wlanAssociationAttributes.dot11Ssid.ucSSID,wlan_cattr->wlanAssociationAttributes.dot11Ssid.uSSIDLength);
measure->statusString = ConvertToWide((LPCSTR)wlan_cattr->wlanAssociationAttributes.dot11Ssid.ucSSID, (int)wlan_cattr->wlanAssociationAttributes.dot11Ssid.uSSIDLength);
// If not connected yet add current status
wcscat(buffer,getDot11str(wlan_cattr->isState,3));
measure->statusString += GetDot11Str(wlan_cattr->isState, 3);
break;
case PHY:
if (ERROR_SUCCESS != dwCErr){
bIntfError = true;
break;
}
wcscpy(buffer,getDot11str(wlan_cattr->wlanAssociationAttributes.dot11PhyType,4));
measure->statusString = GetDot11Str(wlan_cattr->wlanAssociationAttributes.dot11PhyType, 4);
break;
case ENCRYPTION:
if (ERROR_SUCCESS != dwCErr){
bIntfError = true;
break;
}
wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11CipherAlgorithm,1));
measure->statusString = GetDot11Str(wlan_cattr->wlanSecurityAttributes.dot11CipherAlgorithm, 1);
break;
case AUTH:
if (ERROR_SUCCESS != dwCErr){
bIntfError = true;
measure->statusString = GetDot11Str(wlan_cattr->wlanSecurityAttributes.dot11AuthAlgorithm, 2);
break;
default: // Invalid type
measure->statusString.clear();
break;
}
wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11AuthAlgorithm,2));
break;
default: //InfoType does not refer to a string measure
bInvalidType= true;
break;
WlanFreeMemory(wlan_cattr);
}
}
}
if (wlan_cattr!=NULL)WlanFreeMemory(wlan_cattr);
if (pwnl!=NULL)WlanFreeMemory(pwnl);
if (bNetList)
return g_meas_data[id].netlist;
if (bIntfError)
return L"-1";
else {
if (bInvalidType)
return value;
}
PLUGIN_EXPORT LPCWSTR GetString(void* data)
{
if (g_pInterface == NULL) return NULL;
MeasureData* measure = (MeasureData*)data;
switch (measure->type)
{
case LIST:
case SSID:
case PHY:
case ENCRYPTION:
case AUTH:
return measure->statusString.c_str();
default:
return NULL;
else
return buffer;
}
}
PLUGIN_EXPORT void Finalize(void* data)
{
MeasureData* measure = (MeasureData*)data;
delete measure;
if (g_Instances > 0)
{
--g_Instances;
if (g_Instances == 0)
{
FinalizeHandle();
}
}
}
@ -368,9 +395,12 @@ LPCTSTR GetString(UINT id, UINT flags)
-type of ENUM (cipher=1, auth=2, status=3, phy=4, otherwise=error strings)
out: String to be returned by measure
*/
LPCTSTR getDot11str(int dot11enum,int type){
if (type ==1){
switch(dot11enum){
LPCWSTR GetDot11Str(int dot11enum, int type)
{
if (type == 1)
{
switch (dot11enum)
{
case DOT11_CIPHER_ALGO_NONE:
return L"NONE";
case DOT11_CIPHER_ALGO_WEP40:
@ -389,8 +419,10 @@ LPCTSTR getDot11str(int dot11enum,int type){
return L"???";
}
}
else if (type == 2){
switch(dot11enum){
else if (type == 2)
{
switch (dot11enum)
{
case DOT11_AUTH_ALGO_80211_OPEN:
return L"Open";
case DOT11_AUTH_ALGO_80211_SHARED_KEY:
@ -409,8 +441,10 @@ LPCTSTR getDot11str(int dot11enum,int type){
return L"???";
}
}
else if (type==3){
switch(dot11enum){
else if (type == 3)
{
switch (dot11enum)
{
case wlan_interface_state_connected:
return L"";
case wlan_interface_state_authenticating:
@ -419,9 +453,12 @@ LPCTSTR getDot11str(int dot11enum,int type){
return L"(connecting...)";
}
}
else if (type==4){
switch(dot11enum){
else if (type == 4)
{
switch (dot11enum)
{
case dot11_phy_type_unknown:
default:
return L"???";
case dot11_phy_type_dsss:
return L"DSSS";
@ -439,12 +476,12 @@ LPCTSTR getDot11str(int dot11enum,int type){
//However its not supported in winlanapi.h ???
case 7:
return L"802.11n";
default:
return L"???";
}
}
else{
switch(dot11enum){
else
{
switch (dot11enum)
{
case ERROR_INVALID_PARAMETER:
return L"Invalid parameters";
case ERROR_NOT_ENOUGH_MEMORY:
@ -456,46 +493,3 @@ LPCTSTR getDot11str(int dot11enum,int type){
}
}
}
/*
If the measure needs to free resources before quitting.
The plugin can export Finalize function, which is called
when Rainmeter quits (or refreshes).
*/
void Finalize(HMODULE instance, UINT id)
{
std::map<UINT, meas_data_t>::iterator i1 = g_meas_data.find(id);
if (i1 != g_meas_data.end())
{
free(g_meas_data[id].netlist);
g_meas_data[id].listInit = false;
g_meas_data.erase(i1);
}
g_Instances--;
if (hClient != NULL && g_Instances == 0){
WlanCloseHandle(hClient, NULL);
hClient = NULL;
}
if (pIntfList != NULL && g_Instances == 0){
WlanFreeMemory(pIntfList);
pIntfList = NULL;
}
}
/*
Returns the version number of the plugin. The value
can be calculated like this: Major * 1000 + Minor.
So, e.g. 2.31 would be 2031.
*/
UINT GetPluginVersion()
{
return 1009;
}
/*
Returns the author of the plugin for the about dialog.
*/
LPCTSTR GetPluginAuthor()
{
return L"nvme (shaivya.m@gmail.com)";
}