/* Copyright 2012. Bloomberg Finance L.P.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:  The above
 * copyright notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */
// blpapi_dispatchtbl.h                                               -*-C++-*-
#ifndef INCLUDED_BLPAPI_DISPATCHTBL
#define INCLUDED_BLPAPI_DISPATCHTBL

//@PURPOSE: Work with dispatch table
//
//@DESCRIPTION: This provides dispatch table for extended exported functions.
// These functions are called through dispatch table based on preprocessors. It
// avoids direct call of these functions by applications. So when blpapi DLL
// is rolled back to the previous versions, blpapi DLL still can be loaded.

// We only support dispatchtbl on windows currently
#if defined(_WIN32) || defined(__WIN32__)

#include <blpapi_defs.h>
#include <blpapi_correlationid.h>
#include <blpapi_streamproxy.h>
#include <blpapi_types.h>
#include <blpapi_versionmacros.h>
#include <stddef.h>

#ifdef __cplusplus

#ifndef BLPAPI_MIN_VERSION
#define BLPAPI_MIN_VERSION BLPAPI_SDK_VERSION
#endif

#ifndef BLPAPI_TARGET_VERSION
#define BLPAPI_TARGET_VERSION BLPAPI_SDK_VERSION
#endif

#if BLPAPI_MIN_VERSION > BLPAPI_TARGET_VERSION
#error "Min required version cannot be greater than target version"
#endif

