diff --git a/sync/device_client.cpp b/sync/device_client.cpp index b2a585f..230d283 100644 --- a/sync/device_client.cpp +++ b/sync/device_client.cpp @@ -1,20 +1,22 @@ #include "device.h" #include "../network.h" -#include "../syncdataclient.h" +#include "../syncdata.h" using namespace sync; class ClientDevice : public Device { public: - ClientDevice(SOCKET serverSocket, Timer &timer) : syncData(serverSocket), timer(timer) {} + ClientDevice(SOCKET serverSocket, Timer &timer) : serverSocket(serverSocket), timer(timer) {} ~ClientDevice(); Track &getTrack(const std::string &trackName); bool update(float row); private: - SyncDataClient syncData; + SyncData syncData; + SOCKET serverSocket; + Timer &timer; }; @@ -25,12 +27,74 @@ ClientDevice::~ClientDevice() 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) { - 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) diff --git a/sync/track.cpp b/sync/track.cpp index 46ed732..83cb3f7 100644 --- a/sync/track.cpp +++ b/sync/track.cpp @@ -1,4 +1,5 @@ #include "track.h" +#include "../syncdata.h" using namespace sync; #include diff --git a/syncdata.h b/syncdata.h index 226cdc0..d4312ea 100644 --- a/syncdata.h +++ b/syncdata.h @@ -6,6 +6,8 @@ #include #include +#include +#include #include "sync/track.h" diff --git a/syncdataclient.cpp b/syncdataclient.cpp deleted file mode 100644 index 0e7f236..0000000 --- a/syncdataclient.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "syncdataclient.h" -#include "network.h" - -sync::Track &SyncDataClient::getTrack(const std::basic_string &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; -} diff --git a/syncdataclient.h b/syncdataclient.h deleted file mode 100644 index e7a1f26..0000000 --- a/syncdataclient.h +++ /dev/null @@ -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 &name); - bool poll(); -private: - std::map serverRemap; - SOCKET serverSocket; -};