diff --git a/ChangeLog b/ChangeLog index f3696c06..b43f7af7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,13 @@ VERSION 0.7.2cvs ================ +2005-07-15 Vincent Richard + + * *attachment, messageParser: added a getName() parameter to retrieve + the attachment filename either from the "filename" parameter of the + "Content-Disposition" field, or from the "name" parameter of the + "Content-Type" field (if available). + 2005-07-13 Vincent Richard * All files: added reference counting and smart pointers to simplify the diff --git a/examples/example5.cpp b/examples/example5.cpp index 3404be97..9456b502 100644 --- a/examples/example5.cpp +++ b/examples/example5.cpp @@ -50,6 +50,7 @@ int main() const vmime::attachment& att = *mp.getAttachmentAt(i); // Media type (content type) is in "att.getType()" + // Name is in "att.getName()" // Description is in "att.getDescription()" // Data is in "att.getData()" } diff --git a/src/defaultAttachment.cpp b/src/defaultAttachment.cpp index dc8f8ccc..118a301a 100644 --- a/src/defaultAttachment.cpp +++ b/src/defaultAttachment.cpp @@ -31,23 +31,24 @@ defaultAttachment::defaultAttachment() defaultAttachment::defaultAttachment(ref data, - const encoding& enc, const mediaType& type, const text& desc) - : m_type(type), m_desc(desc), m_data(data), m_encoding(enc) + const encoding& enc, const mediaType& type, const text& desc, const word& name) + : m_type(type), m_desc(desc), m_data(data), m_encoding(enc), m_name(name) { } defaultAttachment::defaultAttachment(ref data, - const mediaType& type, const text& desc) + const mediaType& type, const text& desc, const word& name) : m_type(type), m_desc(desc), m_data(data), - m_encoding(encoding::decide(data)) + m_encoding(encoding::decide(data)), m_name(name) { } defaultAttachment::defaultAttachment(const defaultAttachment& attach) : attachment(), m_type(attach.m_type), m_desc(attach.m_desc), - m_data(attach.m_data->clone().dynamicCast ()), m_encoding(attach.m_encoding) + m_data(attach.m_data->clone().dynamicCast ()), + m_encoding(attach.m_encoding), m_name(attach.m_name) { } @@ -61,6 +62,7 @@ defaultAttachment& defaultAttachment::operator=(const defaultAttachment& attach) { m_type = attach.m_type; m_desc = attach.m_desc; + m_name = attach.m_name; m_data = attach.m_data->clone().dynamicCast (); m_encoding = attach.m_encoding; @@ -103,6 +105,12 @@ const text& defaultAttachment::getDescription() const } +const word& defaultAttachment::getName() const +{ + return (m_name); +} + + const ref defaultAttachment::getData() const { return (m_data); diff --git a/src/messageParser.cpp b/src/messageParser.cpp index 94fec668..a3b71375 100644 --- a/src/messageParser.cpp +++ b/src/messageParser.cpp @@ -153,6 +153,7 @@ void messageParser::findAttachments(const bodyPart& part) if (isAttachment) { // Determine the media type of this attachment + const contentTypeField* contTypeField = NULL; mediaType type; try @@ -161,6 +162,8 @@ void messageParser::findAttachments(const bodyPart& part) (*hdr.findField(fields::CONTENT_TYPE)); type = ctf.getValue(); + + contTypeField = &ctf; } catch (exceptions::no_such_field) { @@ -184,10 +187,43 @@ void messageParser::findAttachments(const bodyPart& part) // No description available. } + // Get the name/filename (if available) + word name; + + // -- try the 'filename' parameter of 'Content-Disposition' field + if (contentDispField != NULL) + { + try + { + name = contentDispField->getFilename(); + } + catch (exceptions::no_such_parameter) + { + // No 'filename' parameter + } + } + + // -- try the 'name' parameter of 'Content-Type' field + if (name.getBuffer().empty() && contTypeField != NULL) + { + try + { + ref prm = contTypeField-> + findParameter("name").dynamicCast (); + + if (prm != NULL) + name = prm->getValue(); + } + catch (exceptions::no_such_parameter) + { + // No attachment name available. + } + } + // Construct the attachment object ref attach = vmime::create (bdy.getContents()->clone().dynamicCast (), - bdy.getEncoding(), type, description); + bdy.getEncoding(), type, description, name); if (contentDispField != NULL) { diff --git a/vmime/attachment.hpp b/vmime/attachment.hpp index 72fb13d0..522f6017 100644 --- a/vmime/attachment.hpp +++ b/vmime/attachment.hpp @@ -60,6 +60,11 @@ public: */ virtual const text& getDescription() const = 0; + /** Return the name of this attachment. + * @return attachment name + */ + virtual const word& getName() const = 0; + /** Return the data contained in this attachment. * @return attachment data */ diff --git a/vmime/defaultAttachment.hpp b/vmime/defaultAttachment.hpp index c451d9f8..f5a1a5b6 100644 --- a/vmime/defaultAttachment.hpp +++ b/vmime/defaultAttachment.hpp @@ -41,8 +41,8 @@ protected: public: - defaultAttachment(ref data, const encoding& enc, const mediaType& type, const text& desc = NULL_TEXT); - defaultAttachment(ref data, const mediaType& type, const text& desc = NULL_TEXT); + defaultAttachment(ref data, const encoding& enc, const mediaType& type, const text& desc = NULL_TEXT, const word& name = NULL_TEXT); + defaultAttachment(ref data, const mediaType& type, const text& desc = NULL_TEXT, const word& name = NULL_TEXT); defaultAttachment(const defaultAttachment& attach); ~defaultAttachment(); @@ -51,6 +51,7 @@ public: const mediaType& getType() const; const text& getDescription() const; + const word& getName() const; const ref getData() const; const encoding& getEncoding() const; @@ -60,6 +61,7 @@ protected: text m_desc; // Description (eg. "The image you requested") ref m_data; // Attachment data (eg. the file contents) encoding m_encoding; // Encoding + word m_name; // Name/filename (eg. "sunset.jpg") private: