diff --git a/src/Filter.c b/src/Filter.c index 0e07247..dc72596 100644 --- a/src/Filter.c +++ b/src/Filter.c @@ -24,11 +24,15 @@ */ #include +#include #include #include +#include + #include + bool IsRoomFiltered(Filter *filter, char *roomID) { @@ -91,3 +95,50 @@ FilterApply(Filter * filter, HashMap * event) (void) sender; return copy; } +Filter * +FilterDecode(Db *db, char *user, char *filterStr) +{ + Filter *ret; + DbRef *filterRef; + HashMap *filterObj; + if (!db || !user || !filterStr) + { + return NULL; + } + + if (*filterStr != '{') + { + char *err; /* TODO: use error status somewhere... */ + + filterRef = DbLock(db, 3, "filters", user, filterStr); + filterObj = DbJson(filterRef); + ret = Malloc(sizeof(*ret)); + memset(ret, 0, sizeof(*ret)); + + if (!FilterFromJson(filterObj, ret, &err)) + { + DbUnlock(db, filterRef); + Free(ret); + return NULL; + } + + DbUnlock(db, filterRef); + (void) err; + return ret; + } + + /* TODO: Decode JSON here... */ + return NULL; +} + +void +FilterDestroy(Filter *filter) +{ + if (!filter) + { + return; + } + + FilterFree(filter); + Free(filter); +} diff --git a/src/Routes/RouteSync.c b/src/Routes/RouteSync.c index 8ad27da..89ff425 100644 --- a/src/Routes/RouteSync.c +++ b/src/Routes/RouteSync.c @@ -68,7 +68,7 @@ ROUTE_IMPL(RouteSync, path, argp) HashMap *params = NULL; HashMap *response = NULL; SyncResponse sync = { 0 }; - Filter filterData = { 0 }; + Filter *filterData = NULL; Array *invites; Array *joins; @@ -118,26 +118,15 @@ ROUTE_IMPL(RouteSync, path, argp) filter = HashMapGet(params, "filter"); timeoutDuration = timeout ? atoi(timeout) : 0; - /* TODO: Abstract this into a DecodeFilter function */ - if (filter && *filter != '{') + if (filter) { - /* The filter must be located in the database */ - DbRef *filterRef = DbLock(db, 3, - "filters", UserGetName(user), filter - ); - HashMap *filterJson = DbJson(filterRef); - - if (!FilterFromJson(filterJson, &filterData, &err)) + char *userName = UserGetName(user); + if (!(filterData = FilterDecode(db, userName, filter))) { + err = "Couldn't decode filter given in"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); response = MatrixErrorCreate(M_BAD_JSON, err); - - DbUnlock(db, filterRef); - goto finish; } - - /* We now grabbed a filter JSON */ - DbUnlock(db, filterRef); } if (!prevBatch) @@ -184,7 +173,7 @@ ROUTE_IMPL(RouteSync, path, argp) InvitedRooms invited = { 0 }; HashMap *invitedObject; - if (IsRoomFiltered(&filterData, roomId)) + if (IsRoomFiltered(filterData, roomId)) { continue; } @@ -215,7 +204,7 @@ ROUTE_IMPL(RouteSync, path, argp) size_t j; Room *r; - if (IsRoomFiltered(&filterData, roomId)) + if (IsRoomFiltered(filterData, roomId)) { continue; } @@ -230,7 +219,7 @@ ROUTE_IMPL(RouteSync, path, argp) { char *event = ArrayGet(el, j); HashMap *eventObj = RoomEventFetch(r, event); - HashMap *filteredObj = FilterApply(&filterData, eventObj); + HashMap *filteredObj = FilterApply(filterData, eventObj); if (filteredObj) { @@ -289,7 +278,7 @@ ROUTE_IMPL(RouteSync, path, argp) response = SyncResponseToJson(&sync); SyncResponseFree(&sync); finish: - FilterFree(&filterData); + FilterDestroy(filterData); UserUnlock(user); (void) path; return response; diff --git a/src/State.c b/src/State.c index 5631e5b..32d36af 100644 --- a/src/State.c +++ b/src/State.c @@ -379,7 +379,13 @@ StateCurrent(Room *room) return ret; } -bool StateIterate(HashMap *state, char **type, char **key, void **event) + +/* TODO: USING A ',' DELIMITED HASHMAP IS A _BAD_ IDEA! + * I'll need to change these functions, and some things in the room + * implementation, thankfully _that_ was abstracted away, so I don't have + * to think about it too much... */ +bool +StateIterate(HashMap *state, char **type, char **key, void **event) { char *tuple; bool ret; @@ -400,6 +406,7 @@ bool StateIterate(HashMap *state, char **type, char **key, void **event) return ret; } + char * StateGet(HashMap *state, char *type, char *key) { diff --git a/src/include/Filter.h b/src/include/Filter.h index b55e754..f60daa5 100644 --- a/src/include/Filter.h +++ b/src/include/Filter.h @@ -28,6 +28,7 @@ #include #include +#include /*** * @Nm Filter @@ -52,4 +53,16 @@ FilterApply(Filter *, HashMap *); */ extern bool IsRoomFiltered(Filter *, char *); +/** + * Decodes a filter from a JSON stream to decode or an ID that was + * registered using the filter API. + */ +extern Filter * FilterDecode(Db *, char *, char *); + +/** + * Frees all memory created by + * .Fn FilterDecode . + */ +extern void FilterDestroy(Filter *); + #endif /* TELODENDRIA_FILTER_H */