* 02110-1301 USA
*/
+#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <json/json.h>
#include "list.h"
-#include "log.h"
+#include <plog.h>
#include "ttrss_ws.h"
#include "ttrss_wsasync.h"
+struct async_request {
+ void *data;
+ struct json_object *request;
+ void (*callback)(struct json_object *, void *);
+};
+
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-static struct json_object **requests;
+static struct async_request **requests;
static pthread_t *thread;
-void *loop()
+static void async_request_free(struct async_request *rq)
+{
+ if (rq) {
+ if (rq->request)
+ json_object_put(rq->request);
+ free(rq);
+ }
+}
+
+static void *loop()
{
- struct json_object **tmp, **cur, *rp, *rq;
+ struct json_object *rp;
+ struct async_request **tmp, **cur, *rq;
while (1) {
log_debug("loop()");
cur = tmp;
while (*cur) {
rq = *cur;
- rp = ws_execute(rq);
- json_object_put(rq);
+ rp = ws_execute(rq->request);
+
+ if (rq->callback)
+ rq->callback(rp, rq->data);
+
+ async_request_free(rq);
if (rp)
json_object_put(rp);
+
cur++;
+ usleep(500000);
}
free(tmp);
}
pthread_exit(NULL);
}
-void ws_async_set_article_unread(int id, int unread)
+static struct async_request *
+add_async_request(struct json_object *rq,
+ void (*callback)(struct json_object *, void *data),
+ void *data)
{
- struct json_object *rq, **tmp;
-
- log_debug("ws_async_set_article_unread(%d,%d)", id, unread);
-
- rq = ws_request_new_set_article_unread(id, unread);
+ struct async_request *async_rq;
+ struct async_request **tmp;
pthread_mutex_lock(&lock);
if (!thread) {
thread = malloc(sizeof(pthread_t));
pthread_create(thread, NULL, loop, NULL);
}
+ pthread_mutex_unlock(&lock);
- tmp = (struct json_object **)list_add((void **)requests, rq);
+ async_rq = malloc(sizeof(struct async_request));
+ async_rq->request = rq;
+ async_rq->data = data;
+ async_rq->callback = callback;
+
+ pthread_mutex_lock(&lock);
+ tmp = (struct async_request **)list_add((void **)requests, async_rq);
list_free((void **)requests);
requests = tmp;
pthread_mutex_unlock(&lock);
+ return async_rq;
+}
+
+void ws_async_set_article_unread(int id, int unread)
+{
+ struct json_object *rq;
+
+ log_debug("ws_async_set_article_unread(%d,%d)", id, unread);
+
+ rq = ws_request_new_set_article_unread(id, unread);
+
+ add_async_request(rq, NULL, NULL);
+
log_debug("ws_async_set_article_unread(%d,%d) done", id, unread);
}
+
+struct cbk_data {
+ int id;
+ void (*callback)(int id, const char *);
+};
+
+void async_article_content_cbk(struct json_object *rp, void *userdata)
+{
+ struct cbk_data *data;
+
+ data = userdata;
+
+ log_debug("async_article_content_cbk %d\n", data->id);
+
+ if (data->callback)
+ data->callback(data->id, ws_reply_get_article_content(rp));
+
+ free(data);
+}
+
+
+void
+ws_async_get_article_content(int id, void (*callback)(int id, const char *))
+{
+ struct json_object *rq;
+ struct cbk_data *data;
+
+ rq = ws_request_new_get_article_content(id);
+
+ data = malloc(sizeof(struct cbk_data));
+ data->id = id;
+ data->callback = callback;
+
+ add_async_request(rq, async_article_content_cbk, data);
+}