- Renamed bool ReadFormula() to ParseFormula.

- Changed ReadConfig() in Measure/Meter to protected.
- Other code tweaks and cleanups.
This commit is contained in:
spx 2011-11-26 02:49:52 +00:00
parent b26dafc46f
commit 3c1338b4c5
31 changed files with 198 additions and 118 deletions

View File

@ -40,7 +40,8 @@ CConfigParser::CConfigParser() :
m_Parser(MathParser_Create(NULL)), m_Parser(MathParser_Create(NULL)),
m_LastReplaced(false), m_LastReplaced(false),
m_LastDefaultUsed(false), m_LastDefaultUsed(false),
m_LastValueDefined(false) m_LastValueDefined(false),
m_CurrentSection()
{ {
} }
@ -76,6 +77,8 @@ void CConfigParser::Initialize(LPCTSTR filename, CRainmeter* pRainmeter, CMeterW
m_LastDefaultUsed = false; m_LastDefaultUsed = false;
m_LastValueDefined = false; m_LastValueDefined = false;
m_CurrentSection = NULL;
// Set the built-in variables. Do this before the ini file is read so that the paths can be used with @include // Set the built-in variables. Do this before the ini file is read so that the paths can be used with @include
SetBuiltInVariables(pRainmeter, meterWindow); SetBuiltInVariables(pRainmeter, meterWindow);
ResetMonitorVariables(meterWindow); ResetMonitorVariables(meterWindow);
@ -106,7 +109,6 @@ void CConfigParser::SetBuiltInVariables(CRainmeter* pRainmeter, CMeterWindow* me
SetBuiltInVariable(L"PLUGINSPATH", pRainmeter->GetPluginPath()); SetBuiltInVariable(L"PLUGINSPATH", pRainmeter->GetPluginPath());
SetBuiltInVariable(L"CURRENTPATH", CRainmeter::ExtractPath(m_Filename)); SetBuiltInVariable(L"CURRENTPATH", CRainmeter::ExtractPath(m_Filename));
SetBuiltInVariable(L"ADDONSPATH", pRainmeter->GetAddonPath()); SetBuiltInVariable(L"ADDONSPATH", pRainmeter->GetAddonPath());
SetBuiltInVariable(L"CRLF", L"\n");
} }
if (meterWindow) if (meterWindow)
{ {
@ -114,6 +116,12 @@ void CConfigParser::SetBuiltInVariables(CRainmeter* pRainmeter, CMeterWindow* me
SetBuiltInVariable(L"CURRENTCONFIG", meterWindow->GetSkinName()); SetBuiltInVariable(L"CURRENTCONFIG", meterWindow->GetSkinName());
SetBuiltInVariable(L"ROOTCONFIGPATH", meterWindow->GetSkinRootPath()); SetBuiltInVariable(L"ROOTCONFIGPATH", meterWindow->GetSkinRootPath());
} }
SetBuiltInVariable(L"CRLF", L"\n");
static const std::wstring CURRENTSECTION = L"CURRENTSECTION";
SetBuiltInVariable(CURRENTSECTION, L"");
m_CurrentSection = &((*m_BuiltInVariables.find(StrToLower(CURRENTSECTION))).second); // shortcut
} }
/* /*
@ -461,7 +469,7 @@ bool CConfigParser::ReplaceVariables(std::wstring& result)
if (end != std::wstring::npos) if (end != std::wstring::npos)
{ {
size_t ei = end - 1; size_t ei = end - 1;
if (result[si] == L'*' && result[ei] == L'*') if (si != ei && result[si] == L'*' && result[ei] == L'*')
{ {
result.erase(ei, 1); result.erase(ei, 1);
result.erase(si, 1); result.erase(si, 1);
@ -528,7 +536,7 @@ bool CConfigParser::ReplaceMeasures(std::wstring& result)
if (next == std::wstring::npos || end < next) if (next == std::wstring::npos || end < next)
{ {
size_t ei = end - 1; size_t ei = end - 1;
if (result[si] == L'*' && result[ei] == L'*') if (si != ei && result[si] == L'*' && result[ei] == L'*')
{ {
result.erase(ei, 1); result.erase(ei, 1);
result.erase(si, 1); result.erase(si, 1);
@ -633,26 +641,28 @@ const std::wstring& CConfigParser::ReadString(LPCTSTR section, LPCTSTR key, LPCT
{ {
m_LastValueDefined = true; m_LastValueDefined = true;
if (result.find(L'#') != std::wstring::npos) if (result.size() >= 3)
{ {
static const std::wstring CURRENTSECTION = L"CURRENTSECTION"; if (result.find(L'#') != std::wstring::npos)
SetBuiltInVariable(CURRENTSECTION, strSection); // Set temporarily {
m_CurrentSection->assign(strSection); // Set temporarily
if (ReplaceVariables(result)) if (ReplaceVariables(result))
{
m_LastReplaced = true;
}
m_CurrentSection->clear(); // Reset
}
else
{
CRainmeter::ExpandEnvironmentVariables(result);
}
if (bReplaceMeasures && ReplaceMeasures(result))
{ {
m_LastReplaced = true; m_LastReplaced = true;
} }
SetBuiltInVariable(CURRENTSECTION, L""); // Reset
}
else
{
CRainmeter::ExpandEnvironmentVariables(result);
}
if (bReplaceMeasures && ReplaceMeasures(result))
{
m_LastReplaced = true;
} }
} }
@ -667,8 +677,8 @@ bool CConfigParser::IsKeyDefined(LPCTSTR section, LPCTSTR key)
bool CConfigParser::IsValueDefined(LPCTSTR section, LPCTSTR key) bool CConfigParser::IsValueDefined(LPCTSTR section, LPCTSTR key)
{ {
const std::wstring& result = ReadString(section, key, L"", false); ReadString(section, key, L"", false);
return (!m_LastDefaultUsed && !result.empty()); return m_LastValueDefined;
} }
void CConfigParser::AddMeasure(CMeasure* pMeasure) void CConfigParser::AddMeasure(CMeasure* pMeasure)
@ -694,7 +704,7 @@ double CConfigParser::ReadFloat(LPCTSTR section, LPCTSTR key, double defValue)
{ {
const std::wstring& result = ReadString(section, key, L""); const std::wstring& result = ReadString(section, key, L"");
return (m_LastDefaultUsed) ? defValue : ParseDouble(result, defValue); return (m_LastDefaultUsed) ? defValue : ParseDouble(result.c_str(), defValue);
} }
std::vector<Gdiplus::REAL> CConfigParser::ReadFloats(LPCTSTR section, LPCTSTR key) std::vector<Gdiplus::REAL> CConfigParser::ReadFloats(LPCTSTR section, LPCTSTR key)
@ -708,7 +718,7 @@ std::vector<Gdiplus::REAL> CConfigParser::ReadFloats(LPCTSTR section, LPCTSTR ke
std::vector<std::wstring>::const_iterator iter = tokens.begin(); std::vector<std::wstring>::const_iterator iter = tokens.begin();
for ( ; iter != tokens.end(); ++iter) for ( ; iter != tokens.end(); ++iter)
{ {
result.push_back((Gdiplus::REAL)ParseDouble((*iter), 0)); result.push_back((Gdiplus::REAL)ParseDouble((*iter).c_str(), 0.0));
} }
} }
return result; return result;
@ -718,14 +728,14 @@ int CConfigParser::ReadInt(LPCTSTR section, LPCTSTR key, int defValue)
{ {
const std::wstring& result = ReadString(section, key, L""); const std::wstring& result = ReadString(section, key, L"");
return (m_LastDefaultUsed) ? defValue : (int)ParseDouble(result, defValue, true); return (m_LastDefaultUsed) ? defValue : ParseInt(result.c_str(), defValue);
} }
unsigned int CConfigParser::ReadUInt(LPCTSTR section, LPCTSTR key, unsigned int defValue) unsigned int CConfigParser::ReadUInt(LPCTSTR section, LPCTSTR key, unsigned int defValue)
{ {
const std::wstring& result = ReadString(section, key, L""); const std::wstring& result = ReadString(section, key, L"");
return (m_LastDefaultUsed) ? defValue : (unsigned int)ParseDouble(result, defValue, true); return (m_LastDefaultUsed) ? defValue : ParseUInt(result.c_str(), defValue);
} }
// Works as ReadFloat except if the value is surrounded by parenthesis in which case it tries to evaluate the formula // Works as ReadFloat except if the value is surrounded by parenthesis in which case it tries to evaluate the formula
@ -743,9 +753,9 @@ double CConfigParser::ReadFormula(LPCTSTR section, LPCTSTR key, double defValue)
std::wstring error = L"ReadFormula: "; std::wstring error = L"ReadFormula: ";
error += ConvertToWide(errMsg); error += ConvertToWide(errMsg);
error += L" in key \""; error += L" in key \"";
error += key ? key : L""; error += key;
error += L"\" in ["; error += L"\" in [";
error += section ? section : L""; error += section;
error += L"]"; error += L"]";
Log(LOG_ERROR, error.c_str()); Log(LOG_ERROR, error.c_str());
} }
@ -753,12 +763,12 @@ double CConfigParser::ReadFormula(LPCTSTR section, LPCTSTR key, double defValue)
return resultValue; return resultValue;
} }
return (m_LastDefaultUsed) ? defValue : ParseDouble(result, defValue); return (m_LastDefaultUsed) ? defValue : ParseDouble(result.c_str(), defValue);
} }
// Returns true if the formula was read successfully, false for failure. // Returns true if the formula was read successfully, false for failure.
// Pass a pointer to a double. // Pass a pointer to a double.
bool CConfigParser::ReadFormula(const std::wstring& result, double* resultValue) bool CConfigParser::ParseFormula(const std::wstring& result, double* resultValue)
{ {
// Formulas must be surrounded by parenthesis // Formulas must be surrounded by parenthesis
if (!result.empty() && result[0] == L'(' && result[result.size() - 1] == L')') if (!result.empty() && result[0] == L'(' && result[result.size() - 1] == L')')
@ -766,7 +776,7 @@ bool CConfigParser::ReadFormula(const std::wstring& result, double* resultValue)
char* errMsg = MathParser_Parse(m_Parser, ConvertToAscii(result.c_str()).c_str(), resultValue); char* errMsg = MathParser_Parse(m_Parser, ConvertToAscii(result.c_str()).c_str(), resultValue);
if (errMsg != NULL) if (errMsg != NULL)
{ {
std::wstring error = L"ReadFormula: "; std::wstring error = L"ParseFormula: ";
error += ConvertToWide(errMsg); error += ConvertToWide(errMsg);
error += L": "; error += L": ";
error += result; error += result;
@ -874,40 +884,59 @@ void CConfigParser::Shrink(std::vector<std::wstring>& vec)
** If the given string is invalid format or causes overflow/underflow, returns given default value. ** If the given string is invalid format or causes overflow/underflow, returns given default value.
** **
*/ */
double CConfigParser::ParseDouble(const std::wstring& string, double defValue, bool rejectExp) double CConfigParser::ParseDouble(LPCTSTR string, double defValue)
{ {
std::wstring::size_type pos; if (string && *string)
// Ignore inline comments which start with ';'
if ((pos = string.find_first_of(L';')) != std::wstring::npos)
{ {
std::wstring temp(string, 0, pos);
return ParseDouble(temp, defValue, rejectExp);
}
if (rejectExp)
{
// Reject if the given string includes the exponential part
if (string.find_last_of(L"dDeE") != std::wstring::npos)
{
return defValue;
}
}
if ((pos = string.find_first_not_of(L" \t\r\n")) != std::wstring::npos)
{
// Trim white-space
std::wstring temp(string, pos, string.find_last_not_of(L" \t\r\n") - pos + 1);
WCHAR* end = NULL;
errno = 0; errno = 0;
double resultValue = wcstod(temp.c_str(), &end); double resultValue = wcstod(string, NULL);
if (end && *end == L'\0' && errno != ERANGE) if (errno != ERANGE)
{ {
return resultValue; return resultValue;
} }
} }
return defValue;
}
/*
** ParseInt
**
** This is a helper method that parses the integer value from the given string.
** If the given string is invalid format or causes overflow/underflow, returns given default value.
**
*/
int CConfigParser::ParseInt(LPCTSTR string, int defValue)
{
if (string && *string)
{
errno = 0;
int resultValue = wcstol(string, NULL, 10);
if (errno != ERANGE)
{
return resultValue;
}
}
return defValue;
}
/*
** ParseUInt
**
** This is a helper method that parses the unsigned integer value from the given string.
** If the given string is invalid format or causes overflow/underflow, returns given default value.
**
*/
unsigned int CConfigParser::ParseUInt(LPCTSTR string, unsigned int defValue)
{
if (string && *string)
{
errno = 0;
unsigned int resultValue = wcstoul(string, NULL, 10);
if (errno != ERANGE)
{
return resultValue;
}
}
return defValue; return defValue;
} }
@ -1198,9 +1227,7 @@ void CConfigParser::ReadIniFile(const std::wstring& iniFile, LPCTSTR config, int
clen = len - (clen + 1); // value's length clen = len - (clen + 1); // value's length
// Trim surrounded quotes from value // Trim surrounded quotes from value
if (clen >= 2 && ( if (clen >= 2 && (sep[0] == L'\"' || sep[0] == L'\'') && sep[clen - 1] == sep[0])
(sep[0] == L'\"' && sep[clen - 1] == L'\"') ||
(sep[0] == L'\'' && sep[clen - 1] == L'\'')))
{ {
clen -= 2; clen -= 2;
++sep; ++sep;

View File

@ -74,7 +74,7 @@ public:
RECT ReadRECT(LPCTSTR section, LPCTSTR key, const RECT& defValue); RECT ReadRECT(LPCTSTR section, LPCTSTR key, const RECT& defValue);
std::vector<Gdiplus::REAL> ReadFloats(LPCTSTR section, LPCTSTR key); std::vector<Gdiplus::REAL> ReadFloats(LPCTSTR section, LPCTSTR key);
bool ReadFormula(const std::wstring& result, double* resultValue); bool ParseFormula(const std::wstring& result, double* resultValue);
const std::wstring& GetFilename() { return m_Filename; } const std::wstring& GetFilename() { return m_Filename; }
const std::list<std::wstring>& GetSections() { return m_Sections; } const std::list<std::wstring>& GetSections() { return m_Sections; }
@ -84,7 +84,9 @@ public:
static std::vector<std::wstring> Tokenize(const std::wstring& str, const std::wstring& delimiters); static std::vector<std::wstring> Tokenize(const std::wstring& str, const std::wstring& delimiters);
static void Shrink(std::vector<std::wstring>& vec); static void Shrink(std::vector<std::wstring>& vec);
static double ParseDouble(const std::wstring& string, double defValue, bool rejectExp = false); static double ParseDouble(LPCTSTR string, double defValue);
static int ParseInt(LPCTSTR string, int defValue);
static unsigned int ParseUInt(LPCTSTR string, unsigned int defValue);
static Gdiplus::ARGB ParseColor(LPCTSTR string); static Gdiplus::ARGB ParseColor(LPCTSTR string);
static Gdiplus::Rect ParseRect(LPCTSTR string); static Gdiplus::Rect ParseRect(LPCTSTR string);
static RECT ParseRECT(LPCTSTR string); static RECT ParseRECT(LPCTSTR string);
@ -107,6 +109,7 @@ private:
static void SetMultiMonitorVariables(bool reset); static void SetMultiMonitorVariables(bool reset);
static void SetMonitorVariable(const std::wstring& strVariable, const std::wstring& strValue) { SetVariable(c_MonitorVariables, strVariable, strValue); } static void SetMonitorVariable(const std::wstring& strVariable, const std::wstring& strValue) { SetVariable(c_MonitorVariables, strVariable, strValue); }
static void SetMonitorVariable(const WCHAR* strVariable, const WCHAR* strValue) { SetVariable(c_MonitorVariables, strVariable, strValue); }
static std::wstring StrToLower(const std::wstring& str) { std::wstring strTmp(str); StrToLowerC(strTmp); return strTmp; } static std::wstring StrToLower(const std::wstring& str) { std::wstring strTmp(str); StrToLowerC(strTmp); return strTmp; }
static std::wstring StrToLower(const WCHAR* str) { std::wstring strTmp(str); StrToLowerC(strTmp); return strTmp; } static std::wstring StrToLower(const WCHAR* str) { std::wstring strTmp(str); StrToLowerC(strTmp); return strTmp; }
@ -124,6 +127,8 @@ private:
bool m_LastDefaultUsed; bool m_LastDefaultUsed;
bool m_LastValueDefined; bool m_LastValueDefined;
std::wstring* m_CurrentSection;
std::list<std::wstring> m_Sections; // The sections must be an ordered array std::list<std::wstring> m_Sections; // The sections must be an ordered array
std::unordered_map<std::wstring, std::wstring> m_Values; std::unordered_map<std::wstring, std::wstring> m_Values;

View File

@ -142,7 +142,7 @@ void CMeasure::ReadConfig(CConfigParser& parser, const WCHAR* section)
const std::wstring& result = parser.ReadString(section, L"Disabled", L"0"); const std::wstring& result = parser.ReadString(section, L"Disabled", L"0");
if (parser.GetLastReplaced()) if (parser.GetLastReplaced())
{ {
m_Disabled = 0!=(int)parser.ParseDouble(result, 0.0, true); m_Disabled = 0!=parser.ParseInt(result.c_str(), 0);
} }
} }
@ -172,17 +172,19 @@ void CMeasure::ReadConfig(CConfigParser& parser, const WCHAR* section)
m_RegExpSubstitute = 0!=parser.ReadInt(section, L"RegExpSubstitute", 0); m_RegExpSubstitute = 0!=parser.ReadInt(section, L"RegExpSubstitute", 0);
std::wstring subs = parser.ReadString(section, L"Substitute", L""); std::wstring subs = parser.ReadString(section, L"Substitute", L"");
if (!subs.empty() && if (!subs.empty())
(subs[0] != L'\"' || subs[subs.length() - 1] != L'\'') &&
(subs[0] != L'\'' || subs[subs.length() - 1] != L'\"'))
{ {
// Add quotes since they are removed by the GetProfileString if ((subs[0] != L'\"' || subs[subs.length() - 1] != L'\'') &&
subs.insert(0, L"\""); (subs[0] != L'\'' || subs[subs.length() - 1] != L'\"'))
subs.append(L"\""); {
} // Add quotes since they are removed by the GetProfileString
if (!ParseSubstitute(subs)) subs.insert(0, L"\"");
{ subs.append(L"\"");
LogWithArgs(LOG_ERROR, L"Measure: Invalid Substitute=%s", subs.c_str()); }
if (!ParseSubstitute(subs))
{
LogWithArgs(LOG_ERROR, L"Measure: Invalid Substitute=%s", subs.c_str());
}
} }
const std::wstring& group = parser.ReadString(section, L"Group", L""); const std::wstring& group = parser.ReadString(section, L"Group", L"");

