away with abstraction

This commit is contained in:
Erik Faye-Lund 2008-02-14 22:40:58 +00:00
parent 60a835fa35
commit b53505f660
5 changed files with 72 additions and 93 deletions

View File

@ -1,20 +1,22 @@
#include "device.h" #include "device.h"
#include "../network.h" #include "../network.h"
#include "../syncdataclient.h" #include "../syncdata.h"
using namespace sync; using namespace sync;
class ClientDevice : public Device class ClientDevice : public Device
{ {
public: public:
ClientDevice(SOCKET serverSocket, Timer &timer) : syncData(serverSocket), timer(timer) {} ClientDevice(SOCKET serverSocket, Timer &timer) : serverSocket(serverSocket), timer(timer) {}
~ClientDevice(); ~ClientDevice();
Track &getTrack(const std::string &trackName); Track &getTrack(const std::string &trackName);
bool update(float row); bool update(float row);
private: private:
SyncDataClient syncData; SyncData syncData;
SOCKET serverSocket;
Timer &timer; Timer &timer;
}; };
@ -25,12 +27,74 @@ ClientDevice::~ClientDevice()
Track &ClientDevice::getTrack(const std::string &trackName) Track &ClientDevice::getTrack(const std::string &trackName)
{ {
return syncData.getTrack(trackName); SyncData::TrackContainer::iterator iter = syncData.tracks.find(trackName);
if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second];
unsigned char cmd = GET_TRACK;
send(serverSocket, (char*)&cmd, 1, 0);
size_t clientIndex = syncData.actualTracks.size();
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
// send request data
size_t name_len = trackName.size();
printf("len: %d\n", name_len);
send(serverSocket, (char*)&name_len, sizeof(size_t), 0);
const char *name_str = trackName.c_str();
send(serverSocket, name_str, name_len, 0);
sync::Track *track = new sync::Track();
/* todo: fill in based on the response */
syncData.actualTracks.push_back(track);
syncData.tracks[trackName] = clientIndex;
return *track;
} }
bool ClientDevice::update(float row) bool ClientDevice::update(float row)
{ {
return !syncData.poll(); bool done = false;
// look for new commands
while (pollRead(serverSocket))
{
unsigned char cmd = 0;
int ret = recv(serverSocket, (char*)&cmd, 1, 0);
if (0 >= ret)
{
done = true;
break;
}
else
{
switch (cmd)
{
case SET_KEY:
{
int track, row;
float value;
recv(serverSocket, (char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0);
recv(serverSocket, (char*)&value, sizeof(float), 0);
printf("set: %d,%d = %f\n", track, row, value);
}
break;
case DELETE_KEY:
{
int track, row;
recv(serverSocket, (char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0);
printf("delete: %d,%d = %f\n", track, row);
}
break;
default:
printf("unknown cmd: %02x\n", cmd);
}
}
}
return !done;
} }
Device *sync::createDevice(const std::string &baseName, Timer &timer) Device *sync::createDevice(const std::string &baseName, Timer &timer)

View File

@ -1,4 +1,5 @@
#include "track.h" #include "track.h"
#include "../syncdata.h"
using namespace sync; using namespace sync;
#include <cmath> #include <cmath>

View File

@ -6,6 +6,8 @@
#include <exception> #include <exception>
#include <cmath> #include <cmath>
#include <cassert>
#include <tchar.h>
#include "sync/track.h" #include "sync/track.h"

View File

@ -1,74 +0,0 @@
#include "syncdataclient.h"
#include "network.h"
sync::Track &SyncDataClient::getTrack(const std::basic_string<TCHAR> &name)
{
TrackContainer::iterator iter = tracks.find(name);
if (iter != tracks.end()) return *actualTracks[iter->second];
unsigned char cmd = GET_TRACK;
send(serverSocket, (char*)&cmd, 1, 0);
size_t clientIndex = actualTracks.size();
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
// send request data
size_t name_len = name.size();
printf("len: %d\n", name_len);
send(serverSocket, (char*)&name_len, sizeof(size_t), 0);
const char *name_str = name.c_str();
send(serverSocket, name_str, name_len, 0);
sync::Track *track = new sync::Track();
/* todo: fill in based on the response */
actualTracks.push_back(track);
tracks[name] = clientIndex;
return *track;
}
bool SyncDataClient::poll()
{
bool done = false;
// look for new commands
while (pollRead(serverSocket))
{
unsigned char cmd = 0;
int ret = recv(serverSocket, (char*)&cmd, 1, 0);
if (0 >= ret)
{
done = true;
break;
}
else
{
switch (cmd)
{
case SET_KEY:
{
int track, row;
float value;
recv(serverSocket, (char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0);
recv(serverSocket, (char*)&value, sizeof(float), 0);
printf("set: %d,%d = %f\n", track, row, value);
}
break;
case DELETE_KEY:
{
int track, row;
recv(serverSocket, (char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0);
printf("delete: %d,%d = %f\n", track, row);
}
break;
default:
printf("unknown cmd: %02x\n", cmd);
}
}
}
return done;
}

View File

@ -1,14 +0,0 @@
#include "network.h"
#include "syncdata.h"
class SyncDataClient : public SyncData
{
public:
SyncDataClient(SOCKET serverSocket) : serverSocket(serverSocket) {}
sync::Track &getTrack(const std::basic_string<TCHAR> &name);
bool poll();
private:
std::map<int, sync::Track*> serverRemap;
SOCKET serverSocket;
};