/* Single-header tools for Parsee tools. */ #include #include #include #include #include #include #include #include #include #include #define GrabString(obj, ...) JsonValueAsString(JsonGet(obj, __VA_ARGS__)) #define GrabInteger(obj, ...) JsonValueAsInteger(JsonGet(obj, __VA_ARGS__)) #define GrabBoolean(obj, ...) JsonValueAsBoolean(JsonGet(obj, __VA_ARGS__)) #define GrabObject(obj, ...) JsonValueAsObject(JsonGet(obj, __VA_ARGS__)) #define GrabArray(obj, ...) JsonValueAsArray(JsonGet(obj, __VA_ARGS__)) Uri * DelegateServer(char *raw) { HttpClientContext *ctx = NULL; Stream *stream = NULL; HashMap *reply = NULL; Uri *ret = NULL; if (!raw) { return NULL; } ctx = HttpRequest( HTTP_GET, HTTP_FLAG_TLS, 443, raw, "/.well-known/matrix/client" ); HttpRequestSendHeaders(ctx); switch (HttpRequestSend(ctx)) { case HTTP_OK: stream = HttpClientStream(ctx); reply = JsonDecode(stream); if (!reply) { goto end; } ret = UriParse(JsonValueAsString(JsonGet( reply, 2, "m.homeserver", "base_url" ))); break; default: /* TODO */ break; } if (ret && !ret->port && StrEquals(ret->proto, "https")) { ret->port = 443; } if (ret && !ret->port) { ret->port = 80; } end: HttpClientContextFree(ctx); JsonFree(reply); return ret; } Db * GetDB(char *config) { size_t lmdb_size; Db *ret = NULL; char *db_path; HashMap *json; Stream *file; if (!config) { return NULL; } file = StreamOpen(config, "r"); json = JsonDecode(file); StreamClose(file); if (!json) { return NULL; } lmdb_size = GrabInteger(json, 1, "db_size"); db_path = GrabString(json, 1, "db"); if (!db_path) { JsonFree(json); return NULL; } if (lmdb_size) { ret = DbOpenLMDB(db_path, lmdb_size); } else { ret = DbOpen(db_path, 0); } JsonFree(json); return ret; }