Dependents:   xively-jumpstart-demo

This is Xively C library, the code lives on GitHub.

See our example program and the tutorial, documentation can bee found here.

src/libxively/data_layer.h

Committer:
xively
Date:
2013-05-13
Revision:
0:53753690a8bf

File content as of revision 0:53753690a8bf:

// Copyright (c) 2003-2013, LogMeIn, Inc. All rights reserved.
// This is part of Xively C library, it is under the BSD 3-Clause license.

/**
 * \file    data_layer.h
 * \author  Olgierd Humenczuk
 * \brief   Defines _data layer_ abstraction interface
 */

#ifndef __DATA_LAYER_H__
#define __DATA_LAYER_H__

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \brief   _The data layer interface_ - contains function pointers,
 *          that's what we expose to the layers above and below
 *
 *    It is effectively a class that holds declarations of pure virtual functions.
 *    * All encoders take a given data type (e.g. `xi_feed_t`, `xi_datapoint_t`) and produce
 *    an encoded string in a buffer, which can be wrapped as payload to _transport layer_
 *    or any other layer, such as _gzip_.
 *    * All decoders take a given data buffer and convert to an appropriate data type.
 *
 * \note    The encoders and decoders do not have to be paired, e.g. `encode_feed` is actually
 *          implemented using `encode_datapoint_in_place` in a loop (see `http_encode_update_feed`),
 *          so we only need `decode_feed`. However, this presumption had been made with CSV _data_
 *          _layer_ implementation and the interface may need to change if other data formats are
 *          to be implemented, but it is currently more important to have it the way it is.
 *          The layering model should allow for simple way of integrating anything, even if there
 *          might seem to be some inconsistency right now.
 */
typedef struct {
    /**
     * \brief   This function converts `xi_datapoint_t` into an implementation-specific format
     *          for a datapoint.
     *
     * \return  Pointer to the buffer where encoded string resides.
     */
    const char* ( *encode_datapoint )( const xi_datapoint_t* dp );

    /**
     * \brief   This function converts `xi_datapoint_t` into an implementation-specific format
     *          for a datapoint with output buffer given as an argument.
     *
     * \return  Offset or -1 if an error occurred.
     */
    int ( *encode_datapoint_in_place )(
          char* buffer, size_t buffer_size
        , const xi_datapoint_t* dp );

    /**
     * \brief   This function converts `xi_datapoint_t` and a given datastream ID string
     *          into an implementation-specific format for creating datastreams.

     * \return  Pointer to the buffer where encoded string resides.
     */
    const char* ( *encode_create_datastream )(
          const char* data
        , const xi_datapoint_t* dp );

    /**
     * \brief   This function converts from an implementation-specific format for a feed
     *          into `xi_feed_t` that is given as an argument.
     *
     * \return  Pointer to feed structure or null if an error occurred.
     */
    xi_feed_t* ( *decode_feed )( const char* data, xi_feed_t* feed );

    /**
     * \brief   This function converts from an implementation-specific format for a datapoint
     *          into `xi_datapoint_t` that is given as an argument.
     *
     * \return  Pointer to datastream structure or null if an error occurred.

     */
    xi_datapoint_t* ( *decode_datapoint )( const char* data, xi_datapoint_t* dp );
} data_layer_t;

#ifdef __cplusplus
}
#endif

#endif // __DATA_LAYER_H__