/* 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_request.h -*-C++-*-
#ifndef INCLUDED_BLPAPI_REQUEST
#define INCLUDED_BLPAPI_REQUEST
//@PURPOSE: Defines a request which can be sent for a service.
//
//@CLASSES:
// blpapi::Request: a request for a particular service
//
//@DESCRIPTION: This file defines a 'Request'. A generic Request object is
// created for a service using Service::createRequest() and sent over a session
// using Session::sendRequest().
#ifndef INCLUDED_BLPAPI_TYPES
#include <blpapi_types.h>
#endif
#ifndef INCLUDED_BLPAPI_CORRELATIONID
#include <blpapi_correlationid.h>
#endif
#ifndef INCLUDED_BLPAPI_ELEMENT
#include <blpapi_element.h>
#endif
#ifndef INCLUDED_BLPAPI_EXCEPTION
#include <blpapi_exception.h>
#endif
#ifndef INCLUDED_BLPAPI_DEFS
#include <blpapi_defs.h>
#endif
struct blpapi_Request;
typedef struct blpapi_Request blpapi_Request_t;
#ifdef __cplusplus
extern "C" {
#endif
BLPAPI_EXPORT
void blpapi_Request_destroy(
blpapi_Request_t *request);
BLPAPI_EXPORT
blpapi_Element_t* blpapi_Request_elements(
blpapi_Request_t *request);
BLPAPI_EXPORT
void blpapi_Request_setPreferredRoute(
blpapi_Request_t *request,
blpapi_CorrelationId_t *correlationId);
#ifdef __cplusplus
}
#ifndef INCLUDED_IOSFWD
#include <iosfwd>
#define INCLUDED_IOSFWD
#endif
namespace BloombergLP {
namespace blpapi {
// FORWARD DECLARATION
class RequestRef;
// =============
// class Request
// =============
class Request {
// A single request to a single service.
//
// Request objects are created using Service::createRequest() or
// Service::createAuthorizationRequest(). They are used with
// Session::sendRequest() or Session::sendAuthorizationRequest().
//
// The Request object contains the parameters for a single request
// to a single service. Once a Request has been created its fields
// can be populated directly using the convenience functions set()
// and append() functions or using the Element interface on the
// Element returned by asElement().
//
// The schema for the Request can be queried using the Element
// interface on the Element returned by asElement().
//
// Request objects cannot be duplicated. Copying a Request causes
// the original Request to become invalid. The API provides
// support for common idioms which require a normal copy
// constructor. For example, you can write the following code.
//..
// Request request(service.createRequest("operationName"));
//..
// However, if you write this 'requestOne' will become invalid and
// unusable.
//..
// Request requestOne(service.createRequest("operationName"));
// Request requestTwo(requestOne);
// // At this point requestOne is no longer valid
//..
// This should be written as follows.
//..
// Request requestOne(service.createRequest("operationName"));
// Request requestTwo(service.createRequest("operationName"));
//..
blpapi_Request_t *d_handle;
Element d_elements;
Request& operator=(const Request& rhs); // not implemented
public:
explicit Request(blpapi_Request_t *handle);
Request(RequestRef src);
Request(Request &src);
// Initialize a Request from the specified non-const
// 'src'. After this the 'src' Request is invalid.
~Request();
// Destructor.
// MANIPULATORS
operator RequestRef();
void set(const char* name, bool value);
// Equivalent to asElement().set(name, value).
void set(const char* name, char value);
// Equivalent to asElement().set(name, value).
void set(const char* name, Int32 value);
// Equivalent to asElement().set(name, value).
void set(const char* name, Int64 value);
// Equivalent to asElement().set(name, value).
void set(const char* name, Float32 value);
// Equivalent to asElement().set(name, value).
void set(const char* name, Float64 value);
// Equivalent to asElement().set(name, value).
void set(const char* name, const Datetime& value);
// Equivalent to asElement().set(name, value).
void set(const char* name, const char* value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, bool value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, char value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, Int32 value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, Int64 value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, Float32 value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, Float64 value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, const Datetime& value);
// Equivalent to asElement().set(name, value).
void set(const Name& name, const char* value);
// Equivalent to asElement().set(name, value).
void append(const char* name, bool value);
// Equivalent to asElement().append(name, value).
void append(const char* name, char value);
// Equivalent to asElement().append(name, value).
void append(const char* name, Int32 value);
// Equivalent to asElement().append(name, value).
void append(const char* name, Int64 value);
// Equivalent to asElement().append(name, value).
void append(const char* name, Float32 value);
// Equivalent to asElement().append(name, value).
void append(const char* name, Float64 value);
// Equivalent to asElement().append(name, value).
void append(const char* name, const Datetime& value);
// Equivalent to asElement().append(name, value).
void append(const char* name, const char* value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, bool value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, char value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, Int32 value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, Int64 value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, Float32 value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, Float64 value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, const Datetime& value);
// Equivalent to asElement().append(name, value).
void append(const Name& name, const char* value);
// Equivalent to asElement().append(name, value).
Element asElement();
// Returns the contents of this request as a modifiable
// Element.
Element getElement(const char* name);
// Equivalent to asElement().getElement(name).
Element getElement(const Name& name);
// Equivalent to asElement().getElement(name).
// ACCESSORS
const Element getElement(const char* name) const;
// Equivalent to asElement().getElement(name).
const Element getElement(const Name& name) const;
// Equivalent to asElement().getElement(name).
const Element asElement() const;
// Returns the contents of this request as a read-only
// Element.
blpapi_Request_t* handle() const;
std::ostream& print(std::ostream& stream,
int level=0,
int spacesPerLevel=4) const;
// Format this Element to the specified output 'stream' at the
// (absolute value of) the optionally specified indentation
// 'level' and return a reference to 'stream'. If 'level' is
// specified, optionally specify 'spacesPerLevel', the number
// of spaces per indentation level for this and all of its
// nested objects. If 'level' is negative, suppress indentation
// of the first line. If 'spacesPerLevel' is negative, format
// the entire output on one line, suppressing all but the
// initial indentation (as governed by 'level').
};
// FREE OPERATORS
std::ostream& operator<<(std::ostream& stream, const Request &request);
// Write the value of the specified 'request' object to the specified
// output 'stream' in a single-line format, and return a reference to
// 'stream'. If 'stream' is not valid on entry, this operation has no
// effect. Note that this human-readable format is not fully specified,
// can change without notice, and is logically equivalent to:
//..
// print(stream, 0, -1);
//..
// ================
// class RequestRef
// ================
class RequestRef {
Request *d_request_p;
public:
RequestRef(Request *request_p);
Request* ptr() const;
Request* operator->() const;
};
//=============================================================================
// INLINE FUNCTION DEFINITIONS
//=============================================================================
// -------------
// class Request
// -------------
inline
Request::Request(blpapi_Request_t *newHandle)
{
d_handle = newHandle;
if (newHandle) {
d_elements.rebind(blpapi_Request_elements(newHandle));
}
}
inline
Request::Request(RequestRef ref)
{
Request *src = ref.ptr();
d_handle = src->d_handle;
d_elements = src->d_elements;
src->d_handle = 0;
src->d_elements.rebind(0);
}
inline
Request::Request(Request &src)
{
d_handle = src.d_handle;
d_elements = src.d_elements;
src.d_handle = 0;
src.d_elements.rebind(0);
}
inline
Request::~Request()
{
if (d_handle) {
blpapi_Request_destroy(d_handle);
}
}
inline
Request::operator RequestRef()
{
return this;
}
inline
void Request::set(const char* element, bool value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, char value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, Int32 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, Int64 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, Float32 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, Float64 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, const Datetime& value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const char* element, const char* value)
{
d_elements.setElement(element, value);
}
inline
void Request::append(const char* element, bool value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, char value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, Int32 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, Int64 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, Float32 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, Float64 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, const Datetime& value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const char* element, const char* value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::set(const Name& element, bool value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, char value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, Int32 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, Int64 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, Float32 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, Float64 value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, const Datetime& value)
{
d_elements.setElement(element, value);
}
inline
void Request::set(const Name& element, const char* value)
{
d_elements.setElement(element, value);
}
inline
void Request::append(const Name& element, bool value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, char value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, Int32 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, Int64 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, Float32 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, Float64 value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, const Datetime& value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
void Request::append(const Name& element, const char* value)
{
Element namedElement = d_elements.getElement(element);
namedElement.appendValue(value);
}
inline
Element Request::getElement(const char* name)
{
return d_elements.getElement(name);
}
inline
Element Request::getElement(const Name& name)
{
return d_elements.getElement(name);
}
inline
Element Request::asElement()
{
return d_elements;
}
inline
const Element Request::getElement(const char* name) const
{
return d_elements.getElement(name);
}
inline
const Element Request::getElement(const Name& name) const
{
return d_elements.getElement(name);
}
inline
const Element Request::asElement() const
{
return d_elements;
}
inline
blpapi_Request_t* Request::handle() const
{
return d_handle;
}
inline
std::ostream& Request::print(
std::ostream& stream,
int level,
int spacesPerLevel) const
{
return d_elements.print(stream, level, spacesPerLevel);
}
inline
std::ostream& operator<<(std::ostream& stream, const Request &request)
{
return request.print(stream, 0,-1);
}
// ----------------
// class RequestRef
// ----------------
inline
RequestRef::RequestRef(Request *request)
: d_request_p(request)
{
}
inline
Request* RequestRef::ptr() const
{
return this->d_request_p;
}
inline
Request* RequestRef::operator->() const
{
return this->d_request_p;
}
} // close namespace blpapi
} // close namespace BloombergLP
#endif // #ifdef __cplusplus
#endif // #ifndef INCLUDED_BLPAPI_REQUEST