// StockQuoteAPI.cpp: implementation of the CStockQuoteAPI class. // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "StockSample.h" #include "StockQuoteAPI.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CStockQuoteAPI::CStockQuoteAPI() { InitTickerArray(); } CStockQuoteAPI::~CStockQuoteAPI() { } AFX_INLINE void ExtractSubString(CString& rString, const CString& strRead, int& iStart) { // see if sub-string is wrapped in quotes. if (strRead[iStart] == _T('"')) { int iNext = strRead.Find(_T('"'), iStart + 1); rString = strRead.Mid(iStart + 1, iNext - iStart - 1); iStart = strRead.Find(_T(','), iNext) + 1; } else { int iNext = strRead.Find(_T(','), iStart); rString = strRead.Mid(iStart, iNext - iStart); iStart = strRead.Find(_T(','), iNext) + 1; } } BOOL CStockQuoteAPI::LoadBuffer(int nResID, CString& rString) { BOOL retVal = FALSE; HRSRC hSrc = ::FindResource(NULL, MAKEINTRESOURCE(nResID), _T("CSV")); if (hSrc != NULL) { HGLOBAL hHeader = ::LoadResource(NULL, hSrc); if (hHeader != NULL) { LPCSTR lpcCSV = static_cast(::LockResource(hHeader)); if (lpcCSV != NULL) { rString = CString(lpcCSV, ::SizeofResource(NULL, hSrc)); retVal = TRUE; } ::UnlockResource(hHeader); } ::FreeResource(hHeader); } return retVal; } BOOL CStockQuoteAPI::ReadBuffer(LPCTSTR lpszBuffer, CStringArray& rArray) { if (rArray.GetSize() > 0) { rArray.RemoveAll(); } _ASSERTE(rArray.GetSize() == 0); BOOL bFirstLine = TRUE; TCHAR* lpszContext = NULL; TCHAR* pszBuffer = STRTOK_S((LPTSTR)lpszBuffer, _T("\n"), &lpszContext); while (pszBuffer != NULL) { if (bFirstLine) { bFirstLine = FALSE; } else { rArray.Add(pszBuffer); } pszBuffer = STRTOK_S(NULL, _T("\n"), &lpszContext); } return (rArray.GetSize() > 0); } void CStockQuoteAPI::InitTickerArray() { if (m_arrTickers.GetSize() > 0) { m_arrTickers.RemoveAll(); } _ASSERTE(m_arrTickers.GetSize() == 0); CString rString; if (LoadBuffer(IDR_CSV_TICKERS, rString)) { ReadBuffer(rString, m_arrTickers); } } CStringArray& CStockQuoteAPI::GetHistory(int nDays) { _ASSERTE(nDays <= m_arrQuote.GetSize()); if (m_arrHistory.GetSize() > 0) { m_arrHistory.RemoveAll(); } _ASSERTE(m_arrHistory.GetSize() == 0); INT_PTR nSize = m_arrQuote.GetSize(); if (nDays <= nSize) { for (INT_PTR i = (nSize - 1); i >= (nSize - nDays); i--) { m_arrHistory.InsertAt(0, m_arrQuote[i]); } } return m_arrHistory; } LPCTSTR CStockQuoteAPI::GetQuote(int nResID) { if (m_arrQuote.GetSize() > 0) { m_arrQuote.RemoveAll(); } _ASSERTE(m_arrQuote.GetSize() == 0); CString rString; if (LoadBuffer(nResID, rString)) { ReadBuffer(rString, m_arrQuote); } INT_PTR nSize = m_arrQuote.GetSize(); if (nSize > 2) { return m_arrQuote[nSize - 1]; } return _T(""); } BOOL CStockQuoteAPI::GetTickerInfo(CString strTicker, CString& strCompany, CString& strSector, CString& strIndustry) { CString strInfo = strTicker; for (int i = 0; i < m_arrTickers.GetSize(); ++i) { CString rString; AfxExtractSubString(rString, m_arrTickers[i], 0, _T(',')); if (rString.CompareNoCase(strTicker) == 0) { AfxExtractSubString(strCompany, m_arrTickers[i], 1, _T(',')); AfxExtractSubString(strSector, m_arrTickers[i], 2, _T(',')); AfxExtractSubString(strIndustry, m_arrTickers[i], 3, _T(',')); return TRUE; } } return FALSE; } AFX_INLINE double StringToDouble(LPCTSTR lpszStr) { USES_CONVERSION; return atof(T2A((LPTSTR)lpszStr)); } CString CStockQuoteAPI::GetDate(CString arrQuote) { CString strDate; AfxExtractSubString(strDate, arrQuote, 0, ','); CString strM, strD, strY; AfxExtractSubString(strY, strDate, 0, _T('-')); AfxExtractSubString(strM, strDate, 1, _T('-')); AfxExtractSubString(strD, strDate, 2, _T('-')); strDate.Format(_T("%s-%s-%s"), strM, strD, strY); return strDate; } double CStockQuoteAPI::GetLow(CString arrQuote) { CString strLow; AfxExtractSubString(strLow, arrQuote, 3, ','); return StringToDouble(strLow); } double CStockQuoteAPI::GetHigh(CString arrQuote) { CString strHigh; AfxExtractSubString(strHigh, arrQuote, 2, ','); return StringToDouble(strHigh); } double CStockQuoteAPI::GetOpen(CString arrQuote) { CString strOpen; AfxExtractSubString(strOpen, arrQuote, 1, ','); return StringToDouble(strOpen); } double CStockQuoteAPI::GetClose(CString arrQuote) { CString strClose; AfxExtractSubString(strClose, arrQuote, 4, ','); return StringToDouble(strClose); } int CStockQuoteAPI::GetVolume(CString arrQuote) { CString strVolume; AfxExtractSubString(strVolume, arrQuote, 6, ','); return _ttoi(strVolume); }