aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--examples/example5.cpp1
-rw-r--r--src/defaultAttachment.cpp18
-rw-r--r--src/messageParser.cpp38
-rw-r--r--vmime/attachment.hpp5
-rw-r--r--vmime/defaultAttachment.hpp6
6 files changed, 67 insertions, 8 deletions
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 <[email protected]>
+
+ * *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 <[email protected]>
* 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 <contentHandler> 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 <contentHandler> 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 <contentHandler>()), m_encoding(attach.m_encoding)
+ m_data(attach.m_data->clone().dynamicCast <contentHandler>()),
+ 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 <contentHandler>();
m_encoding = attach.m_encoding;
@@ -103,6 +105,12 @@ const text& defaultAttachment::getDescription() const
}
+const word& defaultAttachment::getName() const
+{
+ return (m_name);
+}
+
+
const ref <const contentHandler> 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 <defaultParameter> prm = contTypeField->
+ findParameter("name").dynamicCast <defaultParameter>();
+
+ if (prm != NULL)
+ name = prm->getValue();
+ }
+ catch (exceptions::no_such_parameter)
+ {
+ // No attachment name available.
+ }
+ }
+
// Construct the attachment object
ref <attachment> attach = vmime::create <defaultAttachment>
(bdy.getContents()->clone().dynamicCast <contentHandler>(),
- 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 <contentHandler> data, const encoding& enc, const mediaType& type, const text& desc = NULL_TEXT);
- defaultAttachment(ref <contentHandler> data, const mediaType& type, const text& desc = NULL_TEXT);
+ defaultAttachment(ref <contentHandler> data, const encoding& enc, const mediaType& type, const text& desc = NULL_TEXT, const word& name = NULL_TEXT);
+ defaultAttachment(ref <contentHandler> 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 <const contentHandler> getData() const;
const encoding& getEncoding() const;
@@ -60,6 +61,7 @@ protected:
text m_desc; // Description (eg. "The image you requested")
ref <contentHandler> m_data; // Attachment data (eg. the file contents)
encoding m_encoding; // Encoding
+ word m_name; // Name/filename (eg. "sunset.jpg")
private: