- n = 0;
- while (*list) {
- n++;
- list++;
- }
-
- return n;
-}
-
-static void **list_add(void **list, void *item)
-{
- int n;
- void **result;
-
- n = list_length(list);
-
- result = malloc((n + 1 + 1) * sizeof(void *));
-
- if (list)
- memcpy(result, list, n * sizeof(void *));
-
- result[n] = item;
- result[n + 1] = NULL;
-
- return result;
-}
-
-struct headline **
-headlines_add(struct headline **list, struct headline *h)
-{
- return (struct headline **)list_add((void **)list, (void *)h);
-}
-
-struct headline *feed_get_headline(struct feed *feed, int id)
-{
- struct headline **headlines;
-
- headlines = feed->headlines;
- if (headlines)
- while (*headlines) {
- if ((*headlines)->id == id)
- return *headlines;
- headlines++;
- }
-
- return NULL;
-}
-
-void ws_request_add_att_str(json_object *rq, const char *k, const char *str)
-{
- json_object_object_add(rq, k, json_object_new_string(str));
-}
-
-void ws_request_add_att_int(json_object *rq, const char *k, int v)
-{
- json_object_object_add(rq, k, json_object_new_int(v));
-}
-
-struct json_object *ws_request_new(const char *op)
-{
- struct json_object *rq;
-
- rq = json_object_new_object();
-
- ws_request_add_att_str(rq, "op", op);
-
- if (session_id)
- ws_request_add_att_str(rq, "sid", session_id);
-
- return rq;
-}
-
-void ws_init(const char *url, const char *user, const char *pwd)
-{
- char *tmp;
-
- if (session_id)
- session_id = NULL;
-
- if (session_user)
- free(session_user);
- session_user = strdup(user);
-
- if (session_pwd)
- free(session_pwd);
- session_pwd = strdup(pwd);
-
- if (session_url)
- free(session_url);
-
- tmp = url_normalize(url);
- session_url = malloc(strlen(tmp) + strlen("/api/") + 1);
- strcpy(session_url, tmp);
- strcat(session_url, "/api/");
- free(tmp);
-}
-
-struct json_object *ws_reply_get_content(struct json_object *rp)
-{
- return json_object_object_get(rp, "content");
-}
-
-struct json_object *ws_execute(struct json_object *rq)
-{
- struct json_object *rp, *content;
-
- rp = http_json_get(session_url, rq);
-
- if (rp) {
- content = ws_reply_get_content(rp);
-
- if (content && !json_object_object_get(rp, "error")) {
- json_object_get(content);
- json_object_put(rp);
- return content;
- }
-
- json_object_put(rp);
- }
-
- return NULL;
-}
-
-int ws_get_api_version()
-{
- struct json_object *rp, *rq;
- int v;
-
- rq = ws_request_new("getApiLevel");
-
- rp = ws_execute(rq);
-
- json_object_put(rq);
-
- if (rp) {
- v = json_object_get_int(json_object_object_get(rp, "level"));
-
- json_object_put(rp);
- } else {
- v = 0;
- }
-
- return v;
-}
-
-char *ws_login()
-{
- struct json_object *rq, *rp, *j;
- char *str;
-
- rq = ws_request_new("login");
- ws_request_add_att_str(rq, "user", session_user);
- ws_request_add_att_str(rq, "password", session_pwd);
-
- rp = ws_execute(rq);
- json_object_put(rq);