Changeset bc73e2ba


Ignore:
Timestamp:
2015-04-04T00:33:30Z (10 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Children:
16652e9
Parents:
578790e
Message:

Error parsing, support for optional args, added handle_cmp to avoid segfault.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/rpc/rpc.c

    r578790e rbc73e2ba  
    2727
    2828static JSON_Value *jsonrpc_error(int code, const char *msg) {
    29         JSON_Value *error = json_value_init_object();
    30         json_object_set_number(json_object(error), "code", code);
    31         json_object_set_string(json_object(error), "message", msg);
    3229        JSON_Value *ret = json_value_init_object();
    33         json_object_set_value(json_object(ret), "error", error);
     30        json_object_set_null(json_object(ret), "result");
     31        if (TRUE) {
     32                /* Format from http://jsonrpc.org/historical/json-rpc-1-1-alt.html.
     33                 * Not sure whether to use it. */
     34                JSON_Value *error = json_value_init_object();
     35                json_object_set_number(json_object(error), "code", code);
     36                json_object_set_string(json_object(error), "message", msg);
     37                json_object_set_value(json_object(ret), "error", error);
     38        } else {
     39                json_object_set_string(json_object(ret), "error", msg);
     40        }
    3441       
    3542        return ret;
     43}
     44
     45static void json_array_append_string_or_null(JSON_Array *params, const char *string) {
     46        if (string)
     47                json_array_append_string(params, string);
     48        else
     49                json_array_append_null(params);
    3650}
    3751
     
    150164static void rpc_set_away(struct im_connection *ic, char *state, char *message) {
    151165        RPC_OUT_INIT("set_away");
    152         json_array_append_string(params, state);
    153         json_array_append_string(params, message);
     166        json_array_append_string_or_null(params, state);
     167        json_array_append_string_or_null(params, message);
    154168        rpc_send(ic, rpc);
    155169}
     
    165179        RPC_OUT_INIT("add_buddy");
    166180        json_array_append_string(params, name);
    167         json_array_append_string(params, group);
     181        json_array_append_string_or_null(params, group);
    168182        rpc_send(ic, rpc);
    169183}
     
    172186        RPC_OUT_INIT("remove_buddy");
    173187        json_array_append_string(params, name);
    174         json_array_append_string(params, group);
     188        json_array_append_string_or_null(params, group);
    175189        rpc_send(ic, rpc);
    176190}
     
    211225        json_array_append_number(params, rc->id);
    212226        json_array_append_string(params, who);
    213         json_array_append_string(params, message);
     227        json_array_append_string_or_null(params, message);
    214228        rpc_send(gc->ic, rpc);
    215229}
     
    220234        json_array_append_number(params, rc->id);
    221235        json_array_append_string(params, who);
    222         json_array_append_string(params, message);
     236        json_array_append_string_or_null(params, message);
    223237        rpc_send(gc->ic, rpc);
    224238}
     
    282296        json_array_append_number(params, rc->id);
    283297        json_array_append_string(params, room);
    284         json_array_append_string(params, nick);
    285         json_array_append_string(params, password);
     298        json_array_append_string_or_null(params, nick);
     299        json_array_append_string_or_null(params, password);
    286300        //json_array_append_value(params, rpc_ser_sets(sets));
    287301        rpc_send(ic, rpc);
     
    303317        const char *cmd = json_object_get_string(rpc, "method");
    304318        JSON_Value *id = json_object_get_value(rpc, "id");
     319        JSON_Value *error = json_object_get_value(rpc, "error");
    305320        JSON_Array *params = json_object_get_array(rpc, "params");
    306321
     
    322337                json_object_set_value(json_object(resp), "id", json_value_deep_copy(id));
    323338                return rpc_send(ic, resp);
     339        } else if (error && json_type(error) != JSONNull) {
     340                char *error_str = json_serialize_to_string(error);
     341                /* Maybe sanitise/truncate? Though really that should be done at
     342                 * a different layer. */
     343                imcb_error(ic, "RPC Error: %s", error_str);
     344                g_free(error_str);
    324345        }
    325346
     
    534555                                switch (methods[i].args[j]) {
    535556                                case 's':
    536                                         ok = type == JSONString;
     557                                        ok = type == JSONString || type == JSONNull;
    537558                                        break;
    538559                                case 'n':
     
    663684
    664685        // TODO: Property for a few standard nickcmp implementations.
     686        ret->handle_cmp = g_ascii_strcasecmp;
    665687       
    666688        struct rpc_plugin *proto_data = g_new0(struct rpc_plugin, 1);
Note: See TracChangeset for help on using the changeset viewer.