summaryrefslogtreecommitdiffstats
path: root/mimelib/attach.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mimelib/attach.cpp')
-rw-r--r--mimelib/attach.cpp238
1 files changed, 238 insertions, 0 deletions
diff --git a/mimelib/attach.cpp b/mimelib/attach.cpp
new file mode 100644
index 000000000..27b35dfdf
--- /dev/null
+++ b/mimelib/attach.cpp
@@ -0,0 +1,238 @@
+//=============================================================================
+// File: attach.cpp
+// Contents: Definitions for MessageWithAttachments
+// Maintainer: Doug Sauder <dwsauder@fwb.gulf.net>
+// WWW: http://www.fwb.gulf.net/~dwsauder/mimepp.html
+//
+// Copyright (c) 1996, 1997 Douglas W. Sauder
+// All rights reserved.
+//
+// IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
+// INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+// THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
+// HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
+// NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
+// BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
+// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+//
+//=============================================================================
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <mimelib/string.h>
+#include <mimelib/utility.h>
+#include "attach.h"
+
+
+MessageWithAttachments::MessageWithAttachments()
+{
+}
+
+
+MessageWithAttachments::~MessageWithAttachments()
+{
+}
+
+
+void MessageWithAttachments::SetText(const DwString& aStr)
+{
+ // Create a body part and set the necessary fields
+
+ MultipartBodyPart part;
+ part.SetType(DwMime::kTypeText);
+ part.SetSubtype(DwMime::kSubtypePlain);
+ part.SetCte(DwMime::kCte7bit);
+
+ // Set the string as the body of the body part
+
+ part.SetBody(aStr);
+
+ // Set this body part as the first one
+
+ SetBodyPart(0, part);
+}
+
+
+int MessageWithAttachments::NumberOfAttachments() const
+{
+ int n = NumberOfParts() - 1;
+ return (n >= 0) ? n : 0;
+}
+
+
+void MessageWithAttachments::Attach7bitFile(const char* aFilename,
+ int aType, int aSubtype)
+{
+ // Get the file contents
+
+ DwString str;
+ PutFileInString(aFilename, str);
+
+ // Create a body part and set the necessary fields
+
+ MultipartBodyPart part;
+ part.SetType(aType);
+ part.SetSubtype(aSubtype);
+ part.SetCte(DwMime::kCte7bit);
+
+ // Set content-disposition to attachment, with filename parameter
+ // (see RFC-1806 for information on this *experimental* header field)
+
+ DwString contDisp = "attachment; filename=";
+ contDisp += '\"';
+ contDisp += aFilename;
+ contDisp += '\"';
+ part.SetContentDisposition(contDisp);
+
+ // Set the file contents as the body of the body part
+
+ part.SetBody(str);
+
+ // Make sure this is not the first part, since that is reserved for
+ // the text
+
+ if (NumberOfParts() == 0) {
+ SetBodyPart(1, part);
+ }
+ else {
+ AddBodyPart(part);
+ }
+}
+
+
+void MessageWithAttachments::Attach8bitFile(const char* aFilename,
+ int aType, int aSubtype)
+{
+ // Get the file contents
+
+ DwString str;
+ PutFileInString(aFilename, str);
+
+ // Encode using quoted-printable encoding
+
+ DwString encStr;
+ DwEncodeQuotedPrintable(str, encStr);
+
+ // Create a body part and set the necessary fields
+
+ MultipartBodyPart part;
+ part.SetType(aType);
+ part.SetSubtype(aSubtype);
+ part.SetCte(DwMime::kCteQuotedPrintable);
+
+ // Set content-disposition to attachment, with filename parameter
+ // (see RFC-1806 for information on this *experimental* header field)
+
+ DwString contDisp = "attachment; filename=";
+ contDisp += '\"';
+ contDisp += aFilename;
+ contDisp += '\"';
+ part.SetContentDisposition(contDisp);
+
+ // Set the encoded file contents as the body of the body part
+
+ part.SetBody(encStr);
+
+ // Make sure this is not the first part, since that is reserved for
+ // the text
+
+ if (NumberOfParts() == 0) {
+ SetBodyPart(1, part);
+ }
+ else {
+ AddBodyPart(part);
+ }
+}
+
+
+void MessageWithAttachments::AttachBinaryFile(const char* aFilename,
+ int aType, int aSubtype)
+{
+ // Get the file contents
+
+ DwString str;
+ PutFileInString(aFilename, str);
+
+ // Encode using base64 encoding
+
+ DwString encStr;
+ DwEncodeBase64(str, encStr);
+
+ // Create a body part and set the necessary fields
+
+ MultipartBodyPart part;
+ part.SetType(aType);
+ part.SetSubtype(aSubtype);
+ part.SetCte(DwMime::kCteBase64);
+
+ // Set content-disposition to attachment, with filename parameter
+ // (see RFC-1806 for information on this *experimental* header field)
+
+ DwString contDisp = "attachment; filename=";
+ contDisp += '\"';
+ contDisp += aFilename;
+ contDisp += '\"';
+ part.SetContentDisposition(contDisp);
+
+ // Set the encoded file contents as the body of the body part
+
+ part.SetBody(encStr);
+
+ // Make sure this is not the first part, since that is reserved for
+ // the text
+
+ if (NumberOfParts() == 0) {
+ SetBodyPart(1, part);
+ }
+ else {
+ AddBodyPart(part);
+ }
+}
+
+
+int MessageWithAttachments::PutFileInString(const char* aFilename,
+ DwString& str)
+{
+ // Get the file size
+ struct stat statBuf;
+ int k = stat(aFilename, &statBuf);
+ if (k < 0) {
+ str = "";
+ return -1;
+ }
+ int fileSize = (int) statBuf.st_size;
+
+ // Allocate a buffer
+
+ int bufSize = fileSize + 8; // a little elbow room added
+ char* buf = new char[bufSize];
+
+ // Read the file into the buffer
+
+ FILE* fp = fopen(aFilename, "rb");
+ if (fp == 0) {
+ delete[] buf;
+ str = "";
+ return -1;
+ }
+ int len = 0;
+ while (1) {
+ int ch = getc(fp);
+ if (feof(fp) || len == fileSize) {
+ break;
+ }
+ buf[len++] = ch;
+ }
+ buf[len] = 0;
+ fclose(fp);
+
+ // Place the buffer in the string
+
+ str.TakeBuffer(buf, bufSize, 0, len);
+ return 0;
+}
+