~lalo.martins/vos/s5-scripting

« back to all changes in this revision

Viewing changes to libs/vos/python/vobject.cc

  • Committer: Lalo Martins
  • Date: 2006-12-31 13:01:41 UTC
  • Revision ID: lalo@interreality.org-20061231130141-f0c671813cc934fb
basic marshalling and unmarshalling of values

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 
4
4
namespace VOS { namespace Python { namespace internal {
5
5
 
 
6
// hack: vos_datatype_sizes should be in libvos, but for some reason it's
 
7
// private there.  Until I can get that sorted out, copy it here.
 
8
const int vos_datatype_sizes[VOS_DATATYPE_LAST_STATIC_TYPE] = {
 
9
    0,
 
10
    sizeof(int8_t), sizeof(uint8_t),
 
11
    sizeof(int16_t), sizeof(uint16_t),
 
12
    sizeof(int32_t), sizeof(uint32_t),
 
13
    sizeof(int64_t), sizeof(uint64_t),
 
14
    sizeof(float), sizeof(double),
 
15
    sizeof(vos_string_t*), sizeof(vos_vobject_t),
 
16
    sizeof(vos_datatype_t), sizeof(bool)
 
17
};
 
18
 
6
19
static PyObject* vobject_new(PyTypeObject* type, PyObject* args, PyObject* kwds);
7
20
static PyObject* vobject_repr(vobjectWrapper* self);
8
21
static PyObject* vobject_getid(vobjectWrapper* self);
183
196
 
184
197
PyObject*
185
198
method_call(methodWrapper* self, PyObject* args, PyObject* kwds) {
186
 
    std::cerr << "calling method " << self->method->name << "\n";
187
 
 
188
 
    vosNewStackMessage(msg, self->self, self->method->name, 0, 0);
189
 
 
190
 
    vosNewStackReply(result, msg, 1, (0));
 
199
    vosNewStackMessage(msg, self->self, self->method->name,
 
200
                       self->method->params.size(), 0);
 
201
 
 
202
    vos_msgfield_t* field;
 
203
    PyObject* value;
 
204
    Py_ssize_t args_pos = 0;
 
205
 
 
206
    for(int i = 0; i < self->method->params.size(); i++) {
 
207
        field = &msg->fields[i];
 
208
        field->key = self->method->params[i].name.get();
 
209
        std::string key(*self->method->params[i].name);
 
210
        field->valueType = self->method->params[i].datatype;
 
211
        // XXX: we don't support count!=1 yet
 
212
        if(self->method->params[i].count != 1) {
 
213
            PY_RAISE(PyExc_NotImplementedError,
 
214
                     "Method uses parameter with multiple count");
 
215
        }
 
216
        field->valueLength = vos_datatype_sizes[field->valueType];
 
217
        PyObject* pyarg = PyDict_GetItemString(kwds, key.c_str());
 
218
        if(!pyarg) {
 
219
            pyarg = PyTuple_GetItem(args, args_pos++);
 
220
            if(!pyarg) {
 
221
                vosFreeMessage(msg);
 
222
                PY_RAISE(PyExc_ValueError,
 
223
                         ("Insufficient arguments: expected value for " +
 
224
                          key).c_str());
 
225
            }
 
226
        }
 
227
        unwrapValue(value, field);
 
228
    }
 
229
 
 
230
    unsigned int fields = self->method->returnParams.size(), reply_size = 0;
 
231
    for(int i = 0; i < fields; i++)
 
232
        reply_size += vos_datatype_sizes[self->method->returnParams[i].datatype];
 
233
    vosNewStackReply(result, msg, fields, (reply_size));
191
234
 
192
235
    vosCall(msg, &result);
193
236
    if (result->type != VOS_MSGTYPE_REPLY ||
194
237
        result->method != self->method->name) {
195
238
        PY_RAISE(PyExc_RuntimeError, "Did not get the expected reply.");
196
239
    }
197
 
    // unmarshal result
 
240
 
 
241
    // XXX: not handling returns with count != 1, must fix kernel.cc
 
242
 
 
243
    PyObject* res = NULL;
 
244
    if(fields == 0) {
 
245
        value = Py_None;
 
246
    } else if(fields == 1) {
 
247
        value = wrapValue(&result->fields[0]);
 
248
    } else {
 
249
        value = PyTuple_New(fields);
 
250
        for(int i = 0; i < fields; i++)
 
251
            PyTuple_SET_ITEM(value, i, wrapValue(&result->fields[i]));
 
252
    }
 
253
 
198
254
    vosFreeMessage(result);
199
 
    Py_INCREF(Py_None);
200
 
    return Py_None;
 
255
    //Py_INCREF(value);
 
256
    return value;
201
257
}
202
258
 
203
259
PyObject*