#include <json/json.h>
#include "http.h"
-#include "ttrss.h"
+#include "ttrss_ws.h"
#include "url.h"
-static char *session_id;
-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));
-}
-
-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);
-
- if (rp) {
- j = json_object_object_get(rp, "session_id");
- str = strdup(json_object_get_string(j));
-
- json_object_put(rp);
- } else {
- str = NULL;
- }
-
- return str;
-}
-
-int ws_open_session()
-{
- int version, result;
-
- if (session_id)
- free(session_id);
-
- session_id = ws_login();
-
- if (session_id) {
- version = ws_get_api_version();
- printf("API version: %d\n", version);
-
- if (version > 0) {
- result = 1;
- } else {
- free(session_id);
- session_id = NULL;
- result = 0;
- }
- } else {
- result = 0;
- }
-
- return result;
-}
-
-char *ws_get_article_content(int id)
-{
- struct json_object *rp, *rq, *content, *item;
- char *str;
-
- rq = ws_request_new("getArticle");
- ws_request_add_att_int(rq, "article_id", id);
-
- rp = ws_execute(rq);
-
- json_object_put(rq);
-
- str = NULL;
-
- if (rp) {
- item = json_object_array_get_idx(rp, 0);
-
- if (item) {
- content = json_object_object_get(item, "content");
- str = strdup(json_object_get_string(content));
- }
-
- json_object_put(rp);
- }
-
- return str;
-}
-
-int ws_update_headlines(struct feed *feed)
-{
- struct json_object *rp, *rq, *jheadline, *j;
- int i, n, err, hid;
- struct headline *h, **tmp;
-
- rq = ws_request_new("getHeadlines");
- ws_request_add_att_int(rq, "feed_id", feed->id);
-
- rp = ws_execute(rq);
-
- json_object_put(rq);
-
- if (rp) {
- n = json_object_array_length(rp);
- for (i = 0; i < n; i++) {
- jheadline = json_object_array_get_idx(rp, i);
-
- j = json_object_object_get(jheadline, "id");
- hid = json_object_get_int(j);
- h = feed_get_headline(feed, hid);
-
- if (!h) {
- h = malloc(sizeof(struct headline));
- h->id = hid;
- h->excerpt = NULL;
- h->content = NULL;
- h->title = NULL;
- h->url = NULL;
-
- tmp = headlines_add(feed->headlines, h);
- if (feed->headlines)
- free(feed->headlines);
- feed->headlines = tmp;
- }
-
- if (!h->title) {
- j = json_object_object_get(jheadline, "title");
- h->title = strdup(json_object_get_string(j));
- }
-
- if (!h->url) {
- j = json_object_object_get(jheadline, "link");
- h->url = strdup(json_object_get_string(j));
- }
-
- j = json_object_object_get(jheadline, "unread");
- h->unread = json_object_get_boolean(j);
- }
- err = 0;
- } else {
- err = 1;
- }
-
- json_object_put(rp);
- return !err;
-}
-
const char *ttrss_get_headline_content(struct headline *h)
{
if (!h->content)
struct feed **ttrss_get_feeds()
{
- struct json_object *rp, *rq, *content, *jfeed, *j;
- int i, n;
- struct feed **feeds, *feed, **tmp;
-
- printf("ttrss_get_feeds\n");
-
- rq = ws_request_new("getFeeds");
-
- rp = http_json_get(session_url, rq);
- json_object_put(rq);
-
- content = json_object_object_get(rp, "content");
+ struct feed **tmp;
- 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");
+ tmp = ws_update_feeds(data);
+ feeds_free(data);
+ data = tmp;
- return feeds;
+ return data;
}
-struct headline **ttrss_get_headlines(struct feed *f)
+struct headline **ttrss_feed_get_headlines(struct feed *f)
{
if (!f->headlines)
ws_update_headlines(f);
json_object_object_add(rq, "field", json_object_new_int(2));
json_object_object_add(rq, "mode", json_object_new_int(unread));
- rp = http_json_get(session_url, rq);
+ rp = ws_execute(rq);
json_object_put(rq);
json_object_put(rp);