*/
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <glib.h>
#include <json/json.h>
-#include <gtk/gtk.h>
#include "http.h"
-#include "ttrss.h"
+#include "io.h"
+#include "log.h"
+#include "ttrss_cache.h"
+#include "ttrss_wsasync.h"
#include "url.h"
-static char *session_id;
-static char *session_url;
-
-static struct json_object *create_op(const char *op)
+static struct feed **data;
+char *ttrss_get_headline_content(struct headline *h)
{
- struct json_object *j;
+ char *content;
- j = json_object_new_object();
- json_object_object_add(j, "op", json_object_new_string(op));
+ content = cache_get(h);
- if (session_id && strcmp(op, "login"))
- json_object_object_add(j,
- "sid",
- json_object_new_string(session_id));
+ if (content) {
+ log_debug("ttrss_get_headline_content: cache hit");
+ } else {
+ log_debug("ttrss_get_headline_content: cache miss");
+ content = ws_get_article_content(h->id);
+ cache_put(h->id, content);
+ }
- return j;
+ return content;
}
-void ttrss_login(const char *url, const char *user, const char *password)
+struct feed **ttrss_get_feeds()
{
- struct json_object *content, *rp, *error, *sid, *rq;
- char *tmp;
-
- 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);
-
- rq = create_op("login");
- json_object_object_add(rq, "user", json_object_new_string(user));
- json_object_object_add(rq,
- "password",
- json_object_new_string(password));
-
- rp = http_json_get(session_url, rq);
- json_object_put(rq);
-
- content = json_object_object_get(rp, "content");
- if (!content) {
- fprintf(stderr, "Login failed: no content\n");
- return ;
- }
+ data = ws_update_feeds(data);
- error = json_object_object_get(content, "error");
- if (error) {
- fprintf(stderr, "Login failed\n");
- return ;
- }
-
- sid = json_object_object_get(content, "session_id");
-
- if (session_id) {
- free(session_id);
- session_id = NULL;
- }
-
- session_id = strdup(json_object_get_string(sid));
-
- printf("Session id: %s\n", session_id);
-
- json_object_put(rp);
+ return data;
}
-const char *ttrss_get_headline_content(struct headline *h)
+struct headline **ttrss_feed_get_headlines(struct feed *f)
{
- struct json_object *rp, *rq, *content, *array, *item;
-
- printf("get_headlines %d\n", h->id);
-
- if (!h->content) {
- rq = create_op("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");
-
- if (!array)
- goto release;
-
- item = json_object_array_get_idx(array, 0);
-
- if (!item)
- goto release;
-
- content = json_object_object_get(item, "content");
+ if (!f->headlines)
+ ws_update_headlines(f);
- h->content = strdup(json_object_get_string(content));
-
- release:
- json_object_put(rp);
- }
- return h->content;
+ return f->headlines;
}
-static struct headline **get_headlines(int feed_id)
+void ttrss_set_article_unread(int id, int unread)
{
- struct json_object *rp, *rq, *content, *jheadline, *j;
- int i, n;
- struct headline **headlines, *h;
-
- printf("get_headlines %d\n", feed_id);
-
- rq = create_op("getHeadlines");
- json_object_object_add(rq, "feed_id", json_object_new_int(feed_id));
-
- rp = http_json_get(session_url, rq);
+ log_debug("ttrss_set_article_unread(%d,%d)", id, unread);
- json_object_put(rq);
+ ws_async_set_article_unread(id, unread);
- content = json_object_object_get(rp, "content");
-
- if (content) {
- n = json_object_array_length(content);
- headlines = malloc((n+1)*sizeof(struct headline *));
- for (i = 0; i < n; i++) {
- jheadline = json_object_array_get_idx(content, i);
-
- h = malloc(sizeof(struct headline));
-
- j = json_object_object_get(jheadline, "id");
- h->id = json_object_get_int(j);
-
- j = json_object_object_get(jheadline, "title");
- h->title = strdup(json_object_get_string(j));
-
- j = json_object_object_get(jheadline, "link");
- h->url = strdup(json_object_get_string(j));
-
- h->excerpt = NULL;
- h->content = NULL;
-
- j = json_object_object_get(jheadline, "unread");
- h->unread = json_object_get_boolean(j);
-
- headlines[i] = h;
- }
- headlines[n] = NULL;
- } else {
- headlines = NULL;
- }
-
- json_object_put(rp);
-
- printf("get_headlines %d end\n", feed_id);
-
- return headlines;
+ log_debug("ttrss_set_article_unread(%d,%d)", id, unread);
}
-static int feeds_length(struct feed **list)
+void ttrss_set_config(const char *url, const char *user, const char *pwd)
{
- int n;
-
- if (!list)
- return 0;
-
- n = 0;
- while(*list) {
- n++;
- list++;
- }
-
- return n;
+ feeds_free(data);
+ data = NULL;
+ ws_set_config(url, user, pwd);
}
-static struct feed **feeds_add(struct feed **feeds, struct feed *feed)
+struct feed *ttrss_get_feed(int id)
{
- int n;
- struct feed **result;
-
- n = feeds_length(feeds);
-
- 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 feeds_get_feed(data, id);
}
-struct feed **ttrss_get_feeds()
+struct headline *ttrss_get_headline(int id)
{
- struct json_object *rp, *rq, *content, *jfeed, *j;
- int i, n;
- struct feed **feeds, *feed, **tmp;
-
- printf("ttrss_get_feeds\n");
-
- rq = create_op("getFeeds");
-
- rp = http_json_get(session_url, rq);
- json_object_put(rq);
-
- content = json_object_object_get(rp, "content");
-
- if (content) {
- n = json_object_array_length(content);
-
- feeds = NULL;
- for (i = 0; i < n; i++) {
- jfeed = json_object_array_get_idx(content, i);
-
- feed = malloc(sizeof(struct feed));
-
- j = json_object_object_get(jfeed, "title");
- feed->title = strdup(json_object_get_string(j));
-
- j = json_object_object_get(jfeed, "feed_url");
- feed->url = strdup(json_object_get_string(j));
-
- j = json_object_object_get(jfeed, "id");
- feed->id = json_object_get_int(j);
-
- j = json_object_object_get(jfeed, "unread");
- feed->unread = json_object_get_int(j);
-
- feed->headlines = NULL;
-
- tmp = feeds_add(feeds, feed);
- free(feeds);
- feeds = tmp;
- }
- } else {
- feeds = NULL;
- }
-
- json_object_put(rp);
-
- printf("ttrss_get_feeds ended\n");
-
- return feeds;
+ return feeds_get_headline(data, id);
}
-struct headline **ttrss_get_headlines(struct feed *f)
+static void get_article_content_cbk(int id, const char *content)
{
- if (!f->headlines)
- f->headlines = get_headlines(f->id);
+ log_debug("get_article_content_cbk %d\n", id);
- return f->headlines;
+ if (content)
+ cache_put(id, content);
}
-void ttrss_set_article_unread(int id, int unread)
+void ttrs_download_headline_content(struct feed **feeds)
{
- struct json_object *rp, *rq;
+ struct feed **fcur;
+ struct headline **hcur;
+
+ log_debug("ttrs_download_headline_content");
- printf("ttrss_set_article_unread %d %d\n", id, unread);
+ for (fcur = feeds; *fcur; fcur++) {
+ hcur = ttrss_feed_get_headlines(*fcur);
- rq = create_op("updateArticle");
- json_object_object_add(rq, "article_ids", json_object_new_int(id));
- json_object_object_add(rq, "field", json_object_new_int(2));
- json_object_object_add(rq, "mode", json_object_new_int(unread));
+ log_debug("ttrs_download_headline_content(): %s",
+ (*fcur)->title);
- rp = http_json_get(session_url, rq);
-
- json_object_put(rq);
- json_object_put(rp);
+ while (hcur && *hcur) {
+ if (!cache_exists(*hcur)) {
+ ws_async_get_article_content
+ ((*hcur)->id, get_article_content_cbk);
+ }
+ hcur++;
+ }
+ }
}