]> gitweb.ps.run Git - matrix_esp_thesis/commitdiff
start working on Sync example (reply to to_device messages)
authorPatrick <patrick.schoenberger@posteo.de>
Tue, 5 Sep 2023 15:08:25 +0000 (17:08 +0200)
committerPatrick <patrick.schoenberger@posteo.de>
Tue, 5 Sep 2023 15:08:25 +0000 (17:08 +0200)
Todo.md
examples/Sync.c
src/matrix.c
src/matrix.h
src/matrix_http_mongoose.c

diff --git a/Todo.md b/Todo.md
index 23734f765c6fdc304c45ef904ded50a1942757e0..b8e62c527e77e786bb5f65a46c589898315079c1 100644 (file)
--- a/Todo.md
+++ b/Todo.md
@@ -17,4 +17,5 @@
 + add client saving/loading\r
 - overhaul client saving/loading\r
 + esp compatibility\r
-- http requests in chunks/dynamically allocated
\ No newline at end of file
+- http requests in chunks/dynamically allocated\r
+- URL encode (sync next_batch)
\ No newline at end of file
index e8450564f8584235e0e26de30f0244d54719f4ee..eafed27ee8f2a111ef9a3fe804f156934d59cbf4 100644 (file)
@@ -1,8 +1,16 @@
+#include <mjson.h>\r
 #include <matrix.h>\r
 #include <stdio.h>\r
 \r
-#define SERVER       "https://matrix.org"\r
-#define ACCESS_TOKEN "syt_cHNjaG8_yBvTjVTquGCikvsAenOJ_49mBMO"\r
+#define SERVER      "https://matrix.org"\r
+#define USER_ID     "@pscho:matrix.org"\r
+#define USERNAME    "pscho"\r
+#define PASSWORD    "Wc23EbmB9G3faMq"\r
+#define DISPLAYNAME "SyncClient"\r
+\r
+#define ROOM_ID      "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
+#define EVENT_ID     "$_-y42DkC3OmJ_s40gYko7jMwrUQhoXfEut2pMV3E2J8"\r
+#define SESSION_ID   "tzdnJbDrm82D/RpgkZKpILTifQ5Rads+tVzp3ax8+Ls"\r
 \r
 int\r
 main(void)\r
@@ -13,13 +21,71 @@ main(void)
     \r
     MatrixHttpInit(&client);\r
 \r
-    MatrixClientSetAccessToken(&client,\r
-        ACCESS_TOKEN);\r
+    MatrixClientSetUserId(&client, USER_ID);\r
+\r
+    MatrixClientLoginPassword(&client,\r
+        USERNAME,\r
+        PASSWORD,\r
+        DISPLAYNAME);\r
+    \r
+    MatrixClientGenerateOnetimeKeys(&client, 10);\r
+    MatrixClientUploadOnetimeKeys(&client);\r
+    MatrixClientUploadDeviceKey(&client);\r
+    \r
+\r
+    static char eventBuffer[1024];\r
+    MatrixClientGetRoomEvent(&client,\r
+        ROOM_ID,\r
+        EVENT_ID,\r
+        eventBuffer, 1024);\r
+    \r
+    printf("event: %s\n", eventBuffer);\r
+\r
+\r
+    while (getchar() != 'q') {\r
+        static char nextBatch[1024];\r
+\r
+        static char syncBuffer[1024*50];\r
+        MatrixClientSync(&client, syncBuffer, 1024*50, nextBatch);\r
+        \r
+        int res;\r
+\r
+        const char * s = syncBuffer;\r
+        int slen = strlen(syncBuffer);\r
+        \r
+        {\r
+        int koff, klen, voff, vlen, vtype, off = 0;\r
+        for (off = 0; (off = mjson_next(s, slen, off, &koff, &klen,\r
+                                        &voff, &vlen, &vtype)) != 0; ) {\r
+            const char * key = s + koff;\r
+            const char * val = s + voff;\r
+\r
+            printf("%.*s: %.100s\n", klen, key, val);\r
+        }\r
+        }\r
+\r
+        mjson_get_string(s, slen, "$.next_batch", nextBatch, 1024);\r
+\r
+        const char * events;\r
+        int eventsLen;\r
+        res =\r
+            mjson_find(s, slen, "$.to_device.events", &events, &eventsLen);\r
+        \r
+        if (res != MJSON_TOK_INVALID) {\r
+            {\r
+            int koff, klen, voff, vlen, vtype, off = 0;\r
+            for (off = 0; (off = mjson_next(events, eventsLen, off, &koff, &klen,\r
+                                            &voff, &vlen, &vtype)) != 0; ) {\r
+                const char * val = events + voff;\r
+\r
+                printf("%.*s\n", vlen, val);\r
+            }\r
+            }\r
+        }\r
+    }\r
+\r
 \r
