added support for pre-connection editing

This commit is contained in:
Erik Faye-Lund 2008-02-18 23:57:50 +00:00
parent 74eee30216
commit ff614fbbb9
7 changed files with 104 additions and 45 deletions

View File

@ -9,6 +9,9 @@
#include <stack> #include <stack>
#include <list> #include <list>
#import <msxml4.dll> named_guids
class SyncDocument : public sync::Data class SyncDocument : public sync::Data
{ {
public: public:
@ -31,6 +34,8 @@ public:
void sendDeleteKeyCommand(int track, int row) void sendDeleteKeyCommand(int track, int row)
{ {
if (INVALID_SOCKET == clientSocket) return; if (INVALID_SOCKET == clientSocket) return;
if (clientRemap.count(track) == 0) return;
track = int(clientRemap[track]);
unsigned char cmd = DELETE_KEY; unsigned char cmd = DELETE_KEY;
send(clientSocket, (char*)&cmd, 1, 0); send(clientSocket, (char*)&cmd, 1, 0);
@ -77,18 +82,19 @@ public:
virtual void exec(SyncDocument *data) virtual void exec(SyncDocument *data)
{ {
sync::Track &t = data->getTrack(this->track); sync::Track *t = data->actualTracks[this->track];
assert(!t.isKeyFrame(row)); assert(NULL != t);
t.setKeyFrame(row, key); assert(!t->isKeyFrame(row));
t->setKeyFrame(row, key);
data->sendSetKeyCommand(track, row, key); // update clients data->sendSetKeyCommand(track, row, key); // update clients
} }
virtual void undo(SyncDocument *data) virtual void undo(SyncDocument *data)
{ {
sync::Track &t = data->getTrack(this->track); sync::Track *t = data->actualTracks[this->track];
assert(t.isKeyFrame(row)); assert(NULL != t);
t.deleteKeyFrame(row); assert(t->isKeyFrame(row));
t->deleteKeyFrame(row);
data->sendDeleteKeyCommand(track, row); // update clients data->sendDeleteKeyCommand(track, row); // update clients
} }
@ -249,6 +255,53 @@ public:
else cmd = new InsertCommand(track, row, key); else cmd = new InsertCommand(track, row, key);
return cmd; return cmd;
} }
void load(const std::string &fileName)
{
MSXML2::IXMLDOMDocumentPtr doc(MSXML2::CLSID_DOMDocument);
try
{
doc->load(fileName.c_str());
MSXML2::IXMLDOMNodeListPtr trackNodes = doc->documentElement->selectNodes("track");
for (int i = 0; i < trackNodes->Getlength(); ++i)
{
MSXML2::IXMLDOMNodePtr trackNode = trackNodes->Getitem(i);
MSXML2::IXMLDOMNamedNodeMapPtr attribs = trackNode->Getattributes();
std::string name = attribs->getNamedItem("name")->Gettext();
sync::Track &t = getTrack(name);
MSXML2::IXMLDOMNodeListPtr rowNodes = trackNode->GetchildNodes();
for (int i = 0; i < rowNodes->Getlength(); ++i)
{
MSXML2::IXMLDOMNodePtr keyNode = rowNodes->Getitem(i);
std::string baseName = keyNode->GetbaseName();
if (baseName == "key")
{
MSXML2::IXMLDOMNamedNodeMapPtr rowAttribs = keyNode->Getattributes();
std::string rowString = rowAttribs->getNamedItem("row")->Gettext();
std::string valueString = rowAttribs->getNamedItem("value")->Gettext();
std::string interpolationString = rowAttribs->getNamedItem("interpolation")->Gettext();
sync::Track::KeyFrame keyFrame(
float(atof(valueString.c_str())),
sync::Track::KeyFrame::InterpolationType(
atoi(interpolationString.c_str())
)
);
t.setKeyFrame(atoi(rowString.c_str()), keyFrame);
}
}
}
}
catch(_com_error &e)
{
char temp[256];
_snprintf(temp, 256, "Error loading: %s\n", (const char*)_bstr_t(e.Description()));
MessageBox(NULL, temp, NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
}
}
SOCKET clientSocket; SOCKET clientSocket;
std::map<size_t, size_t> clientRemap; std::map<size_t, size_t> clientRemap;

View File

@ -234,19 +234,6 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance)
return RegisterClassEx(&wc); return RegisterClassEx(&wc);
} }
SyncDocument loadDocument()
{
SyncDocument document;
for (int i = 0; i < 10; ++i)
{
std::string trackName = "balle";
// find track
const sync::Track &track = document.getTrack(trackName);
}
return document;
}
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
#ifdef _DEBUG #ifdef _DEBUG
@ -258,6 +245,7 @@ int _tmain(int argc, _TCHAR* argv[])
#endif #endif
HINSTANCE hInstance = GetModuleHandle(NULL); HINSTANCE hInstance = GetModuleHandle(NULL);
CoInitialize(NULL);
#if 1 #if 1
if (false == initNetwork()) if (false == initNetwork())
@ -317,7 +305,6 @@ int _tmain(int argc, _TCHAR* argv[])
CW_USEDEFAULT, CW_USEDEFAULT, // width, height CW_USEDEFAULT, CW_USEDEFAULT, // width, height
NULL, NULL, hInstance, NULL NULL, NULL, hInstance, NULL
); );
printf("main window: %p\n", hwnd);
if (NULL == hwnd) if (NULL == hwnd)
{ {
@ -326,15 +313,11 @@ int _tmain(int argc, _TCHAR* argv[])
} }
HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR)); HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
printf("accel: %p\n", accel);
ShowWindow(hwnd, TRUE); ShowWindow(hwnd, TRUE);
UpdateWindow(hwnd); UpdateWindow(hwnd);
#if 1 #if 1
printf("server socket %x\n", serverSocket);
bool done = false; bool done = false;
SOCKET clientSocket = INVALID_SOCKET; SOCKET clientSocket = INVALID_SOCKET;
MSG msg; MSG msg;
@ -427,7 +410,6 @@ int _tmain(int argc, _TCHAR* argv[])
{ {
int newRow = 0; int newRow = 0;
int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0); int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0);
printf("new row: %d\n", newRow);
trackView->setEditRow(newRow); trackView->setEditRow(newRow);
} }
break; break;

