(no commit message)
[prss.git] / src / ttrss_ws.c
index d2c673f..c4c2c4f 100644 (file)
 #include "ttrss_ws.h"
 #include "url.h"
 
-static pthread_mutex_t *lock;
-
 static char *session_id;
 static char *session_url;
 static char *session_user;
 static char *session_pwd;
 
+static pthread_mutex_t lock;
+static struct http_session *session;
+
 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));
@@ -94,15 +95,32 @@ void ws_set_config(const char *url, const char *user, const char *pwd)
 
 struct json_object *ws_reply_get_content(struct json_object *rp)
 {
+        log_debug("ws_reply_get_content");
        return json_object_object_get(rp, "content");
 }
 
-static struct json_object *execute(struct json_object *rq, char **err)
+static const char *ws_reply_get_error(struct json_object *content)
 {
-       struct json_object *rp, *content, *jerror;
+        struct json_object *jerror;
+
+        if (json_object_get_type(content) != json_type_object)
+                return NULL;
+
+        jerror = json_object_object_get(content, "error");
+        
+        if (!jerror)
+                return NULL;
+
+        return json_object_get_string(jerror);                
+}
+
+static struct json_object *
+execute(struct http_session *sess, struct json_object *rq, char **err)
+{
+       struct json_object *rp, *content;
        const char *str;
 
-       rp = http_json_get(session_url, rq);
+       rp = http_json_get(sess, session_url, rq);
 
        content = NULL;
 
@@ -110,15 +128,13 @@ static struct json_object *execute(struct json_object *rq, char **err)
                content = ws_reply_get_content(rp);
 
                if (content) {
-                       jerror = json_object_object_get(content, "error");
-                       if (jerror) {
-                               if (err) {
-                                       str = json_object_get_string(jerror);
-                                       *err = strdup(str);
-                               }
+                        str = ws_reply_get_error(content);
+
+                       if (str) {
+                                *err = strdup(str);
                                content = NULL;
                        } else {
-                               json_object_get(content);
+                                json_object_get(content);
                        }
                }
 
@@ -134,25 +150,25 @@ struct json_object *ws_execute(struct json_object *rq)
        struct json_object *result;
 
        log_debug("ws_execute()");
-       pthread_mutex_lock(lock);
+       pthread_mutex_lock(&lock);
        log_debug("ws_execute() lock");
 
        err = NULL;
-       result = execute(rq, &err);
+       result = execute(session, rq, &err);
 
        if (err) {
-               log_debug("ws_execute(): error=%s\n", err);
+               log_debug("ws_execute(): error=%s", err);
 
                if (!strcmp(err, "NOT_LOGGED_IN")) {
                        ws_open_session();
-                       result = execute(rq, NULL);
+                       result = execute(session, rq, NULL);
                }
 
                free(err);
        }
 
        log_debug("ws_execute() unlock");
-       pthread_mutex_unlock(lock);
+       pthread_mutex_unlock(&lock);
 
        log_debug("ws_execute()");
 
@@ -221,7 +237,7 @@ int ws_open_session()
        if (session_id) {
                version = ws_get_api_version();
                log_debug("API version= %d", version);
-               
+
                if (version > 0) {
                        result = 1;
                } else {
@@ -302,6 +318,10 @@ int ws_update_headlines(struct feed *feed)
                                                           "excerpt");
                                h->excerpt = strdup(json_object_get_string(j));
 
+                               j = json_object_object_get(jheadline,
+                                                          "updated");
+                               h->date = json_object_get_int(j);
+
                                tmp = headlines_add(feed->headlines, h);
                                if (feed->headlines)
                                        free(feed->headlines);
@@ -330,6 +350,7 @@ struct feed **ws_update_feeds(struct feed **feeds)
        rq = ws_request_new("getFeeds");
 
        rp = ws_execute(rq);
+
        json_object_put(rq);
 
        if (rp) {
@@ -340,7 +361,7 @@ struct feed **ws_update_feeds(struct feed **feeds)
 
                        j = json_object_object_get(jfeed, "id");
                        id = json_object_get_int(j);
-
+                        
                        feed = feeds_get_feed(feeds, id);
 
                        if (!feed) {
@@ -359,6 +380,8 @@ struct feed **ws_update_feeds(struct feed **feeds)
 
                        j = json_object_object_get(jfeed, "unread");
                        feed->unread = json_object_get_int(j);
+
+                       ws_update_headlines(feed);
                }
                json_object_put(rp);
        } else {
@@ -403,9 +426,9 @@ void ws_set_article_unread(int id, int unread)
 
 void ws_init()
 {
-       pthread_mutexattr_t    attr;
-
+       pthread_mutexattr_t attr;
        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-       lock = malloc(sizeof(pthread_mutex_t));
-       pthread_mutex_init(lock, &attr);
+       pthread_mutex_init(&lock, &attr);
+
+       session = http_session_new();
 }