/* variable_new_deserialize_buffer */ Variable * variable_new_deserialize_buffer(size_t * size, Buffer const * buffer) { char const * data; data = buffer_get_data(buffer); return variable_new_deserialize(size, data); }
static AppMessage * _new_deserialize_call(AppMessage * message, char const * data, const size_t size, size_t pos) { size_t s; Variable * v; size_t i; AppMessageCallArgument * p; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif if(_new_deserialize_id(message, data, size, &pos) == NULL) return NULL; message->t.call.method = NULL; message->t.call.args = NULL; message->t.call.args_cnt = 0; s = size; if((v = variable_new_deserialize_type(VT_STRING, &s, &data[pos])) == NULL) { error_set_code(1, "%s", "Could not obtain the AppMessage call" " method"); appmessage_delete(message); return NULL; } pos += s; /* XXX may fail */ variable_get_as(v, VT_STRING, &message->t.call.method); variable_delete(v); #ifdef DEBUG fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, message->t.call.method); #endif /* deserialize the arguments */ for(i = 0; pos < size; i++) { #ifdef DEBUG fprintf(stderr, "DEBUG: %s() %lu\n", __func__, i); #endif if((p = realloc(message->t.call.args, sizeof(*p) * (i + 1))) == NULL) { appmessage_delete(message); return NULL; } message->t.call.args = p; s = size - pos; if((v = variable_new_deserialize(&s, &data[pos])) == NULL) { appmessage_delete(message); return NULL; } #ifdef DEBUG fprintf(stderr, "DEBUG: %s() %lu (%u)\n", __func__, i, variable_get_type(v)); #endif pos += s; message->t.call.args[i].direction = AMCD_IN; /* XXX */ message->t.call.args[i].arg = v; message->t.call.args_cnt = i + 1; } return message; }