summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/compose/src/nsMsgAttachmentData.h
blob: 763a4377e9a5a72b9ad937668eadafb5acdc207f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef __MSGATTACHMENTDATA_H__
#define __MSGATTACHMENTDATA_H__

#include "nsIURL.h"
#include "nsString.h"
#include "nsIMsgSend.h"

// Attachment file/URL structures - we're letting libmime use this directly
class nsMsgAttachmentData final : public nsIMsgAttachmentData {
 public:
  NS_DECL_NSIMSGATTACHMENTDATA
  NS_DECL_ISUPPORTS

  nsMsgAttachmentData();
  virtual ~nsMsgAttachmentData();

  nsCOMPtr<nsIURI> m_url;  // The URL to attach.

  nsCString m_desiredType;  // The type to which this document should be
                            // converted.  Legal values are NULL, TEXT_PLAIN
                            // and APPLICATION_POSTSCRIPT (which are macros
                            // defined in net.h); other values are ignored.

  nsCString
      m_realType;  // The type of the URL if known, otherwise NULL. For example,
                   // if you were attaching a temp file which was known to
                   // contain HTML data, you would pass in TEXT_HTML as the
                   // real_type, to override whatever type the name of the tmp
                   // file might otherwise indicate.

  nsCString m_realEncoding;  // Goes along with real_type

  nsCString
      m_realName;  // The original name of this document, which will eventually
                   // show up in the Content-Disposition header. For example, if
                   // you had copied a document to a tmp file, this would be the
                   // original, human-readable name of the document.

  nsCString m_description;  // If you put a string here, it will show up as the
                            // Content-Description header. This can be any
                            // explanatory text; it's not a file name.

  nsCString m_disposition;    // The Content-Disposition header (if any). a
                              // nsMsgAttachmentData can very well have
                              // Content-Disposition: inline value, instead of
                              // "attachment".
  nsCString m_cloudPartInfo;  // For X-Mozilla-Cloud-Part header, if any

  // Mac-specific data that should show up as optional parameters
  // to the content-type header.
  nsCString m_xMacType;
  nsCString m_xMacCreator;

  int32_t m_size;  // The size of the attachment. May be 0.
  nsCString
      m_sizeExternalStr;  // The reported size of an external attachment.
                          // Originally set at "-1" to mean an unknown value.
  bool m_isExternalAttachment;      // Flag for determining if the attachment is
                                    // external
  bool m_isExternalLinkAttachment;  // Flag for determining if the attachment is
                                    // external and an http link.
  bool m_isDownloaded;  // Flag for determining if the attachment has already
                        // been downloaded
  bool m_hasFilename;   // Tells whether the name is provided by us or if it's a
                        // Part 1.2-like attachment
  bool m_displayableInline;  // Tells whether the attachment could be displayed
                             // inline
};

class nsMsgAttachedFile final : public nsIMsgAttachedFile {
 public:
  NS_DECL_NSIMSGATTACHEDFILE
  NS_DECL_ISUPPORTS

  nsMsgAttachedFile();
  virtual ~nsMsgAttachedFile();

  nsCOMPtr<nsIURI> m_origUrl;  // Where it came from on the network (or even
                               // elsewhere on the local disk.)

  nsCOMPtr<nsIFile> m_tmpFile;  // The tmp file in which the (possibly
                                // converted) data now resides.

  nsCString m_type;  // The type of the data in file_name (not necessarily the
                     // same as the type of orig_url.)

  nsCString
      m_encoding;  // Likewise, the encoding of the tmp file. This will be set
                   // only if the original document had an encoding already; we
                   // don't do base64 encoding and so forth until it's time to
                   // assemble a full MIME message of all parts.

  nsCString m_description;    // For Content-Description header
  nsCString m_cloudPartInfo;  // For X-Mozilla-Cloud-Part header, if any
  nsCString m_xMacType;       // mac-specific info
  nsCString m_xMacCreator;    // mac-specific info
  nsCString m_realName;       // The real name of the file.

  // Some statistics about the data that was written to the file, so that when
  // it comes time to compose a MIME message, we can make an informed decision
  // about what Content-Transfer-Encoding would be best for this attachment.
  // (If it's encoded already, we ignore this information and ship it as-is.)
  uint32_t m_size;
  uint32_t m_unprintableCount;
  uint32_t m_highbitCount;
  uint32_t m_ctlCount;
  uint32_t m_nullCount;
  uint32_t m_maxLineLength;
};

#undef MOZ_ASSERT_TYPE_OK_FOR_REFCOUNTING
#ifdef MOZ_IS_DESTRUCTIBLE
#  define MOZ_ASSERT_TYPE_OK_FOR_REFCOUNTING(X)                              \
    static_assert(                                                           \
        !MOZ_IS_DESTRUCTIBLE(X) ||                                           \
            mozilla::IsSame<X, nsMsgAttachmentData>::value ||                \
            mozilla::IsSame<X, nsMsgAttachedFile>::value,                    \
        "Reference-counted class " #X                                        \
        " should not have a public destructor. "                             \
        "Try to make this class's destructor non-public. If that is really " \
        "not possible, you can whitelist this class by providing a "         \
        "HasDangerousPublicDestructor specialization for it.");
#else
#  define MOZ_ASSERT_TYPE_OK_FOR_REFCOUNTING(X)
#endif
#endif