From dfb950bc7f427f00a9f373a6deaf7fb1251ebd13 Mon Sep 17 00:00:00 2001 From: LDA Date: Tue, 27 Aug 2024 18:56:38 +0200 Subject: [PATCH] [MOD] Use keyed schemas for the sync --- Schema/SyncResponse.json | 4 ++-- src/Routes/RouteSync.c | 38 +++++++++++++++++--------------------- src/State.c | 6 ++++-- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/Schema/SyncResponse.json b/Schema/SyncResponse.json index c4990bc..74c5259 100644 --- a/Schema/SyncResponse.json +++ b/Schema/SyncResponse.json @@ -88,8 +88,8 @@ }, "Rooms": { "fields": { - "invite": { "type": "object" }, - "join": { "type": "object" } + "invite": { "type": "{InvitedRooms}" }, + "join": { "type": "{JoinedRooms}" } }, "type": "struct" }, diff --git a/src/Routes/RouteSync.c b/src/Routes/RouteSync.c index 1ba46bc..c38a937 100644 --- a/src/Routes/RouteSync.c +++ b/src/Routes/RouteSync.c @@ -155,22 +155,19 @@ ROUTE_IMPL(RouteSync, path, argp) for (i = 0; i < ArraySize(invites); i++) { char *roomId = ArrayGet(invites, i); - InvitedRooms invited = { 0 }; - HashMap *invitedObject; + InvitedRooms *invited; if (IsRoomFiltered(filterData, roomId)) { continue; } - invited.invite_state.events = ArrayCreate(); - invitedObject = InvitedRoomsToJson(&invited); - JsonSet( - sync.rooms.invite, - JsonValueObject(invitedObject), - 1, roomId - ); - InvitedRoomsFree(&invited); + invited = Malloc(sizeof(*invited)); + memset(invited, 0, sizeof(*invited)); + + /* TODO: Populate the invitestate */ + invited->invite_state.events = ArrayCreate(); + HashMapSet(sync.rooms.invite, roomId, invited); } UserFreeList(invites); @@ -180,10 +177,9 @@ ROUTE_IMPL(RouteSync, path, argp) { /* TODO: Rename these variables */ char *roomId = ArrayGet(joins, i); - JoinedRooms joined = { 0 }; + JoinedRooms *joined; char *firstEvent = NULL; char *type, *key, *id; - HashMap *joinedObj; State *state; Array *el; size_t j; @@ -194,12 +190,14 @@ ROUTE_IMPL(RouteSync, path, argp) continue; } + joined = Malloc(sizeof(*joined)); + memset(joined, 0, sizeof(*joined)); + el = UserGetEvents(user, currBatch, roomId); r = RoomLock(db, roomId); state = StateCurrent(r); - joined.timeline.events = ArrayCreate(); - + joined->timeline.events = ArrayCreate(); for (j = 0; j < ArraySize(el); j++) { char *event = ArrayGet(el, j); @@ -217,18 +215,18 @@ ROUTE_IMPL(RouteSync, path, argp) firstEvent = c->event_id; } - ArrayAdd(joined.timeline.events, c); + ArrayAdd(joined->timeline.events, c); } JsonFree(eventObj); JsonFree(filteredObj); } - joined.timeline.prev_batch = UserNewMessageToken( + joined->timeline.prev_batch = UserNewMessageToken( user, roomId, firstEvent ); /* TODO: Don't shove the entire state. * That's a recipe for disaster, especially on large rooms. */ - joined.state.events = ArrayCreate(); + joined->state.events = ArrayCreate(); while (StateIterate(state, &type, &key, (void **) &id)) { HashMap *e = RoomEventFetch(r, id); @@ -238,7 +236,7 @@ ROUTE_IMPL(RouteSync, path, argp) JsonFree(e); - ArrayAdd(joined.state.events, s); + ArrayAdd(joined->state.events, s); Free(type); Free(key); } @@ -247,9 +245,7 @@ ROUTE_IMPL(RouteSync, path, argp) RoomUnlock(r); UserFreeList(el); - joinedObj = JoinedRoomsToJson(&joined); - HashMapSet(sync.rooms.join, roomId, JsonValueObject(joinedObj)); - JoinedRoomsFree(&joined); + HashMapSet(sync.rooms.join, roomId, joined); } UserFreeList(joins); diff --git a/src/State.c b/src/State.c index c5756dc..b7a49cd 100644 --- a/src/State.c +++ b/src/State.c @@ -77,10 +77,12 @@ V1Cmp(void *a, void *b) JsonValueAsString(JsonGet(e1, 1, "event_id")); char *e2id = JsonValueAsString(JsonGet(e2, 1, "event_id")); + + /* Matrix, *seriously*? */ unsigned char *sha1 = Sha1(e1id); unsigned char *sha2 = Sha1(e2id); - char *str1 = ShaToHex(sha1); - char *str2 = ShaToHex(sha2); + char *str1 = ShaToHex(sha1, HASH_SHA1); + char *str2 = ShaToHex(sha2, HASH_SHA1); int ret = strcmp(str1, str2) * -1; Free(str1);