player: wrap up send and recv

This leads to much simpler error checking.

Add casts so the inlined code can be called from the editor's
C++ code.
This commit is contained in:
Erik Faye-Lund 2010-06-19 15:38:56 +02:00
parent 078e344b24
commit c600e2abbe
2 changed files with 31 additions and 25 deletions

View File

@ -48,4 +48,14 @@ static inline int socket_poll(SOCKET socket)
return select(0, &fds, NULL, NULL, &to) > 0; return select(0, &fds, NULL, NULL, &to) > 0;
} }
static inline int xsend(SOCKET s, const void *buf, size_t len, int flags)
{
return send(s, (const char *)buf, len, flags) != (int)len;
}
static inline int xrecv(SOCKET s, void *buf, size_t len, int flags)
{
return recv(s, (char *)buf, len, flags) != (int)len;
}
#endif /* SYNC_BASE_H */ #endif /* SYNC_BASE_H */

View File

@ -60,8 +60,10 @@ static SOCKET server_connect(const char *host, int nport)
if (sock == INVALID_SOCKET) if (sock == INVALID_SOCKET)
return INVALID_SOCKET; return INVALID_SOCKET;
send(sock, client_greet, (int)strlen(client_greet), 0); if (xsend(sock, client_greet, strlen(client_greet), 0) ||
recv(sock, greet, (int)strlen(server_greet), 0); xrecv(sock, greet, strlen(server_greet), 0))
return INVALID_SOCKET;
if (!strncmp(server_greet, greet, strlen(server_greet))) if (!strncmp(server_greet, greet, strlen(server_greet)))
return sock; return sock;
@ -164,30 +166,26 @@ static void save_tracks(const char *base, struct sync_data *data)
static int request_track_data(SOCKET sock, const char *name, int idx) static int request_track_data(SOCKET sock, const char *name, int idx)
{ {
int ret;
unsigned char cmd = GET_TRACK; unsigned char cmd = GET_TRACK;
size_t name_len = strlen(name); size_t name_len = strlen(name);
/* send request data */ /* send request data */
ret = send(sock, (char *)&cmd, 1, 0); return xsend(sock, (char *)&cmd, 1, 0) ||
ret += send(sock, (char *)&idx, sizeof(int), 0); xsend(sock, (char *)&idx, sizeof(int), 0) ||
ret += send(sock, (char *)&name_len, sizeof(size_t), 0); xsend(sock, (char *)&name_len, sizeof(size_t), 0) ||
ret += send(sock, name, (int)name_len, 0); xsend(sock, name, (int)name_len, 0);
return ret != 1 + sizeof(size_t) * 2 + name_len;
} }
static int hanle_set_key_cmd(SOCKET sock, struct sync_data *data) static int hanle_set_key_cmd(SOCKET sock, struct sync_data *data)
{ {
int ret, track; int track;
struct track_key key; struct track_key key;
unsigned char type; unsigned char type;
ret = recv(sock, (char *)&track, sizeof(int), 0); if (xrecv(sock, (char *)&track, sizeof(int), 0) ||
ret += recv(sock, (char *)&key.row, sizeof(int), 0); xrecv(sock, (char *)&key.row, sizeof(int), 0) ||
ret += recv(sock, (char *)&key.value, sizeof(float), 0); xrecv(sock, (char *)&key.value, sizeof(float), 0) ||
ret += recv(sock, (char *)&type, 1, 0); xrecv(sock, (char *)&type, 1, 0))
if (ret != sizeof(int) * 2 + sizeof(float) + 1)
return 0; return 0;
assert(type < KEY_TYPE_COUNT); assert(type < KEY_TYPE_COUNT);
@ -199,11 +197,10 @@ static int hanle_set_key_cmd(SOCKET sock, struct sync_data *data)
static int hanle_del_key_cmd(SOCKET sock, struct sync_data *data) static int hanle_del_key_cmd(SOCKET sock, struct sync_data *data)
{ {
int ret, track, row; int track, row;
ret = recv(sock, (char *)&track, sizeof(int), 0); if (xrecv(sock, (char *)&track, sizeof(int), 0) ||
ret += recv(sock, (char *)&row, sizeof(int), 0); xrecv(sock, (char *)&row, sizeof(int), 0))
if (ret != sizeof(int) * 2)
return 0; return 0;
assert(track < (int)data->num_tracks); assert(track < (int)data->num_tracks);
@ -246,7 +243,7 @@ int sync_update(struct sync_device *d, int row)
while (socket_poll(d->sock)) { while (socket_poll(d->sock)) {
unsigned char cmd = 0, flag; unsigned char cmd = 0, flag;
int row; int row;
if (!recv(d->sock, (char *)&cmd, 1, 0)) if (xrecv(d->sock, (char *)&cmd, 1, 0))
goto sockerr; goto sockerr;
switch (cmd) { switch (cmd) {
@ -259,13 +256,13 @@ int sync_update(struct sync_device *d, int row)
goto sockerr; goto sockerr;
break; break;
case SET_ROW: case SET_ROW:
if (recv(d->sock, (char *)&row, sizeof(int), 0) != sizeof(int)) if (xrecv(d->sock, (char *)&row, sizeof(int), 0))
goto sockerr; goto sockerr;
if (d->cb && d->cb->set_row) if (d->cb && d->cb->set_row)
d->cb->set_row(d->cb_param, row); d->cb->set_row(d->cb_param, row);
break; break;
case PAUSE: case PAUSE:
if (recv(d->sock, (char *)&flag, 1, 0) != 1) if (xrecv(d->sock, (char *)&flag, 1, 0))
goto sockerr; goto sockerr;
if (d->cb && d->cb->pause) if (d->cb && d->cb->pause)
d->cb->pause(d->cb_param, flag); d->cb->pause(d->cb_param, flag);
@ -282,9 +279,8 @@ int sync_update(struct sync_device *d, int row)
if (d->cb && d->cb->is_playing && d->cb->is_playing(d->cb_param)) { if (d->cb && d->cb->is_playing && d->cb->is_playing(d->cb_param)) {
if (d->row != row && d->sock != INVALID_SOCKET) { if (d->row != row && d->sock != INVALID_SOCKET) {
unsigned char cmd = SET_ROW; unsigned char cmd = SET_ROW;
int ret = send(d->sock, (char*)&cmd, 1, 0); if (xsend(d->sock, (char*)&cmd, 1, 0) ||
ret += send(d->sock, (char*)&row, sizeof(int), 0); xsend(d->sock, (char*)&row, sizeof(int), 0))
if (ret != sizeof(int) + 1)
goto sockerr; goto sockerr;
d->row = row; d->row = row;
} }