diff options
Diffstat (limited to 'plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp')
-rw-r--r-- | plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp b/plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp new file mode 100644 index 0000000000..50d3b7e8cc --- /dev/null +++ b/plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp @@ -0,0 +1,122 @@ +#include "StdAfx.h" +#include "QuotesProviderCurrencyConverter.h" + +CQuotesProviderVisitorFormater::CQuotesProviderVisitorFormater(MCONTACT hContact, wchar_t chr, int nWidth) + : m_hContact(hContact), + m_chr(chr), + m_nWidth(nWidth) +{ +} + +CQuotesProviderVisitorFormater::~CQuotesProviderVisitorFormater() +{ +} + +const tstring& CQuotesProviderVisitorFormater::GetResult()const +{ + return m_sResult; +} + +static bool get_fetch_time(MCONTACT hContact, time_t& rTime) +{ + DBVARIANT dbv; + if (db_get(hContact, QUOTES_MODULE_NAME, DB_STR_QUOTE_FETCH_TIME, &dbv) || (DBVT_DWORD != dbv.type)) + return false; + + rTime = dbv.dVal; + return true; +} + +static tstring format_fetch_time(const CQuotesProviderBase&, MCONTACT hContact, const tstring& rsFormat) +{ + time_t nTime; + if (true == get_fetch_time(hContact, nTime)) { + boost::posix_time::ptime time = boost::date_time::c_local_adjustor<boost::posix_time::ptime>::utc_to_local(boost::posix_time::from_time_t(nTime)); + tostringstream k; + k.imbue(std::locale(GetSystemLocale(), new ttime_facet(rsFormat.c_str()))); + k << time; + return k.str(); + } + + return tstring(); +} + +void CQuotesProviderVisitorFormater::Visit(const CQuotesProviderBase& rProvider) +{ + switch (m_chr) { + case '%': + case '\t': + case '\\': + m_sResult = m_chr; + break; + case 'S': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_QUOTE_PROVIDER); + break; + case 's': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_QUOTE_SYMBOL); + break; + case 'X': + m_sResult = format_fetch_time(rProvider, m_hContact, Quotes_GetTimeFormat(true)); + break; + case 'x': + m_sResult = format_fetch_time(rProvider, m_hContact, Quotes_GetDateFormat(true)); + break; + case 't': + { + tstring sFrmt = Quotes_GetDateFormat(true); + sFrmt += L" "; + sFrmt += Quotes_GetTimeFormat(true); + m_sResult = format_fetch_time(rProvider, m_hContact, sFrmt); + } + break; + case 'r': + case 'R': + FormatDoubleHelper(DB_STR_QUOTE_CURR_VALUE); + break; + case 'p': + FormatDoubleHelper(DB_STR_QUOTE_PREV_VALUE); + break; + } +} + + +tstring format_double(double dValue, int nWidth) +{ + tostringstream o; + o.imbue(GetSystemLocale()); + + if (nWidth > 0 && nWidth <= 9) + o << std::setprecision(nWidth) << std::showpoint << std::fixed; + + o << dValue; + + return o.str(); +} + +void CQuotesProviderVisitorFormater::FormatDoubleHelper(LPCSTR pszDbSet, + const tstring sInvalid/* = L"-"*/) +{ + double d = 0.0; + if (true == Quotes_DBReadDouble(m_hContact, QUOTES_MODULE_NAME, pszDbSet, d)) + m_sResult = format_double(d, m_nWidth); + else + m_sResult = sInvalid; +} + +void CQuotesProviderVisitorFormater::Visit(const CQuotesProviderCurrencyConverter&) +{ + switch (m_chr) { + case 'F': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_FROM_DESCRIPTION); + break; + case 'f': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_FROM_ID); + break; + case 'I': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_TO_DESCRIPTION); + break; + case 'i': + m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_TO_ID); + break; + } +}
\ No newline at end of file |