/* 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_logging.h                                                   -*-C++-*-
#ifndef INCLUDED_BLPAPI_LOGGING
#define INCLUDED_BLPAPI_LOGGING

//@PURPOSE: Provide a C call to register a call back for logging
//
//@DESCRIPTION: This component provides a C function that is used to
// register a callback for logging
//
///Usage
///-----
// To use the call back a function needs to be created with the same definition
// of blpapi_Logging_Func_t.
// The callback will be called for all the log messages that have severity
// greater than or equal to the specified 'thresholdSeverity'.
// A callback can be registered multiple number of times but only the last
// registered callback will be used.
// Registering with a 'NULL' callback will de-register the callback.
//..
// extern "C" {
// void myLoggerCallback(blpapi_UInt64_t    threadId,
//                       int                severity,
//                       blpapi_Datetime_t  timestamp,
//                       const char        *category,
//                       const char        *message)
// {
//     if (severity == blpapi_Logging_SEVERITY_FATAL) {
//         // Do some logic for abort here
//     }
//     std::cout << severity << "-->" << message << std::endl;
// }
//..
// This callback needs to be registered with the library as
//..
// int main()  {
//     // ....
//     blpapi_Logging_registerCallback(myLoggerCallback,
//                                     blpapi_Logging_SEVERITY_TRACE);
//     // ....
// }
//..


#ifndef INCLUDED_BLPAPI_DATETIME
#include <blpapi_datetime.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef enum blpapi_Logging_Severity_t {
    blpapi_Logging_SEVERITY_OFF   = 0,
    blpapi_Logging_SEVERITY_FATAL = 1,
    blpapi_Logging_SEVERITY_ERROR = 2,
    blpapi_Logging_SEVERITY_WARN  = 3,
    blpapi_Logging_SEVERITY_INFO  = 4,
    blpapi_Logging_SEVERITY_DEBUG = 5,
    blpapi_Logging_SEVERITY_TRACE = 6
} blpapi_Logging_Severity_t;

typedef void (*blpapi_Logging_Func_t)(blpapi_UInt64_t    threadId,
                                      int                severity,
                                      blpapi_Datetime_t  timestamp,
                                      const char        *category,
                                      const char        *message);

BLPAPI_EXPORT
int blpapi_Logging_registerCallback(
                                  blpapi_Logging_Func_t     callback,
                                  blpapi_Logging_Severity_t thresholdSeverity);
    // Register the specified 'callback' at the specified 'thresholdSeverity'.
    // The 'callback' will be called for all the log messages that have
    // severity higher or equal to the 'thresholdSeverity'.
    // '0' is returned if callback is registered and a non-zero otherwise.
    // The callback needs to be registered before the start of all sessions.

#ifdef __cplusplus
}
#endif

#endif