recv: Make ->btrp and ->fd generic.
[paraslash.git] / http_recv.c
index 5717692ce2133e548fee68552787cd89c9c69fc0..d4fe29ad686846cd3ee1b6d3617bdf7e329d73f1 100644 (file)
@@ -44,24 +44,6 @@ struct private_http_recv_data {
         * \sa receiver::open, receiver_node.
         */
        enum http_recv_status status;
-       /**
-        * The file descriptor used for receiving the http stream.
-        *
-        * The pre_select function of the http receiver adds this file descriptor to
-        * the set of file descriptors which are checked for reading/writing (depending
-        * on the current status) by the select loop of the application (para_audiod or
-        * para_recv).
-        *
-        * The post_select function of the http receiver uses \a fd, if ready, to
-        * establish the http connection, and updates \a status according to the new
-        * state of the connection.  As soon as \a status is \p HTTP_STREAMING, \a fd is
-        * going to be only checked for reading. If data is available, it is read into
-        * the output buffer of the receiver node by post_select.
-        *
-        * \sa receiver::pre_select receiver::post_select receiver_node, http_recv_status
-        */
-       int fd;
-       struct btr_pool *btrp;
 };
 
 static char *make_request_msg(void)
@@ -82,11 +64,16 @@ static void http_recv_pre_select(struct sched *s, struct task *t)
        if (generic_recv_pre_select(s, t) <= 0)
                return;
        if  (phd->status == HTTP_CONNECTED)
-               para_fd_set(phd->fd, &s->wfds, &s->max_fileno);
+               para_fd_set(rn->fd, &s->wfds, &s->max_fileno);
        else
-               para_fd_set(phd->fd, &s->rfds, &s->max_fileno);
+               para_fd_set(rn->fd, &s->rfds, &s->max_fileno);
 }
 
+/*
+ * Establish the http connection. If already established, fill the buffer pool
+ * area with data read from the socket. In any case, update the state of the
+ * connection if necessary.
+ */
 static void http_recv_post_select(struct sched *s, struct task *t)
 {
        struct receiver_node *rn = container_of(t, struct receiver_node, task);
@@ -104,11 +91,11 @@ static void http_recv_post_select(struct sched *s, struct task *t)
                return;
        if (phd->status == HTTP_CONNECTED) {
                char *rq;
-               if (!FD_ISSET(phd->fd, &s->wfds))
+               if (!FD_ISSET(rn->fd, &s->wfds))
                        return;
                rq = make_request_msg();
                PARA_INFO_LOG("sending http request\n");
-               ret = send_va_buffer(phd->fd, "%s", rq);
+               ret = send_va_buffer(rn->fd, "%s", rq);
                free(rq);
                if (ret < 0)
                        goto err;
@@ -116,7 +103,7 @@ static void http_recv_post_select(struct sched *s, struct task *t)
                return;
        }
        if (phd->status == HTTP_SENT_GET_REQUEST) {
-               ret = read_pattern(phd->fd, HTTP_OK_MSG, strlen(HTTP_OK_MSG), &s->rfds);
+               ret = read_pattern(rn->fd, HTTP_OK_MSG, strlen(HTTP_OK_MSG), &s->rfds);
                if (ret < 0)
                        goto err;
                if (ret == 0)
@@ -126,12 +113,12 @@ static void http_recv_post_select(struct sched *s, struct task *t)
                return;
        }
        ret = -E_HTTP_RECV_OVERRUN;
-       sz = btr_pool_get_buffer(phd->btrp, &buf);
+       sz = btr_pool_get_buffer(rn->btrp, &buf);
        if (sz == 0)
                goto err;
-       ret = read_nonblock(phd->fd, buf, sz, &s->rfds, &n);
+       ret = read_nonblock(rn->fd, buf, sz, &s->rfds, &n);
        if (n > 0)
-               btr_add_output_pool(phd->btrp, n, btrn);
+               btr_add_output_pool(rn->btrp, n, btrn);
        if (ret >= 0)
                return;
 err:
@@ -141,10 +128,8 @@ err:
 
 static void http_recv_close(struct receiver_node *rn)
 {
-       struct private_http_recv_data *phd = rn->private_data;
-
-       close(phd->fd);
-       btr_pool_free(phd->btrp);
+       close(rn->fd);
+       btr_pool_free(rn->btrp);
        free(rn->private_data);
 }
 
@@ -174,9 +159,9 @@ static int http_recv_open(struct receiver_node *rn)
                return ret;
        }
        rn->private_data = phd = para_calloc(sizeof(struct private_http_recv_data));
-       phd->fd = fd;
+       rn->fd = fd;
        phd->status = HTTP_CONNECTED;
-       phd->btrp = btr_pool_new("http_recv", 320 * 1024);
+       rn->btrp = btr_pool_new("http_recv", 320 * 1024);
        return 1;
 }