Как посчитать количество деталей в одной мульти части? - PullRequest
0 голосов
/ 11 июня 2018

Используя приведенный ниже код, я получаю счетчик всех частей сообщения MIME, но мое требование состоит в том, чтобы получить счетчик частей в одном теле, состоящем из нескольких частей. Может ли кто-нибудь помочь?

void testFunc() {
            GMimeStream* stream;
            GMimeParser* parser;
            GMimeMessage* msg;
            GMimeObject* root = NULL;

            stream = g_mime_stream_fs_new(fd); // Fd is the email file
            parser = g_mime_parser_new_with_stream(stream);
            g_object_unref(stream);
            msg = g_mime_parser_construct_message(parser);
            g_object_unref(parser);
            if (msg) {
                root = g_mime_message_get_mime_part(msg);
                int part_count=0;
                scan_part(root, &scan_data, &part_count);
            }
}

static void scan_part(GMimeObject *part, struct scan_part_data *scan_data, int *part_count) {
    gboolean is_multipart = GMIME_IS_MULTIPART(part);
    if (is_multipart) {
        GMimeMultipart* mpart = GMIME_MULTIPART(part);
        int count = g_mime_multipart_get_count(mpart);
        int i;

        for (i = 0; i < count; i++) {
            GMimeObject* subpart = g_mime_multipart_get_part(mpart, i);
            scan_part(subpart, scan_data, part_count);
            return;
        }
    } else if (GMIME_IS_MESSAGE_PART(part)) {
        GMimeMessage* msg = g_mime_message_part_get_message(GMIME_MESSAGE_PART(part));
        GMimeObject* subpart = g_mime_message_get_mime_part(msg);
        scan_part(subpart, scan_data, part_count);
        return;
    }

    gboolean is_part = GMIME_IS_PART(part);
    if (is_part || is_multipart) {
        (*part_count)++;
        // some code;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я получил ответ на мой вопрос,

static void scan_part(GMimeObject *part, struct scan_part_data *scan_data, int *part_count) {
    gboolean is_multipart = GMIME_IS_MULTIPART(part);
    if (is_multipart) {
        GMimeMultipart* mpart = GMIME_MULTIPART(part);
        int count = g_mime_multipart_get_count(mpart);
+++     (*part_count)++;
        int i;

        for (i = 0; i < count; i++) {
            GMimeObject* subpart = g_mime_multipart_get_part(mpart, i);
            scan_part(subpart, scan_data, part_count);
            return;
        }
    } else if (GMIME_IS_MESSAGE_PART(part)) {
        GMimeMessage* msg = g_mime_message_part_get_message(GMIME_MESSAGE_PART(part));
        GMimeObject* subpart = g_mime_message_get_mime_part(msg);
        scan_part(subpart, scan_data, part_count);
        return;
    }

    gboolean is_part = GMIME_IS_PART(part);
    if (is_part || is_multipart) {
---     (*part_count)++;
        // some code;
    }
}
0 голосов
/ 11 июня 2018

Чтобы получить счет для одной составной части, просто сделайте это:

int count = g_mime_multipart_get_count (multipart);
...