--- /dev/null
+[submodule "ext/olm"]
+ path = ext/olm
+ url = https://gitlab.matrix.org/matrix-org/olm/
--- /dev/null
+CC=gcc\r
+\r
+C_OPTS=-Wall -Wextra -pedantic\r
+C_OPTS+=-I src/\r
+C_OPTS+=-I ext/olm/include/\r
+C_OPTS+=src/matrix.c\r
+\r
+out/examples/%: examples/%.c\r
+ $(CC) -o out/examples/$* examples/$*.c $(C_OPTS)\r
+\r
+\r
+.PHONY: examples\r
+\r
+examples: out/examples/Login out/examples/Send out/examples/SendEncrypted out/examples/Sync
\ No newline at end of file
--- /dev/null
+# Matrix Client Library in C\r
--- /dev/null
+#include <stdio.h>\r
+#include <matrix.h>\r
+\r
+#define SERVER FixedBuf("matrix.org")\r
+#define USERNAME FixedBuf("@pscho:matrix.org")\r
+#define PASSWORD FixedBuf("abcde")\r
+\r
+\r
+int\r
+main(\r
+ int argc,\r
+ char **argv)\r
+{\r
+ MatrixClient client;\r
+ MatrixClientInit(&client, SERVER);\r
+\r
+ MatrixClientLoginPassword(&client,\r
+ USERNAME,\r
+ PASSWORD);\r
+\r
+ static char accessTokenCharBuffer[ACCESS_TOKEN_LEN];\r
+ FixedBuffer accessTokenBuffer = { accessTokenCharBuffer, ACCESS_TOKEN_LEN, 0 };\r
+ MatrixClientGetAccessToken(&client, &accessTokenBuffer);\r
+ printf("Access Token: %.*s\n", accessTokenBuffer.len, (char *)accessTokenBuffer.ptr);\r
+\r
+ return 0;\r
+}
\ No newline at end of file
--- /dev/null
+#include <matrix.h>\r
+\r
+#define SERVER FixedBuf("matrix.org")\r
+#define ACCESS_TOKEN FixedBuf("abc")\r
+#define ROOM_ID FixedBuf("!jhpZBTbckszblMYjMK:matrix.org")\r
+\r
+int\r
+main(\r
+ int argc,\r
+ char **argv)\r
+{\r
+ MatrixClient client;\r
+ MatrixClientCreate(&client,\r
+ SERVER);\r
+\r
+ MatrixClientSetAccessToken(&client,\r
+ ACCESS_TOKEN);\r
+\r
+ MatrixClientSendEvent(&client,\r
+ ROOM_ID,\r
+ FixedBuf("m.room.message"),\r
+ FixedBuf("{\"body\":\"Hello\",\"msgtype\":\"m.text\"}"));\r
+\r
+ return 0;\r
+}
\ No newline at end of file
--- /dev/null
+#include <matrix.h>\r
+\r
+#define SERVER FixedBuf("matrix.org")\r
+#define ACCESS_TOKEN FixedBuf("abc")\r
+#define ROOM_ID FixedBuf("!jhpZBTbckszblMYjMK:matrix.org")\r
+\r
+int\r
+main(\r
+ int argc,\r
+ char **argv)\r
+{\r
+ MatrixClient client;\r
+ MatrixClientCreate(&client,\r
+ SERVER);\r
+\r
+ MatrixClientSetAccessToken(&client,\r
+ ACCESS_TOKEN);\r
+\r
+ MatrixMegolmSession megolm;\r
+ MatrixMegolmSessionInit(&megolm);\r
+ \r
+ MatrixRoomShareMegolmSession(&client,\r
+ ROOM_ID,\r
+ megolm);\r
+ \r
+ MatrixClientSendGroupEncrypted(&client,\r
+ ROOM_ID,\r
+ FixedBuf("m.room.message"),\r
+ FixedBuf("{\"body\":\"Hello\",\"msgtype\":\"m.text\"}"));\r
+\r
+ return 0;\r
+}
\ No newline at end of file
--- /dev/null
+#include <matrix.h>\r
+\r
+#define SERVER "matrix.org"\r
+#define ACCESS_TOKEN "abc"\r
+#define ROOM_ID "!jhpZBTbckszblMYjMK:matrix.org"\r
+\r
+int\r
+main(\r
+ int argc,\r
+ char **argv)\r
+{\r
+ MatrixClient client;\r
+ MatrixClientCreate(&client,\r
+ SERVER);\r
+\r
+ MatrixClientSetAccessToken(&client,\r
+ ACCESS_TOKEN);\r
+\r
+ static char syncCharBuffer[1024];\r
+ FixedBuffer syncBuffer = { syncCharBuffer, 1024, 0 };\r
+ int syncN = 1;\r
+\r
+ while (syncN > 0)\r
+ {\r
+ MatrixClientSyncN(&client, &syncBuffer, &syncN);\r
+ printf("%.*s", syncBuffer.len, (char *)syncBuffer.ptr);\r
+ }\r
+ printf("\n");\r
+\r
+ return 0;\r
+}
\ No newline at end of file
--- /dev/null
+Subproject commit 66294cf7f66ae380683dbb7f43a16a8922249fc8
--- /dev/null
+#include "matrix.h"\r
+\r
+FixedBuffer\r
+FixedBuf(const char * str)\r
+{\r
+ int len = strlen(str);\r
+ FixedBuffer result;\r
+ result.ptr = (char *)str;\r
+ result.size = len;\r
+ result.len = len;\r
+ return result;\r
+}\r
+\r
+\r
+bool\r
+MatrixClientInit(\r
+ MatrixClient * client,\r
+ FixedBuffer server\r
+) {\r
+\r
+}\r
+\r
+bool\r
+MatrixClientLoginPassword(\r
+ MatrixClient * client,\r
+ FixedBuffer username,\r
+ FixedBuffer password\r
+) {\r
+\r
+}\r
+\r
+bool\r
+MatrixClientGetAccessToken(\r
+ MatrixClient * client,\r
+ FixedBuffer * outBuffer\r
+) {\r
+\r
+}\r
--- /dev/null
+#ifndef MATRIX__H\r
+#define MATRIX__H\r
+\r
+#include <stdbool.h>\r
+#include <string.h>\r
+\r
+#include <olm/olm.h>\r
+\r
+\r
+\r
+\r
+\r
+typedef struct FixedBuffer {\r
+ void * ptr;\r
+ int size;\r
+ int len;\r
+} FixedBuffer;\r
+\r
+FixedBuffer\r
+FixedBuf(const char * str);\r
+\r
+\r
+\r
+#define ACCESS_TOKEN_LEN 20 // TODO: fix\r
+\r
+typedef struct MatrixClient {\r
+ OlmAccount * olmAcc;\r
+ char accessToken[ACCESS_TOKEN_LEN];\r
+} MatrixClient;\r
+\r
+bool\r
+MatrixClientInit(\r
+ MatrixClient * client,\r
+ FixedBuffer server\r
+);\r
+\r
+bool\r
+MatrixClientLoginPassword(\r
+ MatrixClient * client,\r
+ FixedBuffer username,\r
+ FixedBuffer password\r
+);\r
+\r
+bool\r
+MatrixClientGetAccessToken(\r
+ MatrixClient * client,\r
+ FixedBuffer * outBuffer\r
+);\r
+\r
+#endif\r