summaryrefslogtreecommitdiff
path: root/cesar/maximus/interface/msg/inc/templates.h
blob: fcdcf62eb75a290100968af13be4d5e4c5bd7ad1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef maximus_interface_msg_inc_templates_h
#define maximus_interface_msg_inc_templates_h
/* Maximus project {{{
 *
 * Copyright (C) 2012 MStar Semiconductor
 *
 * <<<Licence>>>
 *
 * }}} */
/**
 * \file    maximus/interface/msg/inc/templates.h
 * \ingroup maximus_interface_msg_inc
 *
 */

#include "maximus/utils/inc/Error.h"
#include "maximus/utils/inc/Logger.h"
#include <netinet/in.h>

template <typename T> T &
MsgFunctionCall::bind_param (
    const std::string & name) const
{
    // parameter not found => return 0
    static T param = 0;
    unsigned long length = sizeof(T);
    unsigned char * pData = new unsigned char [length];

    if ( (NULL != bind_param(name, length, pData))
         && (NULL != pData) )
    {
        param = *((T*)pData);
        if (sizeof(long) == sizeof(param))
        {
            param = ntohl(param);
        }
        else if (sizeof(short) == sizeof(param))
        {
            param = ntohs(param);
        }
        else if (sizeof(long long) == sizeof(param))
        {
            uint32_t high = 0, low = 0;
            high = (uint32_t)((uint64_t)param >> 32);
            low = (uint32_t) ((uint64_t)param
                              & 0x00000000ffffffffL);
            param = (
                ( (uint64_t)(ntohl(high))) << 32)
                | (uint64_t)(ntohl(low));
        }
    }
    delete [] pData;

    return param;
}

#endif // maximus_interface_msg_inc_templates_h