summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Quotes/Forex.vcxproj14
-rw-r--r--plugins/Quotes/Forex.vcxproj.filters698
-rw-r--r--plugins/Quotes/docs/Utility/Google.py52
-rw-r--r--plugins/Quotes/docs/Utility/cc.xml (renamed from plugins/Quotes/docs/Utility/google.xml)1034
-rw-r--r--plugins/Quotes/res/Forex.rc25
-rw-r--r--plugins/Quotes/src/CurrencyConverter.cpp39
-rw-r--r--plugins/Quotes/src/ImportExport.cpp8
-rw-r--r--plugins/Quotes/src/QuotesProviderCurrencyConverter.cpp425
-rw-r--r--plugins/Quotes/src/QuotesProviderCurrencyConverter.h29
-rw-r--r--plugins/Quotes/src/QuotesProviderGoogle.cpp431
-rw-r--r--plugins/Quotes/src/QuotesProviderGoogle.h40
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitor.h4
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorDbSettings.cpp56
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorDbSettings.h10
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.cpp18
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.h11
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorFormater.cpp37
-rw-r--r--plugins/Quotes/src/QuotesProviderVisitorFormater.h10
-rw-r--r--plugins/Quotes/src/QuotesProviders.cpp3
-rw-r--r--plugins/Quotes/src/resource.h4
-rw-r--r--plugins/Quotes/src/stdafx.h1
21 files changed, 1808 insertions, 1141 deletions
diff --git a/plugins/Quotes/Forex.vcxproj b/plugins/Quotes/Forex.vcxproj
index 6aa12c214f..c43c448b46 100644
--- a/plugins/Quotes/Forex.vcxproj
+++ b/plugins/Quotes/Forex.vcxproj
@@ -18,6 +18,20 @@
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
+ <ItemGroup>
+ <Image Include="res\AutoUpdateDisabled.ico" />
+ <Image Include="res\CurrencyConverter.ico" />
+ <Image Include="res\down.ico" />
+ <Image Include="res\Export quotes.ico" />
+ <Image Include="res\Import quotes.ico" />
+ <Image Include="res\main.ico" />
+ <Image Include="res\notchanged.ico" />
+ <Image Include="res\quote.ico" />
+ <Image Include="res\Refresh.ico" />
+ <Image Include="res\Section.ico" />
+ <Image Include="res\swap.ico" />
+ <Image Include="res\up.ico" />
+ </ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C619A811-8023-4441-B3D7-785388A09DF0}</ProjectGuid>
<ProjectName>Quotes</ProjectName>
diff --git a/plugins/Quotes/Forex.vcxproj.filters b/plugins/Quotes/Forex.vcxproj.filters
index de5ad9f66c..933faca1c0 100644
--- a/plugins/Quotes/Forex.vcxproj.filters
+++ b/plugins/Quotes/Forex.vcxproj.filters
@@ -1,4 +1,702 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(ProjectDir)..\..\build\vc.common\common.filters" />
+ <ItemGroup>
+ <ClCompile Include="src\stdafx.cxx">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\CommonOptionDlg.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\CreateFilePath.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\CurrencyConverter.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\DBUtils.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\ExtraImages.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\Forex.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\HTMLParserMS.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\HTTPSession.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\IconLib.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\ImportExport.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\Locale.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\Log.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\ModuleInfo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\OptionDukasCopy.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuoteChart.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuoteInfoDlg.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderBase.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderCurrencyConverter.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderDukasCopy.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderFinance.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderGoogle.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderGoogleFinance.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviders.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderVisitorDbSettings.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderVisitorFormater.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderVisitorFormatSpecificator.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderVisitorTendency.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\QuotesProviderYahoo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\SettingsDlg.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\WinCtrlHelper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\XMLEngineMI.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\*.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\ComHelper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\CommonOptionDlg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\CreateFilePath.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\CurrencyConverter.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\DBUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\EconomicRateInfo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\ExtraImages.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\HTMLParserMS.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\HTTPSession.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IconLib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IHTMLEngine.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IHTMLParser.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\ImportExport.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IQuotesProvider.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IsWithinAccuracy.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\IXMLEngine.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\Locale.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\Log.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\ModuleInfo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\OptionDukasCopy.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuoteChart.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuoteInfoDlg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderBase.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderCurrencyConverter.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderDukasCopy.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderFinance.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderGoogle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderGoogleFinance.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviders.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderVisitor.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderVisitorDbSettings.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderVisitorFormater.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderVisitorFormatSpecificator.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderVisitorTendency.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\QuotesProviderYahoo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\SettingsDlg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\stdafx.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\version.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\WinCtrlHelper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\XMLEngineMI.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="src\*.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="res\*.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ <ResourceCompile Include="res\*.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ <ResourceCompile Include="res\*.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <Image Include="res\main.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\Section.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\quote.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\up.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\down.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\CurrencyConverter.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\Refresh.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\Export quotes.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\swap.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\Import quotes.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\notchanged.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ <Image Include="res\AutoUpdateDisabled.ico">
+ <Filter>Resource Files</Filter>
+ </Image>
+ </ItemGroup>
</Project> \ No newline at end of file
diff --git a/plugins/Quotes/docs/Utility/Google.py b/plugins/Quotes/docs/Utility/Google.py
deleted file mode 100644
index 35653a77f6..0000000000
--- a/plugins/Quotes/docs/Utility/Google.py
+++ /dev/null
@@ -1,52 +0,0 @@
-from html.parser import HTMLParser
-import sys
-from xml.etree.ElementTree import Element, ElementTree, SubElement
-
-class MyHTMLParser(HTMLParser):
- def __init__(self,in_fn,out_fn):
- HTMLParser.__init__(self)
- f_in = open(in_fn,'r')
- self.quote = 0
- self.start = 0
- self.parse_option = 0
- self.elQuote = Element("fake")
- elProvider = Element("Provider")
- SubElement(elProvider,'name').text = 'Google'
- SubElement(elProvider,'ref').text = 'http://www.google.com'
- SubElement(elProvider,'url').text = 'http://www.google.com/finance/converter?a=1&'
- self.root = SubElement(elProvider,'section')
- SubElement(self.root,'name').text = 'Currencies'
- self.feed(f_in.read())
- f_in.close()
- ElementTree(elProvider).write(out_fn)
-
- def handle_starttag(self, tag, attrs):
- self.start = 1
- if tag == 'select':
- if self.parse_option == 0:
- for k in attrs:
- if k[0] == 'name' and k[1] == 'from':
- self.parse_option = 1
- break
- else:
- self.parse_option == 0
- elif self.parse_option == 1 and tag == 'option':
- for k in attrs:
- if k[0] == 'value':
- self.elQuote = SubElement(self.root,'quote')
- SubElement(self.elQuote,'id').text = k[1]
- SubElement(self.elQuote,'symbol').text = k[1]
- break
-
- def handle_endtag(self, tag):
- self.start = 0
- if tag == 'select':
- self.parse_option == 0
-
- def handle_data(self, data):
- if self.start == 1 and self.parse_option == 1:
- SubElement(self.elQuote,'description').text = data
-
-parser = MyHTMLParser(sys.argv[1],sys.argv[2])
-parser.close()
-
diff --git a/plugins/Quotes/docs/Utility/google.xml b/plugins/Quotes/docs/Utility/cc.xml
index 5a6e0569f7..874d03e457 100644
--- a/plugins/Quotes/docs/Utility/google.xml
+++ b/plugins/Quotes/docs/Utility/cc.xml
@@ -1,518 +1,518 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<Provider>
- <name>Google</name>
- <ref>http://www.google.com</ref>
- <url>https://finance.google.com/bctzjpnsun/converter</url>
-
-<section>
- <name>Currencies</name>
- <quote>
- <id>AED</id><symbol>AED</symbol><description>United Arab Emirates Dirham (AED)</description>
- </quote>
- <quote>
- <id>AFN</id><symbol>AFN</symbol><description>Afghan Afghani (AFN)</description>
- </quote>
- <quote>
- <id>ALL</id><symbol>ALL</symbol><description>Albanian Lek (ALL)</description>
- </quote>
- <quote>
- <id>AMD</id><symbol>AMD</symbol><description>Armenian Dram (AMD)</description>
- </quote>
- <quote>
- <id>ANG</id><symbol>ANG</symbol><description>Netherlands Antillean Gulden (ANG)</description>
- </quote>
- <quote>
- <id>AOA</id><symbol>AOA</symbol><description>Angolan Kwanza (AOA)</description>
- </quote>
- <quote>
- <id>ARS</id><symbol>ARS</symbol><description>Argentine Peso (ARS)</description>
- </quote>
- <quote>
- <id>AUD</id><symbol>AUD</symbol><description>Australian Dollar (AUD)</description>
- </quote>
- <quote>
- <id>AWG</id><symbol>AWG</symbol><description>Aruban Florin (AWG)</description>
- </quote>
- <quote>
- <id>AZN</id><symbol>AZN</symbol><description>Azerbaijani Manat (AZN)</description>
- </quote>
- <quote>
- <id>BAM</id><symbol>BAM</symbol><description>Bosnia-Herzegovina Convertible Mark (BAM)</description>
- </quote>
- <quote>
- <id>BBD</id><symbol>BBD</symbol><description>Barbadian Dollar (BBD)</description>
- </quote>
- <quote>
- <id>BDT</id><symbol>BDT</symbol><description>Bangladeshi Taka (BDT)</description>
- </quote>
- <quote>
- <id>BGN</id><symbol>BGN</symbol><description>Bulgarian Lev (BGN)</description>
- </quote>
- <quote>
- <id>BHD</id><symbol>BHD</symbol><description>Bahraini Dinar (BHD)</description>
- </quote>
- <quote>
- <id>BIF</id><symbol>BIF</symbol><description>Burundian Franc (BIF)</description>
- </quote>
- <quote>
- <id>BMD</id><symbol>BMD</symbol><description>Bermudan Dollar (BMD)</description>
- </quote>
- <quote>
- <id>BND</id><symbol>BND</symbol><description>Brunei Dollar (BND)</description>
- </quote>
- <quote>
- <id>BOB</id><symbol>BOB</symbol><description>Bolivian Boliviano (BOB)</description>
- </quote>
- <quote>
- <id>BRL</id><symbol>BRL</symbol><description>Brazilian Real (BRL)</description>
- </quote>
- <quote>
- <id>BSD</id><symbol>BSD</symbol><description>Bahamian Dollar (BSD)</description>
- </quote>
- <quote>
- <id>BTC</id><symbol>BTC</symbol><description>Bitcoin (BTC)</description>
- </quote>
- <quote>
- <id>BTN</id><symbol>BTN</symbol><description>Bhutanese Ngultrum (BTN)</description>
- </quote>
- <quote>
- <id>BWP</id><symbol>BWP</symbol><description>Botswana Pula (BWP)</description>
- </quote>
- <quote>
- <id>BYN</id><symbol>BYN</symbol><description>Belarusian Ruble (BYN)</description>
- </quote>
- <quote>
- <id>BYR</id><symbol>BYR</symbol><description>Belarusian Ruble (2000–2016) (BYR)</description>
- </quote>
- <quote>
- <id>BZD</id><symbol>BZD</symbol><description>Belize Dollar (BZD)</description>
- </quote>
- <quote>
- <id>CAD</id><symbol>CAD</symbol><description>Canadian Dollar (CAD)</description>
- </quote>
- <quote>
- <id>CDF</id><symbol>CDF</symbol><description>Congolese Franc (CDF)</description>
- </quote>
- <quote>
- <id>CHF</id><symbol>CHF</symbol><description>Swiss Franc (CHF)</description>
- </quote>
- <quote>
- <id>CLF</id><symbol>CLF</symbol><description>Chilean Unit of Account (UF) (CLF)</description>
- </quote>
- <quote>
- <id>CLP</id><symbol>CLP</symbol><description>Chilean Peso (CLP)</description>
- </quote>
- <quote>
- <id>CNH</id><symbol>CNH</symbol><description>CNH (CNH)</description>
- </quote>
- <quote>
- <id>CNY</id><symbol>CNY</symbol><description>Chinese Yuan (CNY)</description>
- </quote>
- <quote>
- <id>COP</id><symbol>COP</symbol><description>Colombian Peso (COP)</description>
- </quote>
- <quote>
- <id>CRC</id><symbol>CRC</symbol><description>Costa Rican Colón (CRC)</description>
- </quote>
- <quote>
- <id>CUP</id><symbol>CUP</symbol><description>Cuban Peso (CUP)</description>
- </quote>
- <quote>
- <id>CVE</id><symbol>CVE</symbol><description>Cape Verdean Escudo (CVE)</description>
- </quote>
- <quote>
- <id>CZK</id><symbol>CZK</symbol><description>Czech Koruna (CZK)</description>
- </quote>
- <quote>
- <id>DEM</id><symbol>DEM</symbol><description>German Mark (DEM)</description>
- </quote>
- <quote>
- <id>DJF</id><symbol>DJF</symbol><description>Djiboutian Franc (DJF)</description>
- </quote>
- <quote>
- <id>DKK</id><symbol>DKK</symbol><description>Danish Krone (DKK)</description>
- </quote>
- <quote>
- <id>DOP</id><symbol>DOP</symbol><description>Dominican Peso (DOP)</description>
- </quote>
- <quote>
- <id>DZD</id><symbol>DZD</symbol><description>Algerian Dinar (DZD)</description>
- </quote>
- <quote>
- <id>EGP</id><symbol>EGP</symbol><description>Egyptian Pound (EGP)</description>
- </quote>
- <quote>
- <id>ERN</id><symbol>ERN</symbol><description>Eritrean Nakfa (ERN)</description>
- </quote>
- <quote>
- <id>ETB</id><symbol>ETB</symbol><description>Ethiopian Birr (ETB)</description>
- </quote>
- <quote>
- <id>EUR</id><symbol>EUR</symbol><description>Euro (EUR)</description>
- </quote>
- <quote>
- <id>FIM</id><symbol>FIM</symbol><description>Finnish Markka (FIM)</description>
- </quote>
- <quote>
- <id>FJD</id><symbol>FJD</symbol><description>Fijian Dollar (FJD)</description>
- </quote>
- <quote>
- <id>FKP</id><symbol>FKP</symbol><description>Falkland Islands Pound (FKP)</description>
- </quote>
- <quote>
- <id>FRF</id><symbol>FRF</symbol><description>French Franc (FRF)</description>
- </quote>
- <quote>
- <id>GBP</id><symbol>GBP</symbol><description>British Pound (GBP)</description>
- </quote>
- <quote>
- <id>GEL</id><symbol>GEL</symbol><description>Georgian Lari (GEL)</description>
- </quote>
- <quote>
- <id>GHS</id><symbol>GHS</symbol><description>Ghanaian Cedi (GHS)</description>
- </quote>
- <quote>
- <id>GIP</id><symbol>GIP</symbol><description>Gibraltar Pound (GIP)</description>
- </quote>
- <quote>
- <id>GMD</id><symbol>GMD</symbol><description>Gambian Dalasi (GMD)</description>
- </quote>
- <quote>
- <id>GNF</id><symbol>GNF</symbol><description>Guinean Franc (GNF)</description>
- </quote>
- <quote>
- <id>GTQ</id><symbol>GTQ</symbol><description>Guatemalan Quetzal (GTQ)</description>
- </quote>
- <quote>
- <id>GYD</id><symbol>GYD</symbol><description>Guyanaese Dollar (GYD)</description>
- </quote>
- <quote>
- <id>HKD</id><symbol>HKD</symbol><description>Hong Kong Dollar (HKD)</description>
- </quote>
- <quote>
- <id>HNL</id><symbol>HNL</symbol><description>Honduran Lempira (HNL)</description>
- </quote>
- <quote>
- <id>HRK</id><symbol>HRK</symbol><description>Croatian Kuna (HRK)</description>
- </quote>
- <quote>
- <id>HTG</id><symbol>HTG</symbol><description>Haitian Gourde (HTG)</description>
- </quote>
- <quote>
- <id>HUF</id><symbol>HUF</symbol><description>Hungarian Forint (HUF)</description>
- </quote>
- <quote>
- <id>IDR</id><symbol>IDR</symbol><description>Indonesian Rupiah (IDR)</description>
- </quote>
- <quote>
- <id>IEP</id><symbol>IEP</symbol><description>Irish Pound (IEP)</description>
- </quote>
- <quote>
- <id>ILS</id><symbol>ILS</symbol><description>Israeli New Shekel (ILS)</description>
- </quote>
- <quote>
- <id>INR</id><symbol>INR</symbol><description>Indian Rupee (INR)</description>
- </quote>
- <quote>
- <id>IQD</id><symbol>IQD</symbol><description>Iraqi Dinar (IQD)</description>
- </quote>
- <quote>
- <id>IRR</id><symbol>IRR</symbol><description>Iranian Rial (IRR)</description>
- </quote>
- <quote>
- <id>ISK</id><symbol>ISK</symbol><description>Icelandic Króna (ISK)</description>
- </quote>
- <quote>
- <id>ITL</id><symbol>ITL</symbol><description>Italian Lira (ITL)</description>
- </quote>
- <quote>
- <id>JMD</id><symbol>JMD</symbol><description>Jamaican Dollar (JMD)</description>
- </quote>
- <quote>
- <id>JOD</id><symbol>JOD</symbol><description>Jordanian Dinar (JOD)</description>
- </quote>
- <quote>
- <id>JPY</id><symbol>JPY</symbol><description>Japanese Yen (JPY)</description>
- </quote>
- <quote>
- <id>KES</id><symbol>KES</symbol><description>Kenyan Shilling (KES)</description>
- </quote>
- <quote>
- <id>KGS</id><symbol>KGS</symbol><description>Kyrgystani Som (KGS)</description>
- </quote>
- <quote>
- <id>KHR</id><symbol>KHR</symbol><description>Cambodian Riel (KHR)</description>
- </quote>
- <quote>
- <id>KMF</id><symbol>KMF</symbol><description>Comorian Franc (KMF)</description>
- </quote>
- <quote>
- <id>KPW</id><symbol>KPW</symbol><description>North Korean Won (KPW)</description>
- </quote>
- <quote>
- <id>KRW</id><symbol>KRW</symbol><description>South Korean Won (KRW)</description>
- </quote>
- <quote>
- <id>KWD</id><symbol>KWD</symbol><description>Kuwaiti Dinar (KWD)</description>
- </quote>
- <quote>
- <id>KYD</id><symbol>KYD</symbol><description>Cayman Islands Dollar (KYD)</description>
- </quote>
- <quote>
- <id>KZT</id><symbol>KZT</symbol><description>Kazakhstani Tenge (KZT)</description>
- </quote>
- <quote>
- <id>LAK</id><symbol>LAK</symbol><description>Laotian Kip (LAK)</description>
- </quote>
- <quote>
- <id>LBP</id><symbol>LBP</symbol><description>Lebanese Pound (LBP)</description>
- </quote>
- <quote>
- <id>LKR</id><symbol>LKR</symbol><description>Sri Lankan Rupee (LKR)</description>
- </quote>
- <quote>
- <id>LRD</id><symbol>LRD</symbol><description>Liberian Dollar (LRD)</description>
- </quote>
- <quote>
- <id>LSL</id><symbol>LSL</symbol><description>Lesotho Loti (LSL)</description>
- </quote>
- <quote>
- <id>LTL</id><symbol>LTL</symbol><description>Lithuanian Litas (LTL)</description>
- </quote>
- <quote>
- <id>LVL</id><symbol>LVL</symbol><description>Latvian Lats (LVL)</description>
- </quote>
- <quote>
- <id>LYD</id><symbol>LYD</symbol><description>Libyan Dinar (LYD)</description>
- </quote>
- <quote>
- <id>MAD</id><symbol>MAD</symbol><description>Moroccan Dirham (MAD)</description>
- </quote>
- <quote>
- <id>MDL</id><symbol>MDL</symbol><description>Moldovan Leu (MDL)</description>
- </quote>
- <quote>
- <id>MGA</id><symbol>MGA</symbol><description>Malagasy Ariary (MGA)</description>
- </quote>
- <quote>
- <id>MKD</id><symbol>MKD</symbol><description>Macedonian Denar (MKD)</description>
- </quote>
- <quote>
- <id>MNT</id><symbol>MNT</symbol><description>Mongolian Tugrik (MNT)</description>
- </quote>
- <quote>
- <id>MOP</id><symbol>MOP</symbol><description>Macanese Pataca (MOP)</description>
- </quote>
- <quote>
- <id>MRO</id><symbol>MRO</symbol><description>Mauritanian Ouguiya (MRO)</description>
- </quote>
- <quote>
- <id>MUR</id><symbol>MUR</symbol><description>Mauritian Rupee (MUR)</description>
- </quote>
- <quote>
- <id>MVR</id><symbol>MVR</symbol><description>Maldivian Rufiyaa (MVR)</description>
- </quote>
- <quote>
- <id>MWK</id><symbol>MWK</symbol><description>Malawian Kwacha (MWK)</description>
- </quote>
- <quote>
- <id>MXN</id><symbol>MXN</symbol><description>Mexican Peso (MXN)</description>
- </quote>
- <quote>
- <id>MYR</id><symbol>MYR</symbol><description>Malaysian Ringgit (MYR)</description>
- </quote>
- <quote>
- <id>MZN</id><symbol>MZN</symbol><description>Mozambican Metical (MZN)</description>
- </quote>
- <quote>
- <id>NAD</id><symbol>NAD</symbol><description>Namibian Dollar (NAD)</description>
- </quote>
- <quote>
- <id>NGN</id><symbol>NGN</symbol><description>Nigerian Naira (NGN)</description>
- </quote>
- <quote>
- <id>NIO</id><symbol>NIO</symbol><description>Nicaraguan Córdoba (NIO)</description>
- </quote>
- <quote>
- <id>NOK</id><symbol>NOK</symbol><description>Norwegian Krone (NOK)</description>
- </quote>
- <quote>
- <id>NPR</id><symbol>NPR</symbol><description>Nepalese Rupee (NPR)</description>
- </quote>
- <quote>
- <id>NZD</id><symbol>NZD</symbol><description>New Zealand Dollar (NZD)</description>
- </quote>
- <quote>
- <id>OMR</id><symbol>OMR</symbol><description>Omani Rial (OMR)</description>
- </quote>
- <quote>
- <id>PAB</id><symbol>PAB</symbol><description>Panamanian Balboa (PAB)</description>
- </quote>
- <quote>
- <id>PEN</id><symbol>PEN</symbol><description>Peruvian Nuevo Sol (PEN)</description>
- </quote>
- <quote>
- <id>PGK</id><symbol>PGK</symbol><description>Papua New Guinean Kina (PGK)</description>
- </quote>
- <quote>
- <id>PHP</id><symbol>PHP</symbol><description>Philippine Peso (PHP)</description>
- </quote>
- <quote>
- <id>PKG</id><symbol>PKG</symbol><description>PKG (PKG)</description>
- </quote>
- <quote>
- <id>PKR</id><symbol>PKR</symbol><description>Pakistani Rupee (PKR)</description>
- </quote>
- <quote>
- <id>PLN</id><symbol>PLN</symbol><description>Polish Zloty (PLN)</description>
- </quote>
- <quote>
- <id>PYG</id><symbol>PYG</symbol><description>Paraguayan Guarani (PYG)</description>
- </quote>
- <quote>
- <id>QAR</id><symbol>QAR</symbol><description>Qatari Riyal (QAR)</description>
- </quote>
- <quote>
- <id>RON</id><symbol>RON</symbol><description>New Romanian Leu (RON)</description>
- </quote>
- <quote>
- <id>RSD</id><symbol>RSD</symbol><description>Serbian Dinar (RSD)</description>
- </quote>
- <quote>
- <id>RUB</id><symbol>RUB</symbol><description>Russian Ruble (RUB)</description>
- </quote>
- <quote>
- <id>RWF</id><symbol>RWF</symbol><description>Rwandan Franc (RWF)</description>
- </quote>
- <quote>
- <id>SAR</id><symbol>SAR</symbol><description>Saudi Riyal (SAR)</description>
- </quote>
- <quote>
- <id>SBD</id><symbol>SBD</symbol><description>Solomon Islands Dollar (SBD)</description>
- </quote>
- <quote>
- <id>SCR</id><symbol>SCR</symbol><description>Seychellois Rupee (SCR)</description>
- </quote>
- <quote>
- <id>SDG</id><symbol>SDG</symbol><description>Sudanese Pound (SDG)</description>
- </quote>
- <quote>
- <id>SEK</id><symbol>SEK</symbol><description>Swedish Krona (SEK)</description>
- </quote>
- <quote>
- <id>SGD</id><symbol>SGD</symbol><description>Singapore Dollar (SGD)</description>
- </quote>
- <quote>
- <id>SHP</id><symbol>SHP</symbol><description>St. Helena Pound (SHP)</description>
- </quote>
- <quote>
- <id>SKK</id><symbol>SKK</symbol><description>Slovak Koruna (SKK)</description>
- </quote>
- <quote>
- <id>SLL</id><symbol>SLL</symbol><description>Sierra Leonean Leone (SLL)</description>
- </quote>
- <quote>
- <id>SOS</id><symbol>SOS</symbol><description>Somali Shilling (SOS)</description>
- </quote>
- <quote>
- <id>SRD</id><symbol>SRD</symbol><description>Surinamese Dollar (SRD)</description>
- </quote>
- <quote>
- <id>STD</id><symbol>STD</symbol><description>São Tomé and Príncipe Dobra (STD)</description>
- </quote>
- <quote>
- <id>SVC</id><symbol>SVC</symbol><description>Salvadoran Colón (SVC)</description>
- </quote>
- <quote>
- <id>SYP</id><symbol>SYP</symbol><description>Syrian Pound (SYP)</description>
- </quote>
- <quote>
- <id>SZL</id><symbol>SZL</symbol><description>Swazi Lilangeni (SZL)</description>
- </quote>
- <quote>
- <id>THB</id><symbol>THB</symbol><description>Thai Baht (THB)</description>
- </quote>
- <quote>
- <id>TJS</id><symbol>TJS</symbol><description>Tajikistani Somoni (TJS)</description>
- </quote>
- <quote>
- <id>TMT</id><symbol>TMT</symbol><description>Turkmenistani Manat (TMT)</description>
- </quote>
- <quote>
- <id>TND</id><symbol>TND</symbol><description>Tunisian Dinar (TND)</description>
- </quote>
- <quote>
- <id>TOP</id><symbol>TOP</symbol><description>Tongan Paʻanga (TOP)</description>
- </quote>
- <quote>
- <id>TRY</id><symbol>TRY</symbol><description>Turkish Lira (TRY)</description>
- </quote>
- <quote>
- <id>TTD</id><symbol>TTD</symbol><description>Trinidad and Tobago Dollar (TTD)</description>
- </quote>
- <quote>
- <id>TWD</id><symbol>TWD</symbol><description>New Taiwan Dollar (TWD)</description>
- </quote>
- <quote>
- <id>TZS</id><symbol>TZS</symbol><description>Tanzanian Shilling (TZS)</description>
- </quote>
- <quote>
- <id>UAH</id><symbol>UAH</symbol><description>Ukrainian Hryvnia (UAH)</description>
- </quote>
- <quote>
- <id>UGX</id><symbol>UGX</symbol><description>Ugandan Shilling (UGX)</description>
- </quote>
- <quote>
- <id>USD</id><symbol>USD</symbol><description>United States Dollar (USD)</description>
- </quote>
- <quote>
- <id>UYU</id><symbol>UYU</symbol><description>Uruguayan Peso (UYU)</description>
- </quote>
- <quote>
- <id>UZS</id><symbol>UZS</symbol><description>Uzbekistani Som (UZS)</description>
- </quote>
- <quote>
- <id>VEF</id><symbol>VEF</symbol><description>Venezuelan Bolívar (VEF)</description>
- </quote>
- <quote>
- <id>VND</id><symbol>VND</symbol><description>Vietnamese Dong (VND)</description>
- </quote>
- <quote>
- <id>VUV</id><symbol>VUV</symbol><description>Vanuatu Vatu (VUV)</description>
- </quote>
- <quote>
- <id>WST</id><symbol>WST</symbol><description>Samoan Tala (WST)</description>
- </quote>
- <quote>
- <id>XAF</id><symbol>XAF</symbol><description>Central African CFA Franc (FCFA)</description>
- </quote>
- <quote>
- <id>XCD</id><symbol>XCD</symbol><description>East Caribbean Dollar (XCD)</description>
- </quote>
- <quote>
- <id>XDR</id><symbol>XDR</symbol><description>Special Drawing Rights (XDR)</description>
- </quote>
- <quote>
- <id>XOF</id><symbol>XOF</symbol><description>West African CFA Franc (CFA)</description>
- </quote>
- <quote>
- <id>XPF</id><symbol>XPF</symbol><description>CFP Franc (CFPF)</description>
- </quote>
- <quote>
- <id>YER</id><symbol>YER</symbol><description>Yemeni Rial (YER)</description>
- </quote>
- <quote>
- <id>ZAR</id><symbol>ZAR</symbol><description>South African Rand (ZAR)</description>
- </quote>
- <quote>
- <id>ZMK</id><symbol>ZMK</symbol><description>Zambian Kwacha (1968–2012) (ZMK)</description>
- </quote>
- <quote>
- <id>ZMW</id><symbol>ZMW</symbol><description>Zambian Kwacha (ZMW)</description>
- </quote>
- <quote>
- <id>ZWL</id><symbol>ZWL</symbol><description>Zimbabwean Dollar (2009) (ZWL)</description>
- </quote>
-</section>
+<?xml version="1.0" encoding="utf-8"?>
+
+<Provider>
+ <name>Currency Converter API</name>
+ <ref>https://www.currencyconverterapi.com/</ref>
+ <url>https://free.currencyconverterapi.com/api/v5/convert</url>
+
+<section>
+ <name>Currencies</name>
+ <quote>
+ <id>AED</id><symbol>AED</symbol><description>United Arab Emirates Dirham (AED)</description>
+ </quote>
+ <quote>
+ <id>AFN</id><symbol>AFN</symbol><description>Afghan Afghani (AFN)</description>
+ </quote>
+ <quote>
+ <id>ALL</id><symbol>ALL</symbol><description>Albanian Lek (ALL)</description>
+ </quote>
+ <quote>
+ <id>AMD</id><symbol>AMD</symbol><description>Armenian Dram (AMD)</description>
+ </quote>
+ <quote>
+ <id>ANG</id><symbol>ANG</symbol><description>Netherlands Antillean Gulden (ANG)</description>
+ </quote>
+ <quote>
+ <id>AOA</id><symbol>AOA</symbol><description>Angolan Kwanza (AOA)</description>
+ </quote>
+ <quote>
+ <id>ARS</id><symbol>ARS</symbol><description>Argentine Peso (ARS)</description>
+ </quote>
+ <quote>
+ <id>AUD</id><symbol>AUD</symbol><description>Australian Dollar (AUD)</description>
+ </quote>
+ <quote>
+ <id>AWG</id><symbol>AWG</symbol><description>Aruban Florin (AWG)</description>
+ </quote>
+ <quote>
+ <id>AZN</id><symbol>AZN</symbol><description>Azerbaijani Manat (AZN)</description>
+ </quote>
+ <quote>
+ <id>BAM</id><symbol>BAM</symbol><description>Bosnia-Herzegovina Convertible Mark (BAM)</description>
+ </quote>
+ <quote>
+ <id>BBD</id><symbol>BBD</symbol><description>Barbadian Dollar (BBD)</description>
+ </quote>
+ <quote>
+ <id>BDT</id><symbol>BDT</symbol><description>Bangladeshi Taka (BDT)</description>
+ </quote>
+ <quote>
+ <id>BGN</id><symbol>BGN</symbol><description>Bulgarian Lev (BGN)</description>
+ </quote>
+ <quote>
+ <id>BHD</id><symbol>BHD</symbol><description>Bahraini Dinar (BHD)</description>
+ </quote>
+ <quote>
+ <id>BIF</id><symbol>BIF</symbol><description>Burundian Franc (BIF)</description>
+ </quote>
+ <quote>
+ <id>BMD</id><symbol>BMD</symbol><description>Bermudan Dollar (BMD)</description>
+ </quote>
+ <quote>
+ <id>BND</id><symbol>BND</symbol><description>Brunei Dollar (BND)</description>
+ </quote>
+ <quote>
+ <id>BOB</id><symbol>BOB</symbol><description>Bolivian Boliviano (BOB)</description>
+ </quote>
+ <quote>
+ <id>BRL</id><symbol>BRL</symbol><description>Brazilian Real (BRL)</description>
+ </quote>
+ <quote>
+ <id>BSD</id><symbol>BSD</symbol><description>Bahamian Dollar (BSD)</description>
+ </quote>
+ <quote>
+ <id>BTC</id><symbol>BTC</symbol><description>Bitcoin (BTC)</description>
+ </quote>
+ <quote>
+ <id>BTN</id><symbol>BTN</symbol><description>Bhutanese Ngultrum (BTN)</description>
+ </quote>
+ <quote>
+ <id>BWP</id><symbol>BWP</symbol><description>Botswana Pula (BWP)</description>
+ </quote>
+ <quote>
+ <id>BYN</id><symbol>BYN</symbol><description>Belarusian Ruble (BYN)</description>
+ </quote>
+ <quote>
+ <id>BYR</id><symbol>BYR</symbol><description>Belarusian Ruble (2000–2016) (BYR)</description>
+ </quote>
+ <quote>
+ <id>BZD</id><symbol>BZD</symbol><description>Belize Dollar (BZD)</description>
+ </quote>
+ <quote>
+ <id>CAD</id><symbol>CAD</symbol><description>Canadian Dollar (CAD)</description>
+ </quote>
+ <quote>
+ <id>CDF</id><symbol>CDF</symbol><description>Congolese Franc (CDF)</description>
+ </quote>
+ <quote>
+ <id>CHF</id><symbol>CHF</symbol><description>Swiss Franc (CHF)</description>
+ </quote>
+ <quote>
+ <id>CLF</id><symbol>CLF</symbol><description>Chilean Unit of Account (UF) (CLF)</description>
+ </quote>
+ <quote>
+ <id>CLP</id><symbol>CLP</symbol><description>Chilean Peso (CLP)</description>
+ </quote>
+ <quote>
+ <id>CNH</id><symbol>CNH</symbol><description>CNH (CNH)</description>
+ </quote>
+ <quote>
+ <id>CNY</id><symbol>CNY</symbol><description>Chinese Yuan (CNY)</description>
+ </quote>
+ <quote>
+ <id>COP</id><symbol>COP</symbol><description>Colombian Peso (COP)</description>
+ </quote>
+ <quote>
+ <id>CRC</id><symbol>CRC</symbol><description>Costa Rican Colón (CRC)</description>
+ </quote>
+ <quote>
+ <id>CUP</id><symbol>CUP</symbol><description>Cuban Peso (CUP)</description>
+ </quote>
+ <quote>
+ <id>CVE</id><symbol>CVE</symbol><description>Cape Verdean Escudo (CVE)</description>
+ </quote>
+ <quote>
+ <id>CZK</id><symbol>CZK</symbol><description>Czech Koruna (CZK)</description>
+ </quote>
+ <quote>
+ <id>DEM</id><symbol>DEM</symbol><description>German Mark (DEM)</description>
+ </quote>
+ <quote>
+ <id>DJF</id><symbol>DJF</symbol><description>Djiboutian Franc (DJF)</description>
+ </quote>
+ <quote>
+ <id>DKK</id><symbol>DKK</symbol><description>Danish Krone (DKK)</description>
+ </quote>
+ <quote>
+ <id>DOP</id><symbol>DOP</symbol><description>Dominican Peso (DOP)</description>
+ </quote>
+ <quote>
+ <id>DZD</id><symbol>DZD</symbol><description>Algerian Dinar (DZD)</description>
+ </quote>
+ <quote>
+ <id>EGP</id><symbol>EGP</symbol><description>Egyptian Pound (EGP)</description>
+ </quote>
+ <quote>
+ <id>ERN</id><symbol>ERN</symbol><description>Eritrean Nakfa (ERN)</description>
+ </quote>
+ <quote>
+ <id>ETB</id><symbol>ETB</symbol><description>Ethiopian Birr (ETB)</description>
+ </quote>
+ <quote>
+ <id>EUR</id><symbol>EUR</symbol><description>Euro (EUR)</description>
+ </quote>
+ <quote>
+ <id>FIM</id><symbol>FIM</symbol><description>Finnish Markka (FIM)</description>
+ </quote>
+ <quote>
+ <id>FJD</id><symbol>FJD</symbol><description>Fijian Dollar (FJD)</description>
+ </quote>
+ <quote>
+ <id>FKP</id><symbol>FKP</symbol><description>Falkland Islands Pound (FKP)</description>
+ </quote>
+ <quote>
+ <id>FRF</id><symbol>FRF</symbol><description>French Franc (FRF)</description>
+ </quote>
+ <quote>
+ <id>GBP</id><symbol>GBP</symbol><description>British Pound (GBP)</description>
+ </quote>
+ <quote>
+ <id>GEL</id><symbol>GEL</symbol><description>Georgian Lari (GEL)</description>
+ </quote>
+ <quote>
+ <id>GHS</id><symbol>GHS</symbol><description>Ghanaian Cedi (GHS)</description>
+ </quote>
+ <quote>
+ <id>GIP</id><symbol>GIP</symbol><description>Gibraltar Pound (GIP)</description>
+ </quote>
+ <quote>
+ <id>GMD</id><symbol>GMD</symbol><description>Gambian Dalasi (GMD)</description>
+ </quote>
+ <quote>
+ <id>GNF</id><symbol>GNF</symbol><description>Guinean Franc (GNF)</description>
+ </quote>
+ <quote>
+ <id>GTQ</id><symbol>GTQ</symbol><description>Guatemalan Quetzal (GTQ)</description>
+ </quote>
+ <quote>
+ <id>GYD</id><symbol>GYD</symbol><description>Guyanaese Dollar (GYD)</description>
+ </quote>
+ <quote>
+ <id>HKD</id><symbol>HKD</symbol><description>Hong Kong Dollar (HKD)</description>
+ </quote>
+ <quote>
+ <id>HNL</id><symbol>HNL</symbol><description>Honduran Lempira (HNL)</description>
+ </quote>
+ <quote>
+ <id>HRK</id><symbol>HRK</symbol><description>Croatian Kuna (HRK)</description>
+ </quote>
+ <quote>
+ <id>HTG</id><symbol>HTG</symbol><description>Haitian Gourde (HTG)</description>
+ </quote>
+ <quote>
+ <id>HUF</id><symbol>HUF</symbol><description>Hungarian Forint (HUF)</description>
+ </quote>
+ <quote>
+ <id>IDR</id><symbol>IDR</symbol><description>Indonesian Rupiah (IDR)</description>
+ </quote>
+ <quote>
+ <id>IEP</id><symbol>IEP</symbol><description>Irish Pound (IEP)</description>
+ </quote>
+ <quote>
+ <id>ILS</id><symbol>ILS</symbol><description>Israeli New Shekel (ILS)</description>
+ </quote>
+ <quote>
+ <id>INR</id><symbol>INR</symbol><description>Indian Rupee (INR)</description>
+ </quote>
+ <quote>
+ <id>IQD</id><symbol>IQD</symbol><description>Iraqi Dinar (IQD)</description>
+ </quote>
+ <quote>
+ <id>IRR</id><symbol>IRR</symbol><description>Iranian Rial (IRR)</description>
+ </quote>
+ <quote>
+ <id>ISK</id><symbol>ISK</symbol><description>Icelandic Króna (ISK)</description>
+ </quote>
+ <quote>
+ <id>ITL</id><symbol>ITL</symbol><description>Italian Lira (ITL)</description>
+ </quote>
+ <quote>
+ <id>JMD</id><symbol>JMD</symbol><description>Jamaican Dollar (JMD)</description>
+ </quote>
+ <quote>
+ <id>JOD</id><symbol>JOD</symbol><description>Jordanian Dinar (JOD)</description>
+ </quote>
+ <quote>
+ <id>JPY</id><symbol>JPY</symbol><description>Japanese Yen (JPY)</description>
+ </quote>
+ <quote>
+ <id>KES</id><symbol>KES</symbol><description>Kenyan Shilling (KES)</description>
+ </quote>
+ <quote>
+ <id>KGS</id><symbol>KGS</symbol><description>Kyrgystani Som (KGS)</description>
+ </quote>
+ <quote>
+ <id>KHR</id><symbol>KHR</symbol><description>Cambodian Riel (KHR)</description>
+ </quote>
+ <quote>
+ <id>KMF</id><symbol>KMF</symbol><description>Comorian Franc (KMF)</description>
+ </quote>
+ <quote>
+ <id>KPW</id><symbol>KPW</symbol><description>North Korean Won (KPW)</description>
+ </quote>
+ <quote>
+ <id>KRW</id><symbol>KRW</symbol><description>South Korean Won (KRW)</description>
+ </quote>
+ <quote>
+ <id>KWD</id><symbol>KWD</symbol><description>Kuwaiti Dinar (KWD)</description>
+ </quote>
+ <quote>
+ <id>KYD</id><symbol>KYD</symbol><description>Cayman Islands Dollar (KYD)</description>
+ </quote>
+ <quote>
+ <id>KZT</id><symbol>KZT</symbol><description>Kazakhstani Tenge (KZT)</description>
+ </quote>
+ <quote>
+ <id>LAK</id><symbol>LAK</symbol><description>Laotian Kip (LAK)</description>
+ </quote>
+ <quote>
+ <id>LBP</id><symbol>LBP</symbol><description>Lebanese Pound (LBP)</description>
+ </quote>
+ <quote>
+ <id>LKR</id><symbol>LKR</symbol><description>Sri Lankan Rupee (LKR)</description>
+ </quote>
+ <quote>
+ <id>LRD</id><symbol>LRD</symbol><description>Liberian Dollar (LRD)</description>
+ </quote>
+ <quote>
+ <id>LSL</id><symbol>LSL</symbol><description>Lesotho Loti (LSL)</description>
+ </quote>
+ <quote>
+ <id>LTL</id><symbol>LTL</symbol><description>Lithuanian Litas (LTL)</description>
+ </quote>
+ <quote>
+ <id>LVL</id><symbol>LVL</symbol><description>Latvian Lats (LVL)</description>
+ </quote>
+ <quote>
+ <id>LYD</id><symbol>LYD</symbol><description>Libyan Dinar (LYD)</description>
+ </quote>
+ <quote>
+ <id>MAD</id><symbol>MAD</symbol><description>Moroccan Dirham (MAD)</description>
+ </quote>
+ <quote>
+ <id>MDL</id><symbol>MDL</symbol><description>Moldovan Leu (MDL)</description>
+ </quote>
+ <quote>
+ <id>MGA</id><symbol>MGA</symbol><description>Malagasy Ariary (MGA)</description>
+ </quote>
+ <quote>
+ <id>MKD</id><symbol>MKD</symbol><description>Macedonian Denar (MKD)</description>
+ </quote>
+ <quote>
+ <id>MNT</id><symbol>MNT</symbol><description>Mongolian Tugrik (MNT)</description>
+ </quote>
+ <quote>
+ <id>MOP</id><symbol>MOP</symbol><description>Macanese Pataca (MOP)</description>
+ </quote>
+ <quote>
+ <id>MRO</id><symbol>MRO</symbol><description>Mauritanian Ouguiya (MRO)</description>
+ </quote>
+ <quote>
+ <id>MUR</id><symbol>MUR</symbol><description>Mauritian Rupee (MUR)</description>
+ </quote>
+ <quote>
+ <id>MVR</id><symbol>MVR</symbol><description>Maldivian Rufiyaa (MVR)</description>
+ </quote>
+ <quote>
+ <id>MWK</id><symbol>MWK</symbol><description>Malawian Kwacha (MWK)</description>
+ </quote>
+ <quote>
+ <id>MXN</id><symbol>MXN</symbol><description>Mexican Peso (MXN)</description>
+ </quote>
+ <quote>
+ <id>MYR</id><symbol>MYR</symbol><description>Malaysian Ringgit (MYR)</description>
+ </quote>
+ <quote>
+ <id>MZN</id><symbol>MZN</symbol><description>Mozambican Metical (MZN)</description>
+ </quote>
+ <quote>
+ <id>NAD</id><symbol>NAD</symbol><description>Namibian Dollar (NAD)</description>
+ </quote>
+ <quote>
+ <id>NGN</id><symbol>NGN</symbol><description>Nigerian Naira (NGN)</description>
+ </quote>
+ <quote>
+ <id>NIO</id><symbol>NIO</symbol><description>Nicaraguan Córdoba (NIO)</description>
+ </quote>
+ <quote>
+ <id>NOK</id><symbol>NOK</symbol><description>Norwegian Krone (NOK)</description>
+ </quote>
+ <quote>
+ <id>NPR</id><symbol>NPR</symbol><description>Nepalese Rupee (NPR)</description>
+ </quote>
+ <quote>
+ <id>NZD</id><symbol>NZD</symbol><description>New Zealand Dollar (NZD)</description>
+ </quote>
+ <quote>
+ <id>OMR</id><symbol>OMR</symbol><description>Omani Rial (OMR)</description>
+ </quote>
+ <quote>
+ <id>PAB</id><symbol>PAB</symbol><description>Panamanian Balboa (PAB)</description>
+ </quote>
+ <quote>
+ <id>PEN</id><symbol>PEN</symbol><description>Peruvian Nuevo Sol (PEN)</description>
+ </quote>
+ <quote>
+ <id>PGK</id><symbol>PGK</symbol><description>Papua New Guinean Kina (PGK)</description>
+ </quote>
+ <quote>
+ <id>PHP</id><symbol>PHP</symbol><description>Philippine Peso (PHP)</description>
+ </quote>
+ <quote>
+ <id>PKG</id><symbol>PKG</symbol><description>PKG (PKG)</description>
+ </quote>
+ <quote>
+ <id>PKR</id><symbol>PKR</symbol><description>Pakistani Rupee (PKR)</description>
+ </quote>
+ <quote>
+ <id>PLN</id><symbol>PLN</symbol><description>Polish Zloty (PLN)</description>
+ </quote>
+ <quote>
+ <id>PYG</id><symbol>PYG</symbol><description>Paraguayan Guarani (PYG)</description>
+ </quote>
+ <quote>
+ <id>QAR</id><symbol>QAR</symbol><description>Qatari Riyal (QAR)</description>
+ </quote>
+ <quote>
+ <id>RON</id><symbol>RON</symbol><description>New Romanian Leu (RON)</description>
+ </quote>
+ <quote>
+ <id>RSD</id><symbol>RSD</symbol><description>Serbian Dinar (RSD)</description>
+ </quote>
+ <quote>
+ <id>RUB</id><symbol>RUB</symbol><description>Russian Ruble (RUB)</description>
+ </quote>
+ <quote>
+ <id>RWF</id><symbol>RWF</symbol><description>Rwandan Franc (RWF)</description>
+ </quote>
+ <quote>
+ <id>SAR</id><symbol>SAR</symbol><description>Saudi Riyal (SAR)</description>
+ </quote>
+ <quote>
+ <id>SBD</id><symbol>SBD</symbol><description>Solomon Islands Dollar (SBD)</description>
+ </quote>
+ <quote>
+ <id>SCR</id><symbol>SCR</symbol><description>Seychellois Rupee (SCR)</description>
+ </quote>
+ <quote>
+ <id>SDG</id><symbol>SDG</symbol><description>Sudanese Pound (SDG)</description>
+ </quote>
+ <quote>
+ <id>SEK</id><symbol>SEK</symbol><description>Swedish Krona (SEK)</description>
+ </quote>
+ <quote>
+ <id>SGD</id><symbol>SGD</symbol><description>Singapore Dollar (SGD)</description>
+ </quote>
+ <quote>
+ <id>SHP</id><symbol>SHP</symbol><description>St. Helena Pound (SHP)</description>
+ </quote>
+ <quote>
+ <id>SKK</id><symbol>SKK</symbol><description>Slovak Koruna (SKK)</description>
+ </quote>
+ <quote>
+ <id>SLL</id><symbol>SLL</symbol><description>Sierra Leonean Leone (SLL)</description>
+ </quote>
+ <quote>
+ <id>SOS</id><symbol>SOS</symbol><description>Somali Shilling (SOS)</description>
+ </quote>
+ <quote>
+ <id>SRD</id><symbol>SRD</symbol><description>Surinamese Dollar (SRD)</description>
+ </quote>
+ <quote>
+ <id>STD</id><symbol>STD</symbol><description>São Tomé and Príncipe Dobra (STD)</description>
+ </quote>
+ <quote>
+ <id>SVC</id><symbol>SVC</symbol><description>Salvadoran Colón (SVC)</description>
+ </quote>
+ <quote>
+ <id>SYP</id><symbol>SYP</symbol><description>Syrian Pound (SYP)</description>
+ </quote>
+ <quote>
+ <id>SZL</id><symbol>SZL</symbol><description>Swazi Lilangeni (SZL)</description>
+ </quote>
+ <quote>
+ <id>THB</id><symbol>THB</symbol><description>Thai Baht (THB)</description>
+ </quote>
+ <quote>
+ <id>TJS</id><symbol>TJS</symbol><description>Tajikistani Somoni (TJS)</description>
+ </quote>
+ <quote>
+ <id>TMT</id><symbol>TMT</symbol><description>Turkmenistani Manat (TMT)</description>
+ </quote>
+ <quote>
+ <id>TND</id><symbol>TND</symbol><description>Tunisian Dinar (TND)</description>
+ </quote>
+ <quote>
+ <id>TOP</id><symbol>TOP</symbol><description>Tongan Paʻanga (TOP)</description>
+ </quote>
+ <quote>
+ <id>TRY</id><symbol>TRY</symbol><description>Turkish Lira (TRY)</description>
+ </quote>
+ <quote>
+ <id>TTD</id><symbol>TTD</symbol><description>Trinidad and Tobago Dollar (TTD)</description>
+ </quote>
+ <quote>
+ <id>TWD</id><symbol>TWD</symbol><description>New Taiwan Dollar (TWD)</description>
+ </quote>
+ <quote>
+ <id>TZS</id><symbol>TZS</symbol><description>Tanzanian Shilling (TZS)</description>
+ </quote>
+ <quote>
+ <id>UAH</id><symbol>UAH</symbol><description>Ukrainian Hryvnia (UAH)</description>
+ </quote>
+ <quote>
+ <id>UGX</id><symbol>UGX</symbol><description>Ugandan Shilling (UGX)</description>
+ </quote>
+ <quote>
+ <id>USD</id><symbol>USD</symbol><description>United States Dollar (USD)</description>
+ </quote>
+ <quote>
+ <id>UYU</id><symbol>UYU</symbol><description>Uruguayan Peso (UYU)</description>
+ </quote>
+ <quote>
+ <id>UZS</id><symbol>UZS</symbol><description>Uzbekistani Som (UZS)</description>
+ </quote>
+ <quote>
+ <id>VEF</id><symbol>VEF</symbol><description>Venezuelan Bolívar (VEF)</description>
+ </quote>
+ <quote>
+ <id>VND</id><symbol>VND</symbol><description>Vietnamese Dong (VND)</description>
+ </quote>
+ <quote>
+ <id>VUV</id><symbol>VUV</symbol><description>Vanuatu Vatu (VUV)</description>
+ </quote>
+ <quote>
+ <id>WST</id><symbol>WST</symbol><description>Samoan Tala (WST)</description>
+ </quote>
+ <quote>
+ <id>XAF</id><symbol>XAF</symbol><description>Central African CFA Franc (FCFA)</description>
+ </quote>
+ <quote>
+ <id>XCD</id><symbol>XCD</symbol><description>East Caribbean Dollar (XCD)</description>
+ </quote>
+ <quote>
+ <id>XDR</id><symbol>XDR</symbol><description>Special Drawing Rights (XDR)</description>
+ </quote>
+ <quote>
+ <id>XOF</id><symbol>XOF</symbol><description>West African CFA Franc (CFA)</description>
+ </quote>
+ <quote>
+ <id>XPF</id><symbol>XPF</symbol><description>CFP Franc (CFPF)</description>
+ </quote>
+ <quote>
+ <id>YER</id><symbol>YER</symbol><description>Yemeni Rial (YER)</description>
+ </quote>
+ <quote>
+ <id>ZAR</id><symbol>ZAR</symbol><description>South African Rand (ZAR)</description>
+ </quote>
+ <quote>
+ <id>ZMK</id><symbol>ZMK</symbol><description>Zambian Kwacha (1968–2012) (ZMK)</description>
+ </quote>
+ <quote>
+ <id>ZMW</id><symbol>ZMW</symbol><description>Zambian Kwacha (ZMW)</description>
+ </quote>
+ <quote>
+ <id>ZWL</id><symbol>ZWL</symbol><description>Zimbabwean Dollar (2009) (ZWL)</description>
+ </quote>
+</section>
</Provider> \ No newline at end of file
diff --git a/plugins/Quotes/res/Forex.rc b/plugins/Quotes/res/Forex.rc
index ed52889477..451b780d9d 100644
--- a/plugins/Quotes/res/Forex.rc
+++ b/plugins/Quotes/res/Forex.rc
@@ -27,18 +27,30 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON_MAIN ICON "main.ico"
+
IDI_ICON_SECTION ICON "Section.ico"
+
IDI_ICON_QUOTE ICON "quote.ico"
+
IDI_ICON_UP ICON "up.ico"
+
IDI_ICON_DOWN ICON "down.ico"
+
IDI_ICON_CURRENCY_CONVERTER ICON "CurrencyConverter.ico"
+
IDI_ICON_REFRESH ICON "Refresh.ico"
+
IDI_ICON_EXPORT ICON "Export quotes.ico"
+
IDI_ICON_SWAP ICON "swap.ico"
+
IDI_ICON_IMPORT ICON "Import quotes.ico"
+
IDI_ICON_NOTCHANGED ICON "notchanged.ico"
+
IDI_ICON_DISABLED ICON "AutoUpdateDisabled.ico"
+
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
@@ -131,7 +143,7 @@ BEGIN
PUSHBUTTON "Convert",IDC_BUTTON_CONVERT,134,24,79,14
EDITTEXT IDC_EDIT_RESULT,7,44,328,12,ES_CENTER | ES_AUTOHSCROLL | ES_READONLY
CONTROL "Info provided by <a href=""http://www.google.com"">Google</a>",IDC_SYSLINK_PROVIDER,
- "SysLink",WS_TABSTOP,7,61,159,11
+ "SysLink",WS_TABSTOP,7,61,328,11
PUSHBUTTON "Close",IDCANCEL,148,80,50,14
END
@@ -392,6 +404,17 @@ BEGIN
END
#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_CURRENCY_CONVERTER AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
+
#endif // Neutral resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/Quotes/src/CurrencyConverter.cpp b/plugins/Quotes/src/CurrencyConverter.cpp
index 39de2a3805..e66511ce91 100644
--- a/plugins/Quotes/src/CurrencyConverter.cpp
+++ b/plugins/Quotes/src/CurrencyConverter.cpp
@@ -1,4 +1,5 @@
#include "StdAfx.h"
+#include "QuotesProviderCurrencyConverter.h"
#define WINDOW_PREFIX "CurrenyConverter_"
@@ -6,36 +7,37 @@
#define DB_STR_CC_QUOTE_TO_ID "CurrencyConverter_ToID"
#define DB_STR_CC_AMOUNT "CurrencyConverter_Amount"
-static CQuotesProviderGoogle* get_google_provider()
+static CQuotesProviderCurrencyConverter* get_currency_converter_provider()
{
CModuleInfo::TQuotesProvidersPtr pProviders = CModuleInfo::GetQuoteProvidersPtr();
const CQuotesProviders::TQuotesProviders& rapQuotesProviders = pProviders->GetProviders();
for (CQuotesProviders::TQuotesProviders::const_iterator i = rapQuotesProviders.begin(); i != rapQuotesProviders.end(); ++i) {
const CQuotesProviders::TQuotesProviderPtr& pProvider = *i;
- CQuotesProviderGoogle* pGoogle = dynamic_cast<CQuotesProviderGoogle*>(pProvider.get());
- if (pGoogle)
- return pGoogle;
+ if (auto p = dynamic_cast<CQuotesProviderCurrencyConverter*>(pProvider.get()))
+ {
+ return p;
+ }
}
assert(!"We should never get here!");
return nullptr;
}
-CQuotesProviderGoogle::CQuoteSection get_quotes(const CQuotesProviderGoogle* pProvider = nullptr)
+CQuotesProviderBase::CQuoteSection get_quotes(const CQuotesProviderCurrencyConverter* pProvider = nullptr)
{
if (nullptr == pProvider)
- pProvider = get_google_provider();
+ pProvider = get_currency_converter_provider();
if (pProvider) {
- const CQuotesProviderGoogle::CQuoteSection& rQuotes = pProvider->GetQuotes();
+ const auto& rQuotes = pProvider->GetQuotes();
if (rQuotes.GetSectionCount() > 0)
return rQuotes.GetSection(0);
}
- return CQuotesProviderGoogle::CQuoteSection();
+ return CQuotesProviderBase::CQuoteSection();
}
-inline tstring make_quote_name(const CQuotesProviderGoogle::CQuote& rQuote)
+inline tstring make_quote_name(const CQuotesProviderBase::CQuote& rQuote)
{
const tstring& rsDesc = rQuote.GetName();
return((false == rsDesc.empty()) ? rsDesc : rQuote.GetSymbol());
@@ -97,11 +99,11 @@ INT_PTR CALLBACK CurrencyConverterDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM
tstring sFromQuoteID = Quotes_DBGetStringT(NULL, QUOTES_MODULE_NAME, DB_STR_CC_QUOTE_FROM_ID);
tstring sToQuoteID = Quotes_DBGetStringT(NULL, QUOTES_MODULE_NAME, DB_STR_CC_QUOTE_TO_ID);
- const CQuotesProviderGoogle* pProvider = get_google_provider();
- const CQuotesProviderGoogle::CQuoteSection& rSection = get_quotes(pProvider);
- size_t cQuotes = rSection.GetQuoteCount();
- for (size_t i = 0; i < cQuotes; ++i) {
- const CQuotesProviderGoogle::CQuote& rQuote = rSection.GetQuote(i);
+ const auto pProvider = get_currency_converter_provider();
+ const auto& rSection = get_quotes(pProvider);
+ auto cQuotes = rSection.GetQuoteCount();
+ for (auto i = 0u; i < cQuotes; ++i) {
+ const auto& rQuote = rSection.GetQuote(i);
tstring sName = make_quote_name(rQuote);
LPCTSTR pszName = sName.c_str();
LRESULT nFrom = ::SendMessage(hcbxFrom, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszName));
@@ -193,17 +195,16 @@ INT_PTR CALLBACK CurrencyConverterDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM
size_t nFrom = static_cast<size_t>(::SendDlgItemMessage(hDlg, IDC_COMBO_CONVERT_FROM, CB_GETCURSEL, 0, 0));
size_t nTo = static_cast<size_t>(::SendDlgItemMessage(hDlg, IDC_COMBO_CONVERT_INTO, CB_GETCURSEL, 0, 0));
if ((CB_ERR != nFrom) && (CB_ERR != nTo) && (nFrom != nTo)) {
- const CQuotesProviderGoogle::CQuoteSection& rSection = get_quotes();
+ const auto& rSection = get_quotes();
size_t cQuotes = rSection.GetQuoteCount();
if ((nFrom < cQuotes) && (nTo < cQuotes)) {
- CQuotesProviderGoogle::CRateInfo ri;
- CQuotesProviderGoogle::CQuote from = rSection.GetQuote(nFrom);
- CQuotesProviderGoogle::CQuote to = rSection.GetQuote(nTo);
+ auto from = rSection.GetQuote(nFrom);
+ auto to = rSection.GetQuote(nTo);
db_set_ws(NULL, QUOTES_MODULE_NAME, DB_STR_CC_QUOTE_FROM_ID, from.GetID().c_str());
db_set_ws(NULL, QUOTES_MODULE_NAME, DB_STR_CC_QUOTE_TO_ID, to.GetID().c_str());
- const CQuotesProviderGoogle* pProvider = get_google_provider();
+ const auto pProvider = get_currency_converter_provider();
assert(pProvider);
if (pProvider) {
tstring sResult;
diff --git a/plugins/Quotes/src/ImportExport.cpp b/plugins/Quotes/src/ImportExport.cpp
index b68cc67103..564fb7b960 100644
--- a/plugins/Quotes/src/ImportExport.cpp
+++ b/plugins/Quotes/src/ImportExport.cpp
@@ -1,4 +1,5 @@
#include "StdAfx.h"
+#include "QuotesProviderCurrencyConverter.h"
LPCTSTR g_pszXmlValue = L"Value";
LPCTSTR g_pszXmlName = L"Name";
@@ -462,7 +463,7 @@ bool get_contact_state(const IXMLNode::TXMLNodePtr& pXmlContact, CContactState&
MCONTACT GetContact()const { return m_hContact; }
private:
- virtual void Visit(const CQuotesProviderDukasCopy& rProvider)
+ virtual void Visit(const CQuotesProviderDukasCopy& rProvider)override
{
tstring sQuoteID = GetXMLNodeValue(DB_STR_QUOTE_ID);
if (false == sQuoteID.empty()) {
@@ -470,9 +471,8 @@ bool get_contact_state(const IXMLNode::TXMLNodePtr& pXmlContact, CContactState&
}
}
- virtual void Visit(const CQuotesProviderGoogle& rProvider)
+ virtual void Visit(const CQuotesProviderCurrencyConverter& rProvider)override
{
- // USES_CONVERSION;
static const tstring g_sFromID = quotes_a2t(DB_STR_FROM_ID);//A2CT(DB_STR_FROM_ID);
static const tstring g_sToID = quotes_a2t(DB_STR_TO_ID);//A2CT(DB_STR_TO_ID);
@@ -497,7 +497,7 @@ bool get_contact_state(const IXMLNode::TXMLNodePtr& pXmlContact, CContactState&
}
}
- virtual void Visit(const CQuotesProviderFinance& rProvider)
+ virtual void Visit(const CQuotesProviderFinance& rProvider)override
{
tstring sQuoteID = GetXMLNodeValue(DB_STR_QUOTE_ID);
if (false == sQuoteID.empty()) {
diff --git a/plugins/Quotes/src/QuotesProviderCurrencyConverter.cpp b/plugins/Quotes/src/QuotesProviderCurrencyConverter.cpp
new file mode 100644
index 0000000000..f51a662721
--- /dev/null
+++ b/plugins/Quotes/src/QuotesProviderCurrencyConverter.cpp
@@ -0,0 +1,425 @@
+#include "stdafx.h"
+#include "QuotesProviderCurrencyConverter.h"
+#include <boost\property_tree\ptree.hpp>
+#include <boost\property_tree\json_parser.hpp>
+
+namespace
+{
+ tstring build_url(const tstring& rsURL, const tstring& from, const tstring& to)
+ {
+ tostringstream o;
+ o << rsURL << L"?q=" << from << L"_" << to << "&compact=ultra";
+ return o.str();
+ }
+
+ tstring build_url(MCONTACT hContact, const tstring& rsURL)
+ {
+ tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
+ tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
+ return build_url(rsURL, sFrom, sTo);
+ }
+
+ bool parse_responce(const tstring& rsJSON, double& dRate)
+ {
+ try
+ {
+ boost::property_tree::ptree pt;
+ std::istringstream i_stream(quotes_t2a(rsJSON.c_str()));
+
+ boost::property_tree::read_json(i_stream, pt);
+ if (!pt.empty())
+ {
+ auto pt_nested = pt.begin()->second;
+ dRate = pt_nested.get_value<double>();
+ }
+ else
+ {
+ dRate = pt.get_value<double>();
+ }
+
+ return true;
+ }
+ catch (boost::property_tree::ptree_error& )
+ {
+ }
+ return false;
+ }
+
+ using TWatchedRates = std::vector<CQuotesProviderCurrencyConverter::TRateInfo>;
+ TWatchedRates g_aWatchedRates;
+
+ INT_PTR CALLBACK OptDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
+ {
+ auto get_provider = []()->CQuotesProviderCurrencyConverter*
+ {
+ auto pProviders = CModuleInfo::GetQuoteProvidersPtr();
+ const auto& rapQuotesProviders = pProviders->GetProviders();
+ for (auto i = rapQuotesProviders.begin(); i != rapQuotesProviders.end(); ++i) {
+ const auto& pProvider = *i;
+ if (auto p = dynamic_cast<CQuotesProviderCurrencyConverter*>(pProvider.get()))
+ {
+ return p;
+ }
+ }
+
+ assert(!"We should never get here!");
+ return nullptr;
+ };
+
+ auto make_quote_name = [](const CQuotesProviderBase::CQuote& rQuote)->tstring
+ {
+ const tstring& rsDesc = rQuote.GetName();
+ return((false == rsDesc.empty()) ? rsDesc : rQuote.GetSymbol());
+ };
+
+ auto make_contact_name = [](const tstring& rsSymbolFrom, const tstring& rsSymbolTo)->tstring
+ {
+ tostringstream o;
+ o << rsSymbolFrom << L"/" << rsSymbolTo;
+ return o.str();
+ };
+
+
+ auto make_rate_name = [make_contact_name](const CQuotesProviderCurrencyConverter::TRateInfo& ri)->tstring
+ {
+ if ((false == ri.first.GetName().empty()) && (false == ri.second.GetName().empty()))
+ return make_contact_name(ri.first.GetName(), ri.second.GetName());
+
+ return make_contact_name(ri.first.GetSymbol(), ri.second.GetSymbol());
+ };
+
+
+ auto pProvider = get_provider();
+
+ CCommonDlgProcData d(pProvider);
+ CommonOptionDlgProc(hdlg, message, wParam, lParam, d);
+
+ switch (message) {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pNMHDR = reinterpret_cast<LPNMHDR>(lParam);
+ switch (pNMHDR->code) {
+ case PSN_APPLY:
+ {
+ if (pProvider) {
+ TWatchedRates aTemp(g_aWatchedRates);
+ TWatchedRates aRemove;
+ size_t cWatchedRates = pProvider->GetWatchedRateCount();
+ for (size_t i = 0; i < cWatchedRates; ++i) {
+ CQuotesProviderCurrencyConverter::TRateInfo ri;
+ if (true == pProvider->GetWatchedRateInfo(i, ri)) {
+ auto it = std::find_if(aTemp.begin(), aTemp.end(), [&ri](const auto& other)->bool
+ {
+ return ((0 == mir_wstrcmpi(ri.first.GetID().c_str(), other.first.GetID().c_str()))
+ && ((0 == mir_wstrcmpi(ri.second.GetID().c_str(), other.second.GetID().c_str()))));
+ });
+ if (it == aTemp.end()) {
+ aRemove.push_back(ri);
+ }
+ else {
+ aTemp.erase(it);
+ }
+ }
+ }
+
+ std::for_each(aRemove.begin(), aRemove.end(), [pProvider](const auto& ri) {pProvider->WatchForRate(ri, false); });
+ std::for_each(aTemp.begin(), aTemp.end(), [pProvider](const auto& ri) {pProvider->WatchForRate(ri, true); });
+ pProvider->RefreshSettings();
+ }
+ }
+ break;
+ }
+ }
+ break;
+
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hdlg);
+ {
+ g_aWatchedRates.clear();
+
+ HWND hcbxFrom = ::GetDlgItem(hdlg, IDC_COMBO_CONVERT_FROM);
+ HWND hcbxTo = ::GetDlgItem(hdlg, IDC_COMBO_CONVERT_INTO);
+
+ CQuotesProviderBase::CQuoteSection rSection;
+ const auto& rQuotes = pProvider->GetQuotes();
+ if (rQuotes.GetSectionCount() > 0)
+ {
+ rSection = rQuotes.GetSection(0);
+ }
+
+ auto cQuotes = rSection.GetQuoteCount();
+ for (auto i = 0u; i < cQuotes; ++i)
+ {
+ const auto& rQuote = rSection.GetQuote(i);
+ tstring sName = make_quote_name(rQuote);
+ LPCTSTR pszName = sName.c_str();
+ ::SendMessage(hcbxFrom, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszName));
+ ::SendMessage(hcbxTo, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszName));
+ }
+
+ auto cWatchedRates = pProvider->GetWatchedRateCount();
+ for (auto i = 0u; i < cWatchedRates; ++i)
+ {
+ CQuotesProviderCurrencyConverter::TRateInfo ri;
+ if (true == pProvider->GetWatchedRateInfo(i, ri))
+ {
+ g_aWatchedRates.push_back(ri);
+ tstring sRate = make_rate_name(ri);
+ LPCTSTR pszRateName = sRate.c_str();
+ ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszRateName));
+ }
+ }
+
+ ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_ADD), FALSE);
+ ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), FALSE);
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ switch (HIWORD(wParam)) {
+ case CBN_SELCHANGE:
+ switch (LOWORD(wParam)) {
+ case IDC_COMBO_REFRESH_RATE:
+ break;
+ case IDC_COMBO_CONVERT_FROM:
+ case IDC_COMBO_CONVERT_INTO:
+ {
+ int nFrom = static_cast<int>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_FROM, CB_GETCURSEL, 0, 0));
+ int nTo = static_cast<int>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_INTO, CB_GETCURSEL, 0, 0));
+ bool bEnableAddButton = ((CB_ERR != nFrom) && (CB_ERR != nTo) && (nFrom != nTo));
+ EnableWindow(GetDlgItem(hdlg, IDC_BUTTON_ADD), bEnableAddButton);
+ }
+ break;
+ case IDC_LIST_RATES:
+ {
+ int nSel = ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_GETCURSEL, 0, 0);
+ ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), (LB_ERR != nSel));
+ }
+ break;
+ }
+ break;
+
+ case BN_CLICKED:
+ switch (LOWORD(wParam)) {
+ case IDC_BUTTON_ADD:
+ {
+ size_t nFrom = static_cast<size_t>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_FROM, CB_GETCURSEL, 0, 0));
+ size_t nTo = static_cast<size_t>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_INTO, CB_GETCURSEL, 0, 0));
+ if ((CB_ERR != nFrom) && (CB_ERR != nTo) && (nFrom != nTo))
+ {
+ CQuotesProviderBase::CQuoteSection rSection;
+ const auto& rQuotes = pProvider->GetQuotes();
+ if (rQuotes.GetSectionCount() > 0)
+ {
+ rSection = rQuotes.GetSection(0);
+ }
+
+ auto cQuotes = rSection.GetQuoteCount();
+ if ((nFrom < cQuotes) && (nTo < cQuotes))
+ {
+ CQuotesProviderCurrencyConverter::TRateInfo ri;
+ ri.first = rSection.GetQuote(nFrom);
+ ri.second = rSection.GetQuote(nTo);
+
+ g_aWatchedRates.push_back(ri);
+
+ tstring sRate = make_rate_name(ri);
+ LPCTSTR pszRateName = sRate.c_str();
+ ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszRateName));
+ PropSheet_Changed(::GetParent(hdlg), hdlg);
+ }
+ }
+ }
+ break;
+
+ case IDC_BUTTON_REMOVE:
+ HWND hWnd = ::GetDlgItem(hdlg, IDC_LIST_RATES);
+ int nSel = ::SendMessage(hWnd, LB_GETCURSEL, 0, 0);
+ if (LB_ERR != nSel) {
+ if ((LB_ERR != ::SendMessage(hWnd, LB_DELETESTRING, nSel, 0))
+ && (nSel < static_cast<int>(g_aWatchedRates.size()))) {
+
+ TWatchedRates::iterator i = g_aWatchedRates.begin();
+ std::advance(i, nSel);
+ g_aWatchedRates.erase(i);
+ PropSheet_Changed(::GetParent(hdlg), hdlg);
+ }
+ }
+
+ nSel = ::SendMessage(hWnd, LB_GETCURSEL, 0, 0);
+ ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), (LB_ERR != nSel));
+ break;
+ }
+ break;
+ }
+ break;
+ }
+
+ return FALSE;
+ }
+
+}
+
+
+CQuotesProviderCurrencyConverter::CQuotesProviderCurrencyConverter()
+{
+}
+
+
+CQuotesProviderCurrencyConverter::~CQuotesProviderCurrencyConverter()
+{
+}
+
+void CQuotesProviderCurrencyConverter::Accept(CQuotesProviderVisitor& visitor)const
+{
+ CQuotesProviderBase::Accept(visitor);
+ visitor.Visit(*this);
+}
+
+void CQuotesProviderCurrencyConverter::ShowPropertyPage(WPARAM wp, OPTIONSDIALOGPAGE& odp)
+{
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_DIALOG_OPT_GOOGLE);
+ odp.pfnDlgProc = OptDlgProc;
+ odp.szTab.w = const_cast<LPTSTR>(GetInfo().m_sName.c_str());
+ g_plugin.addOptions(wp, &odp);
+}
+
+void CQuotesProviderCurrencyConverter::RefreshQuotes(TContracts& anContacts)
+{
+ CHTTPSession http;
+ tstring sURL = GetURL();
+
+ for (TContracts::const_iterator i = anContacts.begin(); i != anContacts.end() && IsOnline(); ++i) {
+ MCONTACT hContact = *i;
+
+ tstring sFullURL = build_url(hContact, sURL);
+ if ((true == http.OpenURL(sFullURL)) && (true == IsOnline())) {
+ tstring sHTML;
+ if ((true == http.ReadResponce(sHTML)) && (true == IsOnline())) {
+ double dRate = 0.0;
+ if ((true == parse_responce(sHTML, dRate)) && (true == IsOnline())) {
+ WriteContactRate(hContact, dRate);
+ continue;
+ }
+ }
+ }
+
+ SetContactStatus(hContact, ID_STATUS_NA);
+ }
+}
+
+double CQuotesProviderCurrencyConverter::Convert(double dAmount, const CQuote& from, const CQuote& to)const
+{
+ tstring sFullURL = build_url(GetURL(), from.GetID(), to.GetID());
+
+ CHTTPSession http;
+ if ((true == http.OpenURL(sFullURL))) {
+ tstring sHTML;
+ if ((true == http.ReadResponce(sHTML))) {
+ double dResult = 0.0;
+ if ((true == parse_responce(sHTML, dResult)))
+ {
+ return dResult*dAmount;
+ }
+
+ throw std::runtime_error(Translate("Error occurred during HTML parsing."));
+ }
+ else throw std::runtime_error(Translate("Error occurred during site access."));
+ }
+ else throw std::runtime_error(Translate("Error occurred during site access."));
+
+ return 0.0;
+}
+
+size_t CQuotesProviderCurrencyConverter::GetWatchedRateCount()const
+{
+ return m_aContacts.size();
+}
+
+bool CQuotesProviderCurrencyConverter::GetWatchedRateInfo(size_t nIndex, TRateInfo& rRateInfo)
+{
+ if(nIndex < m_aContacts.size()) {
+ MCONTACT hContact = m_aContacts[nIndex];
+ tstring sSymbolFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
+ tstring sSymbolTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
+ tstring sDescFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_DESCRIPTION);
+ tstring sDescTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_DESCRIPTION);
+
+ rRateInfo.first = CQuote(sSymbolFrom, sSymbolFrom, sDescFrom);
+ rRateInfo.second = CQuote(sSymbolTo, sSymbolTo, sDescTo);
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+
+bool CQuotesProviderCurrencyConverter::WatchForRate(const TRateInfo& ri, bool bWatch)
+{
+ auto i = std::find_if(m_aContacts.begin(), m_aContacts.end(), [&ri](auto hContact)->bool
+ {
+ tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
+ tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
+ return ((0 == mir_wstrcmpi(ri.first.GetID().c_str(), sFrom.c_str()))
+ && (0 == mir_wstrcmpi(ri.second.GetID().c_str(), sTo.c_str())));
+ });
+
+ auto make_contact_name = [](const tstring& rsSymbolFrom, const tstring& rsSymbolTo)->tstring
+ {
+ tostringstream o;
+ o << rsSymbolFrom << L"/" << rsSymbolTo;
+ return o.str();
+ };
+
+
+ if ((true == bWatch) && (i == m_aContacts.end()))
+ {
+ tstring sName = make_contact_name(ri.first.GetSymbol(), ri.second.GetSymbol());
+ MCONTACT hContact = CreateNewContact(sName);
+ if (hContact)
+ {
+ db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID, ri.first.GetID().c_str());
+ db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID, ri.second.GetID().c_str());
+ if (false == ri.first.GetName().empty())
+ {
+ db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_DESCRIPTION, ri.first.GetName().c_str());
+ }
+ if (false == ri.second.GetName().empty())
+ {
+ db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_DESCRIPTION, ri.second.GetName().c_str());
+ }
+
+ return true;
+ }
+ }
+ else if ((false == bWatch) && (i != m_aContacts.end()))
+ {
+ MCONTACT hContact = *i;
+ {// for CCritSection
+ mir_cslock lck(m_cs);
+ m_aContacts.erase(i);
+ }
+
+ db_delete_contact(hContact);
+ return true;
+ }
+
+ return false;
+}
+
+MCONTACT CQuotesProviderCurrencyConverter::GetContactByID(const tstring& rsFromID, const tstring& rsToID)const
+{
+ mir_cslock lck(m_cs);
+
+ auto i = std::find_if(m_aContacts.begin(), m_aContacts.end(), [rsFromID, rsToID](MCONTACT hContact)->bool
+ {
+ tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
+ tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
+ return ((0 == mir_wstrcmpi(rsFromID.c_str(), sFrom.c_str())) && (0 == mir_wstrcmpi(rsToID.c_str(), sTo.c_str())));
+
+ });
+ if (i != m_aContacts.end())
+ return *i;
+
+ return NULL;
+}
diff --git a/plugins/Quotes/src/QuotesProviderCurrencyConverter.h b/plugins/Quotes/src/QuotesProviderCurrencyConverter.h
new file mode 100644
index 0000000000..c6138756b3
--- /dev/null
+++ b/plugins/Quotes/src/QuotesProviderCurrencyConverter.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#define DB_STR_FROM_ID "FromID"
+#define DB_STR_TO_ID "ToID"
+#define DB_STR_FROM_DESCRIPTION "FromDesc"
+#define DB_STR_TO_DESCRIPTION "ToDesc"
+
+
+class CQuotesProviderCurrencyConverter : public CQuotesProviderBase
+{
+public:
+ using TRateInfo = std::pair<CQuote, CQuote>;
+
+public:
+ CQuotesProviderCurrencyConverter();
+ ~CQuotesProviderCurrencyConverter();
+
+ double Convert(double dAmount, const CQuote& from, const CQuote& to)const;
+ size_t GetWatchedRateCount()const;
+ bool GetWatchedRateInfo(size_t nIndex, TRateInfo& rRateInfo);
+ bool WatchForRate(const TRateInfo& ri, bool bWatch);
+ MCONTACT GetContactByID(const tstring& rsFromID, const tstring& rsToID)const;
+
+private:
+ virtual void Accept(CQuotesProviderVisitor& visitor)const override;
+ virtual void ShowPropertyPage(WPARAM wp, OPTIONSDIALOGPAGE& odp)override;
+ virtual void RefreshQuotes(TContracts& anContacts)override;
+};
+
diff --git a/plugins/Quotes/src/QuotesProviderGoogle.cpp b/plugins/Quotes/src/QuotesProviderGoogle.cpp
deleted file mode 100644
index e791b8cc4f..0000000000
--- a/plugins/Quotes/src/QuotesProviderGoogle.cpp
+++ /dev/null
@@ -1,431 +0,0 @@
-#include "StdAfx.h"
-
-CQuotesProviderGoogle::CQuotesProviderGoogle()
-{
-}
-
-CQuotesProviderGoogle::~CQuotesProviderGoogle()
-{
-}
-
-inline tstring make_contact_name(const tstring& rsSymbolFrom, const tstring& rsSymbolTo)
-{
- tostringstream o;
- o << rsSymbolFrom << L"/" << rsSymbolTo;
- return o.str();
-}
-
-inline bool is_rate_watched(MCONTACT hContact,
- const CQuotesProviderBase::CQuote& from,
- const CQuotesProviderBase::CQuote& to)
-{
- tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
- tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
- return ((0 == mir_wstrcmpi(from.GetID().c_str(), sFrom.c_str()))
- && (0 == mir_wstrcmpi(to.GetID().c_str(), sTo.c_str())));
-}
-
-bool CQuotesProviderGoogle::WatchForRate(const CRateInfo& ri,
- bool bWatch)
-{
- TContracts::const_iterator i = std::find_if(m_aContacts.begin(), m_aContacts.end(),
- boost::bind(is_rate_watched, _1, ri.m_from, ri.m_to));
- if ((true == bWatch) && (i == m_aContacts.end())) {
- tstring sName = make_contact_name(ri.m_from.GetSymbol(), ri.m_to.GetSymbol());
- MCONTACT hContact = CreateNewContact(sName);
- if (hContact) {
- db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID, ri.m_from.GetID().c_str());
- db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID, ri.m_to.GetID().c_str());
- if (false == ri.m_from.GetName().empty()) {
- db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_DESCRIPTION, ri.m_from.GetName().c_str());
- }
- if (false == ri.m_to.GetName().empty()) {
- db_set_ws(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_DESCRIPTION, ri.m_to.GetName().c_str());
- }
-
- return true;
- }
- }
- else if ((false == bWatch) && (i != m_aContacts.end())) {
- MCONTACT hContact = *i;
- {// for CCritSection
- mir_cslock lck(m_cs);
- m_aContacts.erase(i);
- }
-
- db_delete_contact(hContact);
- return true;
- }
-
- return false;
-}
-
-size_t CQuotesProviderGoogle::GetWatchedRateCount()const
-{
- return m_aContacts.size();
-}
-
-bool CQuotesProviderGoogle::GetWatchedRateInfo(size_t nIndex, CRateInfo& rRateInfo)
-{
- if (nIndex < m_aContacts.size()) {
- MCONTACT hContact = m_aContacts[nIndex];
- tstring sSymbolFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
- tstring sSymbolTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
- tstring sDescFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_DESCRIPTION);
- tstring sDescTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_DESCRIPTION);
-
- rRateInfo.m_from = CQuote(sSymbolFrom, sSymbolFrom, sDescFrom);
- rRateInfo.m_to = CQuote(sSymbolTo, sSymbolTo, sDescTo);
- return true;
- }
- else {
- return false;
- }
-}
-
-static tstring build_url(const tstring& rsURL, const tstring& from, const tstring& to, double dAmount)
-{
- tostringstream o;
- o << rsURL << L"?a=" << std::fixed << dAmount << L"&from=" << from << L"&to=" << to;
- return o.str();
-}
-
-static tstring build_url(MCONTACT hContact, const tstring& rsURL, double dAmount = 1.0)
-{
- tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
- tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
- return build_url(rsURL, sFrom, sTo, dAmount);
-}
-
-typedef IHTMLNode::THTMLNodePtr THTMLNodePtr;
-
-bool parse_html_node(const THTMLNodePtr& pNode, double& rdRate)
-{
- tstring sID = pNode->GetAttribute(L"id");
- if ((false == sID.empty()) && (0 == mir_wstrcmpi(sID.c_str(), L"currency_converter_result"))) {
- size_t cChild = pNode->GetChildCount();
- // assert(1 == cChild);
- if (cChild > 0) {
- THTMLNodePtr pChild = pNode->GetChildPtr(0);
- tstring sRate = pChild->GetText();
-
- tistringstream input(sRate);
- input >> rdRate;
-
- return ((false == input.bad()) && (false == input.fail()));
- }
- }
- else {
- size_t cChild = pNode->GetChildCount();
- for (size_t i = 0; i < cChild; ++i) {
- THTMLNodePtr pChild = pNode->GetChildPtr(i);
- if (pChild && (true == parse_html_node(pChild, rdRate))) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool parse_responce(const tstring& rsHTML, double& rdRate)
-{
- IHTMLEngine::THTMLParserPtr pHTMLParser = CModuleInfo::GetHTMLEngine()->GetParserPtr();
- THTMLNodePtr pRoot = pHTMLParser->ParseString(rsHTML);
- if (pRoot) {
- return parse_html_node(pRoot, rdRate);
- }
- else {
- return false;
- }
-}
-
-void CQuotesProviderGoogle::RefreshQuotes(TContracts& anContacts)
-{
- CHTTPSession http;
- tstring sURL = GetURL();
-
- for (TContracts::const_iterator i = anContacts.begin(); i != anContacts.end() && IsOnline(); ++i) {
- MCONTACT hContact = *i;
-
- tstring sFullURL = build_url(hContact, sURL);
- // LogIt(Info,sFullURL);
- if ((true == http.OpenURL(sFullURL)) && (true == IsOnline())) {
- tstring sHTML;
- if ((true == http.ReadResponce(sHTML)) && (true == IsOnline())) {
- double dRate = 0.0;
- if ((true == parse_responce(sHTML, dRate)) && (true == IsOnline())) {
- WriteContactRate(hContact, dRate);
- continue;
- }
- }
- }
-
- SetContactStatus(hContact, ID_STATUS_NA);
- }
-}
-
-inline tstring make_quote_name(const CQuotesProviderGoogle::CQuote& rQuote)
-{
- const tstring& rsDesc = rQuote.GetName();
- return((false == rsDesc.empty()) ? rsDesc : rQuote.GetSymbol());
-}
-
-static CQuotesProviderGoogle* get_google_provider()
-{
- CModuleInfo::TQuotesProvidersPtr pProviders = CModuleInfo::GetQuoteProvidersPtr();
- const CQuotesProviders::TQuotesProviders& rapQuotesProviders = pProviders->GetProviders();
- for (CQuotesProviders::TQuotesProviders::const_iterator i = rapQuotesProviders.begin(); i != rapQuotesProviders.end(); ++i) {
- const CQuotesProviders::TQuotesProviderPtr& pProvider = *i;
- CQuotesProviderGoogle* pGoogle = dynamic_cast<CQuotesProviderGoogle*>(pProvider.get());
- if (pGoogle)
- return pGoogle;
- }
-
- assert(!"We should never get here!");
- return nullptr;
-}
-
-CQuotesProviderGoogle::CQuoteSection get_quotes()
-{
- const CQuotesProviderGoogle* pProvider = get_google_provider();
- if (pProvider) {
- const CQuotesProviderGoogle::CQuoteSection& rQuotes = pProvider->GetQuotes();
- if (rQuotes.GetSectionCount() > 0)
- return rQuotes.GetSection(0);
- }
-
- return CQuotesProviderGoogle::CQuoteSection();
-}
-
-tstring make_rate_name(const CQuotesProviderGoogle::CQuote& rFrom,
- const CQuotesProviderGoogle::CQuote& rTo)
-{
- if ((false == rFrom.GetName().empty()) && (false == rTo.GetName().empty()))
- return make_contact_name(rFrom.GetName(), rTo.GetName());
-
- return make_contact_name(rFrom.GetSymbol(), rTo.GetSymbol());
-}
-
-typedef std::vector<CQuotesProviderGoogle::CRateInfo> TWatchedRates;
-TWatchedRates g_aWatchedRates;
-
-bool is_equal_rate(const CQuotesProviderGoogle::CRateInfo& riL, const CQuotesProviderGoogle::CRateInfo& riR)
-{
- return ((0 == mir_wstrcmpi(riL.m_from.GetID().c_str(), riR.m_from.GetID().c_str()))
- && ((0 == mir_wstrcmpi(riL.m_to.GetID().c_str(), riR.m_to.GetID().c_str()))));
-}
-
-INT_PTR CALLBACK GoogleOptDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- CQuotesProviderGoogle* pProvider = get_google_provider();
-
- CCommonDlgProcData d(pProvider);
- CommonOptionDlgProc(hdlg, message, wParam, lParam, d);
-
- switch (message) {
- case WM_NOTIFY:
- {
- LPNMHDR pNMHDR = reinterpret_cast<LPNMHDR>(lParam);
- switch (pNMHDR->code) {
- case PSN_APPLY:
- {
- if (pProvider) {
- TWatchedRates aTemp(g_aWatchedRates);
- TWatchedRates aRemove;
- size_t cWatchedRates = pProvider->GetWatchedRateCount();
- for (size_t i = 0; i < cWatchedRates; ++i) {
- CQuotesProviderGoogle::CRateInfo ri;
- if (true == pProvider->GetWatchedRateInfo(i, ri)) {
- TWatchedRates::iterator it =
- std::find_if(aTemp.begin(), aTemp.end(),
- boost::bind(is_equal_rate, _1, boost::cref(ri)));
- if (it == aTemp.end()) {
- aRemove.push_back(ri);
- }
- else {
- aTemp.erase(it);
- }
- }
- }
-
- std::for_each(aRemove.begin(), aRemove.end(), boost::bind(&CQuotesProviderGoogle::WatchForRate, pProvider, _1, false));
- std::for_each(aTemp.begin(), aTemp.end(), boost::bind(&CQuotesProviderGoogle::WatchForRate, pProvider, _1, true));
-
- pProvider->RefreshSettings();
- }
- }
- break;
- }
- }
- break;
-
- case WM_INITDIALOG:
- TranslateDialogDefault(hdlg);
- {
- g_aWatchedRates.clear();
-
- HWND hcbxFrom = ::GetDlgItem(hdlg, IDC_COMBO_CONVERT_FROM);
- HWND hcbxTo = ::GetDlgItem(hdlg, IDC_COMBO_CONVERT_INTO);
-
- const CQuotesProviderGoogle::CQuoteSection& rSection = get_quotes();
- size_t cQuotes = rSection.GetQuoteCount();
- for (size_t i = 0; i < cQuotes; ++i) {
- const CQuotesProviderGoogle::CQuote& rQuote = rSection.GetQuote(i);
- tstring sName = make_quote_name(rQuote);
- LPCTSTR pszName = sName.c_str();
- ::SendMessage(hcbxFrom, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszName));
- ::SendMessage(hcbxTo, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszName));
- }
-
- pProvider = get_google_provider();
- if (pProvider) {
- size_t cWatchedRates = pProvider->GetWatchedRateCount();
- for (size_t i = 0; i < cWatchedRates; ++i) {
- CQuotesProviderGoogle::CRateInfo ri;
- if (true == pProvider->GetWatchedRateInfo(i, ri)) {
- g_aWatchedRates.push_back(ri);
- tstring sRate = make_rate_name(ri.m_from, ri.m_to);
- LPCTSTR pszRateName = sRate.c_str();
- ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszRateName));
- }
- }
- }
-
- ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_ADD), FALSE);
- ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), FALSE);
- }
- return TRUE;
-
- case WM_COMMAND:
- switch (HIWORD(wParam)) {
- case CBN_SELCHANGE:
- switch (LOWORD(wParam)) {
- case IDC_COMBO_REFRESH_RATE:
- break;
- case IDC_COMBO_CONVERT_FROM:
- case IDC_COMBO_CONVERT_INTO:
- {
- int nFrom = static_cast<int>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_FROM, CB_GETCURSEL, 0, 0));
- int nTo = static_cast<int>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_INTO, CB_GETCURSEL, 0, 0));
- bool bEnableAddButton = ((CB_ERR != nFrom) && (CB_ERR != nTo) && (nFrom != nTo));
- EnableWindow(GetDlgItem(hdlg, IDC_BUTTON_ADD), bEnableAddButton);
- }
- break;
- case IDC_LIST_RATES:
- {
- int nSel = ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_GETCURSEL, 0, 0);
- ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), (LB_ERR != nSel));
- }
- break;
- }
- break;
-
- case BN_CLICKED:
- switch (LOWORD(wParam)) {
- case IDC_BUTTON_ADD:
- {
- size_t nFrom = static_cast<size_t>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_FROM, CB_GETCURSEL, 0, 0));
- size_t nTo = static_cast<size_t>(::SendDlgItemMessage(hdlg, IDC_COMBO_CONVERT_INTO, CB_GETCURSEL, 0, 0));
- if ((CB_ERR != nFrom) && (CB_ERR != nTo) && (nFrom != nTo)) {
- const CQuotesProviderGoogle::CQuoteSection& rSection = get_quotes();
- size_t cQuotes = rSection.GetQuoteCount();
- if ((nFrom < cQuotes) && (nTo < cQuotes)) {
- CQuotesProviderGoogle::CRateInfo ri;
- ri.m_from = rSection.GetQuote(nFrom);
- ri.m_to = rSection.GetQuote(nTo);
-
- g_aWatchedRates.push_back(ri);
-
- tstring sRate = make_rate_name(ri.m_from, ri.m_to);
- LPCTSTR pszRateName = sRate.c_str();
- ::SendDlgItemMessage(hdlg, IDC_LIST_RATES, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszRateName));
- PropSheet_Changed(::GetParent(hdlg), hdlg);
- }
- }
- }
- break;
-
- case IDC_BUTTON_REMOVE:
- HWND hWnd = ::GetDlgItem(hdlg, IDC_LIST_RATES);
- int nSel = ::SendMessage(hWnd, LB_GETCURSEL, 0, 0);
- if (LB_ERR != nSel) {
- if ((LB_ERR != ::SendMessage(hWnd, LB_DELETESTRING, nSel, 0))
- && (nSel < static_cast<int>(g_aWatchedRates.size()))) {
-
- TWatchedRates::iterator i = g_aWatchedRates.begin();
- std::advance(i, nSel);
- g_aWatchedRates.erase(i);
- PropSheet_Changed(::GetParent(hdlg), hdlg);
- }
- }
-
- nSel = ::SendMessage(hWnd, LB_GETCURSEL, 0, 0);
- ::EnableWindow(::GetDlgItem(hdlg, IDC_BUTTON_REMOVE), (LB_ERR != nSel));
- break;
- }
- break;
- }
- break;
- }
-
- return FALSE;
-}
-
-void CQuotesProviderGoogle::ShowPropertyPage(WPARAM wp, OPTIONSDIALOGPAGE &odp)
-{
- odp.pszTemplate = MAKEINTRESOURCEA(IDD_DIALOG_OPT_GOOGLE);
- odp.pfnDlgProc = GoogleOptDlgProc;
- odp.szTab.w = const_cast<LPTSTR>(GetInfo().m_sName.c_str());
- g_plugin.addOptions(wp, &odp);
-}
-
-void CQuotesProviderGoogle::Accept(CQuotesProviderVisitor& visitor)const
-{
- CQuotesProviderBase::Accept(visitor);
- visitor.Visit(*this);
-}
-
-double CQuotesProviderGoogle::Convert(double dAmount, const CQuote& from, const CQuote& to)const
-{
- tstring sFullURL = build_url(GetURL(), from.GetID(), to.GetID(), dAmount);
-
- CHTTPSession http;
- if ((true == http.OpenURL(sFullURL))) {
- tstring sHTML;
- if ((true == http.ReadResponce(sHTML))) {
- double dResult = 0.0;
- if ((true == parse_responce(sHTML, dResult)))
- return dResult;
-
- throw std::runtime_error(Translate("Error occurred during HTML parsing."));
- }
- else throw std::runtime_error(Translate("Error occurred during site access."));
- }
- else throw std::runtime_error(Translate("Error occurred during site access."));
-
- return 0.0;
-}
-
-namespace
-{
- bool is_equal_ids(MCONTACT hContact, const tstring& rsFromID, const tstring& rsToID)
- {
- tstring sFrom = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_FROM_ID);
- tstring sTo = Quotes_DBGetStringT(hContact, QUOTES_PROTOCOL_NAME, DB_STR_TO_ID);
- return ((0 == mir_wstrcmpi(rsFromID.c_str(), sFrom.c_str()))
- && (0 == mir_wstrcmpi(rsToID.c_str(), sTo.c_str())));
- }
-}
-
-MCONTACT CQuotesProviderGoogle::GetContactByID(const tstring& rsFromID, const tstring& rsToID)const
-{
- mir_cslock lck(m_cs);
-
- TContracts::const_iterator i = std::find_if(m_aContacts.begin(), m_aContacts.end(),
- boost::bind(is_equal_ids, _1, boost::cref(rsFromID), boost::cref(rsToID)));
- if (i != m_aContacts.end())
- return *i;
-
- return NULL;
-}
diff --git a/plugins/Quotes/src/QuotesProviderGoogle.h b/plugins/Quotes/src/QuotesProviderGoogle.h
deleted file mode 100644
index 083a2945d8..0000000000
--- a/plugins/Quotes/src/QuotesProviderGoogle.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __c0e48a95_b3f0_4227_8adc_455e265f3c14_QuotesProviderGoogle_h__
-#define __c0e48a95_b3f0_4227_8adc_455e265f3c14_QuotesProviderGoogle_h__
-
-#define DB_STR_FROM_ID "FromID"
-#define DB_STR_TO_ID "ToID"
-#define DB_STR_FROM_DESCRIPTION "FromDesc"
-#define DB_STR_TO_DESCRIPTION "ToDesc"
-#define DB_STR_GOOGLE_REFRESH_RATE_TYPE "Google_RefreshRateType"
-#define DB_STR_GOOGLE_REFRESH_RATE_VALUE "Google_RefreshRateValue"
-#define DB_STR_GOOGLE_DISPLAY_NAME_FORMAT "Google_DspNameFrmt"
-// #define DB_STR_GOOGLE_LOG_FILE_FORMAT "Google_LogFileFormat"
-// #define DB_STR_GOOGLE_HISTORY_FORMAT "Google_HistoryFormat"
-
-class CQuotesProviderGoogle : public CQuotesProviderBase
-{
-public:
- struct CRateInfo
- {
- CQuotesProviderBase::CQuote m_from;
- CQuotesProviderBase::CQuote m_to;
- };
-public:
- CQuotesProviderGoogle();
- ~CQuotesProviderGoogle();
-
- bool WatchForRate(const CRateInfo& ri, bool bWatch);
- size_t GetWatchedRateCount()const;
- bool GetWatchedRateInfo(size_t nIndex, CRateInfo& rRateInfo);
-
- MCONTACT GetContactByID(const tstring& rsFromID, const tstring& rsToID)const;
-
- double Convert(double dAmount, const CQuote& from, const CQuote& to)const;
-
-private:
- virtual void RefreshQuotes(TContracts& anContacts);
- virtual void ShowPropertyPage(WPARAM wp, OPTIONSDIALOGPAGE& odp);
- virtual void Accept(CQuotesProviderVisitor& visitor)const;
-};
-
-#endif //__c0e48a95_b3f0_4227_8adc_455e265f3c14_QuotesProviderGoogle_h__
diff --git a/plugins/Quotes/src/QuotesProviderVisitor.h b/plugins/Quotes/src/QuotesProviderVisitor.h
index f074884030..f262763871 100644
--- a/plugins/Quotes/src/QuotesProviderVisitor.h
+++ b/plugins/Quotes/src/QuotesProviderVisitor.h
@@ -4,9 +4,9 @@
class CQuotesProviderBase;
class CQuotesProviderFinance;
class CQuotesProviderDukasCopy;
-class CQuotesProviderGoogle;
class CQuotesProviderGoogleFinance;
class CQuotesProviderYahoo;
+class CQuotesProviderCurrencyConverter;
class CQuotesProviderVisitor
{
@@ -17,9 +17,9 @@ public:
virtual void Visit(const CQuotesProviderBase&){}
virtual void Visit(const CQuotesProviderFinance&){}
virtual void Visit(const CQuotesProviderDukasCopy&){}
- virtual void Visit(const CQuotesProviderGoogle&){}
virtual void Visit(const CQuotesProviderGoogleFinance&){}
virtual void Visit(const CQuotesProviderYahoo&){}
+ virtual void Visit(const CQuotesProviderCurrencyConverter&) {}
};
#endif //__7fca59e7_17b2_4849_bd7a_02c7675f2d76_QuotesProviderVisitor_h__
diff --git a/plugins/Quotes/src/QuotesProviderVisitorDbSettings.cpp b/plugins/Quotes/src/QuotesProviderVisitorDbSettings.cpp
index 51f4fab953..2208d7561f 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorDbSettings.cpp
+++ b/plugins/Quotes/src/QuotesProviderVisitorDbSettings.cpp
@@ -68,34 +68,6 @@ void CQuotesProviderVisitorDbSettings::Visit(const CQuotesProviderDukasCopy&/* r
m_pszDbTendencyFormat = "DC_TendencyFormat";
}
-void CQuotesProviderVisitorDbSettings::Visit(const CQuotesProviderGoogle&/* rProvider*/)
-{
- m_pszDbRefreshRateType = DB_STR_GOOGLE_REFRESH_RATE_TYPE;
- m_pszDbRefreshRateValue = DB_STR_GOOGLE_REFRESH_RATE_VALUE;
- m_pszDbDisplayNameFormat = DB_STR_GOOGLE_DISPLAY_NAME_FORMAT;
- m_pszDefDisplayFormat = L"1 %f = %r %i";
- m_pszXMLIniFileName = L"Google.xml";
- m_pszDbStatusMsgFormat = "Google_StatusMessageFormat";
-
- m_pszDbLogMode = "Google_LogMode";
- m_pszDbHistoryFormat = "Google_HistoryFormat";
- m_pszDbHistoryCondition = "Google_AddToHistoryOnlyIfValueIsChanged";
- m_pszDbLogFile = "Google_LogFile";
- m_pszDbLogFormat = "Google_LogFileFormat";
- m_pszDbLogCondition = "Google_AddToLogOnlyIfValueIsChanged";
- m_pszDbPopupFormat = "Google_PopupFormat";
- m_pszDbPopupCondition = "Google_ShowPopupOnlyIfValueChanged";
-
- m_pszDbPopupColourMode = "Google_PopupColourMode";
- m_pszDbPopupBkColour = "Google_PopupColourBk";
- m_pszDbPopupTextColour = "Google_PopupColourText";
- m_pszDbPopupDelayMode = "Google_PopupDelayMode";
- m_pszDbPopupDelayTimeout = "Google_PopupDelayTimeout";
- m_pszDbPopupHistoryFlag = "Google_PopupHistoryFlag";
-
- m_pszDbTendencyFormat = "Google_TendencyFormat";
-}
-
void CQuotesProviderVisitorDbSettings::Visit(const CQuotesProviderGoogleFinance&/* rProvider*/)
{
m_pszDbRefreshRateType = "GoogleFinance_RefreshRateType";
@@ -151,3 +123,31 @@ void CQuotesProviderVisitorDbSettings::Visit(const CQuotesProviderYahoo&)
m_pszDbTendencyFormat = "Yahoo_TendencyFormat";
}
+
+void CQuotesProviderVisitorDbSettings::Visit(const CQuotesProviderCurrencyConverter&)
+{
+ m_pszDbRefreshRateType = "CC_RefreshRateType";
+ m_pszDbRefreshRateValue = "CC_RefreshRateValue";
+ m_pszDbDisplayNameFormat = "CC_DspNameFrmt";
+ m_pszDefDisplayFormat = L"1 %f = %r %i";
+ m_pszXMLIniFileName = L"CC.xml";
+ m_pszDbStatusMsgFormat = "CC_StatusMessageFormat";
+
+ m_pszDbLogMode = "CC_LogMode";
+ m_pszDbHistoryFormat = "CC_HistoryFormat";
+ m_pszDbHistoryCondition = "CC_AddToHistoryOnlyIfValueIsChanged";
+ m_pszDbLogFile = "CC_LogFile";
+ m_pszDbLogFormat = "CC_LogFileFormat";
+ m_pszDbLogCondition = "CC_AddToLogOnlyIfValueIsChanged";
+ m_pszDbPopupFormat = "CC_PopupFormat";
+ m_pszDbPopupCondition = "CC_ShowPopupOnlyIfValueChanged";
+
+ m_pszDbPopupColourMode = "CC_PopupColourMode";
+ m_pszDbPopupBkColour = "CC_PopupColourBk";
+ m_pszDbPopupTextColour = "CC_PopupColourText";
+ m_pszDbPopupDelayMode = "CC_PopupDelayMode";
+ m_pszDbPopupDelayTimeout = "CC_PopupDelayTimeout";
+ m_pszDbPopupHistoryFlag = "CC_PopupHistoryFlag";
+
+ m_pszDbTendencyFormat = "CC_TendencyFormat";
+}
diff --git a/plugins/Quotes/src/QuotesProviderVisitorDbSettings.h b/plugins/Quotes/src/QuotesProviderVisitorDbSettings.h
index 95805cc110..12ce87ee14 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorDbSettings.h
+++ b/plugins/Quotes/src/QuotesProviderVisitorDbSettings.h
@@ -8,11 +8,11 @@ public:
~CQuotesProviderVisitorDbSettings();
private:
- virtual void Visit(const CQuotesProviderBase& rProvider);
- virtual void Visit(const CQuotesProviderDukasCopy& rProvider);
- virtual void Visit(const CQuotesProviderGoogle& rProvider);
- virtual void Visit(const CQuotesProviderGoogleFinance& rProvider);
- virtual void Visit(const CQuotesProviderYahoo& rProvider);
+ virtual void Visit(const CQuotesProviderBase& rProvider)override;
+ virtual void Visit(const CQuotesProviderDukasCopy& rProvider)override;
+ virtual void Visit(const CQuotesProviderGoogleFinance& rProvider)override;
+ virtual void Visit(const CQuotesProviderYahoo& rProvider)override;
+ virtual void Visit(const CQuotesProviderCurrencyConverter& rProvider)override;
public:
LPCSTR m_pszDbRefreshRateType;
LPCSTR m_pszDbRefreshRateValue;
diff --git a/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.cpp b/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.cpp
index 5dc1bd1848..09a62442ab 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.cpp
+++ b/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.cpp
@@ -14,15 +14,6 @@ void CQuotesProviderVisitorFormatSpecificator::Visit(const CQuotesProviderDukasC
m_aSpecificators.push_back(CFormatSpecificator(L"%d", TranslateT("Quote Name")));
}
-void CQuotesProviderVisitorFormatSpecificator::Visit(const CQuotesProviderGoogle&/* rProvider*/)
-{
- m_aSpecificators.push_back(CFormatSpecificator(L"%F", TranslateT("From Currency Full Name")));
- m_aSpecificators.push_back(CFormatSpecificator(L"%f", TranslateT("From Currency Short Name")));
- m_aSpecificators.push_back(CFormatSpecificator(L"%I", TranslateT("Into Currency Full Name")));
- m_aSpecificators.push_back(CFormatSpecificator(L"%i", TranslateT("Into Currency Short Name")));
- m_aSpecificators.push_back(CFormatSpecificator(L"%s", TranslateT("Short notation for \"%f/%i\"")));
-}
-
void CQuotesProviderVisitorFormatSpecificator::Visit(const CQuotesProviderBase&/* rProvider*/)
{
m_aSpecificators.push_back(CFormatSpecificator(L"%S", TranslateT("Source of Information")));
@@ -60,3 +51,12 @@ void CQuotesProviderVisitorFormatSpecificator::Visit(const CQuotesProviderYahoo&
m_aSpecificators.push_back(CFormatSpecificator(L"%P", TranslateT("Previous Close")));
m_aSpecificators.push_back(CFormatSpecificator(L"%c", TranslateT("Change")));
}
+
+void CQuotesProviderVisitorFormatSpecificator::Visit(const CQuotesProviderCurrencyConverter&)
+{
+ m_aSpecificators.push_back(CFormatSpecificator(L"%F", TranslateT("From Currency Full Name")));
+ m_aSpecificators.push_back(CFormatSpecificator(L"%f", TranslateT("From Currency Short Name")));
+ m_aSpecificators.push_back(CFormatSpecificator(L"%I", TranslateT("Into Currency Full Name")));
+ m_aSpecificators.push_back(CFormatSpecificator(L"%i", TranslateT("Into Currency Short Name")));
+ m_aSpecificators.push_back(CFormatSpecificator(L"%s", TranslateT("Short notation for \"%f/%i\"")));
+} \ No newline at end of file
diff --git a/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.h b/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.h
index 25bb88b15e..156b82b9aa 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.h
+++ b/plugins/Quotes/src/QuotesProviderVisitorFormatSpecificator.h
@@ -21,12 +21,11 @@ public:
const TFormatSpecificators& GetSpecificators()const;
private:
- virtual void Visit(const CQuotesProviderDukasCopy& rProvider);
- virtual void Visit(const CQuotesProviderGoogle& rProvider);
- virtual void Visit(const CQuotesProviderBase& rProvider);
- virtual void Visit(const CQuotesProviderGoogleFinance& rProvider);
- virtual void Visit(const CQuotesProviderYahoo& rProvider);
-
+ virtual void Visit(const CQuotesProviderDukasCopy& rProvider)override;
+ virtual void Visit(const CQuotesProviderBase& rProvider)override;
+ virtual void Visit(const CQuotesProviderGoogleFinance& rProvider)override;
+ virtual void Visit(const CQuotesProviderYahoo& rProvider)override;
+ virtual void Visit(const CQuotesProviderCurrencyConverter& rProvider)override;
private:
TFormatSpecificators m_aSpecificators;
};
diff --git a/plugins/Quotes/src/QuotesProviderVisitorFormater.cpp b/plugins/Quotes/src/QuotesProviderVisitorFormater.cpp
index f421813bf7..f6af082980 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorFormater.cpp
+++ b/plugins/Quotes/src/QuotesProviderVisitorFormater.cpp
@@ -1,4 +1,5 @@
#include "StdAfx.h"
+#include "QuotesProviderCurrencyConverter.h"
CQuotesProviderVisitorFormater::CQuotesProviderVisitorFormater(MCONTACT hContact, wchar_t chr, int nWidth)
: m_hContact(hContact),
@@ -22,24 +23,6 @@ void CQuotesProviderVisitorFormater::Visit(const CQuotesProviderDukasCopy&)
m_sResult = Quotes_DBGetStringT(m_hContact, QUOTES_MODULE_NAME, DB_STR_QUOTE_DESCRIPTION);
}
-void CQuotesProviderVisitorFormater::Visit(const CQuotesProviderGoogle&)
-{
- 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;
- }
-}
-
static bool get_fetch_time(MCONTACT hContact, time_t& rTime)
{
DBVARIANT dbv;
@@ -166,3 +149,21 @@ void CQuotesProviderVisitorFormater::Visit(const CQuotesProviderYahoo&)
break;
}
}
+
+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
diff --git a/plugins/Quotes/src/QuotesProviderVisitorFormater.h b/plugins/Quotes/src/QuotesProviderVisitorFormater.h
index 0b03842a35..5017edd33b 100644
--- a/plugins/Quotes/src/QuotesProviderVisitorFormater.h
+++ b/plugins/Quotes/src/QuotesProviderVisitorFormater.h
@@ -10,11 +10,11 @@ public:
const tstring& GetResult()const;
private:
- virtual void Visit(const CQuotesProviderDukasCopy& rProvider);
- virtual void Visit(const CQuotesProviderGoogle& rProvider);
- virtual void Visit(const CQuotesProviderBase& rProvider);
- virtual void Visit(const CQuotesProviderGoogleFinance& rProvider);
- virtual void Visit(const CQuotesProviderYahoo& rProvider);
+ virtual void Visit(const CQuotesProviderDukasCopy& rProvider)override;
+ virtual void Visit(const CQuotesProviderBase& rProvider)override;
+ virtual void Visit(const CQuotesProviderGoogleFinance& rProvider)override;
+ virtual void Visit(const CQuotesProviderYahoo& rProvider)override;
+ virtual void Visit(const CQuotesProviderCurrencyConverter& rProvider)override;
private:
void FormatDoubleHelper(LPCSTR pszDbSet, const tstring sInvalid = L"-");
diff --git a/plugins/Quotes/src/QuotesProviders.cpp b/plugins/Quotes/src/QuotesProviders.cpp
index f12c0f39df..c9bb5fc045 100644
--- a/plugins/Quotes/src/QuotesProviders.cpp
+++ b/plugins/Quotes/src/QuotesProviders.cpp
@@ -1,4 +1,5 @@
#include "StdAfx.h"
+#include "QuotesProviderCurrencyConverter.h"
#define LAST_RUN_VERSION "LastRunVersion"
@@ -27,9 +28,9 @@ template<class T>void create_provider(CQuotesProviders::TQuotesProviders& apProv
void CQuotesProviders::CreateProviders()
{
create_provider<CQuotesProviderDukasCopy>(m_apProviders);
- create_provider<CQuotesProviderGoogle>(m_apProviders);
create_provider<CQuotesProviderGoogleFinance>(m_apProviders);
create_provider<CQuotesProviderYahoo>(m_apProviders);
+ create_provider<CQuotesProviderCurrencyConverter>(m_apProviders);
}
void CQuotesProviders::ClearProviders()
diff --git a/plugins/Quotes/src/resource.h b/plugins/Quotes/src/resource.h
index d1c78c3a60..c0154194f1 100644
--- a/plugins/Quotes/src/resource.h
+++ b/plugins/Quotes/src/resource.h
@@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
-// Used by C:\Code\My code\MirandaNG\plugins\Quotes\res\Forex.rc
+// Used by C:\Code\miranda-ng-from-github\plugins\Quotes\res\Forex.rc
//
#define IDD_DIALOG_ECONOMIC_RATES 101
#define IDI_ICON_MAIN 102
@@ -96,7 +96,7 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 124
+#define _APS_NEXT_RESOURCE_VALUE 125
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1073
#define _APS_NEXT_SYMED_VALUE 101
diff --git a/plugins/Quotes/src/stdafx.h b/plugins/Quotes/src/stdafx.h
index ad3d73a0cd..4c2eb96152 100644
--- a/plugins/Quotes/src/stdafx.h
+++ b/plugins/Quotes/src/stdafx.h
@@ -96,7 +96,6 @@ inline tstring quotes_a2t(const char* s)
#include "QuotesProviders.h"
#include "QuotesProviderBase.h"
#include "QuotesProviderFinance.h"
-#include "QuotesProviderGoogle.h"
#include "QuotesProviderYahoo.h"
#include "QuotesProviderDukasCopy.h"
#include "QuotesProviderGoogleFinance.h"