Move struct senders[] from server.c to vss.c.
[paraslash.git] / vss.c
diff --git a/vss.c b/vss.c
index 4024284a990614d193f05ad55ca126f85d612638..e21a1ff4fd13a715fc465c2c2758f72961856aa3 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -36,7 +36,33 @@ static struct timeval eof_barrier;
 static struct timeval autoplay_barrier;
 
 extern struct misc_meta_data *mmd;
-extern struct sender senders[];
+
+extern void dccp_send_init(struct sender *);
+extern void http_send_init(struct sender *);
+extern void ortp_send_init(struct sender *);
+
+/** the list of supported senders */
+struct sender senders[] = {
+       {
+               .name = "http",
+               .init = http_send_init,
+       },
+       {
+               .name = "dccp",
+               .init = dccp_send_init,
+       },
+#ifdef HAVE_ORTP
+       {
+               .name = "ortp",
+               .init = ortp_send_init,
+       },
+#endif
+       {
+               .name = NULL,
+       }
+};
+
+
 
 static char *map;
 
@@ -97,6 +123,25 @@ unsigned int vss_stopped(void)
                && !(mmd->new_vss_status_flags & VSS_PLAYING);
 }
 
+/**
+ * Get the data of the given chunk.
+ *
+ * \param chunk_num The number of the desired chunk.
+ * \param buf Chunk data.
+ * \param len Chunk length in bytes.
+ *
+ * \return Standard.
+ */
+int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
+{
+       if (!map || !vss_playing())
+               return -E_CHUNK;
+       if (chunk_num >= mmd->afd.afhi.chunks_total)
+               return -E_CHUNK;
+       afh_get_chunk(chunk_num, &mmd->afd.afhi, map, buf, len);
+       return 1;
+}
+
 /**
  * Initialize the virtual streaming system.
  *
@@ -119,6 +164,7 @@ void vss_init(void)
        }
        free(hn);
        free(home);
+       mmd->sender_cmd_data.cmd_num = -1;
        if (conf.autoplay_given) {
                struct timeval now, tmp;
                mmd->vss_status_flags |= VSS_PLAYING;
@@ -415,45 +461,6 @@ err:
        mmd->new_vss_status_flags = VSS_NEXT;
 }
 
-void vss_post_select(fd_set *rfds, fd_set *wfds)
-{
-       int ret, i;
-
-       if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
-               if (FD_ISSET(afs_socket, rfds))
-                       recv_afs_result();
-       } else if (FD_ISSET(afs_socket, wfds)) {
-               PARA_NOTICE_LOG("requesting new fd from afs\n");
-               ret = send_buffer(afs_socket, "new");
-               afsss = AFS_SOCKET_AFD_PENDING;
-       }
-       for (i = 0; senders[i].name; i++) {
-               if (!senders[i].post_select)
-                       continue;
-               senders[i].post_select(rfds, wfds);
-       }
-       vss_send_chunk();
-}
-
-/**
- * Get the data of the given chunk.
- *
- * \param chunk_num The number of the desired chunk.
- * \param buf Chunk data.
- * \param len Chunk length in bytes.
- *
- * \return Standard.
- */
-int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
-{
-       if (!map || !vss_playing())
-               return -E_CHUNK;
-       if (chunk_num >= mmd->afd.afhi.chunks_total)
-               return -E_CHUNK;
-       afh_get_chunk(chunk_num, &mmd->afd.afhi, map, buf, len);
-       return 1;
-}
-
 /**
  * Main sending function.
  *
@@ -463,7 +470,7 @@ int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
  * each supported sender's send() function which is supposed to send out the data
  * to all connected clients.
  */
-void vss_send_chunk(void)
+static void vss_send_chunk(void)
 {
        int i;
        struct timeval now, due;
@@ -505,3 +512,31 @@ void vss_send_chunk(void)
        mmd->chunks_sent++;
        mmd->current_chunk++;
 }
+
+void vss_post_select(fd_set *rfds, fd_set *wfds)
+{
+       int ret, i;
+
+       if (mmd->sender_cmd_data.cmd_num >= 0) {
+               int num = mmd->sender_cmd_data.cmd_num,
+                       s = mmd->sender_cmd_data.sender_num;
+
+               if (senders[s].client_cmds[num])
+                       senders[s].client_cmds[num](&mmd->sender_cmd_data);
+               mmd->sender_cmd_data.cmd_num = -1;
+       }
+       if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
+               if (FD_ISSET(afs_socket, rfds))
+                       recv_afs_result();
+       } else if (FD_ISSET(afs_socket, wfds)) {
+               PARA_NOTICE_LOG("requesting new fd from afs\n");
+               ret = send_buffer(afs_socket, "new");
+               afsss = AFS_SOCKET_AFD_PENDING;
+       }
+       for (i = 0; senders[i].name; i++) {
+               if (!senders[i].post_select)
+                       continue;
+               senders[i].post_select(rfds, wfds);
+       }
+       vss_send_chunk();
+}