static void processCommand(ClientSocket &sock) { SyncDocument *doc = trackView->getDocument(); int strLen, serverIndex, newRow; std::string trackName; const sync_track *t; unsigned char cmd = 0; if (sock.recv((char*)&cmd, 1)) { switch (cmd) { case GET_TRACK: // read data sock.recv((char *)&strLen, sizeof(int)); strLen = ntohl(strLen); if (!sock.connected()) return; if (!strLen) { sock.disconnect(); InvalidateRect(trackViewWin, NULL, FALSE); return; } trackName.resize(strLen); if (!sock.recv(&trackName[0], strLen)) return; if (int(strlen(trackName.c_str())) != strLen) { sock.disconnect(); InvalidateRect(trackViewWin, NULL, FALSE); return; } // find track serverIndex = sync_find_track(doc, trackName.c_str()); if (0 > serverIndex) serverIndex = int(doc->createTrack(trackName)); // setup remap doc->clientSocket.clientTracks[trackName] = clientIndex++; // send key-frames t = doc->tracks[serverIndex]; for (int i = 0; i < (int)t->num_keys; ++i) doc->clientSocket.sendSetKeyCommand(trackName, t->keys[i]); InvalidateRect(trackViewWin, NULL, FALSE); break; case SET_ROW: sock.recv((char*)&newRow, sizeof(int)); trackView->setEditRow(ntohl(newRow)); break; } } }
const struct sync_track *sync_get_track(struct sync_device *d, const char *name) { struct sync_track *t; int idx = sync_find_track(&d->data, name); if (idx >= 0) return d->data.tracks[idx]; idx = sync_create_track(&d->data, name); t = d->data.tracks[idx]; get_track_data(d, t); return t; }
void processCommand(NetworkSocket &sock) { size_t clientIndex = 0; int strLen, serverIndex, newRow; std::string trackName; const sync_track *t; unsigned char cmd = 0; if (sock.recv((char*)&cmd, 1, 0)) { switch (cmd) { case GET_TRACK: // read data sock.recv((char *)&clientIndex, sizeof(int), 0); sock.recv((char *)&strLen, sizeof(int), 0); clientIndex = ntohl(clientIndex); strLen = ntohl(strLen); if (!sock.connected()) return; trackName.resize(strLen); if (!sock.recv(&trackName[0], strLen, 0)) return; // find track serverIndex = sync_find_track(&document, trackName.c_str()); if (0 > serverIndex) serverIndex = int(document.createTrack(trackName)); // setup remap document.clientRemap[serverIndex] = clientIndex; // send key-frames t = document.tracks[serverIndex]; for (int i = 0; i < (int)t->num_keys; ++i) document.sendSetKeyCommand(int(serverIndex), t->keys[i]); InvalidateRect(trackViewWin, NULL, FALSE); break; case SET_ROW: sock.recv((char*)&newRow, sizeof(int), 0); trackView->setEditRow(ntohl(newRow)); break; } } }
int sync_create_track(struct sync_data *d, const char *name) { struct sync_track *t; assert(sync_find_track(d, name) < 0); t = malloc(sizeof(*t)); t->name = strdup(name); t->keys = NULL; t->num_keys = 0; d->num_tracks++; d->tracks = realloc(d->tracks, sizeof(d->tracks[0]) * d->num_tracks); d->tracks[d->num_tracks - 1] = t; return (int)d->num_tracks - 1; }
int TrackData_createGetTrack(TrackData* trackData, const char* name) { int index = sync_find_track(&trackData->syncData, name); if (index < 0) { index = sync_create_track(&trackData->syncData, name); memset(&trackData->tracks[index], 0, sizeof(Track)); trackData->tracks[index].index = index; trackData->tracks[index].color = TrackData_getNextColor(trackData); } if (trackData->syncData.tracks) Commands_init(trackData->syncData.tracks, trackData); return index; }
static void setDocument(SyncDocument *newDoc) { SyncDocument *oldDoc = trackView->getDocument(); if (oldDoc && oldDoc->clientSocket.connected()) { // delete old key-frames for (size_t i = 0; i < oldDoc->num_tracks; ++i) { sync_track *t = oldDoc->tracks[i]; for (int j = 0; j < t->num_keys; ++j) oldDoc->clientSocket.sendDeleteKeyCommand(t->name, t->keys[j].row); } if (newDoc) { // add back missing client-tracks std::map<const std::string, size_t>::const_iterator it; for (it = oldDoc->clientSocket.clientTracks.begin(); it != oldDoc->clientSocket.clientTracks.end(); ++it) { int trackIndex = sync_find_track(newDoc, it->first.c_str()); if (0 > trackIndex) trackIndex = int(newDoc->createTrack(it->first.c_str())); } // copy socket and update client newDoc->clientSocket = oldDoc->clientSocket; for (size_t i = 0; i < newDoc->num_tracks; ++i) { sync_track *t = newDoc->tracks[i]; for (int j = 0; j < t->num_keys; ++j) newDoc->clientSocket.sendSetKeyCommand(t->name, t->keys[j]); } } } trackView->setDocument(newDoc); SendMessage(hwnd, WM_CURRVALDIRTY, 0, 0); InvalidateRect(trackViewWin, NULL, FALSE); if (oldDoc) delete oldDoc; }
SyncDocument *SyncDocument::load(const QString &fileName) { SyncDocument *ret = new SyncDocument; ret->fileName = fileName; QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(NULL, "Error", file.errorString()); return NULL; } QDomDocument doc; QString err; if (!doc.setContent(&file, &err)) { file.close(); QMessageBox::critical(NULL, "Error", err); return NULL; } file.close(); QDomNamedNodeMap attribs = doc.documentElement().attributes(); QDomNode rowsParam = attribs.namedItem("rows"); if (!rowsParam.isNull()) { QString rowsString = rowsParam.nodeValue(); ret->setRows(rowsString.toInt()); } QDomNodeList trackNodes = doc.documentElement().elementsByTagName("track"); for (int i = 0; i < int(trackNodes.length()); ++i) { QDomNode trackNode = trackNodes.item(i); QDomNamedNodeMap attribs = trackNode.attributes(); QString name = attribs.namedItem("name").nodeValue(); // look up track-name, create it if it doesn't exist int trackIndex = sync_find_track(ret, name.toUtf8()); if (0 > trackIndex) trackIndex = int(ret->createTrack(name.toUtf8().constData())); QDomNodeList rowNodes = trackNode.childNodes(); for (int i = 0; i < int(rowNodes.length()); ++i) { QDomNode keyNode = rowNodes.item(i); QString baseName = keyNode.nodeName(); if (baseName == "key") { QDomNamedNodeMap rowAttribs = keyNode.attributes(); QString rowString = rowAttribs.namedItem("row").nodeValue(); QString valueString = rowAttribs.namedItem("value").nodeValue(); QString interpolationString = rowAttribs.namedItem("interpolation").nodeValue(); track_key k; k.row = rowString.toInt(); k.value = valueString.toFloat(); k.type = key_type(interpolationString.toInt()); Q_ASSERT(!is_key_frame(ret->tracks[trackIndex], k.row)); if (sync_set_key(ret->tracks[trackIndex], &k)) qFatal("failed to insert key"); } } } // YUCK: gathers from entire document QDomNodeList bookmarkNodes = doc.documentElement().elementsByTagName("bookmark"); for (int i = 0; i < int(bookmarkNodes.length()); ++i) { QDomNode bookmarkNode = bookmarkNodes.item(i); QDomNamedNodeMap bookmarkAttribs = bookmarkNode.attributes(); QString str = bookmarkAttribs.namedItem("row").nodeValue(); int row = str.toInt(); ret->toggleRowBookmark(row); } return ret; }