File indexing completed on 2024-04-28 16:13:25

0001 /*
0002     SPDX-FileCopyrightText: 2004 Ace Jones <acejones@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004 Thomas Baumgart <thb@net-bembel.de>
0004 
0005     This file is part of libalkimia.
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "alkfinancequoteprocess.h"
0011 
0012 #include <QString>
0013 #include <QMap>
0014 #include <QtDebug>
0015 
0016 class AlkFinanceQuoteProcess::Private
0017 {
0018 public:
0019     typedef QMap<QString, QString> fqNameMap;
0020     bool m_isDone;
0021     QString m_string;
0022     fqNameMap m_fqNames;
0023 
0024     Private() : m_isDone(false)
0025     {
0026     }
0027 };
0028 
0029 AlkFinanceQuoteProcess::AlkFinanceQuoteProcess()
0030   : d(new Private)
0031 {
0032     d->m_fqNames["aex"] = "AEX";
0033     d->m_fqNames["aex_futures"] = "AEX Futures";
0034     d->m_fqNames["aex_options"] = "AEX Options";
0035     d->m_fqNames["amfiindia"] = "AMFI India";
0036     d->m_fqNames["asegr"] = "ASE";
0037     d->m_fqNames["asia"] = "Asia (Yahoo, ...)";
0038     d->m_fqNames["asx"] = "ASX";
0039     d->m_fqNames["australia"] = "Australia (ASX, Yahoo, ...)";
0040     d->m_fqNames["bmonesbittburns"] = "BMO NesbittBurns";
0041     d->m_fqNames["brasil"] = "Brasil (Yahoo, ...)";
0042     d->m_fqNames["canada"] = "Canada (Yahoo, ...)";
0043     d->m_fqNames["canadamutual"] = "Canada Mutual (Fund Library, ...)";
0044     d->m_fqNames["deka"] = "Deka Investments";
0045     d->m_fqNames["dutch"] = "Dutch (AEX, ...)";
0046     d->m_fqNames["dwsfunds"] = "DWS";
0047     d->m_fqNames["europe"] = "Europe (Yahoo, ...)";
0048     d->m_fqNames["fidelity"] = "Fidelity (Fidelity, ...)";
0049     d->m_fqNames["fidelity_direct"] = "Fidelity Direct";
0050     d->m_fqNames["financecanada"] = "Finance Canada";
0051     d->m_fqNames["ftportfolios"] = "First Trust (First Trust, ...)";
0052     d->m_fqNames["ftportfolios_direct"] = "First Trust Portfolios";
0053     d->m_fqNames["fundlibrary"] = "Fund Library";
0054     d->m_fqNames["greece"] = "Greece (ASE, ...)";
0055     d->m_fqNames["indiamutual"] = "India Mutual (AMFI, ...)";
0056     d->m_fqNames["maninv"] = "Man Investments";
0057     d->m_fqNames["fool"] = "Motley Fool";
0058     d->m_fqNames["nasdaq"] = "Nasdaq (Yahoo, ...)";
0059     d->m_fqNames["nz"] = "New Zealand (Yahoo, ...)";
0060     d->m_fqNames["nyse"] = "NYSE (Yahoo, ...)";
0061     d->m_fqNames["nzx"] = "NZX";
0062     d->m_fqNames["platinum"] = "Platinum Asset Management";
0063     d->m_fqNames["seb_funds"] = "SEB";
0064     d->m_fqNames["sharenet"] = "Sharenet";
0065     d->m_fqNames["za"] = "South Africa (Sharenet, ...)";
0066     d->m_fqNames["troweprice_direct"] = "T. Rowe Price";
0067     d->m_fqNames["troweprice"] = "T. Rowe Price";
0068     d->m_fqNames["tdefunds"] = "TD Efunds";
0069     d->m_fqNames["tdwaterhouse"] = "TD Waterhouse Canada";
0070     d->m_fqNames["tiaacref"] = "TIAA-CREF";
0071     d->m_fqNames["trustnet"] = "Trustnet";
0072     d->m_fqNames["uk_unit_trusts"] = "U.K. Unit Trusts";
0073     d->m_fqNames["unionfunds"] = "Union Investments";
0074     d->m_fqNames["tsp"] = "US Govt. Thrift Savings Plan";
0075     d->m_fqNames["usfedbonds"] = "US Treasury Bonds";
0076     d->m_fqNames["usa"] = "USA (Yahoo, Fool ...)";
0077     d->m_fqNames["vanguard"] = "Vanguard";
0078     d->m_fqNames["vwd"] = "VWD";
0079     d->m_fqNames["yahoo"] = "Yahoo";
0080     d->m_fqNames["yahoo_asia"] = "Yahoo Asia";
0081     d->m_fqNames["yahoo_australia"] = "Yahoo Australia";
0082     d->m_fqNames["yahoo_brasil"] = "Yahoo Brasil";
0083     d->m_fqNames["yahoo_europe"] = "Yahoo Europe";
0084     d->m_fqNames["yahoo_nz"] = "Yahoo New Zealand";
0085     d->m_fqNames["zifunds"] = "Zuerich Investments";
0086     connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReceivedDataFromFilter()));
0087     connect(this, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotProcessExited()));
0088     connect(this, SIGNAL(error(QProcess::ProcessError)), this, SLOT(slotProcessExited()));
0089 }
0090 
0091 void AlkFinanceQuoteProcess::slotReceivedDataFromFilter()
0092 {
0093     QByteArray data(readAllStandardOutput());
0094 
0095 //   kDebug(2) << "WebPriceQuoteProcess::slotReceivedDataFromFilter(): " << QString(data);
0096     d->m_string += QString(data);
0097 }
0098 
0099 void AlkFinanceQuoteProcess::slotProcessExited()
0100 {
0101 //   kDebug(2) << "WebPriceQuoteProcess::slotProcessExited()";
0102     d->m_isDone = true;
0103 }
0104 
0105 void AlkFinanceQuoteProcess::launch(const QString &scriptPath)
0106 {
0107     clearProgram();
0108 
0109     qDebug() << "running" << "perl" << scriptPath << "-l";
0110 
0111     *this << "perl" << scriptPath << "-l";
0112     setOutputChannelMode(KProcess::OnlyStdoutChannel);
0113     start();
0114     if (!waitForStarted()) {
0115         qWarning("Unable to start FQ script");
0116     }
0117 }
0118 
0119 bool AlkFinanceQuoteProcess::isFinished() const
0120 {
0121     return d->m_isDone;
0122 }
0123 
0124 const QStringList AlkFinanceQuoteProcess::getSourceList() const
0125 {
0126     QStringList raw = d->m_string.split(0x0A, QString::SkipEmptyParts);
0127     QStringList sources;
0128     QStringList::iterator it;
0129     for (it = raw.begin(); it != raw.end(); ++it) {
0130         if (d->m_fqNames[*it].isEmpty()) {
0131             sources.append(*it);
0132         } else {
0133             sources.append(d->m_fqNames[*it]);
0134         }
0135     }
0136     sources.sort();
0137     return sources;
0138 }
0139 
0140 const QString AlkFinanceQuoteProcess::crypticName(const QString &niceName) const
0141 {
0142     QString ret(niceName);
0143     Private::fqNameMap::const_iterator it;
0144     for (it = d->m_fqNames.begin(); it != d->m_fqNames.end(); ++it) {
0145         if (niceName == it.value()) {
0146             ret = it.key();
0147             break;
0148         }
0149     }
0150     return ret;
0151 }
0152 
0153 const QString AlkFinanceQuoteProcess::niceName(const QString &crypticName) const
0154 {
0155     QString ret(d->m_fqNames[crypticName]);
0156     if (ret.isEmpty()) {
0157         ret = crypticName;
0158     }
0159     return ret;
0160 }