BLPAPI C++ 3.26.7
Loading...
Searching...
No Matches
blpapi_session.h
Go to the documentation of this file.
1/* Copyright 2012. Bloomberg Finance L.P.
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to
5 * deal in the Software without restriction, including without limitation the
6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 * sell copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions: The above
9 * copyright notice and this permission notice shall be included in all copies
10 * or substantial portions of the Software.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18 * IN THE SOFTWARE.
19 */
20
37
38#ifndef INCLUDED_BLPAPI_SESSION
39#define INCLUDED_BLPAPI_SESSION
40
67
69#include <blpapi_call.h>
71#include <blpapi_defs.h>
72#include <blpapi_event.h>
74#include <blpapi_identity.h>
75#include <blpapi_request.h>
77#include <blpapi_service.h>
80#include <blpapi_types.h>
81
82#include <stddef.h>
83
84#ifdef __cplusplus
85extern "C" {
86#endif
87
89
92
100typedef void (*blpapi_EventHandler_t)(
101 blpapi_Event_t *event, blpapi_Session_t *session, void *userData);
102
110typedef void (*blpapi_SubscriptionPreprocessErrorHandler_t)(
111 const blpapi_CorrelationId_t *correlationId,
112 const char *subscriptionString,
113 int errorCode,
114 const char *errorDescription,
115 void *userData);
116
138BLPAPI_EXPORT
139blpapi_Session_t *blpapi_Session_create(blpapi_SessionOptions_t *parameters,
140 blpapi_EventHandler_t handler,
141 blpapi_EventDispatcher_t *dispatcher,
142 void *userData);
143
153BLPAPI_EXPORT
154void blpapi_Session_destroy(blpapi_Session_t *session);
155
168BLPAPI_EXPORT
169int blpapi_Session_start(blpapi_Session_t *session);
170
183BLPAPI_EXPORT
184int blpapi_Session_startAsync(blpapi_Session_t *session);
185
199BLPAPI_EXPORT
200int blpapi_Session_stop(blpapi_Session_t *session);
201
214BLPAPI_EXPORT
215int blpapi_Session_stopAsync(blpapi_Session_t *session);
216
234BLPAPI_EXPORT
235int blpapi_Session_nextEvent(blpapi_Session_t *session,
236 blpapi_Event_t **eventPointer,
237 unsigned int timeoutInMilliseconds);
238
250BLPAPI_EXPORT
251int blpapi_Session_tryNextEvent(
252 blpapi_Session_t *session, blpapi_Event_t **eventPointer);
253
277BLPAPI_EXPORT
278int blpapi_Session_subscribe(blpapi_Session_t *session,
279 const blpapi_SubscriptionList_t *subscriptionList,
280 const blpapi_Identity_t *handle,
281 const char *requestLabel,
282 int requestLabelLen);
283
305BLPAPI_EXPORT
306int blpapi_Session_subscribeEx(blpapi_Session_t *session,
307 const blpapi_SubscriptionList_t *subscriptionList,
308 const blpapi_Identity_t *handle,
309 const char *requestLabel,
310 int requestLabelLen,
311 blpapi_SubscriptionPreprocessErrorHandler_t errorHandler,
312 void *userData);
313
334BLPAPI_EXPORT
335int blpapi_Session_resubscribe(blpapi_Session_t *session,
336 const blpapi_SubscriptionList_t *resubscriptionList,
337 const char *requestLabel,
338 int requestLabelLen);
339
360BLPAPI_EXPORT
361int blpapi_Session_resubscribeEx(blpapi_Session_t *session,
362 const blpapi_SubscriptionList_t *resubscriptionList,
363 const char *requestLabel,
364 int requestLabelLen,
365 blpapi_SubscriptionPreprocessErrorHandler_t errorHandler,
366 void *userData);
367
387BLPAPI_EXPORT
388int blpapi_Session_resubscribeWithId(blpapi_Session_t *session,
389 const blpapi_SubscriptionList_t *resubscriptionList,
390 int resubscriptionId,
391 const char *requestLabel,
392 int requestLabelLen);
393
416BLPAPI_EXPORT
417int blpapi_Session_resubscribeWithIdEx(blpapi_Session_t *session,
418 const blpapi_SubscriptionList_t *resubscriptionList,
419 int resubscriptionId,
420 const char *requestLabel,
421 int requestLabelLen,
422 blpapi_SubscriptionPreprocessErrorHandler_t errorHandler,
423 void *userData);
424
444BLPAPI_EXPORT
445int blpapi_Session_unsubscribe(blpapi_Session_t *session,
446 const blpapi_SubscriptionList_t *unsubscriptionList,
447 const char *requestLabel,
448 int requestLabelLen);
449
470BLPAPI_EXPORT
471int blpapi_Session_cancel(blpapi_Session_t *session,
472 const blpapi_CorrelationId_t *correlationIds,
473 size_t numCorrelationIds,
474 const char *requestLabel,
475 int requestLabelLen);
476
493BLPAPI_EXPORT
494int blpapi_Session_setStatusCorrelationId(blpapi_Session_t *session,
495 const blpapi_Service_t *service,
496 const blpapi_Identity_t *identity,
497 const blpapi_CorrelationId_t *correlationId);
498
527BLPAPI_EXPORT
528int blpapi_Session_sendRequest(blpapi_Session_t *session,
529 const blpapi_Request_t *request,
530 blpapi_CorrelationId_t *correlationId,
531 blpapi_Identity_t *identity,
532 blpapi_EventQueue_t *eventQueue,
533 const char *requestLabel,
534 int requestLabelLen);
535
553BLPAPI_EXPORT
554int blpapi_Session_sendRequestTemplate(blpapi_Session_t *session,
555 const blpapi_RequestTemplate_t *requestTemplate,
556 blpapi_CorrelationId_t *correlationId);
557
587BLPAPI_EXPORT
588int blpapi_Session_createSnapshotRequestTemplate(
589 blpapi_RequestTemplate_t **requestTemplate,
590 blpapi_Session_t *session,
591 const char *subscriptionString,
592 const blpapi_Identity_t *identity,
593 blpapi_CorrelationId_t *correlationId);
594
617BLPAPI_EXPORT
618int blpapi_Session_sendAuthorizationRequest(blpapi_Session_t *session,
619 const blpapi_Request_t *request,
620 blpapi_Identity_t *identity,
621 blpapi_CorrelationId_t *correlationId,
622 blpapi_EventQueue_t *eventQueue,
623 const char *requestLabel,
624 int requestLabelLen);
625
639BLPAPI_EXPORT
640int blpapi_Session_openService(
641 blpapi_Session_t *session, const char *serviceName);
642
659BLPAPI_EXPORT
660int blpapi_Session_openServiceAsync(blpapi_Session_t *session,
661 const char *serviceName,
662 blpapi_CorrelationId_t *correlationId);
663
678BLPAPI_EXPORT
679int blpapi_Session_generateToken(blpapi_Session_t *session,
680 blpapi_CorrelationId_t *correlationId,
681 blpapi_EventQueue_t *eventQueue);
682
699BLPAPI_EXPORT
700int blpapi_Session_getService(blpapi_Session_t *session,
701 blpapi_Service_t **service,
702 const char *serviceName);
703
715BLPAPI_EXPORT
716blpapi_UserHandle_t *blpapi_Session_createUserHandle(
717 blpapi_Session_t *session);
718
729BLPAPI_EXPORT
730blpapi_Identity_t *blpapi_Session_createIdentity(blpapi_Session_t *session);
731
742BLPAPI_EXPORT
743blpapi_AbstractSession_t *blpapi_Session_getAbstractSession(
744 blpapi_Session_t *session);
745
756BLPAPI_EXPORT
757blpapi_SubscriptionIterator_t *blpapi_SubscriptionItr_create(
758 blpapi_Session_t *session);
759
767BLPAPI_EXPORT
768void blpapi_SubscriptionItr_destroy(blpapi_SubscriptionIterator_t *iterator);
769
790BLPAPI_EXPORT
791int blpapi_SubscriptionItr_next(blpapi_SubscriptionIterator_t *iterator,
792 const char **subscriptionString,
793 blpapi_CorrelationId_t *correlationId,
794 int *status);
795
805BLPAPI_EXPORT
806int blpapi_SubscriptionItr_isValid(
807 const blpapi_SubscriptionIterator_t *iterator);
808
811
812#ifdef __cplusplus
813}
814
815#include <cassert>
816#include <cstring> // for std::memset
817
818namespace BloombergLP {
819namespace blpapi {
826
827class Session;
828
841
842 public:
843 virtual ~EventHandler() = 0;
844
845 virtual bool processEvent(const Event& event, Session *session) = 0;
856};
857
859extern "C" void blpapi_eventHandlerAdapter(
860 blpapi_Event_t *event, blpapi_Session_t *, void *userData);
867
869 enum Code {
871 = BLPAPI_SUBSCRIPTIONPREPROCESS_INVALID_SUBSCRIPTION_STRING,
873
875 = BLPAPI_SUBSCRIPTIONPREPROCESS_CORRELATIONID_ERROR
880 };
881
884 int code;
885 /*
886 * The error code that is one of `Code` enum values.
887 */
888 std::string description;
889
900};
901
902inline std::ostream& operator<<(
903 std::ostream& os, const SubscriptionPreprocessError& error)
904{
905 os << "{" << "correlationId: " << error.correlationId
906 << ", subscriptionString: " << error.subscriptionString << ", code: ";
907 if (error.code
909 os << "InvalidSubscriptionString";
910 } else if (error.code
912 os << "CorrelationIdError";
913 } else {
914 os << "UNKNOWN";
915 }
916
917 os << "(" << error.code << ")";
918 os << ", description: " << error.description << "}";
919
920 return os;
921}
922
924extern "C" inline void blpapi_SubscriptionPreprocess_handleError(
925 const blpapi_CorrelationId_t *correlationId,
926 const char *subscriptionString,
927 int errorCode,
928 const char *description,
929 void *userData)
930{
931 typedef std::vector<SubscriptionPreprocessError> Errors;
932 Errors *errors = reinterpret_cast<Errors *>(userData);
933 errors->emplace_back(CorrelationId(*correlationId),
934 subscriptionString,
935 errorCode,
936 description);
937}
939
961
962typedef std::vector<SubscriptionPreprocessError> SubscriptionPreprocessErrors;
963
1011class Session : public AbstractSession {
1012
1013 public:
1015
1016 private:
1017 blpapi_Session_t *d_handle_p;
1018 EventHandler *d_eventHandler_p;
1019
1020 // NOT IMPLEMENTED
1021 Session(const Session&);
1022 Session& operator=(const Session&);
1023
1025 blpapi_Event_t *event, blpapi_Session_t *, void *userData);
1026
1027 public:
1028 /*
1029 * The possible statuses a subscription may be in.
1030 */
1032 UNSUBSCRIBED = BLPAPI_SUBSCRIPTIONSTATUS_UNSUBSCRIBED,
1034 SUBSCRIBING = BLPAPI_SUBSCRIPTIONSTATUS_SUBSCRIBING,
1036 SUBSCRIBED = BLPAPI_SUBSCRIPTIONSTATUS_SUBSCRIBED,
1038 CANCELLED = BLPAPI_SUBSCRIPTIONSTATUS_CANCELLED,
1040 PENDING_CANCELLATION = BLPAPI_SUBSCRIPTIONSTATUS_PENDING_CANCELLATION
1041 };
1042
1043 explicit Session(const SessionOptions& options = SessionOptions(),
1044 EventHandler *eventHandler = 0,
1045 EventDispatcher *eventDispatcher = 0);
1078
1079 explicit Session(blpapi_Session_t *handle);
1080
1081 virtual ~Session();
1085
1086 virtual bool start();
1096
1097 virtual bool startAsync();
1107
1108 virtual void stop();
1119
1120 virtual void stopAsync();
1131
1132 virtual Event nextEvent(int timeout = 0);
1147
1148 virtual int tryNextEvent(Event *event);
1155
1156 virtual void subscribe(const SubscriptionList& subscriptionList,
1157 const Identity& identity,
1158 const char *requestLabel = 0,
1159 int requestLabelLen = 0);
1172
1174 const SubscriptionList& subscriptionList,
1175 const Identity& identity,
1177 const char *requestLabel = 0,
1178 int requestLabelLen = 0);
1197
1198 virtual void subscribe(const SubscriptionList& subscriptionList,
1199 const char *requestLabel = 0,
1200 int requestLabelLen = 0);
1215
1217 const SubscriptionList& subscriptionList,
1219 const char *requestLabel = 0,
1220 int requestLabelLen = 0);
1240
1241 virtual void unsubscribe(const SubscriptionList& subscriptionList);
1261
1262 virtual void resubscribe(const SubscriptionList& subscriptions);
1275
1277 const SubscriptionList& subscriptions,
1293
1294 virtual void resubscribe(const SubscriptionList& subscriptions,
1295 const char *requestLabel,
1296 int requestLabelLen);
1313
1315 const SubscriptionList& subscriptions,
1316 const char *requestLabel,
1317 int requestLabelLen,
1337
1338 virtual void resubscribe(
1339 const SubscriptionList& subscriptions, int resubscriptionId);
1353
1355 const SubscriptionList& subscriptions,
1356 int resubscriptionId,
1373
1374 virtual void resubscribe(const SubscriptionList& subscriptions,
1375 int resubscriptionId,
1376 const char *requestLabel,
1377 int requestLabelLen);
1395
1397 const SubscriptionList& subscriptions,
1398 int resubscriptionId,
1399 const char *requestLabel,
1400 int requestLabelLen,
1421
1422 virtual void setStatusCorrelationId(
1423 const Service& service, const CorrelationId& correlationID);
1424
1425 virtual void setStatusCorrelationId(const Service& service,
1426 const Identity& identity,
1427 const CorrelationId& correlationID);
1432
1433 virtual CorrelationId sendRequest(const Request& request,
1434 const CorrelationId& correlationId = CorrelationId(),
1435 EventQueue *eventQueue = 0,
1436 const char *requestLabel = 0,
1437 int requestLabelLen = 0);
1458
1459 virtual CorrelationId sendRequest(const Request& request,
1460 const Identity& user,
1461 const CorrelationId& correlationId = CorrelationId(),
1462 EventQueue *eventQueue = 0,
1463 const char *requestLabel = 0,
1464 int requestLabelLen = 0);
1484
1485 virtual CorrelationId sendRequest(const RequestTemplate& requestTemplate,
1486 const CorrelationId& correlationId = CorrelationId());
1503
1505 const char *subscriptionString,
1506 const CorrelationId& statusCid,
1507 const Identity& identity = Identity());
1583
1585 blpapi_Session_t *handle() const;
1587};
1588
1603class SubscriptionIterator {
1604
1605 blpapi_SubscriptionIterator_t *d_handle_p;
1606 const char *d_subscriptionString;
1607 CorrelationId d_correlationId;
1608 int d_status;
1609 bool d_isValid;
1610
1611 private:
1612 // NOT IMPLEMENTED
1613 SubscriptionIterator(const SubscriptionIterator&);
1614 SubscriptionIterator& operator=(const SubscriptionIterator&);
1615
1616 public:
1617 explicit SubscriptionIterator(Session *session);
1623
1628
1629 // MANIPULATORS
1630
1631 bool next();
1639
1640 // ACCESSORS
1641
1642 bool isValid() const;
1647
1648 const char *subscriptionString() const;
1655
1656 const CorrelationId& correlationId() const;
1660
1665
1667 blpapi_SubscriptionIterator_t *handle() const;
1669};
1670
1673
1674namespace util {
1675
1679
1680constexpr const char *to_string(SubscriptionPreprocessError::Code code);
1684
1685constexpr const char *to_string(SubscriptionPreprocessMode::Enum mode);
1689
1690constexpr const char *to_string(Session::SubscriptionStatus status);
1694
1696
1697} // close namespace util
1698
1699// ============================================================================
1700// INLINE FUNCTION DEFINITIONS
1701// ============================================================================
1702
1703// ------------------
1704// class EventHandler
1705// ------------------
1706
1708
1709// FREE FUNCTIONS
1711extern "C" inline void blpapi_eventHandlerAdapter(
1712 blpapi_Event_t *event, blpapi_Session_t *, void *userData)
1713{
1714 Session *session = reinterpret_cast<Session *>(userData);
1715 assert(session);
1716 assert(session->d_eventHandler_p);
1717 session->d_eventHandler_p->processEvent(Event(event), session);
1718}
1720
1721// -------------
1722// class Session
1723// -------------
1724
1725inline Session::Session(const SessionOptions& parameters,
1726 EventHandler *handler,
1727 EventDispatcher *dispatcher)
1728 : d_eventHandler_p(handler)
1729{
1730 if (dispatcher && !handler) {
1732 "Event dispatcher provided without handler.");
1733 }
1734 d_handle_p = blpapi_Session_create(parameters.handle(),
1735 handler ? &blpapi_eventHandlerAdapter : 0,
1736 dispatcher ? dispatcher->impl() : 0,
1737 this);
1738 initAbstractSessionHandle(blpapi_Session_getAbstractSession(d_handle_p));
1739}
1740
1741inline Session::Session(blpapi_Session_t *newHandle)
1742 : d_handle_p(newHandle)
1743{
1744 initAbstractSessionHandle(blpapi_Session_getAbstractSession(d_handle_p));
1745}
1746
1747inline Session::~Session() { blpapi_Session_destroy(d_handle_p); }
1748
1749inline bool Session::start()
1750{
1751 return blpapi_Session_start(d_handle_p) ? false : true;
1752}
1753
1755{
1756 return blpapi_Session_startAsync(d_handle_p) ? false : true;
1757}
1758
1759inline void Session::stop() { blpapi_Session_stop(d_handle_p); }
1760
1761inline void Session::stopAsync() { blpapi_Session_stopAsync(d_handle_p); }
1762
1763inline Event Session::nextEvent(int timeout)
1764{
1765 if (timeout < 0) {
1766 throw InvalidArgumentException("Timeout must be >= 0.");
1767 }
1768
1769 blpapi_Event_t *event = 0;
1770 ExceptionUtil::throwOnError(blpapi_Session_nextEvent(
1771 d_handle_p, &event, static_cast<unsigned>(timeout)));
1772 return Event(event);
1773}
1774
1776{
1777 blpapi_Event_t *impl = 0;
1778 int ret = blpapi_Session_tryNextEvent(d_handle_p, &impl);
1779 if (0 == ret) {
1780 assert(event);
1781
1782 *event = Event(impl);
1783 }
1784 return ret;
1785}
1786
1787inline void Session::subscribe(const SubscriptionList& subscriptions,
1788 const char *requestLabel,
1789 int requestLabelLen)
1790{
1791 ExceptionUtil::throwOnError(blpapi_Session_subscribe(d_handle_p,
1792 subscriptions.impl(),
1793 0, // identityHandle
1794 requestLabel,
1795 requestLabelLen));
1796}
1797
1799 const SubscriptionList& subscriptions,
1801 const char *requestLabel,
1802 int requestLabelLen)
1803{
1806 subscribe(subscriptions, requestLabel, requestLabelLen);
1807 } else {
1809 BLPAPI_CALL(blpapi_Session_subscribeEx)(d_handle_p,
1810 subscriptions.impl(),
1811 0, // identityHandle
1812 requestLabel,
1813 requestLabelLen,
1814 &blpapi_SubscriptionPreprocess_handleError,
1815 &errors));
1816 }
1817
1818 return errors;
1819}
1820
1821inline void Session::subscribe(const SubscriptionList& subscriptions,
1822 const Identity& identity,
1823 const char *requestLabel,
1824 int requestLabelLen)
1825{
1826 ExceptionUtil::throwOnError(blpapi_Session_subscribe(d_handle_p,
1827 subscriptions.impl(),
1828 identity.handle(),
1829 requestLabel,
1830 requestLabelLen));
1831}
1832
1834 const SubscriptionList& subscriptions,
1835 const Identity& identity,
1837 const char *requestLabel,
1838 int requestLabelLen)
1839{
1842 subscribe(subscriptions, identity, requestLabel, requestLabelLen);
1843 } else {
1845 BLPAPI_CALL(blpapi_Session_subscribeEx)(d_handle_p,
1846 subscriptions.impl(),
1847 identity.handle(),
1848 requestLabel,
1849 requestLabelLen,
1850 &blpapi_SubscriptionPreprocess_handleError,
1851 &errors));
1852 }
1853
1854 return errors;
1855}
1856
1857inline void Session::resubscribe(const SubscriptionList& subscriptions)
1858{
1859 ExceptionUtil::throwOnError(blpapi_Session_resubscribe(d_handle_p,
1860 subscriptions.impl(),
1861 0, // requestLabel
1862 0)); // requestLabelLen
1863}
1864
1866 const SubscriptionList& subscriptions,
1868{
1871 resubscribe(subscriptions);
1872 } else {
1874 BLPAPI_CALL(blpapi_Session_resubscribeEx)(d_handle_p,
1875 subscriptions.impl(),
1876 0, // requestLabel
1877 0, // requestLabelLen
1878 &blpapi_SubscriptionPreprocess_handleError,
1879 &errors));
1880 }
1881
1882 return errors;
1883}
1884
1885inline void Session::resubscribe(const SubscriptionList& subscriptions,
1886 const char *requestLabel,
1887 int requestLabelLen)
1888{
1889 ExceptionUtil::throwOnError(blpapi_Session_resubscribe(
1890 d_handle_p, subscriptions.impl(), requestLabel, requestLabelLen));
1891}
1892
1894 const SubscriptionList& subscriptions,
1895 const char *requestLabel,
1896 int requestLabelLen,
1898{
1901 resubscribe(subscriptions, requestLabel, requestLabelLen);
1902 } else {
1904 BLPAPI_CALL(blpapi_Session_resubscribeEx)(d_handle_p,
1905 subscriptions.impl(),
1906 requestLabel,
1907 requestLabelLen,
1908 &blpapi_SubscriptionPreprocess_handleError,
1909 &errors));
1910 }
1911
1912 return errors;
1913}
1914
1916 const SubscriptionList& subscriptions, int resubscriptionId)
1917{
1919 BLPAPI_CALL_SESSION_RESUBSCRIBEWITHID(d_handle_p,
1920 subscriptions.impl(),
1921 resubscriptionId,
1922 0, // requestLabel
1923 0)); // requestLabelLen
1924}
1925
1927 const SubscriptionList& subscriptions,
1928 int resubscriptionId,
1930{
1933 resubscribe(subscriptions, resubscriptionId);
1934 } else {
1936 BLPAPI_CALL(blpapi_Session_resubscribeWithIdEx)(d_handle_p,
1937 subscriptions.impl(),
1938 resubscriptionId,
1939 0, // requestLabel
1940 0, // requestLabelLen
1941 &blpapi_SubscriptionPreprocess_handleError,
1942 &errors));
1943 }
1944
1945 return errors;
1946}
1947
1948inline void Session::resubscribe(const SubscriptionList& subscriptions,
1949 int resubscriptionId,
1950 const char *requestLabel,
1951 int requestLabelLen)
1952{
1954 BLPAPI_CALL_SESSION_RESUBSCRIBEWITHID(d_handle_p,
1955 subscriptions.impl(),
1956 resubscriptionId,
1957 requestLabel,
1958 requestLabelLen));
1959}
1960
1962 const SubscriptionList& subscriptions,
1963 int resubscriptionId,
1964 const char *requestLabel,
1965 int requestLabelLen,
1967{
1970 resubscribe(subscriptions,
1971 resubscriptionId,
1972 requestLabel,
1973 requestLabelLen);
1974 } else {
1976 BLPAPI_CALL(blpapi_Session_resubscribeWithIdEx)(d_handle_p,
1977 subscriptions.impl(),
1978 resubscriptionId,
1979 requestLabel,
1980 requestLabelLen,
1981 &blpapi_SubscriptionPreprocess_handleError,
1982 &errors));
1983 }
1984
1985 return errors;
1986}
1987
1989{
1991 blpapi_Session_unsubscribe(d_handle_p, list.impl(), 0, 0));
1992}
1993
1995 const Service& service, const CorrelationId& correlationID)
1996{
1997 ExceptionUtil::throwOnError(blpapi_Session_setStatusCorrelationId(
1998 d_handle_p, service.handle(), 0, &correlationID.impl()));
1999}
2000
2001inline void Session::setStatusCorrelationId(const Service& service,
2002 const Identity& identity,
2003 const CorrelationId& correlationID)
2004{
2006 blpapi_Session_setStatusCorrelationId(d_handle_p,
2007 service.handle(),
2008 identity.handle(),
2009 &correlationID.impl()));
2010}
2011
2013 const Identity& identity,
2014 const CorrelationId& correlationId,
2015 EventQueue *eventQueue,
2016 const char *requestLabel,
2017 int requestLabelLen)
2018{
2019 CorrelationId retCorrelationId(correlationId);
2020
2021 ExceptionUtil::throwOnError(blpapi_Session_sendRequest(d_handle_p,
2022 request.handle(),
2023 &retCorrelationId.impl(),
2024 identity.handle(),
2025 eventQueue ? eventQueue->handle() : 0,
2026 requestLabel,
2027 requestLabelLen));
2028
2029 return retCorrelationId;
2030}
2031
2033 const CorrelationId& correlationId,
2034 EventQueue *eventQueue,
2035 const char *requestLabel,
2036 int requestLabelLen)
2037{
2038 CorrelationId retCorrelationId(correlationId);
2039
2040 ExceptionUtil::throwOnError(blpapi_Session_sendRequest(d_handle_p,
2041 request.handle(),
2042 &retCorrelationId.impl(),
2043 0,
2044 eventQueue ? eventQueue->handle() : 0,
2045 requestLabel,
2046 requestLabelLen));
2047
2048 return retCorrelationId;
2049}
2050
2052 const RequestTemplate& requestTemplate,
2053 const CorrelationId& correlationId)
2054{
2055 CorrelationId retCorrelationId(correlationId);
2056
2057 ExceptionUtil::throwOnError(BLPAPI_CALL(
2058 blpapi_Session_sendRequestTemplate)(
2059 d_handle_p, requestTemplate.impl(), &retCorrelationId.impl()));
2060
2061 return retCorrelationId;
2062}
2063
2065 const char *subscriptionString,
2066 const CorrelationId& correlationID,
2067 const Identity& identity)
2068{
2069 blpapi_RequestTemplate_t *requestTemplate = 0;
2070
2071 ExceptionUtil::throwOnError(BLPAPI_CALL(
2072 blpapi_Session_createSnapshotRequestTemplate)(&requestTemplate,
2073 d_handle_p,
2074 subscriptionString,
2075 identity.handle(),
2076 const_cast<blpapi_CorrelationId_t *>(&correlationID.impl())));
2077
2078 return RequestTemplate(requestTemplate);
2079}
2080
2082inline blpapi_Session_t *Session::handle() const { return d_handle_p; }
2084
2085// --------------------------
2086// class SubscriptionIterator
2087// --------------------------
2088
2089inline SubscriptionIterator::SubscriptionIterator(Session *session)
2090 : d_isValid(false)
2091{
2092 assert(session);
2093
2094 d_handle_p = blpapi_SubscriptionItr_create(session->handle());
2095}
2096
2098{
2099 blpapi_SubscriptionItr_destroy(d_handle_p);
2100}
2101
2103{
2104 blpapi_CorrelationId_t nextCorrelationIdImpl;
2105 d_isValid = !blpapi_SubscriptionItr_next(d_handle_p,
2106 &d_subscriptionString,
2107 &nextCorrelationIdImpl,
2108 &d_status);
2109
2110 d_correlationId = d_isValid ? CorrelationId(nextCorrelationIdImpl)
2111 : CorrelationId();
2112
2113 return d_isValid;
2114}
2115
2116inline bool SubscriptionIterator::isValid() const { return d_isValid; }
2117
2119inline blpapi_SubscriptionIterator_t *SubscriptionIterator::handle() const
2120{
2121 return d_handle_p;
2122}
2124
2126{
2127 if (!isValid()) {
2128 ExceptionUtil::throwOnError(BLPAPI_ERROR_ILLEGAL_STATE);
2129 }
2130
2131 return d_subscriptionString;
2132}
2133
2135{
2136 if (!isValid()) {
2137 ExceptionUtil::throwOnError(BLPAPI_ERROR_ILLEGAL_STATE);
2138 }
2139
2140 return d_correlationId;
2141}
2142
2145{
2146 if (!isValid()) {
2147 ExceptionUtil::throwOnError(BLPAPI_ERROR_ILLEGAL_STATE);
2148 }
2149
2150 return static_cast<Session::SubscriptionStatus>(d_status);
2151}
2152
2153// --------------
2154// namespace util
2155// --------------
2157{
2158 switch (code) {
2160 return "e_invalidSubscriptionString";
2162 return "e_correlationIdError";
2163 }
2164 // Silence warnings on some compilers
2165 return "UNDEFINED";
2166}
2167
2168// --------------
2169// namespace util
2170// --------------
2172{
2173 switch (mode) {
2175 return "e_failOnFirstError";
2177 return "e_returnIndividualErrors";
2178 }
2179 // Silence warnings on some compilers
2180 return "UNDEFINED";
2181}
2182
2183// --------------
2184// namespace util
2185// --------------
2187{
2188 switch (status) {
2190 return "UNSUBSCRIBED";
2192 return "SUBSCRIBING";
2194 return "SUBSCRIBED";
2195 case Session::CANCELLED:
2196 return "CANCELLED";
2198 return "PENDING_CANCELLATION";
2199 }
2200 // Silence warnings on some compilers
2201 return "UNDEFINED";
2202}
2203
2204} // close namespace blpapi
2205} // close namespace BloombergLP
2206
2207#endif // ifdef __cplusplus
2208
2209#endif // INCLUDED_BLPAPI_SESSION
A common interface shared between publisher and consumer sessions.
Provide functions for dispatchtbl.
Provide a key to identify individual subscriptions or requests.
Common definitions used by the library.
A component which defines events related operations.
Provide a dispatcher to dispatch events.
Provide access to the entitlements for a user.
Defines a request which can be sent for a service.
Provide a handle for a request template.
A service which provides access to API data (provide or consume).
A common interface shared between publish and consumer sessions.
Provide a list of subscriptions.
Provide BLPAPI types.
Definition blpapi_correlationid.h:322
Definition blpapi_eventdispatcher.h:184
Definition blpapi_session.h:840
virtual bool processEvent(const Event &event, Session *session)=0
virtual ~EventHandler()=0
Definition blpapi_session.h:1707
Definition blpapi_event.h:532
Definition blpapi_event.h:325
static void throwOnError(int errorCode)
Definition blpapi_exception.h:556
Definition blpapi_identity.h:217
Definition blpapi_exception.h:268
Definition blpapi_requesttemplate.h:177
Definition blpapi_request.h:214
Definition blpapi_service.h:616
Definition blpapi_sessionoptions.h:1141
Definition blpapi_session.h:1011
virtual ~Session()
Definition blpapi_session.h:1747
SubscriptionStatus
Definition blpapi_session.h:1031
@ SUBSCRIBING
Initiated but no updates received.
Definition blpapi_session.h:1034
@ CANCELLED
No longer active, terminated by Application.
Definition blpapi_session.h:1038
@ SUBSCRIBED
Updates are flowing.
Definition blpapi_session.h:1036
@ UNSUBSCRIBED
No longer active, terminated by API.
Definition blpapi_session.h:1032
@ PENDING_CANCELLATION
Definition blpapi_session.h:1040
virtual int tryNextEvent(Event *event)
Definition blpapi_session.h:1775
virtual bool startAsync()
Definition blpapi_session.h:1754
::BloombergLP::blpapi::EventHandler EventHandler
Definition blpapi_session.h:1014
virtual Event nextEvent(int timeout=0)
Definition blpapi_session.h:1763
virtual void stop()
Definition blpapi_session.h:1759
friend void blpapi_eventHandlerAdapter(blpapi_Event_t *event, blpapi_Session_t *, void *userData)
virtual RequestTemplate createSnapshotRequestTemplate(const char *subscriptionString, const CorrelationId &statusCid, const Identity &identity=Identity())
Definition blpapi_session.h:2064
virtual void setStatusCorrelationId(const Service &service, const CorrelationId &correlationID)
Definition blpapi_session.h:1994
virtual bool start()
Definition blpapi_session.h:1749
virtual CorrelationId sendRequest(const Request &request, const CorrelationId &correlationId=CorrelationId(), EventQueue *eventQueue=0, const char *requestLabel=0, int requestLabelLen=0)
Definition blpapi_session.h:2032
virtual void stopAsync()
Definition blpapi_session.h:1761
virtual void unsubscribe(const SubscriptionList &subscriptionList)
Definition blpapi_session.h:1988
virtual void resubscribe(const SubscriptionList &subscriptions)
Definition blpapi_session.h:1857
virtual void subscribe(const SubscriptionList &subscriptionList, const Identity &identity, const char *requestLabel=0, int requestLabelLen=0)
Definition blpapi_session.h:1821
const CorrelationId & correlationId() const
Definition blpapi_session.h:2134
~SubscriptionIterator()
Definition blpapi_session.h:2097
bool isValid() const
Definition blpapi_session.h:2116
bool next()
Definition blpapi_session.h:2102
Session::SubscriptionStatus subscriptionStatus() const
Definition blpapi_session.h:2144
const char * subscriptionString() const
Definition blpapi_session.h:2125
Definition blpapi_subscriptionlist.h:414
constexpr const char * to_string(CorrelationId::ValueType valueType)
Definition blpapi_correlationid.h:830
std::vector< SubscriptionPreprocessError > SubscriptionPreprocessErrors
Definition blpapi_session.h:962
Definition blpapi_correlationid.h:499
Definition blpapi_abstractsession.h:448
std::ostream & operator<<(std::ostream &os, const CorrelationId &correlator)
Definition blpapi_correlationid.h:792
Definition blpapi_abstractsession.h:447
CorrelationId correlationId
Definition blpapi_session.h:882
SubscriptionPreprocessError(const CorrelationId &correlationId, const std::string &subscriptionString, int code, const char *description)
Definition blpapi_session.h:890
std::string description
Definition blpapi_session.h:888
int code
Definition blpapi_session.h:884
std::string subscriptionString
Definition blpapi_session.h:883
@ e_invalidSubscriptionString
Invalid subscription string.
Definition blpapi_session.h:870
@ e_correlationIdError
Definition blpapi_session.h:874
@ e_returnIndividualErrors
Definition blpapi_session.h:954
@ e_failOnFirstError
Definition blpapi_session.h:947