Tag Request(std::shared_ptr<IRequest> p) { unsigned int num = m_requests.size(); for (unsigned int ui=0; ui<num; ++ui) { if ( m_requests.at(ui) == nullptr ) { m_requests.at(ui) = p; return static_cast<Tag>(ui); } } m_requests.push_back(p); return static_cast<Tag>(num); }
//--------------------------------------------------------------------------------------// void CMarketDataProvider::Subscribe(RequestVector& request) { HRESULT hr = S_OK; try { IBatchPriceProviderPtr spBatchPriceProvider = GetBatchPriceProvider(); if (static_cast<bool>(spBatchPriceProvider)) { CComRecPtr<QuoteUpdateParams, &LIBID_PRICEPROVIDERSLib> RequestInfo; RequestInfo.Init(); long outSize = static_cast<long>(request.size()); SAFEARRAYBOUND sab = { outSize, 0 }; LPSAFEARRAY psa = ::SafeArrayCreateEx( VT_RECORD, 1, &sab, (PVOID) RequestInfo.GetRecordInfo() ); if(psa) { QuoteUpdateParams* pvOutData = NULL; if(SUCCEEDED(hr = ::SafeArrayAccessData(psa, (void**)&pvOutData))) { memset(pvOutData, 0, outSize * sizeof(QuoteUpdateParams)); int j = 0; for (RequestVector::iterator it = request.begin(); it != request.end(); ++it) { (*it).CopyTo(pvOutData[j]); j++; } ::SafeArrayUnaccessData(psa); } } _com_util::CheckError(spBatchPriceProvider->raw_SubscribeMultipleQuotes(&psa)); ::SafeArrayDestroy(psa); m_bInSubscribeMode = true; } } catch (_com_error& err) { TRACE_COM_ERROR(err); } catch (...) { TRACE_UNKNOWN_ERROR(); }; return; };