summaryrefslogtreecommitdiff
path: root/plugins/CurrencyRates/src/QuotesProviders.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CurrencyRates/src/QuotesProviders.cpp')
-rw-r--r--plugins/CurrencyRates/src/QuotesProviders.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/plugins/CurrencyRates/src/QuotesProviders.cpp b/plugins/CurrencyRates/src/QuotesProviders.cpp
new file mode 100644
index 0000000000..384df4277e
--- /dev/null
+++ b/plugins/CurrencyRates/src/QuotesProviders.cpp
@@ -0,0 +1,90 @@
+#include "StdAfx.h"
+#include "QuotesProviderCurrencyConverter.h"
+
+#define LAST_RUN_VERSION "LastRunVersion"
+
+CQuotesProviders::CQuotesProviders()
+{
+ InitProviders();
+}
+
+CQuotesProviders::~CQuotesProviders()
+{
+ ClearProviders();
+}
+
+const CQuotesProviders::TQuotesProviders& CQuotesProviders::GetProviders()const
+{
+ return m_apProviders;
+}
+
+template<class T>void create_provider(CQuotesProviders::TQuotesProviders& apProviders)
+{
+ CQuotesProviders::TQuotesProviderPtr pProvider(new T);
+ if (pProvider->Init())
+ apProviders.push_back(pProvider);
+};
+
+void CQuotesProviders::CreateProviders()
+{
+ create_provider<CQuotesProviderCurrencyConverter>(m_apProviders);
+}
+
+void CQuotesProviders::ClearProviders()
+{
+ m_apProviders.clear();
+}
+
+void convert_contact_settings(MCONTACT hContact)
+{
+ WORD dwLogMode = db_get_w(hContact, QUOTES_PROTOCOL_NAME, DB_STR_QUOTE_LOG, static_cast<WORD>(lmDisabled));
+ if ((dwLogMode&lmInternalHistory) || (dwLogMode&lmExternalFile))
+ db_set_b(hContact, QUOTES_PROTOCOL_NAME, DB_STR_CONTACT_SPEC_SETTINGS, 1);
+}
+
+void CQuotesProviders::InitProviders()
+{
+ CreateProviders();
+
+ const WORD nCurrentVersion = 17;
+ WORD nVersion = db_get_w(NULL, QUOTES_MODULE_NAME, LAST_RUN_VERSION, 1);
+
+ for (auto &hContact : Contacts(QUOTES_MODULE_NAME)) {
+ TQuotesProviderPtr pProvider = GetContactProviderPtr(hContact);
+ if (pProvider) {
+ pProvider->AddContact(hContact);
+ if (nVersion < nCurrentVersion)
+ convert_contact_settings(hContact);
+ }
+ }
+
+ db_set_w(NULL, QUOTES_MODULE_NAME, LAST_RUN_VERSION, nCurrentVersion);
+}
+
+CQuotesProviders::TQuotesProviderPtr CQuotesProviders::GetContactProviderPtr(MCONTACT hContact)const
+{
+ char* szProto = GetContactProto(hContact);
+ if (nullptr == szProto || 0 != ::_stricmp(szProto, QUOTES_PROTOCOL_NAME))
+ return TQuotesProviderPtr();
+
+ tstring sProvider = Quotes_DBGetStringT(hContact, QUOTES_MODULE_NAME, DB_STR_QUOTE_PROVIDER);
+ if (true == sProvider.empty())
+ return TQuotesProviderPtr();
+
+ return FindProvider(sProvider);
+}
+
+CQuotesProviders::TQuotesProviderPtr CQuotesProviders::FindProvider(const tstring& rsName)const
+{
+ TQuotesProviderPtr pResult;
+ for (TQuotesProviders::const_iterator i = m_apProviders.begin(); i != m_apProviders.end(); ++i) {
+ const TQuotesProviderPtr& pProvider = *i;
+ const IQuotesProvider::CProviderInfo& rInfo = pProvider->GetInfo();
+ if (0 == ::mir_wstrcmpi(rsName.c_str(), rInfo.m_sName.c_str())) {
+ pResult = pProvider;
+ break;
+ }
+ }
+
+ return pResult;
+}