View File

@ -49,7 +49,6 @@ public:
void ReadConfig(CConfigParser& parser) { ReadConfig(parser, GetName()); } void ReadConfig(CConfigParser& parser) { ReadConfig(parser, GetName()); }
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update() = 0; virtual bool Update() = 0;
@ -87,6 +86,8 @@ public:
static CMeasure* Create(const WCHAR* measure, CMeterWindow* meterWindow, const WCHAR* name); static CMeasure* Create(const WCHAR* measure, CMeterWindow* meterWindow, const WCHAR* name);
protected: protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool PreUpdate(); virtual bool PreUpdate();
virtual bool PostUpdate(); virtual bool PostUpdate();

View File

@ -37,10 +37,12 @@ public:
CMeasureCPU(CMeterWindow* meterWindow, const WCHAR* name); CMeasureCPU(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureCPU(); virtual ~CMeasureCPU();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
protected: protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private:
void CalcUsage(double idleTime, double systemTime); void CalcUsage(double idleTime, double systemTime);
void CalcAverageUsage(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* systemPerfInfo); void CalcAverageUsage(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* systemPerfInfo);

View File

@ -28,11 +28,13 @@ public:
CMeasureCalc(CMeterWindow* meterWindow, const WCHAR* name); CMeasureCalc(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureCalc(); virtual ~CMeasureCalc();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
static void UpdateVariableMap(CMeterWindow& meterWindow); static void UpdateVariableMap(CMeterWindow& meterWindow);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
void FormulaReplace(); void FormulaReplace();
bool IsDelimiter(WCHAR ch); bool IsDelimiter(WCHAR ch);

View File

@ -27,10 +27,12 @@ public:
CMeasureDiskSpace(CMeterWindow* meterWindow, const WCHAR* name); CMeasureDiskSpace(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureDiskSpace(); virtual ~CMeasureDiskSpace();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
std::wstring m_Drive; std::wstring m_Drive;
std::wstring m_LabelName; std::wstring m_LabelName;

View File

@ -28,6 +28,8 @@ public:
virtual ~CMeasureMemory(); virtual ~CMeasureMemory();
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section); virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:

View File

@ -27,9 +27,11 @@ public:
CMeasureNetIn(CMeterWindow* meterWindow, const WCHAR* name); CMeasureNetIn(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureNetIn(); virtual ~CMeasureNetIn();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
bool m_FirstTime; bool m_FirstTime;
ULONG64 m_InOctets; ULONG64 m_InOctets;

View File

@ -27,9 +27,11 @@ public:
CMeasureNetOut(CMeterWindow* meterWindow, const WCHAR* name); CMeasureNetOut(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureNetOut(); virtual ~CMeasureNetOut();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
bool m_FirstTime; bool m_FirstTime;
ULONG64 m_OutOctets; ULONG64 m_OutOctets;

View File

@ -27,9 +27,11 @@ public:
CMeasureNetTotal(CMeterWindow* meterWindow, const WCHAR* name); CMeasureNetTotal(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureNetTotal(); virtual ~CMeasureNetTotal();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
bool m_FirstTime; bool m_FirstTime;
ULONG64 m_TotalOctets; ULONG64 m_TotalOctets;

View File

@ -28,6 +28,8 @@ public:
virtual ~CMeasurePhysicalMemory(); virtual ~CMeasurePhysicalMemory();
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section); virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:

View File

@ -34,11 +34,13 @@ public:
CMeasurePlugin(CMeterWindow* meterWindow, const WCHAR* name); CMeasurePlugin(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasurePlugin(); virtual ~CMeasurePlugin();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
virtual void ExecuteBang(const WCHAR* args); virtual void ExecuteBang(const WCHAR* args);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
std::wstring m_PluginName; std::wstring m_PluginName;
HMODULE m_Plugin; HMODULE m_Plugin;

View File

@ -27,10 +27,12 @@ public:
CMeasureRegistry(CMeterWindow* meterWindow, const WCHAR* name); CMeasureRegistry(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureRegistry(); virtual ~CMeasureRegistry();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
std::wstring m_RegKeyName; std::wstring m_RegKeyName;
std::wstring m_RegValueName; std::wstring m_RegValueName;

View File

@ -27,7 +27,6 @@ public:
CMeasureScript(CMeterWindow* meterWindow, const WCHAR* name); CMeasureScript(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureScript(); virtual ~CMeasureScript();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
@ -36,6 +35,9 @@ public:
void DeleteLuaScript(); void DeleteLuaScript();
protected: protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private:
LuaScript* m_LuaScript; LuaScript* m_LuaScript;
bool m_HasInitializeFunction; bool m_HasInitializeFunction;

View File

@ -27,10 +27,12 @@ public:
CMeasureTime(CMeterWindow* meterWindow, const WCHAR* name); CMeasureTime(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeasureTime(); virtual ~CMeasureTime();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
void TimeToString(WCHAR* buf, size_t bufLen, const WCHAR* format, const struct tm* time); void TimeToString(WCHAR* buf, size_t bufLen, const WCHAR* format, const struct tm* time);

View File

@ -29,6 +29,8 @@ public:
virtual bool Update(); virtual bool Update();
virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual); virtual const WCHAR* GetStringValue(AUTOSCALE autoScale, double scale, int decimals, bool percentual);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section); virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:

View File

@ -28,6 +28,8 @@ public:
virtual ~CMeasureVirtualMemory(); virtual ~CMeasureVirtualMemory();
virtual bool Update(); virtual bool Update();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section); virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:

View File

@ -307,13 +307,13 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
} }
double val; double val;
if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && parser.ReadFormula(coord, &val)) if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && parser.ParseFormula(coord, &val))
{ {
m_X = (int)val; m_X = (int)val;
} }
else else
{ {
m_X = (int)parser.ParseDouble(coord, 0.0); m_X = (int)parser.ParseDouble(coord.c_str(), 0.0);
} }
} }
else else
@ -346,13 +346,13 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
} }
double val; double val;
if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && parser.ReadFormula(coord, &val)) if (len >= 2 && coord[0] == L'(' && coord[len - 1] == L')' && parser.ParseFormula(coord, &val))
{ {
m_Y = (int)val; m_Y = (int)val;
} }
else else
{ {
m_Y = (int)parser.ParseDouble(coord, 0.0); m_Y = (int)parser.ParseDouble(coord.c_str(), 0.0);
} }
} }
else else
@ -380,7 +380,7 @@ void CMeter::ReadConfig(CConfigParser& parser, const WCHAR* section)
m_StyleHidden = parser.GetLastUsedStyle(); m_StyleHidden = parser.GetLastUsedStyle();
if (parser.GetLastReplaced() || !parser.GetLastDefaultUsed() && m_StyleHidden != oldStyleHidden) if (parser.GetLastReplaced() || !parser.GetLastDefaultUsed() && m_StyleHidden != oldStyleHidden)
{ {
m_Hidden = 0!=(int)parser.ParseDouble(result, 0.0, true); m_Hidden = 0!=parser.ParseInt(result.c_str(), 0);
} }
} }

