Skip to content

Commit

Permalink
jmap_contact.c: parameterize /query method
Browse files Browse the repository at this point in the history
  • Loading branch information
ksmurchison committed May 24, 2023
1 parent e0572b0 commit e546e06
Showing 1 changed file with 24 additions and 16 deletions.
40 changes: 24 additions & 16 deletions imap/jmap_contact.c
Original file line number Diff line number Diff line change
Expand Up @@ -3935,7 +3935,19 @@ static int _contactsquery_cmp QSORT_R_COMPAR_ARGS(const void *va,
return 0;
}

static int _contactsquery(struct jmap_req *req, unsigned kind)
static int _contactsquery(struct jmap_req *req, unsigned kind,
void *(*_filter_parse)(json_t *arg),
void (*_filter_free)(void *vf),
void (*_filter_validate)(jmap_req_t *req,
struct jmap_parser *parser,
json_t *filter,
json_t *unsupported,
void *rock,
json_t **err),
int (*_comparator_validate)(jmap_req_t *req,
struct jmap_comparator *comp,
void *rock,
json_t **err))
{
if (!has_addressbooks(req)) {
jmap_error(req, json_pack("{s:s}", "type", "accountNoAddressbooks"));
Expand All @@ -3959,14 +3971,8 @@ static int _contactsquery(struct jmap_req *req, unsigned kind)
/* Parse request */
json_t *err = NULL;
jmap_query_parse(req, &parser, NULL, NULL,
kind == CARDDAV_KIND_GROUP ?
contactgroup_filter_validate :
contact_filter_validate,
NULL,
kind == CARDDAV_KIND_GROUP ?
contactgroup_comparator_validate :
contact_comparator_validate,
NULL,
_filter_validate, NULL,
_comparator_validate, NULL,
&query, &err);
if (err) {
jmap_error(req, err);
Expand All @@ -3983,9 +3989,7 @@ static int _contactsquery(struct jmap_req *req, unsigned kind)
json_t *filter = json_object_get(req->args, "filter");
const char *wantuid = NULL;
if (JNOTNULL(filter)) {
parsed_filter = jmap_buildfilter(filter,
kind == CARDDAV_KIND_GROUP ?
contactgroup_filter_parse : contact_filter_parse);
parsed_filter = jmap_buildfilter(filter, _filter_parse);
wantuid = json_string_value(json_object_get(filter, "uid"));
}

Expand Down Expand Up @@ -4112,21 +4116,25 @@ static int _contactsquery(struct jmap_req *req, unsigned kind)
jmap_query_fini(&query);
jmap_parser_fini(&parser);
if (parsed_filter) {
jmap_filter_free(parsed_filter, kind == CARDDAV_KIND_GROUP ?
contactgroup_filter_free : contact_filter_free);
jmap_filter_free(parsed_filter, _filter_free);
}
if (db) carddav_close(db);
return 0;
}

static int jmap_contact_query(struct jmap_req *req)
{
return _contactsquery(req, CARDDAV_KIND_CONTACT);
return _contactsquery(req, CARDDAV_KIND_CONTACT,
&contact_filter_parse, &contact_filter_free,
&contact_filter_validate, &contact_comparator_validate);
}

static int jmap_contactgroup_query(struct jmap_req *req)
{
return _contactsquery(req, CARDDAV_KIND_GROUP);
return _contactsquery(req, CARDDAV_KIND_GROUP,
&contactgroup_filter_parse, &contactgroup_filter_free,
&contactgroup_filter_validate,
&contactgroup_comparator_validate);
}

static struct vparse_entry *_card_multi(struct vparse_card *card,
Expand Down

0 comments on commit e546e06

Please sign in to comment.