forked from lda/telodendria
Add schema for PDUs v1 and v3, the only unique PDU formats.
All other room versions use one of these two PDU formats.
This commit is contained in:
parent
bc71a7ec01
commit
d565640455
6 changed files with 244 additions and 10 deletions
|
@ -37,6 +37,13 @@
|
||||||
|
|
||||||
#define MAX_DEPENDENCIES 32
|
#define MAX_DEPENDENCIES 32
|
||||||
|
|
||||||
|
static char *
|
||||||
|
Trim(char c, char *str)
|
||||||
|
{
|
||||||
|
while (*str == c) str++;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
static JsonType
|
static JsonType
|
||||||
TypeToJsonType(char *type)
|
TypeToJsonType(char *type)
|
||||||
{
|
{
|
||||||
|
@ -610,11 +617,11 @@ Main(Array * args)
|
||||||
JsonType jsonType = isEnum ? JSON_STRING : TypeToJsonType(fieldType);
|
JsonType jsonType = isEnum ? JSON_STRING : TypeToJsonType(fieldType);
|
||||||
char *jsonTypeStr = JsonTypeToStr(jsonType);
|
char *jsonTypeStr = JsonTypeToStr(jsonType);
|
||||||
|
|
||||||
StreamPrintf(implFile, " val = HashMapGet(json, \"%s\");\n", key);
|
StreamPrintf(implFile, " val = HashMapGet(json, \"%s\");\n", Trim('_', key));
|
||||||
|
|
||||||
StreamPrintf(implFile, " if (val)\n {\n");
|
StreamPrintf(implFile, " if (val)\n {\n");
|
||||||
StreamPrintf(implFile, " if (JsonValueType(val) != %s)\n {\n", jsonTypeStr);
|
StreamPrintf(implFile, " if (JsonValueType(val) != %s)\n {\n", jsonTypeStr);
|
||||||
StreamPrintf(implFile, " *errp = \"%s.%s must be of type %s.\";\n", type, key, fieldType);
|
StreamPrintf(implFile, " *errp = \"%s.%s must be of type %s.\";\n", type, Trim('_', key), fieldType);
|
||||||
StreamPrintf(implFile, " return 0;\n");
|
StreamPrintf(implFile, " return 0;\n");
|
||||||
StreamPrintf(implFile, " }\n\n");
|
StreamPrintf(implFile, " }\n\n");
|
||||||
if (StrEquals(fieldType, "array"))
|
if (StrEquals(fieldType, "array"))
|
||||||
|
@ -853,12 +860,12 @@ Main(Array * args)
|
||||||
StreamPrintf(implFile, " {\n");
|
StreamPrintf(implFile, " {\n");
|
||||||
StreamPrintf(implFile, " ArrayAdd(jsonArr, JsonValueDuplicate(ArrayGet(val->%s, i)));\n", key);
|
StreamPrintf(implFile, " ArrayAdd(jsonArr, JsonValueDuplicate(ArrayGet(val->%s, i)));\n", key);
|
||||||
StreamPrintf(implFile, " }\n");
|
StreamPrintf(implFile, " }\n");
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueArray(jsonArr))\n", key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueArray(jsonArr));\n", Trim('_', key));
|
||||||
StreamPrintf(implFile, " }\n");
|
StreamPrintf(implFile, " }\n");
|
||||||
}
|
}
|
||||||
else if (StrEquals(fieldType, "object"))
|
else if (StrEquals(fieldType, "object"))
|
||||||
{
|
{
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueObject(JsonDuplicate(val->%s)));\n", key, key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueObject(JsonDuplicate(val->%s)));\n", Trim('_', key), key);
|
||||||
}
|
}
|
||||||
else if (*fieldType == '[' && fieldType[strlen(fieldType) - 1] == ']')
|
else if (*fieldType == '[' && fieldType[strlen(fieldType) - 1] == ']')
|
||||||
{
|
{
|
||||||
|
@ -920,7 +927,7 @@ Main(Array * args)
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamPrintf(implFile, " }\n");
|
StreamPrintf(implFile, " }\n");
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueArray(jsonArr));\n", key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueArray(jsonArr));\n", Trim('_', key));
|
||||||
StreamPrintf(implFile, " }\n");
|
StreamPrintf(implFile, " }\n");
|
||||||
|
|
||||||
fieldType[strlen(fieldType)] = ']';
|
fieldType[strlen(fieldType)] = ']';
|
||||||
|
@ -931,17 +938,17 @@ Main(Array * args)
|
||||||
{
|
{
|
||||||
if (isEnum)
|
if (isEnum)
|
||||||
{
|
{
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueString(%sToStr(val->%s)));\n", key, fieldType, key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueString(%sToStr(val->%s)));\n", Trim('_', key), fieldType, key);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueObject(%sToJson(&val->%s)));\n", key, fieldType, key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValueObject(%sToJson(&val->%s)));\n", Trim('_', key), fieldType, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*fieldType = toupper(*fieldType);
|
*fieldType = toupper(*fieldType);
|
||||||
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValue%s(val->%s));\n", key, fieldType, key);
|
StreamPrintf(implFile, " HashMapSet(json, \"%s\", JsonValue%s(val->%s));\n", Trim('_', key), fieldType, key);
|
||||||
*fieldType = tolower(*fieldType);
|
*fieldType = tolower(*fieldType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1034,7 +1041,7 @@ Main(Array * args)
|
||||||
StreamPrintf(implFile, " if");
|
StreamPrintf(implFile, " if");
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamPrintf(implFile, " (StrEquals(str, \"%s\"))\n {\n", key);
|
StreamPrintf(implFile, " (StrEquals(str, \"%s\"))\n {\n", Trim('_', key));
|
||||||
StreamPrintf(implFile, " return %s;\n", JsonValueAsString(JsonGet(fields, 2, key, "name")));
|
StreamPrintf(implFile, " return %s;\n", JsonValueAsString(JsonGet(fields, 2, key, "name")));
|
||||||
StreamPrintf(implFile, " }\n");
|
StreamPrintf(implFile, " }\n");
|
||||||
}
|
}
|
||||||
|
@ -1053,7 +1060,7 @@ Main(Array * args)
|
||||||
char *name = JsonValueAsString(JsonGet(fields, 2, key, "name"));
|
char *name = JsonValueAsString(JsonGet(fields, 2, key, "name"));
|
||||||
|
|
||||||
StreamPrintf(implFile, " case %s:\n", name);
|
StreamPrintf(implFile, " case %s:\n", name);
|
||||||
StreamPrintf(implFile, " return \"%s\";\n", key);
|
StreamPrintf(implFile, " return \"%s\";\n", Trim('_', key));
|
||||||
}
|
}
|
||||||
StreamPrintf(implFile, " default:\n");
|
StreamPrintf(implFile, " default:\n");
|
||||||
StreamPrintf(implFile, " return NULL;\n");
|
StreamPrintf(implFile, " return NULL;\n");
|
||||||
|
|
58
Schema/ClientEvent.json
Normal file
58
Schema/ClientEvent.json
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"guard": "TELODENDRIA_SCHEMA_CLIENTEVENT_H",
|
||||||
|
"header": "Schema/ClientEvent.h",
|
||||||
|
"types": {
|
||||||
|
"ClientEventUnsignedData": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"age": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"prev_content": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"redacted_because": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"transaction_id": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ClientEvent": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"content": {
|
||||||
|
"type": "object",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"event_id": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"origin_server_ts": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"room_id": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"state_key": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"_unsigned": {
|
||||||
|
"type": "ClientEventUnsignedData"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
81
Schema/PduV1.json
Normal file
81
Schema/PduV1.json
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
"guard": "TELODENDRIA_SCHEMA_PDUV1_H",
|
||||||
|
"header": "Schema/PduV1.h",
|
||||||
|
"types": {
|
||||||
|
"PduV1EventHash": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PduV1UnsignedData": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"age": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PduV1": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"auth_events": {
|
||||||
|
"type": "array",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"type": "object",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"depth": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"event_id": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"hashes": {
|
||||||
|
"type": "PduV1EventHash",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"origin_server_ts": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"prev_events": {
|
||||||
|
"type": "array",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"redacts": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"room_id": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"signatures": {
|
||||||
|
"type": "object",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"state_key": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"_unsigned": {
|
||||||
|
"type": "PduV1UnsignedData"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
77
Schema/PduV3.json
Normal file
77
Schema/PduV3.json
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
"guard": "TELODENDRIA_SCHEMA_PDUV3_H",
|
||||||
|
"header": "Schema/PduV3.h",
|
||||||
|
"types": {
|
||||||
|
"PduV3EventHash": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PduV3UnsignedData": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"age": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PduV3": {
|
||||||
|
"type": "struct",
|
||||||
|
"fields": {
|
||||||
|
"auth_events": {
|
||||||
|
"type": "[string]",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"type": "object",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"depth": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"hashes": {
|
||||||
|
"type": "PduV3EventHash",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"origin_server_ts": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"prev_events": {
|
||||||
|
"type": "[string]",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"redacts": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"room_id": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"signatures": {
|
||||||
|
"type": "object",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"state_key": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"_unsigned": {
|
||||||
|
"type": "PduV3UnsignedData"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -141,6 +141,7 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
||||||
response = MatrixErrorCreate(M_UNAUTHORIZED, NULL);
|
response = MatrixErrorCreate(M_UNAUTHORIZED, NULL);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonValueFree(HashMapDelete(JsonValueAsObject(HashMapGet(aliases, "alias")), alias));
|
JsonValueFree(HashMapDelete(JsonValueAsObject(HashMapGet(aliases, "alias")), alias));
|
||||||
}
|
}
|
||||||
response = HashMapCreate();
|
response = HashMapCreate();
|
||||||
|
|
|
@ -38,6 +38,16 @@
|
||||||
|
|
||||||
#include <Room.h>
|
#include <Room.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the value of a state tuple.
|
||||||
|
*/
|
||||||
|
extern char *StateGet(HashMap *, char *, char *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a state tuple to a value.
|
||||||
|
*/
|
||||||
|
extern char *StateSet(HashMap *, char *, char *, char *);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the room state before the specified event was sent.
|
* Compute the room state before the specified event was sent.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue