diff --git a/Plugins/PluginPerfMon/PerfData.cpp b/Plugins/PluginPerfMon/PerfData.cpp index 3c12828d..9891b2c4 100644 --- a/Plugins/PluginPerfMon/PerfData.cpp +++ b/Plugins/PluginPerfMon/PerfData.cpp @@ -17,179 +17,108 @@ */ #include -#include "PerfData.h" -#include -#include -#include -#include "../../Library/Export.h" // Rainmeter's exported functions - +#include +#include "Titledb.h" +#include "PerfSnap.h" +#include "PerfObj.h" +#include "PerfCntr.h" +#include "ObjList.h" +#include "ObjInst.h" +#include "../API/RainmeterAPI.h" +#include "../../Library/RawString.h" #include "../../Library/DisableThreadLibraryCalls.h" // contains DllMain entry point +struct MeasureData +{ + CRawString objectName; + CRawString counterName; + CRawString instanceName; + ULONGLONG oldValue; + bool difference; + bool firstTime; +}; + ULONGLONG GetPerfData(PCTSTR ObjectName, PCTSTR InstanceName, PCTSTR CounterName); -struct PerfMeasure +PLUGIN_EXPORT void Initialize(void** data, void* rm) { - std::wstring ObjectName; - std::wstring CounterName; - std::wstring InstanceName; - bool Difference; - ULONGLONG OldValue; - bool FirstTime; -}; - -static CPerfTitleDatabase g_CounterTitles( PERF_TITLE_COUNTER ); -static std::map g_Measures; - -/* - 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) -{ - PerfMeasure* measure = new PerfMeasure; - measure->Difference = false; - measure->FirstTime = true; - measure->OldValue = 0; - - LPCTSTR buffer = ReadConfigString(section, L"PerfMonObject", L""); - if (buffer) - { - measure->ObjectName = buffer; - } - - buffer = ReadConfigString(section, L"PerfMonCounter", L""); - if (buffer) - { - measure->CounterName = buffer; - } - - buffer = ReadConfigString(section, L"PerfMonInstance", L""); - if (buffer) - { - measure->InstanceName = buffer; - } - - buffer = ReadConfigString(section, L"PerfMonDifference", L"1"); - if (buffer) - { - measure->Difference = 1==_wtoi(buffer); - } - - // Store the measure - g_Measures[id] = measure; - - int maxVal = 0; - buffer = ReadConfigString(section, L"PerfMonMaxValue", L"0"); - if (buffer) - { - maxVal = _wtoi(buffer); - } - - return maxVal; + MeasureData* measure = new MeasureData; + *data = measure; } -/* - This function is called when new value should be measured. - The function returns the new value. -*/ -double Update2(UINT id) +PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue) { + MeasureData* measure = (MeasureData*)data; + + measure->objectName = RmReadString(rm, L"PerfMonObject", L""); + measure->counterName = RmReadString(rm, L"PerfMonCounter", L""); + measure->instanceName = RmReadString(rm, L"PerfMonInstance", L""); + measure->difference = RmReadInt(rm, L"PerfMonDifference", 1) == 1; +} + +PLUGIN_EXPORT double Update(void* data) +{ + MeasureData* measure = (MeasureData*)data; double value = 0; - std::map::iterator i = g_Measures.find(id); - if (i != g_Measures.end()) + ULONGLONG longValue = GetPerfData( + measure->objectName.c_str(), + measure->instanceName.c_str(), + measure->counterName.c_str()); + + if (measure->difference) { - PerfMeasure* measure = (*i).second; - - if (measure) + // Compare with the old value + if (!measure->firstTime) { - ULONGLONG longvalue; - longvalue = GetPerfData(measure->ObjectName.c_str(), - measure->InstanceName.c_str(), - measure->CounterName.c_str()); - - if (measure->Difference) - { - // Compare with the old value - if (!measure->FirstTime) - { - value = (double)(longvalue - measure->OldValue); - } - measure->OldValue = longvalue; - measure->FirstTime = false; - } - else - { - value = (double)longvalue; - } + value = (double)(longValue - measure->oldValue); } + + measure->oldValue = longValue; + measure->firstTime = false; + } + else + { + value = (double)longValue; } return value; } -/* - 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) +PLUGIN_EXPORT void Finalize(void* data) { - // delete the measure - std::map::iterator i = g_Measures.find(id); - if (i != g_Measures.end()) - { - delete (*i).second; - g_Measures.erase(i); - } + MeasureData* measure = (MeasureData*)data; + delete measure; CPerfSnapshot::CleanUp(); } -/* - This method gets value of the given perfmon counter. -*/ -ULONGLONG GetPerfData(PCTSTR ObjectName, PCTSTR InstanceName, PCTSTR CounterName) +ULONGLONG GetPerfData(LPCWSTR objectName, LPCWSTR instanceName, LPCWSTR counterName) { - CPerfObject* pPerfObj; - CPerfObjectInstance* pObjInst; - CPerfCounter* pPerfCntr; + static CPerfTitleDatabase s_CounterTitles(PERF_TITLE_COUNTER); + BYTE data[256]; WCHAR name[256]; ULONGLONG value = 0; - if (ObjectName == NULL || CounterName == NULL || wcslen(ObjectName) == 0 || wcslen(CounterName) == 0) - { - // Unable to continue - return 0; - } + CPerfSnapshot snapshot(&s_CounterTitles); + CPerfObjectList objList(&snapshot, &s_CounterTitles); - CPerfSnapshot snapshot(&g_CounterTitles); - CPerfObjectList objList(&snapshot, &g_CounterTitles); - - if (snapshot.TakeSnapshot(ObjectName)) + if (snapshot.TakeSnapshot(objectName)) { - pPerfObj = objList.GetPerfObject(ObjectName); + CPerfObject* pPerfObj = objList.GetPerfObject(objectName); if (pPerfObj) { - for (pObjInst = pPerfObj->GetFirstObjectInstance(); + for (CPerfObjectInstance* pObjInst = pPerfObj->GetFirstObjectInstance(); pObjInst != NULL; pObjInst = pPerfObj->GetNextObjectInstance()) { - if (InstanceName != NULL && wcslen(InstanceName) > 0) + if (*instanceName) { if (pObjInst->GetObjectInstanceName(name, 256)) { - if (_wcsicmp(InstanceName, name) != 0) + if (_wcsicmp(instanceName, name) != 0) { delete pObjInst; continue; @@ -202,7 +131,7 @@ ULONGLONG GetPerfData(PCTSTR ObjectName, PCTSTR InstanceName, PCTSTR CounterName } } - pPerfCntr = pObjInst->GetCounterByName(CounterName); + CPerfCounter* pPerfCntr = pObjInst->GetCounterByName(counterName); if (pPerfCntr != NULL) { pPerfCntr->GetData(data, 256, NULL); @@ -228,23 +157,13 @@ ULONGLONG GetPerfData(PCTSTR ObjectName, PCTSTR InstanceName, PCTSTR CounterName delete pObjInst; break; // No need to continue } + delete pObjInst; } + delete pPerfObj; } } return value; } - -UINT GetPluginVersion() -{ - return 1002; -} - -LPCTSTR GetPluginAuthor() -{ - return L"Rainy (rainy@iki.fi)"; -} - -