diff --git a/editor/editor.vcproj b/editor/editor.vcproj index 0b50c98..04f1aba 100644 --- a/editor/editor.vcproj +++ b/editor/editor.vcproj @@ -217,10 +217,6 @@ > - - diff --git a/editor/syncdocument.h b/editor/syncdocument.h index d8ce0fd..5af2721 100644 --- a/editor/syncdocument.h +++ b/editor/syncdocument.h @@ -4,7 +4,6 @@ #pragma once -#include "../sync/network.h" #include "../sync/data.h" #include #include diff --git a/editor/synctracker2.cpp b/editor/synctracker2.cpp index 4677a2d..23a6458 100644 --- a/editor/synctracker2.cpp +++ b/editor/synctracker2.cpp @@ -40,7 +40,6 @@ RecentFiles mruFileList(NULL); #define WM_BIASSELECTION (WM_USER+2) #include "../sync/sync.h" -#include "../sync/network.h" static LRESULT CALLBACK setRowsDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { @@ -558,7 +557,8 @@ int _tmain(int argc, _TCHAR* argv[]) } #endif - if (!init_network()) + WSADATA wsa; + if (0 != WSAStartup(MAKEWORD(2, 0), &wsa)) die("Failed to init network"); SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0); @@ -716,7 +716,7 @@ int _tmain(int argc, _TCHAR* argv[]) } closesocket(serverSocket); - close_network(); + WSACleanup(); delete trackView; trackView = NULL; diff --git a/sync/base.h b/sync/base.h index 17d8832..2f50114 100644 --- a/sync/base.h +++ b/sync/base.h @@ -1,3 +1,7 @@ +/* Copyright (C) 2007-2010 Erik Faye-Lund and Egbert Teeselink + * For conditions of distribution and use, see copyright notice in LICENSE.TXT + */ + #ifndef SYNC_BASE_H #define SYNC_BASE_H @@ -6,4 +10,39 @@ #define strdup _strdup #endif +#ifdef WIN32 + #include + #define WIN32_LEAN_AND_MEAN + #include +#else + #include + #include + #include + #define SOCKET int + #define INVALID_SOCKET -1 +#endif + +static const char *client_greet = "hello, synctracker!"; +static const char *server_greet = "hello, demo!"; + +enum { + SET_KEY = 0, + DELETE_KEY = 1, + GET_TRACK = 2, + SET_ROW = 3, + PAUSE = 4, + SAVE_TRACKS = 5 +}; + +static inline int socket_poll(SOCKET socket) +{ + struct timeval to = { 0, 0 }; + fd_set fds; + + FD_ZERO(&fds); + FD_SET(socket, &fds); + + return select(0, &fds, NULL, NULL, &to) > 0; +} + #endif /* SYNC_BASE_H */ diff --git a/sync/device.c b/sync/device.c index 8192603..3bfd942 100644 --- a/sync/device.c +++ b/sync/device.c @@ -28,25 +28,44 @@ const char *sync_track_path(const char *base, const char *name) static SOCKET server_connect(const char *host, int nport) { struct hostent *he; - struct sockaddr_in addr; - char greet[128]; - SOCKET sock; + struct sockaddr_in sa; + char greet[128], **ap; + SOCKET sock = INVALID_SOCKET; - if (!init_network()) - return INVALID_SOCKET; +#ifdef WIN32 + static int need_init = 1; + if (need_init) { + WSADATA wsa; + if (WSAStartup(MAKEWORD(2, 0), &wsa)) + return INVALID_SOCKET; + need_init = 0; + } +#endif he = gethostbyname(host); if (!he) return INVALID_SOCKET; - addr.sin_family = AF_INET; - addr.sin_port = htons(nport); - addr.sin_addr.s_addr = ((struct in_addr *)(he->h_addr_list[0]))->s_addr; + for (ap = he->h_addr_list; *ap; ++ap) { + sa.sin_family = he->h_addrtype; + sa.sin_port = htons(nport); + memcpy(&sa.sin_addr, *ap, he->h_length); + + sock = socket(he->h_addrtype, SOCK_STREAM, 0); + if (sock == INVALID_SOCKET) + continue; + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) >= 0) + break; + + closesocket(sock); + sock = INVALID_SOCKET; + } + + if (sock == INVALID_SOCKET) + return INVALID_SOCKET; - sock = socket(AF_INET, SOCK_STREAM, 0); - connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); send(sock, client_greet, (int)strlen(client_greet), 0); - recv(sock, greet, (int)strlen(server_greet), 0); if (!strncmp(server_greet, greet, strlen(server_greet))) return sock; @@ -171,27 +190,40 @@ static int hanle_set_key_cmd(SOCKET sock, struct sync_data *data) ret += recv(sock, (char *)&key.value, sizeof(float), 0); ret += recv(sock, (char *)&type, 1, 0); if (ret != sizeof(int) * 2 + sizeof(float) + 1) - return 1; + return 0; assert(type < KEY_TYPE_COUNT); assert(track < (int)data->num_tracks); - key.type = (enum key_type)type; sync_set_key(data->tracks[track], &key); - return 0; + return 1; } static int hanle_del_key_cmd(SOCKET sock, struct sync_data *data) { int ret, track, row; + ret = recv(sock, (char *)&track, sizeof(int), 0); ret += recv(sock, (char *)&row, sizeof(int), 0); if (ret != sizeof(int) * 2) - return 1; + return 0; assert(track < (int)data->num_tracks); - sync_del_key(data->tracks[track], row); + return 1; +} + +static int purge_and_rerequest(struct sync_device *d) +{ + int i; + for (i = 0; i < (int)d->data.num_tracks; ++i) { + free(d->data.tracks[i]->keys); + d->data.tracks[i]->keys = NULL; + d->data.tracks[i]->num_keys = 0; + + if (request_track_data(d->sock, d->data.tracks[i]->name, i)); + return 1; + } return 0; } @@ -199,45 +231,36 @@ void sync_update(struct sync_device *d, double row) { if (d->sock == INVALID_SOCKET) { d->sock = server_connect(REMOTE_HOST, REMOTE_PORT); - if (d->sock != INVALID_SOCKET) { - int i; - for (i = 0; i < (int)d->data.num_tracks; ++i) { - /* throw out old data */ - free(d->data.tracks[i]->keys); - d->data.tracks[i]->keys = NULL; - d->data.tracks[i]->num_keys = 0; - /* request new data */ - request_track_data(d->sock, - d->data.tracks[i]->name, i); - } - } + if (purge_and_rerequest(d)) + goto sockerr; } /* look for new commands */ while (d->sock != INVALID_SOCKET && socket_poll(d->sock)) { unsigned char cmd = 0, flag; - int err = 1, row; - if (!recv(d->sock, (char *)&cmd, 1, 0)) { - d->sock = INVALID_SOCKET; - break; - } + int row; + if (!recv(d->sock, (char *)&cmd, 1, 0)) + goto sockerr; - switch (cmd) - { + switch (cmd) { case SET_KEY: - err = hanle_set_key_cmd(d->sock, &d->data); + if (hanle_set_key_cmd(d->sock, &d->data)) + goto sockerr; break; case DELETE_KEY: - err = hanle_del_key_cmd(d->sock, &d->data); + if (hanle_del_key_cmd(d->sock, &d->data)) + goto sockerr; break; case SET_ROW: - err = recv(d->sock, (char *)&row, sizeof(int), 0) != sizeof(int); - if (!err && d->cb && d->cb->set_row) + if (recv(d->sock, (char *)&row, sizeof(int), 0) != sizeof(int)) + goto sockerr; + if (d->cb && d->cb->set_row) d->cb->set_row(d->cb_param, row); break; case PAUSE: - err = recv(d->sock, (char *)&flag, 1, 0) != 1; - if (!err && d->cb && d->cb->pause) + if (recv(d->sock, (char *)&flag, 1, 0) != 1) + goto sockerr; + if (d->cb && d->cb->pause) d->cb->pause(d->cb_param, flag); break; case SAVE_TRACKS: @@ -245,10 +268,7 @@ void sync_update(struct sync_device *d, double row) break; default: fprintf(stderr, "unknown cmd: %02x\n", cmd); - } - if (err) { - d->sock = INVALID_SOCKET; - break; + goto sockerr; } } @@ -259,11 +279,15 @@ void sync_update(struct sync_device *d, double row) int ret = send(d->sock, (char*)&cmd, 1, 0); ret += send(d->sock, (char*)&nrow, sizeof(int), 0); if (ret != sizeof(int) + 1) - d->sock = INVALID_SOCKET; - else - d->row = nrow; + goto sockerr; + d->row = nrow; } } + return; + +sockerr: + d->sock = INVALID_SOCKET; + return; } #endif diff --git a/sync/device.h b/sync/device.h index 98171b1..8588ac6 100644 --- a/sync/device.h +++ b/sync/device.h @@ -8,10 +8,6 @@ #include "track.h" #include "data.h" -#ifndef SYNC_PLAYER -#include "network.h" -#endif - #ifdef __cplusplus extern "C" { #endif diff --git a/sync/network.h b/sync/network.h deleted file mode 100644 index 6fdebad..0000000 --- a/sync/network.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2007-2010 Erik Faye-Lund and Egbert Teeselink - * For conditions of distribution and use, see copyright notice in LICENSE.TXT - */ - -#ifndef SYNC_NETWORK_H -#define SYNC_NETWORK_H - -#ifdef WIN32 - #include - #define WIN32_LEAN_AND_MEAN - #include -#else - #include - #include - #include - #define SOCKET int - #define INVALID_SOCKET -1 -#endif - -#include "base.h" - -static const char *client_greet = "hello, synctracker!"; -static const char *server_greet = "hello, demo!"; - -enum { - SET_KEY = 0, - DELETE_KEY = 1, - GET_TRACK = 2, - SET_ROW = 3, - PAUSE = 4, - SAVE_TRACKS = 5 -}; - -static inline int init_network() -{ -#ifdef WIN32 - WSADATA wsa; - if (0 != WSAStartup(MAKEWORD(2, 0), &wsa)) - return 0; - if (LOBYTE(wsa.wVersion) != 2 || HIBYTE(wsa.wVersion) != 0) - return 0; -#endif - - return 1; -} - -static inline void close_network() -{ -#ifdef WIN32 - WSACleanup(); -#endif -} - -static inline int socket_poll(SOCKET socket) -{ - struct timeval to = { 0, 0 }; - fd_set fds; - - FD_ZERO(&fds); - FD_SET(socket, &fds); - - return select(0, &fds, NULL, NULL, &to) > 0; -} - -#endif /* SYNC_NETWORK_H */ diff --git a/sync_player.vcproj b/sync_player.vcproj index 747412d..b62917d 100644 --- a/sync_player.vcproj +++ b/sync_player.vcproj @@ -298,10 +298,6 @@ > - -