View File

@ -373,8 +373,9 @@ void TrackView::editCopy()
std::vector<struct CopyEntry> copyEntries; std::vector<struct CopyEntry> copyEntries;
for (int track = selectLeft; track <= selectRight; ++track) for (int track = selectLeft; track <= selectRight; ++track)
{ {
int localTrack = track - selectLeft; const size_t trackIndex = document->getTrackIndexFromPos(track);
const sync::Track &t = document->getTrack(track); const sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row) for (int row = selectTop; row <= selectBottom; ++row)
{ {
int localRow = row - selectTop; int localRow = row - selectTop;
@ -384,7 +385,7 @@ void TrackView::editCopy()
assert(NULL != keyFrame); assert(NULL != keyFrame);
CopyEntry ce; CopyEntry ce;
ce.track = localTrack; ce.track = int(trackIndex);
ce.row = localRow; ce.row = localRow;
ce.keyFrame = *keyFrame; ce.keyFrame = *keyFrame;
@ -682,13 +683,14 @@ void TrackView::editEnterValue()
{ {
if (int(editString.size()) > 0 && editTrack < int(document->getTrackCount())) if (int(editString.size()) > 0 && editTrack < int(document->getTrackCount()))
{ {
sync::Track &t = document->getTrack(editTrack); size_t trackIndex = document->getTrackIndexFromPos(editTrack);
sync::Track &t = document->getTrack(trackIndex);
sync::Track::KeyFrame newKey; sync::Track::KeyFrame newKey;
if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key
newKey.value = float(_tstof(editString.c_str())); // modify value newKey.value = float(_tstof(editString.c_str())); // modify value
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, editRow, newKey); SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), editRow, newKey);
document->exec(cmd); document->exec(cmd);
editString.clear(); editString.clear();
@ -702,7 +704,8 @@ void TrackView::editToggleInterpolationType()
{ {
if (editTrack < int(document->getTrackCount())) if (editTrack < int(document->getTrackCount()))
{ {
sync::Track &t = document->getTrack(editTrack); size_t trackIndex = document->getTrackIndexFromPos(editTrack);
sync::Track &t = document->getTrack(trackIndex);
// find key to modify // find key to modify
sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(editRow); sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(editRow);
@ -728,7 +731,7 @@ void TrackView::editToggleInterpolationType()
(int(newKey.interpolationType) + 1) % sync::Track::KeyFrame::IT_COUNT (int(newKey.interpolationType) + 1) % sync::Track::KeyFrame::IT_COUNT
); );
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, int(lower->first), newKey); SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), int(lower->first), newKey);
document->exec(cmd); document->exec(cmd);
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first)); invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
@ -752,12 +755,14 @@ void TrackView::editDelete()
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
for (int track = selectLeft; track <= selectRight; ++track) for (int track = selectLeft; track <= selectRight; ++track)
{ {
sync::Track &t = document->getTrack(track); size_t trackIndex = document->getTrackIndexFromPos(track);
sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row) for (int row = selectTop; row <= selectBottom; ++row)
{ {
if (t.isKeyFrame(row)) if (t.isKeyFrame(row))
{ {
SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(track, row); SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(int(trackIndex), row);
multiCmd->addCommand(cmd); multiCmd->addCommand(cmd);
} }
} }
@ -786,7 +791,9 @@ void TrackView::editBiasValue(float amount)
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
for (int track = selectLeft; track <= selectRight; ++track) for (int track = selectLeft; track <= selectRight; ++track)
{ {
sync::Track &t = document->getTrack(track); size_t trackIndex = document->getTrackIndexFromPos(track);
sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row) for (int row = selectTop; row <= selectBottom; ++row)
{ {
if (t.isKeyFrame(row)) if (t.isKeyFrame(row))
@ -795,7 +802,7 @@ void TrackView::editBiasValue(float amount)
newKey.value += amount; // modify value newKey.value += amount; // modify value
// add sub-command // add sub-command
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(track, row, newKey); SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), row, newKey);
multiCmd->addCommand(cmd); multiCmd->addCommand(cmd);
} }
} }
@ -944,6 +951,10 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
case 's': case 's':
document->sendSaveCommand(); document->sendSaveCommand();
break; break;
case 'l':
document->load("test.xml");
break;
} }
return FALSE; return FALSE;
} }

