Thinger.io Client Library for ARM mbed platform. This is a generic library that provides a base class that can be used to other develop hardware specific libraries.

Fork of ThingerClient by Alvaro Luis Bustamante

thinger/thinger_message.hpp

Committer:
alvarolb
Date:
2015-12-26
Revision:
4:de51256455f7
Parent:
0:b75d784c7c1a

File content as of revision 4:de51256455f7:

// The MIT License (MIT)
//
// Copyright (c) 2015 THINGER LTD
// Author: alvarolb@gmail.com (Alvaro Luis Bustamante)
//
// 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.

#ifndef THINGER_MESSAGE_HPP
#define THINGER_MESSAGE_HPP

#include "pson.h"

namespace thinger{

    enum message_type{
        MESSAGE             = 1,
        KEEP_ALIVE          = 2
    };

    class thinger_message{

    public:

        // fields for a thinger message (encoded as in protocol buffers)
        enum fields{
            STREAM_ID       = 1,
            SIGNAL_FLAG     = 2,
            UNUSED          = 3,
            RESOURCE        = 4,
            UNUSED2         = 5,
            PSON_PAYLOAD    = 6
        };

        // flags for describing a thinger message
        enum signal_flag {
            // GENERAL USED FLAGS
            REQUEST_OK          = 1,    // the request with the given stream id was successful
            REQUEST_ERROR       = 2,    // the request with the given stream id failed

            // SENT BY THE SERVER
            NONE                = 0,    // default resource action: just execute the given resource
            START_STREAM        = 3,    // enable a streaming resource (with stream_id, and resource filled, sample interval (in payload) is optional)
            STOP_STREAM         = 4,    // stop the streaming resource (with stream_id, and resource filled)

            // SENT BY DEVICE
            AUTH                = 5,
            STREAM_EVENT        = 6,    // means that the message data is related to a stream event
            STREAM_SAMPLE       = 7,    // means that the message is related to a periodical streaming sample
            CALL_ENDPOINT       = 8     // call the endpoint with the provided name (endpoint in resource, value passed in payload)
        };

    public:

        /**
         * Initialize a default response  message setting the same stream id of the source message,
         * and initializing the signal flag to ok. All remaining data or fields are empty
         */
        thinger_message(thinger_message& other) :
            stream_id(other.stream_id),
            flag(REQUEST_OK),
            resource(NULL),
            data(NULL),
            data_allocated(false)
        {}

        /**
         * Initialize a default empty message
         */
        thinger_message() :
                stream_id(0),
                flag(NONE),
                resource(NULL),
                data(NULL),
                data_allocated(false)
        {}

        ~thinger_message(){
            // deallocate resource
            destroy(resource, protoson::pool);
            // deallocate paylaod if was allocated here
            if(data_allocated){
                destroy(data, protoson::pool);
            }
        }

    private:
        /// used for identifying a unique stream
        uint16_t stream_id;
        /// used for setting a stream signal
        signal_flag flag;
        /// used to identify a device resource
        protoson::pson* resource;
        /// used to fill a data payload in the message
        protoson::pson* data;
        /// flag to determine when the payload has been reserved
        bool data_allocated;

    public:

        uint16_t get_stream_id(){
            return stream_id;
        }

        signal_flag get_signal_flag(){
            return flag;
        }

        bool has_data(){
            return data!=NULL;
        }

        bool has_resource(){
            return resource!=NULL;
        }

    public:
        void set_stream_id(uint16_t stream_id) {
            thinger_message::stream_id = stream_id;
        }

        void set_signal_flag(signal_flag const &flag) {
            thinger_message::flag = flag;
        }

    public:

        void operator=(const char* str){
            ((protoson::pson &) * this) = str;
        }

        operator protoson::pson&(){
            if(data==NULL){
                data = new (protoson::pool) protoson::pson;
                data_allocated = true;
            }
            return *data;
        }

        protoson::pson_array& resources(){
            return (protoson::pson_array&)get_resources();
        }

        protoson::pson& get_resources(){
            if(resource==NULL){
                resource = new (protoson::pool) protoson::pson;
            }
            return *resource;
        }

        protoson::pson& get_data(){
            return *this;
        }

        void set_data(protoson::pson& pson_data){
            if(data==NULL){
                data = &pson_data;
                data_allocated = false;
            }
        }

    };
}

#endif