From b1c23ee53ac95d13ab9581a73829e705c3628ba4 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Fri, 7 Jul 2023 03:15:13 +0000 Subject: [PATCH] Begin prototyping state resolution API. --- src/State.c | 85 +++++++++++++++++++++++++++++++++++++++++++++ src/include/Event.h | 1 + src/include/State.h | 46 ++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/State.c create mode 100644 src/include/State.h diff --git a/src/State.c b/src/State.c new file mode 100644 index 0000000..d8dc22b --- /dev/null +++ b/src/State.c @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2022-2023 Jordan Bancino <@jordan:bancino.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include + +#include +#include + +#include +#include + +static HashMap * +StateResolveV1(Array *states) +{ + return NULL; +} + +static HashMap * +StateResolveV2(Array *states) +{ + return NULL; +} + +HashMap * +StateResolve(Room *room, HashMap *event) +{ + Array *states; + size_t i; + + Array *prevEvents; + + if (!room || !event) + { + return NULL; + } + + /* TODO: Return cached state if it exists */ + + states = ArrayCreate(); + if (!states) + { + return NULL; + } + + prevEvents = HashMapGet(event, "prev_events"); + + for (i = 0; i < ArraySize(prevEvents); i++) + { + HashMap *prevEvent = ArrayGet(prevEvents, i); + HashMap *state = StateResolve(room, prevEvent); + + /* TODO: Apply prevEvent to state if it is a state event */ + + ArrayAdd(states, state); + } + + switch (RoomVersionGet(room)) + { + case 1: + return StateResolveV1(states); + default: + return StateResolveV2(states); + } +} diff --git a/src/include/Event.h b/src/include/Event.h index cff349b..5246b17 100644 --- a/src/include/Event.h +++ b/src/include/Event.h @@ -49,6 +49,7 @@ extern char * EventContentHash(HashMap *); * an event comes in from the federation APIs or the * homeserver has finished generating a PDU for a client * event. + */ extern char * EventIdGet(Room *, HashMap *); #endif /* TELODENDRIA_EVENT_H */ diff --git a/src/include/State.h b/src/include/State.h new file mode 100644 index 0000000..08f13b4 --- /dev/null +++ b/src/include/State.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2022-2023 Jordan Bancino <@jordan:bancino.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef TELODENDRIA_STATE_H +#define TELODENDRIA_STATE_H + +/*** + * @Nm State + * @Nd The Matrix state resolution algorithms. + * @Dd July 6 2023 + * + * .Nm implements the state resolution algorithms required + * to maintain room state. + */ + +#include + +#include + +/** + * Compute the room state before the specified event was sent. + */ +extern HashMap * StateResolve(Room *, HashMap *); + +#endif /* TELODENDRIA_STATE_H */