View File

@ -9,7 +9,10 @@ using namespace sync;
size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name) size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name)
{ {
TrackContainer::iterator iter = tracks.find(name); TrackContainer::iterator iter = tracks.find(name);
if (iter != tracks.end()) return int(iter->second); if (iter != tracks.end())
{
return iter->second;
}
size_t index = actualTracks.size(); size_t index = actualTracks.size();
tracks[name] = index; tracks[name] = index;
@ -26,14 +29,16 @@ Track &Data::getTrack(const std::basic_string<TCHAR> &name)
return *actualTracks[index]; return *actualTracks[index];
} }
Track &Data::getTrack(size_t track) size_t Data::getTrackIndexFromPos(size_t track)
{ {
assert(track >= 0); assert(track >= 0);
assert(track < tracks.size()); assert(track < tracks.size());
sync::Data::TrackContainer::iterator trackIter = tracks.begin(); sync::Data::TrackContainer::iterator trackIter = tracks.begin();
for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter); for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter);
return *actualTracks[trackIter->second];
assert(tracks.end() != trackIter);
return trackIter->second;
} }
size_t Data::getTrackCount() const size_t Data::getTrackCount() const

View File

@ -22,7 +22,16 @@ namespace sync
public: public:
size_t getTrackIndex(const std::basic_string<TCHAR> &name); size_t getTrackIndex(const std::basic_string<TCHAR> &name);
Track &getTrack(const std::basic_string<TCHAR> &name); Track &getTrack(const std::basic_string<TCHAR> &name);
Track &getTrack(size_t track);
size_t getTrackIndexFromPos(size_t track);
Track &getTrack(size_t track)
{
assert(track < actualTracks.size());
assert(NULL != actualTracks[track]);
return *actualTracks[track];
}
size_t getTrackCount() const; size_t getTrackCount() const;
// private: // private:

View File

@ -42,11 +42,12 @@ Track &ClientDevice::getTrack(const std::string &trackName)
{ {
sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName);
if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second]; if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second];
unsigned char cmd = GET_TRACK; unsigned char cmd = GET_TRACK;
send(serverSocket, (char*)&cmd, 1, 0); send(serverSocket, (char*)&cmd, 1, 0);
size_t clientIndex = syncData.actualTracks.size(); size_t clientIndex = syncData.actualTracks.size();
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0); send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
// send request data // send request data
@ -90,12 +91,11 @@ bool ClientDevice::update(float row)
recv(serverSocket, (char*)&row, sizeof(int), 0); recv(serverSocket, (char*)&row, sizeof(int), 0);
recv(serverSocket, (char*)&value, sizeof(float), 0); recv(serverSocket, (char*)&value, sizeof(float), 0);
recv(serverSocket, (char*)&interp, 1, 0); recv(serverSocket, (char*)&interp, 1, 0);
assert(interp >= 0); assert(interp >= 0);
assert(interp < Track::KeyFrame::IT_COUNT); assert(interp < Track::KeyFrame::IT_COUNT);
sync::Track &t = syncData.getTrack(track); sync::Track &t = *syncData.actualTracks[track];
t.setKeyFrame(row, t.setKeyFrame(row,
Track::KeyFrame( Track::KeyFrame(
value, value,

View File

@ -25,7 +25,6 @@ SOCKET clientConnect(SOCKET serverSocket)
{ {
SOCKET clientSocket = accept(serverSocket, NULL, NULL); SOCKET clientSocket = accept(serverSocket, NULL, NULL);
if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET; if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET;
printf("%x\n", clientSocket);
const char *expectedGreeting = clientGreeting; const char *expectedGreeting = clientGreeting;
char recievedGreeting[128]; char recievedGreeting[128];