Lines Matching defs:mpctx
31 struct search_mimepart_context *mpctx);
33 static int seach_arg_mime_parent_match(struct search_mimepart_context *mpctx,
36 struct message_part *part = mpctx->mime_part;
51 prev_depth = mpctx->depth;
52 prev_index = mpctx->index;
55 (&mpctx->stack, mpctx->depth-1);
57 mpctx->mime_part = part->parent;
60 mpctx->index = level->index;
61 mpctx->depth = mpctx->depth-1;
63 (args->value.subargs, search_mime_arg, mpctx);
65 mpctx->mime_part = part;
66 mpctx->index = prev_index;
67 mpctx->depth = prev_depth;
71 static int seach_arg_mime_child_match(struct search_mimepart_context *mpctx,
79 part = mpctx->mime_part;
92 prev_depth = mpctx->depth;
93 prev_index = mpctx->index;
95 depth = mpctx->depth;
101 array_copy(&prev_stack.arr, 0, &mpctx->stack.arr, 0,
102 array_count(&mpctx->stack));
105 if (depth < array_count(&mpctx->stack))
106 level = array_idx_modifiable(&mpctx->stack, depth);
108 i_assert(depth == array_count(&mpctx->stack));
109 level = array_append_space(&mpctx->stack);
115 mpctx->mime_part = part;
118 mpctx->depth = depth - prev_depth;
119 mpctx->index = level->index;
121 (args->value.subargs, search_mime_arg, mpctx)) != 0)
125 if (depth < array_count(&mpctx->stack))
126 level = array_idx_modifiable(&mpctx->stack, depth);
128 i_assert(depth == array_count(&mpctx->stack));
129 level = array_append_space(&mpctx->stack);
138 level = array_idx_modifiable(&mpctx->stack, depth);
146 array_clear(&mpctx->stack);
147 array_copy(&mpctx->stack.arr, 0, &prev_stack.arr, 0,
151 mpctx->mime_part = prev_part;
152 mpctx->index = prev_index;
153 mpctx->depth = prev_depth;
159 struct search_mimepart_context *mpctx ATTR_UNUSED,
171 struct search_mimepart_context *mpctx ATTR_UNUSED,
204 struct search_mimepart_context *mpctx ATTR_UNUSED,
247 seach_arg_mime_filename_match(struct search_mimepart_context *mpctx,
250 struct index_search_context *ictx = mpctx->index_ctx;
251 struct message_part *part = mpctx->mime_part;
259 if (mpctx->buf == NULL)
260 mpctx->buf = str_new(default_pool, 256);
263 str_truncate(mpctx->buf, 0);
266 strlen(arg->value.str), mpctx->buf) < 0)
268 key = i_strdup(str_c(mpctx->buf));
274 str_truncate(mpctx->buf, 0);
276 strlen(value), mpctx->buf) >= 0)
277 value = str_c(mpctx->buf);
297 struct search_mimepart_context *mpctx ATTR_UNUSED,
325 seach_arg_mime_language_match(struct search_mimepart_context *mpctx,
328 struct message_part_data *data = mpctx->mime_part->data;
346 static int search_mime_arg_match(struct search_mimepart_context *mpctx,
349 struct message_part *part = mpctx->mime_part;
367 return seach_arg_mime_substring_match(mpctx,
387 return seach_arg_mime_language_match(mpctx, arg->value.str);
415 (mpctx, arg->type, arg->value.time, data->envelope);
424 (mpctx, arg->type, arg->value.str, data->envelope);
429 return seach_arg_mime_substring_match(mpctx,
434 return seach_arg_mime_substring_match(mpctx,
439 return seach_arg_mime_substring_match(mpctx,
443 return (mpctx->depth == arg->value.number ? 1 : 0);
445 return (mpctx->depth >= arg->value.number ? 1 : 0);
447 return (mpctx->depth <= arg->value.number ? 1 : 0);
449 return (mpctx->index == arg->value.number ? 1 : 0);
452 return seach_arg_mime_parent_match(mpctx, arg);
454 return seach_arg_mime_child_match(mpctx, arg);
460 return seach_arg_mime_filename_match(mpctx, arg);
471 struct search_mimepart_context *mpctx)
473 switch (search_mime_arg_match(mpctx, arg)) {
486 static int seach_arg_mime_parts_match(struct search_mimepart_context *mpctx,
494 level = array_append_space(&mpctx->stack);
499 mpctx->mime_part = part;
502 mpctx->index = level->index;
503 mpctx->depth = array_count(&mpctx->stack)-1;
506 (args, search_mime_arg, mpctx)) != 0)
509 level = array_append_space(&mpctx->stack);
516 array_delete(&mpctx->stack, array_count(&mpctx->stack)-1, 1);
518 (&mpctx->stack, array_count(&mpctx->stack)-1);
530 static int search_arg_match_mimepart(struct search_mimepart_context *mpctx,
533 struct index_search_context *ctx = mpctx->index_ctx;
539 if (mpctx->pool == NULL) {
540 mpctx->pool = pool_alloconly_create
542 p_array_init(&mpctx->stack, mpctx->pool, 16);
544 if (mpctx->mime_parts == NULL) {
550 if (imap_bodystructure_parse_full(bodystructure, mpctx->pool,
551 &mpctx->mime_parts, &error) < 0)
558 (mpctx, arg->value.mime_part->args, mpctx->mime_parts);
562 struct search_mimepart_context *mpctx)
564 switch (search_arg_match_mimepart(mpctx, arg)) {
580 struct search_mimepart_context mpctx;
583 i_zero(&mpctx);
584 mpctx.index_ctx = ctx;
587 search_mimepart_arg, &mpctx);
589 pool_unref(&mpctx.pool);
590 str_free(&mpctx.buf);
596 struct search_mimepart_context *mpctx ATTR_UNUSED)
603 search_arg_mime_filename_deinit(mpctx, arg);
613 struct search_mimepart_context mpctx;
619 i_zero(&mpctx);
620 mpctx.index_ctx = ctx;
624 search_mime_arg_deinit, &mpctx);