(no commit message)
[prss.git] / src / ttrss.c
index 97f2803..1f97155 100644 (file)
@@ -31,6 +31,8 @@ static char *session_url;
 static char *session_user;
 static char *session_pwd;
 
+static struct feed **data;
+
 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));
@@ -179,127 +181,90 @@ int ws_open_session()
        return result;
 }
 
-const char *ttrss_get_headline_content(struct headline *h)
+char *ws_get_article_content(int id)
 {
-       struct json_object *rp, *rq, *content, *array, *item;
+       struct json_object *rp, *rq, *content, *item;
+       char *str;
 
-       printf("get_headlines %d\n", h->id);
+       rq = ws_request_new("getArticle");
+       ws_request_add_att_int(rq, "article_id", id);
 
-       if (!h->content) {
-               rq = ws_request_new("getArticle");
-               json_object_object_add(rq, "article_id",
-                                      json_object_new_int(h->id));
-               
-               rp = http_json_get(session_url, rq);
-               
-               json_object_put(rq);
-               
-               array = json_object_object_get(rp, "content");
+       rp = ws_execute(rq);
 
-               if (!array)
-                       goto release;
+       json_object_put(rq);
 
-               item = json_object_array_get_idx(array, 0);
+       str = NULL;
 
-               if (!item)
-                       goto release;
+       if (rp) {
+               item = json_object_array_get_idx(rp, 0);
 
-               content = json_object_object_get(item, "content");
+               if (item) {
+                       content = json_object_object_get(item, "content");
+                       str = strdup(json_object_get_string(content));
+               }
 
-               h->content = strdup(json_object_get_string(content));
-                       
-       release:
                json_object_put(rp);
        }
-       return h->content;
+
+       return str;
 }
 
-static struct headline **get_headlines(int feed_id)
+int ws_update_headlines(struct feed *feed)
 {
-       struct json_object *rp, *rq, *content, *jheadline, *j;
-       int i, n;
-       struct headline **headlines, *h;
-
-       printf("get_headlines %d\n", feed_id);
+       struct json_object *rp, *rq, *jheadline, *j;
+       int i, n, err, hid;
+       struct headline *h, **tmp;
+       const char *title, *url;
 
        rq = ws_request_new("getHeadlines");
-       json_object_object_add(rq, "feed_id", json_object_new_int(feed_id));
+       ws_request_add_att_int(rq, "feed_id", feed->id);
 
-       rp = http_json_get(session_url, rq);
+       rp = ws_execute(rq);
 
        json_object_put(rq);
 
-       content = json_object_object_get(rp, "content");
-
-       if (content) {
-               n = json_object_array_length(content);
-               headlines = malloc((n+1)*sizeof(struct headline *));
+       if (rp) {
+               n = json_object_array_length(rp);
                for (i = 0; i < n; i++) {
-                       jheadline = json_object_array_get_idx(content, i);
-
-                       h = malloc(sizeof(struct headline));
+                       jheadline = json_object_array_get_idx(rp, i);
 
                        j = json_object_object_get(jheadline, "id");
-                       h->id = json_object_get_int(j);
+                       hid = json_object_get_int(j);
+                       h = feed_get_headline(feed, hid);
 
-                       j = json_object_object_get(jheadline, "title");
-                       h->title = strdup(json_object_get_string(j));
+                       if (!h) {
+                               j = json_object_object_get(jheadline, "title");
+                               title = json_object_get_string(j);
+                               
+                               j = json_object_object_get(jheadline, "link");
+                               url = json_object_get_string(j);
 
-                       j = json_object_object_get(jheadline, "link");
-                       h->url = strdup(json_object_get_string(j));
+                               h = headline_new(hid, url, title);
 
-                       h->excerpt = NULL;
-                       h->content = NULL;
+                               tmp = headlines_add(feed->headlines, h);
+                               if (feed->headlines)
+                                       free(feed->headlines);
+                               feed->headlines = tmp;
+                       }
 
                        j = json_object_object_get(jheadline, "unread");
                        h->unread = json_object_get_boolean(j);
-
-                       headlines[i] = h;
                }
-               headlines[n] = NULL;
+               err = 0;
        } else {
-               headlines = NULL;
+               err = 1;
        }
 
        json_object_put(rp);
-
-       printf("get_headlines %d end\n", feed_id);
-
-       return headlines;
-}
-
-static int feeds_length(struct feed **list)
-{
-       int n;
-
-       if (!list)
-               return 0;
-       
-       n = 0;
-       while(*list) {
-               n++;
-               list++;
-       }
-
-       return n;
+       return !err;
 }
 
-static struct feed **feeds_add(struct feed **feeds, struct feed *feed)
+const char *ttrss_get_headline_content(struct headline *h)
 {
-       int n;
-       struct feed **result;
-
-       n = feeds_length(feeds);
+       if (!h->content)
+               h->content = ws_get_article_content(h->id);
 
-       result = malloc((n + 1 + 1) * sizeof(struct feed *));
-
-       if (feeds)
-               memcpy(result, feeds, n * sizeof(struct feed *));
-
-       result[n] = feed;
-       result[n + 1] = NULL;
-
-       return result;
+       return h->content;
 }
 
 struct feed **ttrss_get_feeds()
@@ -358,7 +323,7 @@ struct feed **ttrss_get_feeds()
 struct headline **ttrss_get_headlines(struct feed *f)
 {
        if (!f->headlines)
-               f->headlines = get_headlines(f->id);
+               ws_update_headlines(f);
 
        return f->headlines;
 }
@@ -375,7 +340,14 @@ void ttrss_set_article_unread(int id, int unread)
        json_object_object_add(rq, "mode", json_object_new_int(unread));
 
        rp = http_json_get(session_url, rq);
-       
+
        json_object_put(rq);
        json_object_put(rp);
 }
+
+void ttrss_set_config(const char *url, const char *user, const char *pwd)
+{
+       feeds_free(data);
+       data = NULL;
+       ws_init(url, user, pwd);
+}