Продолжается подписка на наши издания! Вы не забыли подписаться?

Рисунок 13. StockWatcherDoc.cpp

// Stock WatcherDoc.cpp: implementation of the CStockWatcherDoc class
#include “stdafx.h”
#include “Stock Watcher.h”
#include “Stock WatcherDoc.h”
#include “Mainfrm.h”
#include “AddSymbolDlg.h”
#include “QuoteProviderDlg.h
#include “..\QuoteProviders\QuoteProviders.h”

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS FILE[] = __FILE__;
#endif

IMPLEMENT_SERIAL(CStockSymbol. CObject. 1);

/////////////////////////////////////////////////////////////////////////////
// CStockWatcherDoc

IMPLEMEHT_DYNCREATE(CStockWatcherDoc, CDocument)

BEGIN_MESSAGE_MAP(CStockwatcherDoc, CDocument)
  //{{AFX_MSG_MAP(CStockWatcherDoc)
  ON_COMMAND(ID_SYMBOL_NEW, OnSymbolNew)
  ON_COMMAND(ID_REFRESH_ALL_SYMB0LS, OnRefreshAllSymbols)
  ON_COMMAND(ID_QUOTE_PROVIDER, OnQuoteProvider)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStockWatcherDoc construction/destruction

CStockWatcherDoc::CStockWatcherDoc()
{
  //create and initialized the CQuoteProviderEventSink object
  CComObject<CQuoteProviderEventSink>::CreateInstance(&m_pQuoteProviderEventSink);
  m_pQuoteProviderEventSink->AddRef();
  m_pQuoteProviderEventSink->m_pDoc = this;
}

CStockWatcherDoc::~CStockWatcherDoc()
{
  EmptySymbolList();
  //release all IHttpRequest interfaces
  long lSize = m_arrConnections.GetSize(), i;
  for (i=0; i<lSize; i++)
  {
    IHttpRequest* pRequest =
      static_cast<IHttpRequest*>(m_arrIHttpRequests.GetAt{i));
    IQuoteProvider* pProvider = NULL;
    pRequest->GetProviderInterface(reinterpret_cast<IUnknown**>(&pProvider));
    if (pProvider)
      AtIUnadvise(pProvider, IID_IQuoteProviderEvent,
        m_arrConnections,GetAt(i));
    pRequest->Release();
  }
  //release the CQuoteProviderEventSink
  m_pQuoteProviderEventSink->Release();
}

void CStackwatcherDoc::OnRefreshAllSymbols()
{
  long lSize = m_Objects.GetSize(), i;
  CStockSymbol* pSymbol;
  CString strSymbols, strCLSID;
  DWORD dwConnection;
  
  if (lSize == 0)
    return;
  
  //get the currently selected quote provider’s CLSID
  strCLSID = AfxGetApp()->GetProfileString(“Settings”, “ProviderCLSID”, “”);
  if (strCLSID.lsEmpty())
    return;

  LPOLESTR lpszCLSID;
  USES_CONVERSION;
  lpszCLSID = A2W(strCLSID.GetBuffer(255));
  CLSID clsid;
  
  //convert from string to CLSID
  CLSIDFromString(lpszCLSID. &clsid);
  
  for (i=0; i<lSize; i++)
  {
    pSymbol = static_cast<CStockSymbol*>(m_Objects.GetAt(i));
    if (i == 0)
      strSymbols += pSymbol->m_strSymbol:
    else strSymbols +- ‘ ‘ + pSymbol->m_strSymbol;
Рисунок 13. StockWatcherDoc.cpp (продолжение)
  }
  
  //create the IHttpRequest component
  IHttpRequest* pRequest = NULL;
  CoCreateInstance(CLSID_HttpRequest, NULL, CLSCTX_ALL, IID_IHttpRequest,
    (void**)&pRequest);
  _ASSERTE(pRequest != NULL);
  m_arrIHttpRequests.Add(pRequest);
  
  //create the IQuoteProvider component
  IQuoteProvider *pQuoteProvider = NULL;
  CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IQuoteProvider,
    (void**)&pQuoteProvider);
  _ASSERTE(pQuoteProvider != NULL);
  
  //establish the connection point
  AtlAdvise(pQuoteProvider, m_pQuoteProviderEventSink->GetUnknown(),
    IID_IQuoteProviderEvent, &dwConnection);
  m_arrConnections.Add(dwConnection);
  
  //initialize the data (strSymbols)
  pQuoteProvider->InitializeData(strSymbols.GetBuffer{255));
  
  //call ProcessRequest
  pRequest->ProcessRequest(pQuoteProvider,
    reinterpret_cast<1ong>(AfxGetMainWnd()->GetSafeHwnd()));
  
  //release IQuoteProvider, let the IHttpRequest object manage lifetime
  pQuoteProvider->Release();
}
void CStockWatcherDoc::UpdateSymbol(LPCTSTR 1pszSymbol, LPCTSTR lpszPrice,
  LPCTSTR lpszChange, LPCTSTR lpszOpen, LPCTSTR lpszVolume)
{
  CStockSymbo1* pSymbol = FindObjectBySymbol(lpszSymbol);
  pSymbol->m_strPrice = lpszPrice;
  pSymbol->m_strChange = lpszChange;
  pSymbol->m_strOpen = lpszOpen;
  pSymbol->m_strVolume = lpszVolume;
  pSymbol->m_dtLastUpdate = COleDateTime::GetCurrentTime();
  SetModifiedFlag();
}
CStockSymbol* CStockWatcherDoc::FindObjectBySymbol(LPCTSTR lpszSymbol)
{
  long lSize = m_Objects.GetSize(), i;
  CStockSymbol* pSymbol = NULL;
  for (i=0; i<lSize; i++)
  {
    pSymbol = static_cast<CStockSymbol*>(m_Objects.GetAt(i));
    if (pSymbol->m_strSymbol.CompareNoCase(lpszSymbol) == 0)
      return pSymbol;
  }
  return pSymbol;
}

STDMETHODIMP CQuoteProviderEventSink::UpdateSymbol(LPCTSTR lpszSymbol,
  LPCTSTR lpszPrice, LPCTSTR lpszChange, LPCTSTR lpszOpen, LPCTSTR lpszVolume)
{
  m_pDoc->UpdateSymbol(lpszSymbol, lpszPrice, lpszChange, lpszOpen, lpszVolume);
  return S_OK;
}

Copyright © 1994-2016 ООО "К-Пресс"