//
// VMime library (http://www.vmime.org)
// Copyright (C) 2002 Vincent Richard <vincent@vmime.org>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 3 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// Linking this library statically or dynamically with other modules is making
// a combined work based on this library. Thus, the terms and conditions of
// the GNU General Public License cover the whole combination.
//
#include "vmime/config.hpp"
#if VMIME_HAVE_MESSAGING_FEATURES && VMIME_HAVE_MESSAGING_PROTO_IMAP
#include "vmime/net/imap/IMAPMessagePart.hpp"
#include "vmime/net/imap/IMAPMessageStructure.hpp"
namespace vmime {
namespace net {
namespace imap {
IMAPMessagePart::IMAPMessagePart(
const shared_ptr <IMAPMessagePart>& parent,
const size_t number,
const IMAPParser::body_type_mpart* mpart
)
: m_parent(parent),
m_header(null),
m_number(number),
m_size(0) {
m_mediaType = vmime::mediaType(
"multipart",
mpart->media_subtype->value
);
}
namespace {
template<typename T>
vmime::string getPartName(const T& body_type) {
if (const auto* pparam = body_type->body_fields->body_fld_param.get()) {
for (const auto& param : pparam->items) {
if (param->string1->value == "NAME") {
return param->string2->value;
}
}
}
return {};
}
}
IMAPMessagePart::IMAPMessagePart(
const shared_ptr <IMAPMessagePart>& parent,
const size_t number,
const IMAPParser::body_type_1part* part
)
: m_parent(parent),
m_header(null),
m_number(number),
m_size(0) {
if (part->body_type_text) {
m_mediaType = vmime::mediaType(
"text",
part->body_type_text->media_text->media_subtype->value
);
m_size = part->body_type_text->body_fields->body_fld_octets->value;
m_name = getPartName(part->body_type_text);
} else if (part->body_type_msg) {
m_mediaType = vmime::mediaType(
"message",
part->body_type_msg->media_message->media_subtype->value
);
} else {
m_mediaType = vmime::mediaType(
part->body_type_basic->media_basic->media_type->value,
part->body_type_basic->media_basic->media_subtype->value
);
m_size = part->body_type_basic->body_fields->body_fld_octets->value;
m_name = getPartName(part->body_type_basic);
}
if (part->body_ext_1part && part->body_ext_1part->body_fld_dsp) {
auto *cdisp = part->body_ext_1part->body_fld_dsp->str();
if (cdisp) {
m_dispType = contentDisposition(cdisp->value);
}
}
m_structure = null;
}
shared_ptr <const messageStructure> IMAPMessagePart::getStructure() const {
if (m_structure) {
return m_structure;
} else {
return IMAPMessageStructure::emptyStructure();
}
}
shared_ptr <messageStructure> IMAPMessagePart::getStructure() {
if (m_structure) {
return m_structure;
} else {
return IMAPMessageStructure::emptyStructure();
}
}
shared_ptr <const IMAPMessagePart> IMAPMessagePart::getParent() const {
return m_parent.lock();
}
const mediaType& IMAPMessagePart::getType() const {
return m_mediaType;
}
const contentDisposition &IMAPMessagePart::getDisposition() const {
return m_dispType;
}
size_t IMAPMessagePart::getSize() const {
return m_size;
}
size_t IMAPMessagePart::getNumber() const {
return m_number;
}
string IMAPMessagePart::getName() const {
return m_name;
}
shared_ptr <const header> IMAPMessagePart::getHeader() const {
if (!m_header) {
throw exceptions::unfetched_object();
} else {
return m_header;
}
}
// static
shared_ptr <IMAPMessagePart> IMAPMessagePart::create(
const shared_ptr <IMAPMessagePart>& parent,
const size_t number,
const IMAPParser::body* body
) {
if (body->body_type_mpart) {
auto part = make_shared <IMAPMessagePart>(parent, number, body->body_type_mpart.get());
part->m_structure = make_shared <IMAPMessageStructure>(part, body->body_type_mpart->list);
return part;
} else {
return make_shared <IMAPMessagePart>(parent, number, body->body_type_1part.get());
}
}
header& IMAPMessagePart::getOrCreateHeader() {
if (m_header) {
return *m_header;
} else {
return *(m_header = make_shared <header>());
}
}
} // imap
} // net
} // vmime
#endif // VMIME_HAVE_MESSAGING_FEATURES && VMIME_HAVE_MESSAGING_PROTO_IMAP