/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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 MimeHeaderParser_h__ #define MimeHeaderParser_h__ #include "nsCOMArray.h" #include "nsString.h" #include "nsTArray.h" class msgIAddressObject; namespace mozilla { namespace mailnews { /** * This is used to signal that the input header value has already been decoded * according to RFC 2047 and is in UTF-16 form. */ nsCOMArray DecodedHeader(const nsAString& aHeader); /** * This is used to signal that the input header value needs to be decoded * according to RFC 2047. The charset parameter indicates the charset to assume * that non-ASCII data is in; if the value is null (the default), then the * charset is assumed to be UTF-8. */ nsCOMArray EncodedHeader(const nsACString& aHeader, const char* aCharset = nullptr); /** * Same deal, but we're starting with an nsAString. */ nsCOMArray EncodedHeaderW(const nsAString& aHeader); namespace detail { void DoConversion(const nsTArray& aUTF16, nsTArray& aUTF8); }; /** * This is a class designed for use as temporaries so that methods can pass * an nsTArray into methods that expect nsTArray for out * parameters (this does not work for in-parameters). * * It works by internally providing an nsTArray which it uses for its * external API operations. If the user requests an array of nsCString elements * instead, it converts the UTF-16 array to a UTF-8 array on destruction. */ template class UTF16ArrayAdapter { public: explicit UTF16ArrayAdapter(nsTArray& aUTF8Array) : mUTF8Array(aUTF8Array) {} ~UTF16ArrayAdapter() { detail::DoConversion(mUTF16Array, mUTF8Array); } operator nsTArray&() { return mUTF16Array; } private: nsTArray& mUTF8Array; AutoTArray mUTF16Array; }; /** * Given a name and an email, both encoded in UTF-8, produce a string suitable * for writing in an email header by quoting where necessary. * * If name is not empty, the output string will be name . If it is empty, * the output string is just the email. Note that this DOES NOT do any RFC 2047 * encoding. */ void MakeMimeAddress(const nsACString& aName, const nsACString& aEmail, nsACString& full); /** * Given a name and an email, produce a string suitable for writing in an email * header by quoting where necessary. * * If name is not empty, the output string will be name . If it is empty, * the output string is just the email. Note that this DOES NOT do any RFC 2047 * encoding. */ void MakeMimeAddress(const nsAString& aName, const nsAString& aEmail, nsAString& full); /** * Given a name and an email, both encoded in UTF-8, produce a string suitable * for displaying in UI. * * If name is not empty, the output string will be name . If it is empty, * the output string is just the email. */ void MakeDisplayAddress(const nsAString& aName, const nsAString& aEmail, nsAString& full); /** * Returns a copy of the input which may have had some addresses removed. * Addresses are removed if they are already in either of the supplied * address lists. * * Addresses are considered to be the same if they contain the same email * address parts, ignoring case. Display names or comments are not compared. * * @param aHeader The addresses to remove duplicates from. * @param aOtherEmails Other addresses that the duplicate removal process also * checks for duplicates against. Addresses in this list * will not be added to the result. * @return The original header with duplicate addresses removed. */ void RemoveDuplicateAddresses(const nsACString& aHeader, const nsACString& aOtherEmails, nsACString& result); /** * Given a message header, extract all names and email addresses found in that * header into the two arrays. */ void ExtractAllAddresses(const nsCOMArray& aHeader, nsTArray& names, nsTArray& emails); /** * Given a raw message header value, extract display names for every address * found in the header. */ void ExtractDisplayAddresses(const nsCOMArray& aHeader, nsTArray& addresses); /** * Given a raw message header value, extract all the email addresses into an * array. * * Duplicate email addresses are not removed from the output list. */ void ExtractEmails(const nsCOMArray& aHeader, nsTArray& emails); /** * Given a raw message header value, extract the first name/email address found * in the header. This is essentially equivalent to grabbing the first entry of * ExtractAllAddresses. */ void ExtractFirstAddress(const nsCOMArray& aHeader, nsACString& name, nsACString& email); /** * Given an RFC 2047-decoded message header value, extract the first name/email * address found in the header. This is essentially equivalent to grabbing the * first entry of ExtractAllAddresses. */ void ExtractFirstAddress(const nsCOMArray& aHeader, nsAString& name, nsACString& email); /** * Given a raw message header value, extract the first email address found in * the header. */ void ExtractEmail(const nsCOMArray& aHeader, nsACString& email); /** * Given a raw message header value, extract and clean up the first display * name found in the header. If there is no display name, the email address is * used instead. */ void ExtractName(const nsCOMArray& aHeader, nsACString& name); /** * Given an RFC 2047-decoded message header value, extract the first display * name found in the header. If there is no display name, the email address is * returned instead. */ void ExtractName(const nsCOMArray& aDecodedHeader, nsAString& name); } // namespace mailnews } // namespace mozilla #endif