/* AUTOMATICALY GENERATED by org.flib.net.CPickle.java */

#include <netinet/in.h>
#include <string.h>

#include <fcpickle_impl.h>
#include <sdomsgbase.h>

void SDOMsgBase_init(SDOMsgBase_t *o)
{
    o->srvcliCobId = 0;
    o->clisrvCobId = 0;
    o->node = 0;
    o->index = 0;
    o->subindex = 0;
}

/// This value varies only if dynamic length arrays or String type are used.
/// @param o If class does not contain variable length field types (String) or superclass,/// then o can be NULL.
/// @return size of buffer needed to pickle object only data
int SDOMsgBase_getObjectBufferSize(SDOMsgBase_t *o)
{
    int size = 0;
    size += 20;
    return size;
}

/// This value varies only if dynamic length arrays or String type are used
/// @return size of buffer needed to pickle object data and service data
int SDOMsgBase_getPacketBufferSize(SDOMsgBase_t *o)
{
    int32_t len = 0;
    fcpickle_class_def_t class_def;
    class_def.className = "ocera.rtcan.SDOMsgBase";
    len += FCPICKLE_PACKET_HEAD_SIZE;
    len += CPickleClassDef_getObjectBufferSize(&class_def);
    len += SDOMsgBase_getObjectBufferSize(o);
    return len;
}

int SDOMsgBase_pickleObject(SDOMsgBase_t *o, uint8_t *buffer, int buff_len)
{
    int32_t len = 0;

    // pickle field 'srvcliCobId'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -5;
    *(int32_t*)(buffer + len) = h2nl(o->srvcliCobId); len += sizeof(int32_t);

    // pickle field 'clisrvCobId'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -5;
    *(int32_t*)(buffer + len) = h2nl(o->clisrvCobId); len += sizeof(int32_t);

    // pickle field 'node'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -5;
    *(int32_t*)(buffer + len) = h2nl(o->node); len += sizeof(int32_t);

    // pickle field 'index'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -5;
    *(int32_t*)(buffer + len) = h2nl(o->index); len += sizeof(int32_t);

    // pickle field 'subindex'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -5;
    *(int32_t*)(buffer + len) = h2nl(o->subindex); len += sizeof(int32_t);
    return len;
}

/// align structure to array and set network endianing
/// @param buffer sufficient size of buffer is  xx_getBufferSize()
/// @param buff_len actual size of buffer
/// @return number of filled bytes or negative value if error
int SDOMsgBase_toNet(SDOMsgBase_t *o, uint8_t *buffer, int buff_len)
{
    int32_t len = 0, i;
    CPickleHead_t head;
    CPickleClassDef_t class_def;
    // set class definition
    class_def.className = "ocera.rtcan.SDOMsgBase";
    // check buffer size
    len = SDOMsgBase_getPacketBufferSize(o);
    if(len > (size_t)buff_len) return -1;
    // set packet head
    memcpy(&(head.headMagic), "CPICKLE_", 8);
    head.termZero = '\0';
    head.packetSize = len;
    len = 0;
    // pickle all to packet
    i = CPickleHead_pickleObject(&head, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    i = CPickleClassDef_pickleObject(&class_def, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    i = SDOMsgBase_pickleObject(o, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    return len;
}

/// load object data from buffer and set host endianing
/// @param buffer data to read from
/// NOTE!! char* (String in Java) fields are backuped by buffer (no memory is allocated during loading)
/// @return number of read bytes or negative value if error
int SDOMsgBase_unpickleObject(SDOMsgBase_t *o, uint8_t *buffer, int buff_len)
{
    int32_t len = 0;

    // unpickle field 'srvcliCobId'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -4;
    o->srvcliCobId = n2hl(*(int32_t*)(buffer + len)); len += sizeof(int32_t);

    // unpickle field 'clisrvCobId'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -4;
    o->clisrvCobId = n2hl(*(int32_t*)(buffer + len)); len += sizeof(int32_t);

    // unpickle field 'node'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -4;
    o->node = n2hl(*(int32_t*)(buffer + len)); len += sizeof(int32_t);

    // unpickle field 'index'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -4;
    o->index = n2hl(*(int32_t*)(buffer + len)); len += sizeof(int32_t);

    // unpickle field 'subindex'
    if(len + sizeof(int32_t) > (size_t)buff_len) return -4;
    o->subindex = n2hl(*(int32_t*)(buffer + len)); len += sizeof(int32_t);
    return len;
}
/// load object and service data from buffer and set host endianing
/// @param buffer data to read from
/// NOTE!! char* (String in Java) fields are backuped by buffer (no memory is allocated during loading)
/// @return number of read bytes or negative value if error
int SDOMsgBase_fromNet(SDOMsgBase_t *o, uint8_t *buffer, int buff_len)
{
    int32_t len = 0, i;
    CPickleHead_t head;
    CPickleClassDef_t class_def;
    i = CPickleHead_unpickleObject(&head, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    i = CPickleClassDef_unpickleObject(&class_def, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    i = SDOMsgBase_unpickleObject(o, buffer+len, buff_len-len);
    if(i < 0) return i;
    len += i;
    return len;
}

