static int pop_create_body (struct _pop3_message *mpm) { int status; mu_body_t body = NULL; mu_message_t msg = mpm->message; /* FIXME: The owner of the body *must* be the message it belongs to. */ status = mu_body_create (&body, msg); if (status) return status; mu_body_set_get_stream (body, pop_body_get_stream, msg); mu_body_set_size (body, pop_body_size, msg); mu_body_set_lines (body, pop_body_lines, msg); mu_message_set_body (mpm->message, body, mpm); return 0; }
static int nntp_mailbox_get_message (mu_mailbox_t mbox, size_t msgno, mu_message_t *pmsg) { m_nntp_t m_nntp = mbox->data; msg_nntp_t msg_nntp; mu_message_t msg = NULL; int status; size_t i; /* Sanity. */ if (pmsg == NULL) return MU_ERR_OUT_PTR_NULL; msgno--; mu_monitor_rdlock (mbox->monitor); /* See if we have already this message. */ for (i = 0; i < m_nntp->messages_count; i++) { if (m_nntp->messages[i]) { if (m_nntp->messages[i]->msgno == msgno + m_nntp->low) { *pmsg = m_nntp->messages[i]->message; mu_monitor_unlock (mbox->monitor); return 0; } } } mu_monitor_unlock (mbox->monitor); msg_nntp = calloc (1, sizeof (*msg_nntp)); if (msg_nntp == NULL) return ENOMEM; /* Back pointer. */ msg_nntp->m_nntp = m_nntp; msg_nntp->msgno = msgno + m_nntp->low; /* Create the message. */ { mu_stream_t stream = NULL; if ((status = mu_message_create (&msg, msg_nntp)) != 0 || (status = mu_stream_create (&stream, mbox->flags, msg)) != 0) { mu_stream_destroy (&stream, msg); mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } /* Help for the readline()s */ mu_stream_set_read (stream, nntp_message_read, msg); mu_stream_set_get_transport2 (stream, nntp_message_get_transport2, msg); mu_message_set_stream (msg, stream, msg_nntp); mu_message_set_size (msg, nntp_message_size, msg_nntp); } /* Create the header. */ { mu_header_t header = NULL; if ((status = mu_header_create (&header, NULL, 0, msg)) != 0) { mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } mu_header_set_fill (header, nntp_header_fill, msg); mu_message_set_header (msg, header, msg_nntp); } /* Create the body and its stream. */ { mu_body_t body = NULL; mu_stream_t stream = NULL; if ((status = mu_body_create (&body, msg)) != 0 || (status = mu_stream_create (&stream, mbox->flags, body)) != 0) { mu_body_destroy (&body, msg); mu_stream_destroy (&stream, body); mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } /* Helps for the readline()s */ mu_stream_set_read (stream, nntp_body_read, body); mu_stream_set_get_transport2 (stream, nntp_body_get_transport2, body); mu_body_set_size (body, nntp_body_size, msg); mu_body_set_lines (body, nntp_body_lines, msg); mu_body_set_stream (body, stream, msg); mu_message_set_body (msg, body, msg_nntp); } /* Set the UID on the message. */ mu_message_set_uid (msg, nntp_message_uid, msg_nntp); /* Add it to the list. */ mu_monitor_wrlock (mbox->monitor); { msg_nntp_t *m ; m = realloc (m_nntp->messages, (m_nntp->messages_count + 1)*sizeof (*m)); if (m == NULL) { mu_message_destroy (&msg, msg_nntp); free (msg_nntp); mu_monitor_unlock (mbox->monitor); return ENOMEM; } m_nntp->messages = m; m_nntp->messages[m_nntp->messages_count] = msg_nntp; m_nntp->messages_count++; } mu_monitor_unlock (mbox->monitor); /* Save The message pointer. */ mu_message_set_mailbox (msg, mbox, msg_nntp); *pmsg = msg_nntp->message = msg; return 0; }
static int new_message (mu_mailbox_t mailbox, mbox_message_t mum, mu_message_t *pmsg) { int status; mu_message_t msg; /* Get an empty message struct. */ status = mu_message_create (&msg, mum); if (status != 0) return status; /* Set the header. */ { mu_header_t header = NULL; status = mu_header_create (&header, NULL, 0, msg); if (status != 0) { mu_message_destroy (&msg, mum); return status; } mu_header_set_fill (header, mbox_header_fill, msg); mu_message_set_header (msg, header, mum); } /* Set the attribute. */ { mu_attribute_t attribute; status = mu_attribute_create (&attribute, msg); if (status != 0) { mu_message_destroy (&msg, mum); return status; } mu_attribute_set_get_flags (attribute, mbox_get_attr_flags, msg); mu_attribute_set_set_flags (attribute, mbox_set_attr_flags, msg); mu_attribute_set_unset_flags (attribute, mbox_unset_attr_flags, msg); mu_message_set_attribute (msg, attribute, mum); } /* Prepare the body. */ { mu_body_t body = NULL; mu_stream_t stream = NULL; if ((status = mu_body_create (&body, msg)) != 0 || (status = mu_stream_create (&stream, mailbox->flags | MU_STREAM_SEEKABLE, body)) != 0) { mu_body_destroy (&body, msg); mu_stream_destroy (&stream, body); mu_message_destroy (&msg, mum); return status; } mu_stream_set_read (stream, mbox_body_read, body); mu_stream_set_readline (stream, mbox_body_readline, body); mu_stream_set_get_transport2 (stream, mbox_get_body_transport, body); mu_stream_set_size (stream, mbox_stream_size, body); mu_body_set_stream (body, stream, msg); mu_body_set_size (body, mbox_body_size, msg); mu_body_set_lines (body, mbox_body_lines, msg); mu_message_set_body (msg, body, mum); } /* Set the envelope. */ { mu_envelope_t envelope= NULL; status = mu_envelope_create (&envelope, msg); if (status != 0) { mu_message_destroy (&msg, mum); return status; } mu_envelope_set_sender (envelope, mbox_envelope_sender, msg); mu_envelope_set_date (envelope, mbox_envelope_date, msg); mu_message_set_envelope (msg, envelope, mum); } /* Set the UID. */ mu_message_set_uid (msg, mbox_message_uid, mum); mu_message_set_qid (msg, mbox_message_qid, mum); /* Attach the message to the mailbox mbox data. */ mum->message = msg; mu_message_set_mailbox (msg, mailbox, mum); *pmsg = msg; return 0; }