extern "C" {

// Forward declarations
struct blpapi_EventFormatter;
typedef struct blpapi_EventFormatter blpapi_EventFormat_t;

struct blpapi_Topic;
typedef struct blpapi_Topic blpapi_Topic_t;

struct blpapi_Message;
typedef struct blpapi_Message blpapi_Message_t;

struct blpapi_Request;
typedef struct blpapi_Request blpapi_Request_t;

struct blpapi_HighPrecisionDatetime_tag;
typedef struct blpapi_HighPrecisionDatetime_tag blpapi_HighPrecisionDatetime_t;

struct blpapi_TimePoint;
typedef struct blpapi_TimePoint blpapi_TimePoint_t;

struct blpapi_SubscriptionList;
typedef struct blpapi_SubscriptionList blpapi_SubscriptionList_t;

struct blpapi_ServiceRegistrationOptions;
typedef struct blpapi_ServiceRegistrationOptions
                                           blpapi_ServiceRegistrationOptions_t;

struct blpapi_RequestTemplate;
typedef struct blpapi_RequestTemplate blpapi_RequestTemplate_t;

// End Forward declarations

// Function dispatch table declaration
typedef struct blpapi_FunctionEntries {
    int (*blpapi_EventFormatter_appendMessageSeq)(
        blpapi_EventFormatter_t* formatter,
        char const* typeString,
        blpapi_Name_t* typeName,
        const blpapi_Topic_t* topic,
        unsigned int sequenceNumber,
        unsigned int);
    int (*blpapi_EventFormatter_appendRecapMessageSeq)(
        blpapi_EventFormatter_t* formatter,
        const blpapi_Topic_t *topic,
        const blpapi_CorrelationId_t *cid,
        unsigned int sequenceNumber,
        unsigned int);
    int (*blpapi_Message_addRef)(
        const blpapi_Message_t* message);
    int (*blpapi_Message_release)(
        const blpapi_Message_t* message);
    void (*blpapi_SessionOptions_setMaxEventQueueSize)(
        blpapi_SessionOptions_t *parameters,
        size_t maxEventQueueSize);
    int (*blpapi_SessionOptions_setSlowConsumerWarningHiWaterMark)(
        blpapi_SessionOptions_t *parameters,
        float hiWaterMark);
    int (*blpapi_SessionOptions_setSlowConsumerWarningLoWaterMark)(
        blpapi_SessionOptions_t *parameters,
        float loWaterMark);
    void (*blpapi_Request_setPreferredRoute)(
        blpapi_Request_t *request,
        blpapi_CorrelationId_t *correlationId);
    int (*blpapi_Message_fragmentType)(
        const blpapi_Message_t *message);
    size_t (*blpapi_SessionOptions_maxEventQueueSize)(
        blpapi_SessionOptions_t *parameters);
    float (*blpapi_SessionOptions_slowConsumerWarningHiWaterMark)(
        blpapi_SessionOptions_t *parameters);
    float (*blpapi_SessionOptions_slowConsumerWarningLoWaterMark)(
        blpapi_SessionOptions_t *parameters);
    int (*blpapi_SessionOptions_setDefaultKeepAliveInactivityTime)(
        blpapi_SessionOptions_t *parameters,
        int inactivityTime);
    int (*blpapi_SessionOptions_setDefaultKeepAliveResponseTimeout)(
        blpapi_SessionOptions_t *parameters,
        int responseTimeout);
    int (*blpapi_SessionOptions_defaultKeepAliveInactivityTime)(
        blpapi_SessionOptions_t *parameters);
    int (*blpapi_SessionOptions_defaultKeepAliveResponseTimeout)(
        blpapi_SessionOptions_t *parameters);
    int (*blpapi_HighPrecisionDatetime_compare)(
        const blpapi_HighPrecisionDatetime_t*,
        const blpapi_HighPrecisionDatetime_t*);
    int (*blpapi_HighPrecisionDatetime_print)(
        const blpapi_HighPrecisionDatetime_t*,
        blpapi_StreamWriter_t,
        void*,
        int,
        int);
    int (*blpapi_Element_getValueAsHighPrecisionDatetime)(
        const blpapi_Element_t*,
        blpapi_HighPrecisionDatetime_t*,
        size_t);
    int (*blpapi_Element_setValueHighPrecisionDatetime)(
        blpapi_Element_t*,
        const blpapi_HighPrecisionDatetime_t*,
        size_t);
    int (*blpapi_Element_setElementHighPrecisionDatetime)(
        blpapi_Element_t*,
        const char*,
        const blpapi_Name_t*,
        const blpapi_HighPrecisionDatetime_t*);
    int (*blpapi_Session_resubscribeWithId)(
        blpapi_Session_t*,
        const blpapi_SubscriptionList_t*,
        int,
        const char*,
        int);
    int (*blpapi_EventFormatter_setValueNull)(
        blpapi_EventFormatter_t *,
        const char *,
        const blpapi_Name_t *);
    int (*blpapi_DiagnosticsUtil_memoryInfo)(
        char *,
        size_t);
    int (*blpapi_SessionOptions_setKeepAliveEnabled)(
        blpapi_SessionOptions_t *,
        int);
    int (*blpapi_SessionOptions_keepAliveEnabled)(
        blpapi_SessionOptions_t *);
    int (*blpapi_SubscriptionList_addResolved)(
        blpapi_SubscriptionList_t *,
        const char *,
        const blpapi_CorrelationId_t *);
    int (*blpapi_SubscriptionList_isResolvedAt)(
        blpapi_SubscriptionList_t *,
        int *,
        size_t);
    int (*blpapi_ProviderSession_deregisterService)(
        blpapi_ProviderSession_t *session,
        const char* serviceName);
    void (*blpapi_ServiceRegistrationOptions_setPartsToRegister)(
        blpapi_ServiceRegistrationOptions_t *session,
        int parts);
    int (*blpapi_ServiceRegistrationOptions_getPartsToRegister)(
        blpapi_ServiceRegistrationOptions_t *session);
    int (*blpapi_ProviderSession_deleteTopics)(
        blpapi_ProviderSession_t* session,
        const blpapi_Topic_t** topics,
        size_t numTopics);
    int (*blpapi_ProviderSession_activateSubServiceCodeRange)(
        blpapi_ProviderSession_t *session,
        const char* serviceName,
        int begin,
        int end,
        int priority);
    int (*blpapi_ProviderSession_deactivateSubServiceCodeRange)(
        blpapi_ProviderSession_t *session,
        const char* serviceName,
        int begin,
        int end);
    int (*blpapi_ServiceRegistrationOptions_addActiveSubServiceCodeRange)(
        blpapi_ServiceRegistrationOptions_t *parameters,
        int start,
        int end,
        int priority);
    void
    (*blpapi_ServiceRegistrationOptions_removeAllActiveSubServiceCodeRanges)(
        blpapi_ServiceRegistrationOptions_t *parameters);
    void (*blpapi_Logging_logTestMessage)(
        blpapi_Logging_Severity_t severity);
    const char *(*blpapi_getVersionIdentifier)();
    int (*blpapi_Message_timeReceived)(
        const blpapi_Message_t *message,
        blpapi_TimePoint_t *timeReceived);
    int (*blpapi_SessionOptions_recordSubscriptionDataReceiveTimes)(
        blpapi_SessionOptions_t *parameters);
    void (*blpapi_SessionOptions_setRecordSubscriptionDataReceiveTimes)(
        blpapi_SessionOptions_t *parameters,
        int shouldRecord);
    long long (*blpapi_TimePointUtil_nanosecondsBetween)(
        const blpapi_TimePoint_t *start,
        const blpapi_TimePoint_t *end);
    int (*blpapi_HighResolutionClock_now)(
        blpapi_TimePoint_t *timePoint);
    int (*blpapi_HighPrecisionDatetime_fromTimePoint)(
        blpapi_HighPrecisionDatetime_t  *datetime,
        const blpapi_TimePoint_t *timePoint,
        short offset);
    int(*blpapi_RequestTemplate_addRef)(
        const blpapi_RequestTemplate_t* requestTemplate);
    int(*blpapi_RequestTemplate_release)(
        const blpapi_RequestTemplate_t* requestTemplate);
    int(*blpapi_Session_sendRequestTemplate)(
        blpapi_Session_t *session,
        const blpapi_RequestTemplate_t *requestTemplate,
        blpapi_CorrelationId_t *correlationId);
    int(*blpapi_Session_createSnapshotRequestTemplate)(
        blpapi_RequestTemplate_t **requestTemplate,
        blpapi_Session_t *session,
        const char *subscriptionString,
        const blpapi_Identity_t* identity,
        blpapi_CorrelationId_t *correlationId);
    int(*blpapi_Message_print)(
        const blpapi_Message_t *message,
        blpapi_StreamWriter_t   streamWriter,
        void                   *stream,
        int                     indentLevel,
        int                     spacesPerLevel);
    int(*blpapi_Message_recapType)(const blpapi_Message_t* message);
    int(*blpapi_SessionOptions_setServiceCheckTimeout)(
        blpapi_SessionOptions_t *parameters,
        int                      timeoutMsecs);
    int(*blpapi_SessionOptions_setServiceDownloadTimeout)(
        blpapi_SessionOptions_t *parameters,
        int                      timeoutMsecs);
    int(*blpapi_SessionOptions_serviceCheckTimeout)(
        blpapi_SessionOptions_t *parameters);
    int(*blpapi_SessionOptions_serviceDownloadTimeout)(
        blpapi_SessionOptions_t *parameters);

    // 3.10.5
    int (*blpapi_ProviderSession_terminateSubscriptionsOnTopics)(
        blpapi_ProviderSession_t* session,
        const blpapi_Topic_t** topics,
        size_t numTopics,
        const char* message);

    // 3.10.8
    int(*blpapi_EventFormatter_appendFragmentedRecapMessage)(
        blpapi_EventFormatter_t      *formatter,
        const char                   *typeString,
        blpapi_Name_t                *typeName,
        const blpapi_Topic_t         *topic,
        const blpapi_CorrelationId_t *cid,
        int                           fragmentType);
    int(*blpapi_EventFormatter_appendFragmentedRecapMessageSeq)(
        blpapi_EventFormatter_t      *formatter,
        const char                   *typeString,
        blpapi_Name_t                *typeName,
        const blpapi_Topic_t         *topic,
        int                           fragmentType,
        unsigned int                  sequenceNumber);

    // 3.11.0
    void(*blpapi_SessionOptions_setTlsOptions)(
        blpapi_SessionOptions_t   *parameters,
        const blpapi_TlsOptions_t *tlsOptions);
    blpapi_TlsOptions_t *(*blpapi_TlsOptions_createFromFiles)(
        const char *clientCredentialsFileName,
        const char *clientCredentialsPassword,
        const char *trustedCertificatesFileName);
    blpapi_TlsOptions_t *(*blpapi_TlsOptions_createFromBlobs)(
        const char *clientCredentialsRawData,
        int         clientCredentialsRawDataLength,
        const char *clientCredentialsPassword,
        const char *trustedCertificatesRawData,
        int         trustedCertificatesRawDataLength);
    void (*blpapi_TlsOptions_setTlsHandshakeTimeoutMs)(
        blpapi_TlsOptions_t *paramaters,
        int                  tlsHandshakeTimeoutMs);
    void (*blpapi_TlsOptions_setCrlFetchTimeoutMs)(
        blpapi_TlsOptions_t *paramaters,
        int                  crlFetchTimeoutMs);

    blpapi_TlsOptions_t *(*blpapi_TlsOptions_create)(void);
    blpapi_TlsOptions_t *(*blpapi_TlsOptions_duplicate)(
        const blpapi_TlsOptions_t *parameters);
    void (*blpapi_TlsOptions_copy)(
        blpapi_TlsOptions_t       *lhs,
        const blpapi_TlsOptions_t *rhs);
    void (*blpapi_TlsOptions_destroy)(
        blpapi_TlsOptions_t *parameters);

    // 3.11.2
    int (*blpapi_AbstractSession_generateManualToken)(
        blpapi_AbstractSession_t *session,
        blpapi_CorrelationId_t   *correlationId,
        const char               *user,
        const char               *manualIp,
        blpapi_EventQueue_t      *eventQueue);

    // 3.11.4
    int (*blpapi_EventFormatter_appendValueHighPrecisionDatetime)(
        blpapi_EventFormatter_t              *formatter,
        const blpapi_HighPrecisionDatetime_t *value);
    int (*blpapi_EventFormatter_setValueHighPrecisionDatetime)(
        blpapi_EventFormatter_t              *formatter,
        const char                           *typeString,
        const blpapi_Name_t                  *typeName,
        const blpapi_HighPrecisionDatetime_t *value);

    // 3.12.0
    int(*blpapi_SessionOptions_print)(
        blpapi_SessionOptions_t *parameters,
        blpapi_StreamWriter_t    streamWriter,
        void                    *stream,
        int                      indentLevel,
        int                      spacesPerLevel);
    int (*blpapi_SessionOptions_flushPublishedEventsTimeout)(
        blpapi_SessionOptions_t *parameters);
    int (*blpapi_SessionOptions_setFlushPublishedEventsTimeout)(
        blpapi_SessionOptions_t *parameters,
        int                      timeoutMsecs);
    int (*blpapi_ProviderSession_flushPublishedEvents)(
        blpapi_ProviderSession_t *session,
        int                      *allFlushed,
        int                       timeoutMsecs);

} blpapi_FunctionEntries_t;

BLPAPI_EXPORT extern size_t                   g_blpapiFunctionTableSize;
BLPAPI_EXPORT extern blpapi_FunctionEntries_t g_blpapiFunctionEntries;

} // extern "C"

#endif // __cplusplus

#endif // if defined(_WIN32) || defined(__WIN32__)

#endif // INCLUDED_BLPAPI_DISPATCHTBL