forked from smartdevicelink/sdl_atf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
marshal.cc
130 lines (129 loc) · 3.31 KB
/
marshal.cc
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#line 232 "qtlua.nw"
#include "marshal.h"
#line 5 "main.nw"
extern "C" {
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>
#include <lua5.2/lauxlib.h>
}
#line 234 "qtlua.nw"
#include <QMap>
#include <QList>
#include <QString>
#line 241 "qtlua.nw"
QList<Marshaller*> get_marshalling_list(const char* signature)
{
QList<Marshaller*> retval;
char buffer[80];
// Assumed that signature is normalized
const char *p = signature;
while (*p && *p++ != '(');
while (*p && *p != ')') {
char *b = buffer;
while (*p && *p != ',' && *p != ')') {
*b++ = *p++;
}
*b = '\0';
if (*p == ',') ++p;
retval.append(Marshaller::get(buffer));
}
return retval;
}
#line 262 "qtlua.nw"
namespace {
// int Marshaller
class : public Marshaller {
public:
void* Marshal(lua_State *L, int index) {
int isnum = 0;
int val = lua_tointegerx(L, index, &isnum);
if (!isnum)
return NULL;
return new int(val);
}
void Dispose(void *obj) {
delete static_cast<int*>(obj);
}
void Unmarshal(void *obj, lua_State *L) {
lua_pushinteger(L, *static_cast<int*>(obj));
}
} intMarshaller;
// qint64 Marshaller
class : public Marshaller {
public:
void* Marshal(lua_State *L, int index) {
int isnum = 0;
qint64 val = lua_tointegerx(L, index, &isnum);
if (!isnum)
return NULL;
return new qint64(val);
}
void Dispose(void *obj) {
delete static_cast<qint64*>(obj);
}
void Unmarshal(void *obj, lua_State *L) {
lua_pushinteger(L, *static_cast<qint64*>(obj));
}
} qint64Marshaller;
#line 299 "qtlua.nw"
// QString Marshaller
class : public Marshaller {
public:
void* Marshal(lua_State *L, int index) {
const char * val = lua_tostring(L, index);
if (!val)
return NULL;
return new QString(val);
}
void Dispose(void *obj) {
delete static_cast<QString*>(obj);
}
void Unmarshal(void *obj, lua_State *L) {
lua_pushstring(L, static_cast<QString*>(obj)->toUtf8().constData());
}
} QStringMarshaller;
// QByteArray Marshaller
class : public Marshaller {
public:
void* Marshal(lua_State *L, int index) {
size_t size;
const char * val = lua_tolstring(L, index, &size);
if (!val)
return NULL;
return new QByteArray(val, size);
}
void Dispose(void *obj) {
delete static_cast<QByteArray*>(obj);
}
void Unmarshal(void *obj, lua_State *L) {
QByteArray *ba = static_cast<QByteArray*>(obj);
lua_pushlstring(L, ba->constData(), ba->size());
}
} QByteArrayMarshaller;
// bool Marshaller
class : public Marshaller {
public:
void* Marshal(lua_State *L, int index) {
bool val = lua_toboolean(L, index);
return new bool(val);
}
void Dispose(void *obj) {
delete static_cast<bool*>(obj);
}
void Unmarshal(void *obj, lua_State *L) {
lua_pushboolean(L, *static_cast<bool*>(obj));
}
} boolMarshaller;
#line 348 "qtlua.nw"
QMap<QString, Marshaller*> marshallers = {
{ "int", &intMarshaller },
{ "qint64", &qint64Marshaller },
{ "bool", &boolMarshaller },
{ "QString", &QStringMarshaller },
{ "QByteArray", &QByteArrayMarshaller }
};
} // anonymous namespace
Marshaller* Marshaller::get(const QString& type)
{
return marshallers[type];
}