From f097a7d71dd9cad3c2cf8ff7b3299c50dbeb2e6f Mon Sep 17 00:00:00 2001 From: Kimmo Pekkola Date: Fri, 31 Jul 2009 07:53:33 +0000 Subject: [PATCH] Added the PluginWifiStatus to the project. --- .../PluginWifiStatus/PluginWifiStatus.vcproj | 573 ++++++++++++++++++ Plugins/PluginWifiStatus/WifiStatus.cpp | 451 ++++++++++++++ Rainmeter.sln | 69 +-- revision-number.h | 2 +- 4 files changed, 1041 insertions(+), 54 deletions(-) create mode 100644 Plugins/PluginWifiStatus/PluginWifiStatus.vcproj create mode 100644 Plugins/PluginWifiStatus/WifiStatus.cpp diff --git a/Plugins/PluginWifiStatus/PluginWifiStatus.vcproj b/Plugins/PluginWifiStatus/PluginWifiStatus.vcproj new file mode 100644 index 00000000..1adfca55 --- /dev/null +++ b/Plugins/PluginWifiStatus/PluginWifiStatus.vcproj @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/PluginWifiStatus/WifiStatus.cpp b/Plugins/PluginWifiStatus/WifiStatus.cpp new file mode 100644 index 00000000..c8d3de3a --- /dev/null +++ b/Plugins/PluginWifiStatus/WifiStatus.cpp @@ -0,0 +1,451 @@ +/* +Copyright (C) 2009 Shaivya Mahajan + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +*/ + +#pragma warning(disable: 4786) +#pragma warning(disable: 4996) + +#include +#include +#include +#include +#include +#pragma comment( lib, "wlanapi.lib") +#include "..\..\Library\Export.h" // Rainmeter's exported functions + +/* 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 +{ + UNKNOWN, + SSID, + QUALITY, + ENCRYPTION, + AUTH, + LIST, + PHY, +}; + + +std::map g_Types; +std::map g_ListStyle; +/* 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; + +/* + 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: + + 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) +{ + /* initialize interface/adapter structs */ + DWORD dwNegotiatedVersion = 0; + PWLAN_INTERFACE_CAPABILITY pCapability = NULL; + PWLAN_INTERFACE_INFO_LIST pIntfList = NULL; + DWORD dwErr; + //Create WINLAN API Handle + if(hClient == NULL){ + dwErr = WlanOpenHandle( WLAN_API_VERSION, NULL, &dwNegotiatedVersion, &hClient ); + if( ERROR_SUCCESS != dwErr ){ + std::wstring error = L"Unable to open WLAN API Handle! (err code: "; + error+= getDot11str(dwErr,5); + MessageBox(NULL, error.c_str(), L"Rainmeter", MB_OK); + //return 0; + } + } + //Query list of WLAN interfaces + if(pIntfList == NULL){ + dwErr= WlanEnumInterfaces(hClient, NULL, &pIntfList); + if(( ERROR_SUCCESS != dwErr) || (&pIntfList->dwNumberOfItems <= 0)){ + std::wstring error = L"Unable to find a valid WLAN interface/adapter! (err code: "; + error+=(int) dwErr + L")"; + MessageBox(NULL, error.c_str(), L"Rainmeter", MB_OK); + return 0; + } + } + //Select a WLAN interface, default 0. + LPCTSTR data = ReadConfigString(section, L"WifiIntfID", L""); + + if ((data != NULL) && (wcsicmp(L"", data) != 0)){ + if(_wtoi(data) < (int)pIntfList->dwNumberOfItems){ + pInterface = &pIntfList->InterfaceInfo[_wtoi(data)]; + } else { + std::wstring error = L"Invalid WifiIntfID given (defaulting to 0). WifiIntfID="; + error+=data; + MessageBox(NULL, error.c_str(), L"Rainmeter", MB_OK); + pInterface = &pIntfList->InterfaceInfo[0]; + } + } else { + pInterface = &pIntfList->InterfaceInfo[0]; + } + //Select LIST style + data = ReadConfigString(section, L"WifiListStyle", L""); + + if ((data != NULL) && (wcsicmp(L"", data) != 0)){ + if ( (_wtoi(data) >= 0) && (_wtoi(data) <= 3)){ + g_ListStyle[id] = _wtoi(data); + } else { + std::wstring error = L"Invalid WifiListStyle given (defaulting to 0). WifiListStyle="; + error+=data; + MessageBox(NULL, error.c_str(), L"Rainmeter", MB_OK); + g_ListStyle[id] = 0; + } + } else { + g_ListStyle[id] = 0; + } + //Select type of measure + MEASURETYPE infoType = UNKNOWN; + LPCTSTR type = ReadConfigString(section, L"WifiInfoType", L""); + if(type){ + if (wcsicmp(L"SSID", type) == 0){ + infoType=SSID; + } + else if (wcsicmp(L"QUALITY", type) == 0){ + infoType=QUALITY; + } + else if (wcsicmp(L"ENCRYPTION", type) == 0){ + infoType=ENCRYPTION; + } + else if (wcsicmp(L"AUTH", type) == 0){ + infoType=AUTH; + } + else if (wcsicmp(L"LIST", type) == 0){ + infoType=LIST; + } + else if (wcsicmp(L"PHY", type) == 0){ + infoType=PHY; + } else { + std::wstring error = L"No such WifiInfoType: "; + error += type; + MessageBox(NULL, error.c_str(), L"Rainmeter", MB_OK); + } + g_Types[id] = infoType; + } + + switch(infoType){ + case SSID: + case ENCRYPTION: + case AUTH: + return 0; + case QUALITY: + return 100; + } + + return 0; +} + +/* + This function is called when new value should be measured. + The function returns the new value. +*/ +UINT Update(UINT id) +{ + if(pInterface == NULL) return NULL; + + //Get measure id, and identify type + std::map::iterator typeIter = g_Types.find(id); + if(typeIter == g_Types.end()) return NULL; + switch((*typeIter).second) + { + 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(pInterface == NULL) return NULL; + + //@TODO - Netlist needs to be dynamically allocated + renewed + static WCHAR buffer[256]; + static WCHAR netlist[1024];//stores current list of available networks + bool bNetList = false; //whether to return buffer or netlist + bool invalidType= false; + unsigned int listStyle = 0; + memset(buffer,'\0',256); + + std::map::iterator typeIter = g_Types.find(id); + if(typeIter == g_Types.end()) return NULL; + + std::map::iterator verboseIter = g_ListStyle.find(id); + if(verboseIter == g_ListStyle.end()) return NULL; + listStyle = (*verboseIter).second; + //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; + + //Initialize WLAN structs with queries + dwCErr= WlanQueryInterface( hClient, &intfGUID, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL ); + dwLErr= WlanGetAvailableNetworkList(hClient,&intfGUID,NULL,NULL,&pwnl); + + switch((*typeIter).second) + { + case LIST: + if(ERROR_SUCCESS != dwLErr){return NULL;} + memset(netlist,'\0',1024); + memset(buffer,'\0',256); + //Check all items in WLAN NETWORK LIST + for(int i=0; i < (int)pwnl->dwNumberOfItems ; i++){ + //SSID is in UCHAR, convert to WCHAR + mbstowcs(buffer,(char*)pwnl->Network[i].dot11Ssid.ucSSID,pwnl->Network[i].dot11Ssid.uSSIDLength); + //Prevent duplicats that result from profiles + if((wcsstr(netlist,buffer)== NULL)&&(wcsicmp(L"", buffer) != 0)){ + //Add an SSID to list + wcscat(netlist,buffer); + //Add PHY type + memset(buffer,'\0',256); + if(listStyle > 0){ + if(listStyle == 1 || listStyle == 3){ + wcscat(netlist,L" @ "); + wcscpy(buffer,getDot11str(pwnl->Network[i].dot11PhyTypes[0],4)); + wcscat(netlist,buffer); + //Add Cipher type + memset(buffer,'\0',256); + } + if(listStyle == 2 || listStyle == 3){ + wcscat(netlist,L" ("); + wcscpy(buffer,getDot11str(pwnl->Network[i].dot11DefaultCipherAlgorithm,1)); + wcscat(netlist,buffer); + memset(buffer,'\0',256); + //Add Auth type + wcscat(netlist,L":"); + wcscpy(buffer,getDot11str(pwnl->Network[i].dot11DefaultAuthAlgorithm,2)); + wcscat(netlist,buffer); + wcscat(netlist,L")"); + } + } + wcscat(netlist,L"\n"); + } + memset(buffer,'\0',256); + + }//end for + bNetList=TRUE; + break; + + case SSID: + if(ERROR_SUCCESS != dwCErr){return NULL;} + //Need to convert ucSSID to wchar from uchar + mbstowcs(buffer,(char *)wlan_cattr->wlanAssociationAttributes.dot11Ssid.ucSSID,wlan_cattr->wlanAssociationAttributes.dot11Ssid.uSSIDLength); + //If not connected yet add current status + wcscat(buffer,getDot11str(wlan_cattr->isState,3)); + break; + + case PHY: + if(ERROR_SUCCESS != dwCErr){return NULL;} + wcscpy(buffer,getDot11str(wlan_cattr->wlanAssociationAttributes.dot11PhyType,4)); + break; + + case ENCRYPTION: + if(ERROR_SUCCESS != dwCErr){return NULL;} + wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11CipherAlgorithm,1)); + break; + + case AUTH: + if(ERROR_SUCCESS != dwCErr){return NULL;} + wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11AuthAlgorithm,2)); + break; + + default: //InfoType does not refer to a string measure + invalidType= true; + break; + + } + if(wlan_cattr!=NULL)WlanFreeMemory(wlan_cattr); + if(pwnl!=NULL)WlanFreeMemory(pwnl); + if(bNetList)return netlist; + if(invalidType) + return NULL; + else + return buffer; +} + +/* + switches from winlanapi.h + SDK + in: -DOT11 ENUM (converted to int) + -type of ENUM (cipher=1, auth=2, status=3, phy=4) + out: String to be returned by measure +*/ +LPCTSTR getDot11str(int dot11enum,int type){ + if(type ==1){ + switch(dot11enum){ + case DOT11_CIPHER_ALGO_NONE: + return L"NONE"; + case DOT11_CIPHER_ALGO_WEP40: + return L"WEP40"; + case DOT11_CIPHER_ALGO_TKIP: + return L"TKIP"; + case DOT11_CIPHER_ALGO_CCMP: + return L"AES"; + case DOT11_CIPHER_ALGO_WEP104: + return L"WEP104"; + case DOT11_CIPHER_ALGO_WPA_USE_GROUP: + return L"WPA-GROUP"; + case DOT11_CIPHER_ALGO_WEP: + return L"WEP"; + default: + return L"???"; + } + } + else if (type == 2){ + switch(dot11enum){ + case DOT11_AUTH_ALGO_80211_OPEN: + return L"Open"; + case DOT11_AUTH_ALGO_80211_SHARED_KEY: + return L"Shared"; + case DOT11_AUTH_ALGO_WPA_NONE: + return L"WPA-NONE"; + case DOT11_AUTH_ALGO_WPA: + return L"WPA-Enterprise"; + case DOT11_AUTH_ALGO_WPA_PSK: + return L"WPA-Personal"; + case DOT11_AUTH_ALGO_RSNA: + return L"WPA2-Enterprise"; + case DOT11_AUTH_ALGO_RSNA_PSK: + return L"WPA2-Personal"; + default: + return L"???"; + } + } + else if(type==3){ + switch(dot11enum){ + case wlan_interface_state_connected: + return L""; + case wlan_interface_state_authenticating: + return L"(authorizing...)"; + default: + return L"(connecting...)"; + } + } + else if(type==4){ + switch(dot11enum){ + case dot11_phy_type_unknown: + return L"???"; + case dot11_phy_type_dsss: + return L"DSSS"; + case dot11_phy_type_erp: + return L"802.11g"; + case dot11_phy_type_fhss: + return L"FHSS"; + case dot11_phy_type_hrdsss: + return L"802.11b"; + case dot11_phy_type_irbaseband: + return L"IR-Band"; + case dot11_phy_type_ofdm: + return L"802.11a"; + //Case below appears as dot11_phy_type_ht on MSDN + //However its not supported in winlanapi.h ??? + case 7: + return L"n"; + default: + return L"???"; + } + } + else{ + switch(dot11enum){ + case ERROR_INVALID_PARAMETER: + return L"Invalid parameters"; + case ERROR_NOT_ENOUGH_MEMORY: + return L"Not enough memory"; + case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED: + return L"Too many handles already issued"; + default: + return L"Windows just hates you"; + } + } +} + +/* + 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::iterator i1 = g_Types.find(id); + if (i1 != g_Types.end()) + { + g_Types.erase(i1); + } + if(hClient != NULL){ + WlanCloseHandle(hClient, NULL); + hClient = NULL; + } + if(pIntfList != NULL){ + WlanFreeMemory(pIntfList); + hClient = 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 1008; +} + +/* + Returns the author of the plugin for the about dialog. +*/ +LPCTSTR GetPluginAuthor() +{ + return L"nvme (shaivya.m@gmail.com)"; +} diff --git a/Rainmeter.sln b/Rainmeter.sln index cf375ec2..dfa1e37e 100644 --- a/Rainmeter.sln +++ b/Rainmeter.sln @@ -82,12 +82,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginiTunes", "Plugins\Plu {BE9D2400-7F1C-49D6-8498-5CE495491AD6} = {BE9D2400-7F1C-49D6-8498-5CE495491AD6} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PluginWifiStatus", "Plugins\PluginWifiStatus\PluginWifiStatus.vcproj", "{45A34285-56DD-4521-912B-3F884D36FA35}" + ProjectSection(ProjectDependencies) = postProject + {BE9D2400-7F1C-49D6-8498-5CE495491AD6} = {BE9D2400-7F1C-49D6-8498-5CE495491AD6} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 - Release 64|Win32 = Release 64|Win32 - Release 64|x64 = Release 64|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 Release64|Win32 = Release64|Win32 @@ -97,9 +100,6 @@ Global {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Debug|Win32.ActiveCfg = Debug|Win32 {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Debug|Win32.Build.0 = Debug|Win32 {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Debug|x64.ActiveCfg = Debug|Win32 - {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release 64|Win32.ActiveCfg = Release|x64 - {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release 64|x64.ActiveCfg = Release|x64 - {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release 64|x64.Build.0 = Release|x64 {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release|Win32.ActiveCfg = Release|Win32 {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release|Win32.Build.0 = Release|Win32 {D2A0903C-E760-4134-AE61-3D55BF8F760C}.Release|x64.ActiveCfg = Release|Win32 @@ -111,9 +111,6 @@ Global {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Debug|Win32.Build.0 = Debug|Win32 {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Debug|x64.ActiveCfg = Debug|x64 {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Debug|x64.Build.0 = Debug|x64 - {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release 64|Win32.ActiveCfg = Release64|x64 - {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release 64|x64.ActiveCfg = Release64|x64 - {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release 64|x64.Build.0 = Release64|x64 {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release|Win32.ActiveCfg = Release|Win32 {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release|Win32.Build.0 = Release|Win32 {BE9D2400-7F1C-49D6-8498-5CE495491AD6}.Release|x64.ActiveCfg = Release|x64 @@ -125,9 +122,6 @@ Global {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Debug|Win32.ActiveCfg = Debug|Win32 {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Debug|Win32.Build.0 = Debug|Win32 {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Debug|x64.ActiveCfg = Debug|Win32 - {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release 64|Win32.ActiveCfg = Release|x64 - {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release 64|x64.ActiveCfg = Release|x64 - {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release 64|x64.Build.0 = Release|x64 {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release|Win32.ActiveCfg = Release|Win32 {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release|Win32.Build.0 = Release|Win32 {EE8EC522-8430-4B46-86A3-D943D77F9E4B}.Release|x64.ActiveCfg = Release|Win32 @@ -138,9 +132,6 @@ Global {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Debug|Win32.ActiveCfg = Debug|Win32 {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Debug|Win32.Build.0 = Debug|Win32 {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Debug|x64.ActiveCfg = Debug|Win32 - {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release 64|Win32.ActiveCfg = Release64|x64 - {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release 64|x64.ActiveCfg = Release64|x64 - {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release 64|x64.Build.0 = Release64|x64 {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release|Win32.ActiveCfg = Release|Win32 {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release|Win32.Build.0 = Release|Win32 {761BAD94-EA54-4DBD-9FF0-50FDAFECBE93}.Release|x64.ActiveCfg = Release|Win32 @@ -150,9 +141,6 @@ Global {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Debug|Win32.ActiveCfg = Debug|Win32 {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Debug|Win32.Build.0 = Debug|Win32 {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Debug|x64.ActiveCfg = Debug|Win32 - {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release 64|Win32.ActiveCfg = Release64|x64 - {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release 64|x64.ActiveCfg = Release64|x64 - {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release 64|x64.Build.0 = Release64|x64 {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release|Win32.ActiveCfg = Release|Win32 {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release|Win32.Build.0 = Release|Win32 {BCE0E543-7ADC-4E10-AD66-52E90F70ED4A}.Release|x64.ActiveCfg = Release|Win32 @@ -163,9 +151,6 @@ Global {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Debug|Win32.ActiveCfg = Debug|Win32 {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Debug|Win32.Build.0 = Debug|Win32 {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Debug|x64.ActiveCfg = Debug|Win32 - {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release 64|Win32.ActiveCfg = Release|x64 - {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release 64|x64.ActiveCfg = Release|x64 - {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release 64|x64.Build.0 = Release|x64 {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release|Win32.ActiveCfg = Release|Win32 {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release|Win32.Build.0 = Release|Win32 {5344B52B-BAC3-479C-B41D-D465B8BDA1AD}.Release|x64.ActiveCfg = Release|Win32 @@ -176,9 +161,6 @@ Global {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Debug|Win32.ActiveCfg = Debug|Win32 {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Debug|Win32.Build.0 = Debug|Win32 {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Debug|x64.ActiveCfg = Debug|Win32 - {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release 64|Win32.ActiveCfg = Release|x64 - {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release 64|x64.ActiveCfg = Release|x64 - {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release 64|x64.Build.0 = Release|x64 {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release|Win32.ActiveCfg = Release|Win32 {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release|Win32.Build.0 = Release|Win32 {C862B662-5CC6-4E79-B1B3-905E0B98D627}.Release|x64.ActiveCfg = Release|Win32 @@ -189,9 +171,6 @@ Global {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Debug|Win32.ActiveCfg = Debug|Win32 {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Debug|Win32.Build.0 = Debug|Win32 {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Debug|x64.ActiveCfg = Debug|Win32 - {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release 64|Win32.ActiveCfg = Release64|x64 - {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release 64|x64.ActiveCfg = Release64|x64 - {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release 64|x64.Build.0 = Release64|x64 {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release|Win32.ActiveCfg = Release|Win32 {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release|Win32.Build.0 = Release|Win32 {C30E7EB6-9655-4AF4-98AE-D6E6B14631AF}.Release|x64.ActiveCfg = Release|Win32 @@ -202,9 +181,6 @@ Global {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Debug|Win32.ActiveCfg = Debug|Win32 {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Debug|Win32.Build.0 = Debug|Win32 {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Debug|x64.ActiveCfg = Debug|Win32 - {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release 64|Win32.ActiveCfg = Release|x64 - {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release 64|x64.ActiveCfg = Release|x64 - {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release 64|x64.Build.0 = Release|x64 {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release|Win32.ActiveCfg = Release|Win32 {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release|Win32.Build.0 = Release|Win32 {C029E0CF-F203-41D0-9608-A3EA2CF0ED1F}.Release|x64.ActiveCfg = Release|Win32 @@ -215,9 +191,6 @@ Global {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Debug|Win32.ActiveCfg = Debug|Win32 {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Debug|Win32.Build.0 = Debug|Win32 {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Debug|x64.ActiveCfg = Debug|Win32 - {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release 64|Win32.ActiveCfg = Release|x64 - {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release 64|x64.ActiveCfg = Release|x64 - {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release 64|x64.Build.0 = Release|x64 {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release|Win32.ActiveCfg = Release|Win32 {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release|Win32.Build.0 = Release|Win32 {17D3BD92-6F5D-438C-A89B-88F4CE06DB94}.Release|x64.ActiveCfg = Release|Win32 @@ -228,9 +201,6 @@ Global {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Debug|Win32.ActiveCfg = Debug|Win32 {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Debug|Win32.Build.0 = Debug|Win32 {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Debug|x64.ActiveCfg = Debug|Win32 - {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release 64|Win32.ActiveCfg = Release64|x64 - {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release 64|x64.ActiveCfg = Release64|x64 - {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release 64|x64.Build.0 = Release64|x64 {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release|Win32.ActiveCfg = Release|Win32 {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release|Win32.Build.0 = Release|Win32 {D10AB316-0F7A-4551-BE4F-385E04CCF1E8}.Release|x64.ActiveCfg = Release|Win32 @@ -241,9 +211,6 @@ Global {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Debug|Win32.ActiveCfg = Debug|Win32 {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Debug|Win32.Build.0 = Debug|Win32 {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Debug|x64.ActiveCfg = Debug|Win32 - {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release 64|Win32.ActiveCfg = Release64|x64 - {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release 64|x64.ActiveCfg = Release64|x64 - {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release 64|x64.Build.0 = Release64|x64 {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release|Win32.ActiveCfg = Release|Win32 {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release|Win32.Build.0 = Release|Win32 {6EBCA4DA-8CC7-42FE-8F45-878ABE165078}.Release|x64.ActiveCfg = Release|Win32 @@ -254,9 +221,6 @@ Global {8B820B9F-C154-417C-A090-42198F2AF496}.Debug|Win32.ActiveCfg = Debug|Win32 {8B820B9F-C154-417C-A090-42198F2AF496}.Debug|Win32.Build.0 = Debug|Win32 {8B820B9F-C154-417C-A090-42198F2AF496}.Debug|x64.ActiveCfg = Debug|Win32 - {8B820B9F-C154-417C-A090-42198F2AF496}.Release 64|Win32.ActiveCfg = Release64|x64 - {8B820B9F-C154-417C-A090-42198F2AF496}.Release 64|x64.ActiveCfg = Release64|x64 - {8B820B9F-C154-417C-A090-42198F2AF496}.Release 64|x64.Build.0 = Release64|x64 {8B820B9F-C154-417C-A090-42198F2AF496}.Release|Win32.ActiveCfg = Release|Win32 {8B820B9F-C154-417C-A090-42198F2AF496}.Release|Win32.Build.0 = Release|Win32 {8B820B9F-C154-417C-A090-42198F2AF496}.Release|x64.ActiveCfg = Release|Win32 @@ -267,9 +231,6 @@ Global {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Debug|Win32.ActiveCfg = Debug|Win32 {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Debug|Win32.Build.0 = Debug|Win32 {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Debug|x64.ActiveCfg = Debug|Win32 - {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release 64|Win32.ActiveCfg = Release|x64 - {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release 64|x64.ActiveCfg = Release|x64 - {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release 64|x64.Build.0 = Release|x64 {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release|Win32.ActiveCfg = Release|Win32 {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release|Win32.Build.0 = Release|Win32 {B9184DBA-C6B7-44FE-8BBD-0852DB22D2E4}.Release|x64.ActiveCfg = Release|Win32 @@ -280,9 +241,6 @@ Global {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Debug|Win32.ActiveCfg = Debug|Win32 {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Debug|Win32.Build.0 = Debug|Win32 {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Debug|x64.ActiveCfg = Debug|Win32 - {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release 64|Win32.ActiveCfg = Release|x64 - {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release 64|x64.ActiveCfg = Release|x64 - {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release 64|x64.Build.0 = Release|x64 {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release|Win32.ActiveCfg = Release|Win32 {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release|Win32.Build.0 = Release|Win32 {BEB03F9B-FDC4-4DD4-B315-E3414DB0B137}.Release|x64.ActiveCfg = Release|Win32 @@ -293,9 +251,6 @@ Global {4F8C4C09-431C-45C4-830B-32006E783C3A}.Debug|Win32.ActiveCfg = Debug|Win32 {4F8C4C09-431C-45C4-830B-32006E783C3A}.Debug|Win32.Build.0 = Debug|Win32 {4F8C4C09-431C-45C4-830B-32006E783C3A}.Debug|x64.ActiveCfg = Debug|Win32 - {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release 64|Win32.ActiveCfg = Release|x64 - {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release 64|x64.ActiveCfg = Release|x64 - {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release 64|x64.Build.0 = Release|x64 {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release|Win32.ActiveCfg = Release|Win32 {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release|Win32.Build.0 = Release|Win32 {4F8C4C09-431C-45C4-830B-32006E783C3A}.Release|x64.ActiveCfg = Release|Win32 @@ -306,15 +261,23 @@ Global {A2DD3CBE-B140-4892-A875-24107FA52518}.Debug|Win32.ActiveCfg = Debug|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Debug|Win32.Build.0 = Debug|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Debug|x64.ActiveCfg = Debug|Win32 - {A2DD3CBE-B140-4892-A875-24107FA52518}.Release 64|Win32.ActiveCfg = Release64|x64 - {A2DD3CBE-B140-4892-A875-24107FA52518}.Release 64|x64.ActiveCfg = Release64|x64 - {A2DD3CBE-B140-4892-A875-24107FA52518}.Release 64|x64.Build.0 = Release64|x64 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release|Win32.ActiveCfg = Release|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release|Win32.Build.0 = Release|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release|x64.ActiveCfg = Release|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release64|Win32.ActiveCfg = Release64|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release64|Win32.Build.0 = Release64|Win32 {A2DD3CBE-B140-4892-A875-24107FA52518}.Release64|x64.ActiveCfg = Release64|x64 + {A2DD3CBE-B140-4892-A875-24107FA52518}.Release64|x64.Build.0 = Release64|x64 + {45A34285-56DD-4521-912B-3F884D36FA35}.Debug|Win32.ActiveCfg = Debug|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Debug|Win32.Build.0 = Debug|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Debug|x64.ActiveCfg = Debug|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release|Win32.ActiveCfg = Release|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release|Win32.Build.0 = Release|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release|x64.ActiveCfg = Release|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release64|Win32.ActiveCfg = Release64|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release64|Win32.Build.0 = Release64|Win32 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release64|x64.ActiveCfg = Release64|x64 + {45A34285-56DD-4521-912B-3F884D36FA35}.Release64|x64.Build.0 = Release64|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/revision-number.h b/revision-number.h index be266459..af6096c4 100644 --- a/revision-number.h +++ b/revision-number.h @@ -1,2 +1,2 @@ #pragma once -const int revision_number = 119; \ No newline at end of file +const int revision_number = 123; \ No newline at end of file