Fixed bug 2040346
This commit is contained in:
parent
1e1c636b18
commit
378b78ebc8
@ -20,7 +20,7 @@ public:
|
|||||||
Device(baseName),
|
Device(baseName),
|
||||||
timer(timer),
|
timer(timer),
|
||||||
serverRow(-1),
|
serverRow(-1),
|
||||||
serverSocket(serverSocket)
|
serverSocket(NetworkSocket(serverSocket))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,12 +31,12 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void saveTracks();
|
void saveTracks();
|
||||||
|
|
||||||
sync::Data syncData;
|
sync::Data syncData;
|
||||||
Timer &timer;
|
Timer &timer;
|
||||||
|
|
||||||
int serverRow;
|
int serverRow;
|
||||||
SOCKET serverSocket;
|
NetworkSocket serverSocket;
|
||||||
};
|
};
|
||||||
|
|
||||||
ClientDevice::~ClientDevice()
|
ClientDevice::~ClientDevice()
|
||||||
@ -50,13 +50,13 @@ Track &ClientDevice::getTrack(const std::string &trackName)
|
|||||||
|
|
||||||
// send request data
|
// send request data
|
||||||
unsigned char cmd = GET_TRACK;
|
unsigned char cmd = GET_TRACK;
|
||||||
send(serverSocket, (char*)&cmd, 1, 0);
|
serverSocket.send((char*)&cmd, 1, 0);
|
||||||
size_t clientIndex = syncData.getTrackCount();
|
size_t clientIndex = syncData.getTrackCount();
|
||||||
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
|
serverSocket.send((char*)&clientIndex, sizeof(size_t), 0);
|
||||||
size_t name_len = trackName.size();
|
size_t name_len = trackName.size();
|
||||||
send(serverSocket, (char*)&name_len, sizeof(size_t), 0);
|
serverSocket.send((char*)&name_len, sizeof(size_t), 0);
|
||||||
const char *name_str = trackName.c_str();
|
const char *name_str = trackName.c_str();
|
||||||
send(serverSocket, name_str, int(name_len), 0);
|
serverSocket.send(name_str, int(name_len), 0);
|
||||||
|
|
||||||
// insert new track
|
// insert new track
|
||||||
return syncData.getTrack(trackName);
|
return syncData.getTrack(trackName);
|
||||||
@ -66,28 +66,24 @@ bool ClientDevice::update(float row)
|
|||||||
{
|
{
|
||||||
bool done = false;
|
bool done = false;
|
||||||
// look for new commands
|
// look for new commands
|
||||||
while (pollRead(serverSocket))
|
while (serverSocket.pollRead())
|
||||||
{
|
{
|
||||||
unsigned char cmd = 0;
|
unsigned char cmd = 0;
|
||||||
if (0 > recv(serverSocket, (char*)&cmd, 1, 0))
|
if (serverSocket.recv((char*)&cmd, 1, 0))
|
||||||
{
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case SET_KEY:
|
case SET_KEY:
|
||||||
{
|
{
|
||||||
int track, row;
|
int track = 0, row = 0;
|
||||||
float value;
|
float value = 0.0f;
|
||||||
unsigned char interp;
|
unsigned char interp = 0;
|
||||||
|
|
||||||
recv(serverSocket, (char*)&track, sizeof(int), 0);
|
serverSocket.recv((char*)&track, sizeof(int), 0);
|
||||||
recv(serverSocket, (char*)&row, sizeof(int), 0);
|
serverSocket.recv((char*)&row, sizeof(int), 0);
|
||||||
recv(serverSocket, (char*)&value, sizeof(float), 0);
|
serverSocket.recv((char*)&value, sizeof(float), 0);
|
||||||
recv(serverSocket, (char*)&interp, 1, 0);
|
serverSocket.recv((char*)&interp, 1, 0);
|
||||||
|
if (!serverSocket.connected()) return true;
|
||||||
|
|
||||||
assert(interp < Track::KeyFrame::IT_COUNT);
|
assert(interp < Track::KeyFrame::IT_COUNT);
|
||||||
|
|
||||||
@ -103,9 +99,10 @@ bool ClientDevice::update(float row)
|
|||||||
|
|
||||||
case DELETE_KEY:
|
case DELETE_KEY:
|
||||||
{
|
{
|
||||||
int track, row;
|
int track = 0, row = 0;
|
||||||
recv(serverSocket, (char*)&track, sizeof(int), 0);
|
serverSocket.recv((char*)&track, sizeof(int), 0);
|
||||||
recv(serverSocket, (char*)&row, sizeof(int), 0);
|
serverSocket.recv((char*)&row, sizeof(int), 0);
|
||||||
|
if (!serverSocket.connected()) return true;
|
||||||
|
|
||||||
sync::Track &t = syncData.getTrack(track);
|
sync::Track &t = syncData.getTrack(track);
|
||||||
t.deleteKeyFrame(row);
|
t.deleteKeyFrame(row);
|
||||||
@ -115,7 +112,8 @@ bool ClientDevice::update(float row)
|
|||||||
case SET_ROW:
|
case SET_ROW:
|
||||||
{
|
{
|
||||||
int row;
|
int row;
|
||||||
recv(serverSocket, (char*)&row, sizeof(int), 0);
|
serverSocket.recv((char*)&row, sizeof(int), 0);
|
||||||
|
if (!serverSocket.connected()) return true;
|
||||||
timer.setRow(float(row));
|
timer.setRow(float(row));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -123,7 +121,8 @@ bool ClientDevice::update(float row)
|
|||||||
case PAUSE:
|
case PAUSE:
|
||||||
{
|
{
|
||||||
char flag;
|
char flag;
|
||||||
recv(serverSocket, (char*)&flag, 1, 0);
|
serverSocket.recv((char*)&flag, 1, 0);
|
||||||
|
if (!serverSocket.connected()) return true;
|
||||||
if (flag == 0) timer.play();
|
if (flag == 0) timer.play();
|
||||||
else timer.pause();
|
else timer.pause();
|
||||||
}
|
}
|
||||||
@ -143,16 +142,16 @@ bool ClientDevice::update(float row)
|
|||||||
if (timer.isPlaying())
|
if (timer.isPlaying())
|
||||||
{
|
{
|
||||||
int newServerRow = int(floor(row));
|
int newServerRow = int(floor(row));
|
||||||
if (serverRow != newServerRow)
|
if (serverRow != newServerRow && serverSocket.connected())
|
||||||
{
|
{
|
||||||
unsigned char cmd = SET_ROW;
|
unsigned char cmd = SET_ROW;
|
||||||
send(serverSocket, (char*)&cmd, 1, 0);
|
serverSocket.send((char*)&cmd, 1, 0);
|
||||||
send(serverSocket, (char*)&newServerRow, sizeof(int), 0);
|
serverSocket.send((char*)&newServerRow, sizeof(int), 0);
|
||||||
serverRow = newServerRow;
|
serverRow = newServerRow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return !done;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool saveTrack(const sync::Track &track, std::string fileName)
|
static bool saveTrack(const sync::Track &track, std::string fileName)
|
||||||
|
|||||||
@ -27,9 +27,54 @@ void closeNetwork();
|
|||||||
// SOCKET clientConnect(SOCKET serverSocket);
|
// SOCKET clientConnect(SOCKET serverSocket);
|
||||||
SOCKET clientConnect(SOCKET serverSocket, sockaddr_in *host = NULL);
|
SOCKET clientConnect(SOCKET serverSocket, sockaddr_in *host = NULL);
|
||||||
SOCKET serverConnect(struct sockaddr_in *addr);
|
SOCKET serverConnect(struct sockaddr_in *addr);
|
||||||
|
|
||||||
bool pollRead(SOCKET socket);
|
bool pollRead(SOCKET socket);
|
||||||
|
|
||||||
|
class NetworkSocket
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NetworkSocket(SOCKET socket = INVALID_SOCKET) : socket(socket) {}
|
||||||
|
|
||||||
|
bool connected() const { return INVALID_SOCKET != socket; };
|
||||||
|
void disconnect()
|
||||||
|
{
|
||||||
|
closesocket(socket);
|
||||||
|
socket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool recv(char *buffer, size_t length, int flags)
|
||||||
|
{
|
||||||
|
if (!connected()) return false;
|
||||||
|
int ret = ::recv(socket, buffer, int(length), flags);
|
||||||
|
if (ret != length)
|
||||||
|
{
|
||||||
|
disconnect();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool send(const char *buffer, size_t length, int flags)
|
||||||
|
{
|
||||||
|
if (!connected()) return false;
|
||||||
|
int ret = ::send(socket, buffer, int(length), flags);
|
||||||
|
if (ret != length)
|
||||||
|
{
|
||||||
|
disconnect();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pollRead()
|
||||||
|
{
|
||||||
|
if (!connected()) return false;
|
||||||
|
return ::pollRead(socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SOCKET socket;
|
||||||
|
};
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
bool recvBlock(SOCKET socket, char *buffer, size_t length, int flags);
|
bool recvBlock(SOCKET socket, char *buffer, size_t length, int flags);
|
||||||
bool sendBlock(SOCKET socket, const char *buffer, size_t length, int flags);
|
bool sendBlock(SOCKET socket, const char *buffer, size_t length, int flags);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user