View File

@ -38,7 +38,6 @@ public:
void ReadConfig(CConfigParser& parser) { ReadConfig(parser, GetName()); parser.ClearStyleTemplate(); } void ReadConfig(CConfigParser& parser) { ReadConfig(parser, GetName()); parser.ClearStyleTemplate(); }
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
@ -120,6 +119,8 @@ protected:
POSITION_RELATIVE_BR POSITION_RELATIVE_BR
}; };
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
void SetAllMeasures(CMeasure* measure); void SetAllMeasures(CMeasure* measure);
void SetAllMeasures(const std::vector<CMeasure*>& measures); void SetAllMeasures(const std::vector<CMeasure*>& measures);
void ReplaceToolTipMeasures(std::wstring& str); void ReplaceToolTipMeasures(std::wstring& str);

View File

@ -28,11 +28,13 @@ public:
CMeterBar(CMeterWindow* meterWindow, const WCHAR* name); CMeterBar(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterBar(); virtual ~CMeterBar();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
enum ORIENTATION enum ORIENTATION
{ {

View File

@ -30,12 +30,14 @@ public:
virtual bool HitTest(int x, int y); virtual bool HitTest(int x, int y);
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
virtual bool HasActiveTransition(); virtual bool HasActiveTransition();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
CTintedImage m_Image; CTintedImage m_Image;
std::wstring m_ImageName; // Name of the image std::wstring m_ImageName; // Name of the image

View File

@ -30,7 +30,6 @@ public:
CMeterButton(CMeterWindow* meterWindow, const WCHAR* name); CMeterButton(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterButton(); virtual ~CMeterButton();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
@ -42,6 +41,9 @@ public:
void SetFocus(bool f) { m_Focus = f; } void SetFocus(bool f) { m_Focus = f; }
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
bool HitTest2(int px, int py, bool checkAlpha); bool HitTest2(int px, int py, bool checkAlpha);

View File

@ -28,12 +28,14 @@ public:
CMeterHistogram(CMeterWindow* meterWindow, const WCHAR* name); CMeterHistogram(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterHistogram(); virtual ~CMeterHistogram();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
virtual void BindMeasure(const std::list<CMeasure*>& measures); virtual void BindMeasure(const std::list<CMeasure*>& measures);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
void DisposeBuffer(); void DisposeBuffer();

View File

@ -28,13 +28,15 @@ public:
CMeterImage(CMeterWindow* meterWindow, const WCHAR* name); CMeterImage(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterImage(); virtual ~CMeterImage();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
virtual void BindMeasure(const std::list<CMeasure*>& measures); virtual void BindMeasure(const std::list<CMeasure*>& measures);
protected: protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private:
void LoadImage(const std::wstring& imageName, bool bLoadAlways); void LoadImage(const std::wstring& imageName, bool bLoadAlways);
CTintedImage m_Image; CTintedImage m_Image;

View File

@ -27,12 +27,14 @@ public:
CMeterLine(CMeterWindow* meterWindow, const WCHAR* name); CMeterLine(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterLine(); virtual ~CMeterLine();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
virtual void BindMeasure(const std::list<CMeasure*>& measures); virtual void BindMeasure(const std::list<CMeasure*>& measures);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
std::vector<std::wstring> m_MeasureNames; // Name of the other measures std::vector<std::wstring> m_MeasureNames; // Name of the other measures
std::vector<CMeasure*> m_Measures; // Pointer ot the other measures std::vector<CMeasure*> m_Measures; // Pointer ot the other measures

View File

@ -28,11 +28,13 @@ public:
CMeterRotator(CMeterWindow* meterWindow, const WCHAR* name); CMeterRotator(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterRotator(); virtual ~CMeterRotator();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
CTintedImage m_Image; CTintedImage m_Image;
std::wstring m_ImageName; // Name of the image std::wstring m_ImageName; // Name of the image

View File

@ -27,10 +27,12 @@ public:
CMeterRoundLine(CMeterWindow* meterWindow, const WCHAR* name); CMeterRoundLine(CMeterWindow* meterWindow, const WCHAR* name);
virtual ~CMeterRoundLine(); virtual ~CMeterRoundLine();
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual bool Update(); virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics); virtual bool Draw(Gdiplus::Graphics& graphics);
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
bool m_Solid; bool m_Solid;
double m_LineWidth; double m_LineWidth;

View File

@ -23,11 +23,6 @@
#include "Measure.h" #include "Measure.h"
#include <unordered_map> #include <unordered_map>
namespace Gdiplus
{
class Font;
}
class CMeterString : public CMeter class CMeterString : public CMeter
{ {
public: public:
@ -36,7 +31,6 @@ public:
virtual int GetX(bool abs = false); virtual int GetX(bool abs = false);
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
virtual void Initialize(); virtual void Initialize();
virtual bool Update(); virtual bool Update();
void SetText(const WCHAR* text) { m_Text = text; } void SetText(const WCHAR* text) { m_Text = text; }
@ -47,6 +41,9 @@ public:
static void FreeFontCache(Gdiplus::PrivateFontCollection* collection = NULL); static void FreeFontCache(Gdiplus::PrivateFontCollection* collection = NULL);
static void EnumerateInstalledFontFamilies(); static void EnumerateInstalledFontFamilies();
protected:
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
private: private:
enum TEXTSTYLE enum TEXTSTYLE
{ {

View File

@ -900,7 +900,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
case BANG_SETTRANSPARENCY: case BANG_SETTRANSPARENCY:
if (arg != NULL) if (arg != NULL)
{ {
m_AlphaValue = (int)CConfigParser::ParseDouble(arg, 255, true); m_AlphaValue = CConfigParser::ParseInt(arg, 255);
m_AlphaValue = max(m_AlphaValue, 0); m_AlphaValue = max(m_AlphaValue, 0);
m_AlphaValue = min(m_AlphaValue, 255); m_AlphaValue = min(m_AlphaValue, 255);
UpdateTransparency(m_AlphaValue, false); UpdateTransparency(m_AlphaValue, false);
@ -1003,7 +1003,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
double value; double value;
// Formula read fine // Formula read fine
if (m_Parser.ReadFormula(strValue, &value)) if (m_Parser.ParseFormula(strValue, &value))
{ {
WCHAR buffer[256]; WCHAR buffer[256];
int len = _snwprintf_s(buffer, _TRUNCATE, L"%.5f", value); int len = _snwprintf_s(buffer, _TRUNCATE, L"%.5f", value);
@ -1115,31 +1115,31 @@ void CMeterWindow::ResizeBlur(const WCHAR* arg, int mode)
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
type = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); type = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
token = wcstok(NULL, L","); token = wcstok(NULL, L",");
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
x = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); x = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
token = wcstok(NULL, L","); token = wcstok(NULL, L",");
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
y = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); y = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
token = wcstok(NULL, L","); token = wcstok(NULL, L",");
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
w = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); w = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
token = wcstok(NULL, L","); token = wcstok(NULL, L",");
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
h = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); h = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
} }
} }
} }
@ -1161,7 +1161,7 @@ void CMeterWindow::ResizeBlur(const WCHAR* arg, int mode)
if (token) if (token)
{ {
while (token[0] == L' ') ++token; while (token[0] == L' ') ++token;
int r = (m_Parser.ReadFormula(token, &val)) ? (int)val : _wtoi(token); int r = (m_Parser.ParseFormula(token, &val)) ? (int)val : _wtoi(token);
tempRegion = CreateRoundRectRgn(x, y, w, h, r, r); tempRegion = CreateRoundRectRgn(x, y, w, h, r, r);
} }
break; break;
@ -1924,7 +1924,7 @@ void CMeterWindow::ReadConfig()
double value; double value;
if (!m_WindowX.empty() && m_WindowX[0] == L'(' && m_WindowX[m_WindowX.size() - 1] == L')') if (!m_WindowX.empty() && m_WindowX[0] == L'(' && m_WindowX[m_WindowX.size() - 1] == L')')
{ {
if (!parser.ReadFormula(m_WindowX, &value)) if (!parser.ParseFormula(m_WindowX, &value))
{ {
value = 0.0; value = 0.0;
} }
@ -1933,7 +1933,7 @@ void CMeterWindow::ReadConfig()
} }
if (!m_WindowY.empty() && m_WindowY[0] == L'(' && m_WindowY[m_WindowY.size() - 1] == L')') if (!m_WindowY.empty() && m_WindowY[0] == L'(' && m_WindowY[m_WindowY.size() - 1] == L')')
{ {
if (!parser.ReadFormula(m_WindowY, &value)) if (!parser.ParseFormula(m_WindowY, &value))
{ {
value = 0.0; value = 0.0;
} }

View File

@ -668,7 +668,7 @@ void CRainmeter::RainmeterWriteKeyValue(const WCHAR* arg)
if (mw) if (mw)
{ {
double value; double value;
formula = mw->GetParser().ReadFormula(strValue, &value); formula = mw->GetParser().ParseFormula(strValue, &value);
// Formula read fine // Formula read fine
if (formula) if (formula)
@ -3170,13 +3170,16 @@ std::wstring CRainmeter::ExtractPath(const std::wstring& strFilePath)
void CRainmeter::ExpandEnvironmentVariables(std::wstring& strPath) void CRainmeter::ExpandEnvironmentVariables(std::wstring& strPath)
{ {
if (strPath.find(L'%') != std::wstring::npos) std::wstring::size_type pos;
if ((pos = strPath.find(L'%')) != std::wstring::npos &&
strPath.find(L'%', pos + 2) != std::wstring::npos)
{ {
DWORD bufSize = 4096; DWORD bufSize = 4096;
WCHAR* buffer = new WCHAR[bufSize]; // lets hope the buffer is large enough... WCHAR* buffer = new WCHAR[bufSize]; // lets hope the buffer is large enough...
// %APPDATA% is a special case // %APPDATA% is a special case
std::wstring::size_type pos = strPath.find(L"%APPDATA%"); pos = strPath.find(L"%APPDATA%", pos);
if (pos != std::wstring::npos) if (pos != std::wstring::npos)
{ {
HRESULT hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, buffer); HRESULT hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, buffer);