summaryrefslogtreecommitdiff
path: root/plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp')
-rw-r--r--plugins/CurrencyRates/src/QuotesProviderVisitorFormater.cpp122
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