-    static char syncBuffer[40000];\r
-    MatrixClientSync(&client,\r
-        syncBuffer, 40000);\r
-    printf("%s", syncBuffer);\r
+    MatrixClientDeleteDevice(&client);\r
         \r
     MatrixHttpDeinit(&client);\r
 \r
index 18b700a2e412b1d3699b1781bb1a9cb40e7d0930..147d9198730c1221a7b0b6db2f44270afefc28eb 100644 (file)
@@ -842,11 +842,34 @@ MatrixClientSendEventEncrypted(
 bool\r
 MatrixClientSync(\r
     MatrixClient * client,\r
-    char * outSyncBuffer, int outSyncCap)\r
+    char * outSyncBuffer, int outSyncCap,\r
+    const char * nextBatch)\r
 {\r
+    // filter={\"event_fields\":[\"to_device\"]}\r
+    static char url[MAX_URL_LEN];\r
+    snprintf(url, MAX_URL_LEN,\r
+        "/_matrix/client/v3/sync%s",\r
+        strlen(nextBatch) > 0 ? "?since=" : "");\r
+    \r
+    int index = strlen(url);\r
+\r
+    for (int i = 0; i < strlen(nextBatch); i++) {\r
+        char c = nextBatch[i];\r
+\r
+        if (c == '~') {\r
+            url[index++] = '%';\r
+            url[index++] = '7';\r
+            url[index++] = 'E';\r
+        }\r
+        else {\r
+            url[index++] = c;\r
+        }\r
+    }\r
+    url[index] = '\0';\r
+\r
     return\r
         MatrixHttpGet(client,\r
-            "/_matrix/client/v3/sync",\r
+            url,\r
             outSyncBuffer, outSyncCap,\r
             true);\r
 }\r
index 20cdc8ce94376c2cca113786dc9b11052c4692c7..da0e85930b726169adbcd3fd0dcbe663b58f884f 100644 (file)
@@ -17,7 +17,7 @@
 #define DEVICE_ID_SIZE 20\r
 #define EXPIRE_MS_SIZE 20\r
 #define REFRESH_TOKEN_SIZE 20\r
-#define MAX_URL_LEN 128\r
+#define MAX_URL_LEN 1024\r
 \r
 #define OLM_IDENTITY_KEYS_JSON_SIZE 128\r
 #define DEVICE_KEY_SIZE 44\r
@@ -275,7 +275,8 @@ MatrixClientSendEventEncrypted(
 bool\r
 MatrixClientSync(\r
     MatrixClient * client,\r
-    char * outSync, int outSyncCap);\r
+    char * outSync, int outSyncCap,\r
+    const char * nextBatch);\r
 \r
 bool\r
 MatrixClientGetRoomEvent(\r
index b9b2ca3e26a37bbdd3d110e16f3c84e0f9865b74..452e26c59fb0b26de08671e449e16caaa029feec 100644 (file)
@@ -43,6 +43,10 @@ MatrixHttpCallback(
 \r
         conn->connection = c;\r
         conn->connected = true;\r
+    }\r
+    if (ev == MG_EV_HTTP_CHUNK)\r
+    {\r
+        \r
     }\r
     if (ev == MG_EV_HTTP_MSG)\r
     {\r