/* Copyright 2018. 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_zfputil.h                                                   -*-C++-*-
#ifndef INCLUDED_BLPAPI_ZFPUTIL
#define INCLUDED_BLPAPI_ZFPUTIL

//@PURPOSE: Automatic creation of SessionOptions for Zero Footprint solution
// clients that leverage private leased lines to the Bloomberg network.
//
//@CLASSES:
//  blpapi::ZfpUtil: Wrapper for Zero Footprint utilities
//
//@SEE_ALSO: blpapi_sessionoptions
//           blpapi_tlsoptions
//
//@DESCRIPTION: The utilities provided in this component are designed for
// the Zero Footprint solution for BLPAPI.
//
///Usage
///-----
// The following snippet shows how to use a ZfpUtil method for starting a
// 'Session' when using leased lines.
//..
// blpapi::TlsOptions tlsOptions
//                          = blpapi::TlsOptions::createFromFiles( /* ... */ );
//
// blpapi::SessionOptions opts = blpapi::ZfpUtil::getZfpOptionsForLeasedLines(
//                                                blpapi::ZfpUtil::REMOTE_8194,
//                                                tlsOptions);
//
// opts.setAuthorizationOptions(/* ... */);
//
// blpapi::Session session = blpapi::Session(opts);
// session.start();
//..
// Note that the resulting 'SessionOptions' can be used in multiple sessions,
// so this operation only needs to be called once per application.

#ifndef INCLUDED_BLPAPI_CALL
#include <blpapi_call.h>
#endif

#ifndef INCLUDED_BLPAPI_EXCEPTION
#include <blpapi_exception.h>
#endif

#ifndef INCLUDED_BLPAPI_DEFS
#include <blpapi_defs.h>
#endif

#ifndef INCLUDED_BLPAPI_SESSIONOPTIONS
#include <blpapi_sessionoptions.h>
#endif

#ifndef INCLUDED_BLPAPI_TLSOPTIONS
#include <blpapi_tlsoptions.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

BLPAPI_EXPORT
int blpapi_ZfpUtil_getOptionsForLeasedLines(
                                     blpapi_SessionOptions_t   *sessionOptions,
                                     const blpapi_TlsOptions_t *tlsOptions,
                                     int                        remote);

#ifdef __cplusplus
}

namespace BloombergLP {
namespace blpapi {

                           // =============
                           // class ZfpUtil
                           // =============

class ZfpUtil {
    // A wrapper for Zero Footprint solution utilities

  public:

    enum Remote {
        REMOTE_8194 = BLPAPI_ZFPUTIL_REMOTE_8194,
        REMOTE_8196 = BLPAPI_ZFPUTIL_REMOTE_8196
    };

    static SessionOptions getZfpOptionsForLeasedLines(
                                                 Remote            remote,
                                                 const TlsOptions& tlsOptions);
        // Creates a 'SessionOptions' object for applications that leverages
        // private leased lines to Bloomberg network. The 'SessionOptions'
        // object returned is only valid for private leased line connectivity.
        // This is a costly operation that is preferably called once per
        // application during start. The returned 'SessionOptions' can be
        // copied and reused on different sessions. On failure
        // (e.g. connectivity issues), 'blpapi::Exception' is thrown.
};

// ============================================================================
//                      INLINE FUNCTION DEFINITIONS
// ============================================================================

                           // -------------
                           // class ZfpUtil
                           // -------------
inline
SessionOptions ZfpUtil::getZfpOptionsForLeasedLines(
                                                  Remote            remote,
                                                  const TlsOptions& tlsOptions)
{
    SessionOptions so;
    ExceptionUtil::throwOnError(
            BLPAPI_CALL(blpapi_ZfpUtil_getOptionsForLeasedLines)(
                                                           so.handle(),
                                                           tlsOptions.handle(),
                                                           remote));
    return so;
}

}  // close namespace blpapi
}  // close namespace BloombergLP

#endif // #ifdef __cplusplus
#endif // #ifndef INCLUDED_BLPAPI_ZFPUTIL