static void collabclient_sendRedo_sfdfragment( cloneclient_t* cc, SplineFont* sf, SplineChar *sc, /* optional */ char* sfdfrag, /* SFD that makes sense for redo */ char* msgtype, /* will be MSG_TYPE_UNDO if set to zero */ int isLocalUndo ) { printf("collabclient_sendRedo_sfdfragment(top)\n"); if( !cc ) return; if( !msgtype ) msgtype = MSG_TYPE_UNDO; char pos[100]; char* uuid = sf->xuid; printf("uuid:%s\n", uuid ); int idx = 0; char* sfd = sfdfrag; printf("read undo sfd, data:%p\n", sfd ); if( DEBUG_SHOW_SFD_CHUNKS ) printf("SENDING: %s\n\n", sfd ); printf("timers1...\n" ); cc->roundTripTimerWaitingSeq = cc->publisher_sendseq; BackgroundTimer_touch( cc->roundTripTimer ); printf("timers2...\n" ); printf("sfd:%p...\n", sfd ); kvmsg_t *kvmsg = kvmsg_new(0); kvmsg_fmt_key (kvmsg, "%s%d", SUBTREE, cc->publisher_sendseq++); kvmsg_set_body (kvmsg, sfd, strlen(sfd) ); kvmsg_set_prop (kvmsg, "type", msgtype ); kvmsg_set_prop (kvmsg, "uuid", uuid ); if( sc ) { sprintf(pos, "%d", sc->orig_pos ); printf("pos:%s\n", pos ); printf("sc.name:%s\n", sc->name ); } size_t data_size = kvmsg_size (kvmsg); printf("data.size:%ld\n", data_size ); kvmsg_set_prop (kvmsg, "pos", pos ); if( sc ) kvmsg_set_prop (kvmsg, "name", sc->name ); sprintf(pos, "%d", isLocalUndo ); kvmsg_set_prop (kvmsg, "isLocalUndo", pos ); kvmsg_send (kvmsg, cc->publisher); kvmsg_destroy (&kvmsg); DEBUG("Sent a undo chunk of %zu bytes to the server\n",strlen(sfd)); free(sfd); }
static void collabclient_sendRedo_Internal( FontViewBase *fv, SplineChar *sc, Undoes *undo, int isLocalUndo ) { printf("collabclient_sendRedo_Internal()\n"); cloneclient_t* cc = fv->collabClient; if( !cc ) return; char* uuid = fv->sf->xuid; printf("uuid:%s\n", uuid ); printf("________________________ WRITE undo.layer: %d layer_sz:%d\n", undo->layer, sc->layer_cnt ); int idx = 0; char filename[PATH_MAX]; snprintf(filename, PATH_MAX, "%s/fontforge-collab-x.sfd", getTempDir() ); FILE* f = fopen( filename, "wb" ); SFDDumpUndo( f, sc, undo, "Undo", idx ); fclose(f); printf("wrote undo sfd... filename: %s\n", filename ); char* sfd = GFileReadAll( filename ); printf("read undo sfd, data:%p\n", sfd ); if( DEBUG_SHOW_SFD_CHUNKS ) printf("SENDING: %s\n\n", sfd ); printf("timers1...\n" ); cc->roundTripTimerWaitingSeq = cc->publisher_sendseq; BackgroundTimer_touch( cc->roundTripTimer ); printf("timers2...\n" ); printf("sfd:%p...\n", sfd ); kvmsg_t *kvmsg = kvmsg_new(0); kvmsg_fmt_key (kvmsg, "%s%d", SUBTREE, cc->publisher_sendseq++); kvmsg_set_body (kvmsg, sfd, strlen(sfd) ); kvmsg_set_prop (kvmsg, "type", MSG_TYPE_UNDO ); kvmsg_set_prop (kvmsg, "uuid", uuid ); char pos[100]; sprintf(pos, "%d", sc->orig_pos ); printf("pos:%s\n", pos ); printf("sc.name:%s\n", sc->name ); size_t data_size = kvmsg_size (kvmsg); printf("data.size:%ld\n", data_size ); kvmsg_set_prop (kvmsg, "pos", pos ); kvmsg_set_prop (kvmsg, "name", sc->name ); sprintf(pos, "%d", isLocalUndo ); kvmsg_set_prop (kvmsg, "isLocalUndo", pos ); kvmsg_send (kvmsg, cc->publisher); kvmsg_destroy (&kvmsg); DEBUG("Sent a undo chunk of %d bytes to the server\n",strlen(sfd)); free(sfd); }
static void collabclient_sendSFD( void* ccvp, char* sfd, char* fontname ) { cloneclient_t* cc = (cloneclient_t*)ccvp; kvmsg_t *kvmsg = kvmsg_new(0); kvmsg_fmt_key (kvmsg, "%s%d", SUBTREE, cc->publisher_sendseq++); kvmsg_set_body (kvmsg, sfd, strlen(sfd)); kvmsg_set_prop (kvmsg, "type", MSG_TYPE_SFD ); kvmsg_set_prop (kvmsg, "fontname", fontname ); // kvmsg_set_prop (kvmsg, "ttl", "%d", randof (30)); kvmsg_send (kvmsg, cc->publisher); kvmsg_destroy (&kvmsg); DEBUG("Sent a SFD of %d bytes to the server\n",strlen(sfd)); free(sfd); }
static int s_collector (zloop_t *loop, zmq_pollitem_t *poller, void *args) { clonesrv_t *self = (clonesrv_t *) args; kvmsg_t *kvmsg = kvmsg_recv (poller->socket); if (kvmsg) { if (self->active) { kvmsg_set_sequence (kvmsg, ++self->sequence); kvmsg_send (kvmsg, self->publisher); int ttl = atoi (kvmsg_get_prop (kvmsg, "ttl")); if (ttl) kvmsg_set_prop (kvmsg, "ttl", "%" PRId64, zclock_time () + ttl * 1000); kvmsg_store (&kvmsg, self->kvmap); zclock_log ("I: publishing update=%d", (int) self->sequence); } else { // If we already got message from active, drop it, else // hold on pending list if (s_was_pending (self, kvmsg)) kvmsg_destroy (&kvmsg); else zlist_append (self->pending, kvmsg); } } return 0; }
static int s_collector (zloop_t *loop, zmq_pollitem_t *poller, void *args) { clonesrv_t *self = (clonesrv_t *) args; kvmsg_t *kvmsg = kvmsg_recv (poller->socket); if (kvmsg) { kvmsg_set_sequence (kvmsg, ++self->sequence); kvmsg_send (kvmsg, self->publisher); int ttl = atoi (kvmsg_get_prop (kvmsg, "ttl")); if (ttl) kvmsg_set_prop (kvmsg, "ttl", "%" PRId64, zclock_time () + ttl * 1000); kvmsg_store (&kvmsg, self->kvmap); zclock_log ("I: publishing update=%d", (int) self->sequence); } return 0; }