diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/base/src/nsMsgUtils.h | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/base/src/nsMsgUtils.h | 462 |
1 files changed, 462 insertions, 0 deletions
diff --git a/comm/mailnews/base/src/nsMsgUtils.h b/comm/mailnews/base/src/nsMsgUtils.h new file mode 100644 index 0000000000..6f289d4b37 --- /dev/null +++ b/comm/mailnews/base/src/nsMsgUtils.h @@ -0,0 +1,462 @@ +/* -*- 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 _NSMSGUTILS_H +#define _NSMSGUTILS_H + +#include "nsIURL.h" +#include "nsString.h" +#include "msgCore.h" +#include "nsCOMPtr.h" +#include "MailNewsTypes2.h" +#include "nsTArray.h" +#include "nsInterfaceRequestorAgg.h" +#include "nsILoadGroup.h" +#include "nsINetUtil.h" +#include "nsIRequest.h" +#include "nsILoadInfo.h" +#include "nsServiceManagerUtils.h" +#include "nsUnicharUtils.h" +#include "nsIFile.h" + +class nsIChannel; +class nsIFile; +class nsIPrefBranch; +class nsIMsgFolder; +class nsIMsgMessageService; +class nsIUrlListener; +class nsIOutputStream; +class nsIInputStream; +class nsIMsgDatabase; +class nsIProxyInfo; +class nsIMsgWindow; +class nsIStreamListener; +class nsICancelable; +class nsIProtocolProxyCallback; +class nsIMsgSearchTerm; + +#define FILE_IO_BUFFER_SIZE (16 * 1024) +#define MSGS_URL "chrome://messenger/locale/messenger.properties" + +enum nsDateFormatSelectorComm : long { + kDateFormatNone = 0, + kDateFormatLong = 1, + kDateFormatShort = 2, + kDateFormatUnused = 3, + kDateFormatWeekday = 4 +}; + +// These are utility functions that can used throughout the mailnews code + +NS_MSG_BASE nsresult GetMessageServiceContractIDForURI(const char* uri, + nsCString& contractID); + +NS_MSG_BASE nsresult GetMessageServiceFromURI( + const nsACString& uri, nsIMsgMessageService** aMessageService); + +NS_MSG_BASE nsresult GetMsgDBHdrFromURI(const nsACString& uri, + nsIMsgDBHdr** msgHdr); + +NS_MSG_BASE nsresult NS_MsgGetPriorityFromString( + const char* const priority, nsMsgPriorityValue& outPriority); + +NS_MSG_BASE nsresult NS_MsgGetPriorityValueString(const nsMsgPriorityValue p, + nsACString& outValueString); + +NS_MSG_BASE nsresult NS_MsgGetUntranslatedPriorityName( + const nsMsgPriorityValue p, nsACString& outName); + +NS_MSG_BASE nsresult NS_MsgHashIfNecessary(nsAutoString& name); +NS_MSG_BASE nsresult NS_MsgHashIfNecessary(nsAutoCString& name); + +NS_MSG_BASE nsresult FormatFileSize(int64_t size, bool useKB, + nsAString& formattedSize); + +/** + * given a folder uri, return the path to folder in the user profile directory. + * + * @param aFolderURI uri of folder we want the path to, without the scheme + * @param[out] aPathString result path string + * @param aScheme scheme of the uri + * @param[optional] aIsNewsFolder is this a news folder? + */ +NS_MSG_BASE nsresult NS_MsgCreatePathStringFromFolderURI( + const char* aFolderURI, nsCString& aPathString, const nsCString& aScheme, + bool aIsNewsFolder = false); + +/** + * Given a string and a length, removes any "Re:" strings from the front. + * It also deals with that dumbass "Re[2]:" thing that some losing mailers do. + * + * If mailnews.localizedRe is set, it will also remove localized "Re:" strings. + * + * @return true if it made a change (in which case the caller should look to + * modifiedSubject for the result) and false otherwise (in which + * case the caller should look at subject for the result) + */ +NS_MSG_BASE bool NS_MsgStripRE(const nsCString& subject, + nsCString& modifiedSubject); + +NS_MSG_BASE char* NS_MsgSACopy(char** destination, const char* source); + +NS_MSG_BASE char* NS_MsgSACat(char** destination, const char* source); + +NS_MSG_BASE nsresult NS_MsgEscapeEncodeURLPath(const nsAString& aStr, + nsCString& aResult); + +NS_MSG_BASE nsresult NS_MsgDecodeUnescapeURLPath(const nsACString& aPath, + nsAString& aResult); + +NS_MSG_BASE bool WeAreOffline(); + +// Get a folder by Uri, returning null if it doesn't exist (or if some +// error occurs). A missing folder is not considered an error. +NS_MSG_BASE nsresult FindFolder(const nsACString& aFolderURI, + nsIMsgFolder** aFolder); + +// Get a folder by Uri. +// A missing folder is considered to be an error. +// Returns a non-null folder if and only if result is NS_OK. +NS_MSG_BASE nsresult GetExistingFolder(const nsACString& aFolderURI, + nsIMsgFolder** aFolder); + +// Get a folder by Uri, creating it if it doesn't already exist. +// An error is returned if a folder cannot be found or created. +// Created folders will be 'dangling' folders (ie not connected to a +// parent). +NS_MSG_BASE nsresult GetOrCreateFolder(const nsACString& aFolderURI, + nsIMsgFolder** aFolder); + +// Escape lines starting with "From ", ">From ", etc. in a buffer. +NS_MSG_BASE nsresult EscapeFromSpaceLine(nsIOutputStream* ouputStream, + char* start, const char* end); +NS_MSG_BASE bool IsAFromSpaceLine(char* start, const char* end); + +NS_MSG_BASE nsresult NS_GetPersistentFile( + const char* relPrefName, const char* absPrefName, + const char* dirServiceProp, // Can be NULL + bool& gotRelPref, nsIFile** aFile, nsIPrefBranch* prefBranch = nullptr); + +NS_MSG_BASE nsresult NS_SetPersistentFile(const char* relPrefName, + const char* absPrefName, + nsIFile* aFile, + nsIPrefBranch* prefBranch = nullptr); + +NS_MSG_BASE nsresult IsRFC822HeaderFieldName(const char* aHdr, bool* aResult); + +NS_MSG_BASE nsresult NS_GetUnicharPreferenceWithDefault( + nsIPrefBranch* prefBranch, // can be null, if so uses the root branch + const char* prefName, const nsAString& defValue, nsAString& prefValue); + +NS_MSG_BASE nsresult NS_GetLocalizedUnicharPreferenceWithDefault( + nsIPrefBranch* prefBranch, // can be null, if so uses the root branch + const char* prefName, const nsAString& defValue, nsAString& prefValue); + +NS_MSG_BASE nsresult NS_GetLocalizedUnicharPreference( + nsIPrefBranch* prefBranch, // can be null, if so uses the root branch + const char* prefName, nsAString& prefValue); + +/** + * this needs a listener, because we might have to create the folder + * on the server, and that is asynchronous + */ +NS_MSG_BASE nsresult GetOrCreateJunkFolder(const nsACString& aURI, + nsIUrlListener* aListener); + +// Returns true if the nsIURI is a message under an RSS account +NS_MSG_BASE nsresult IsRSSArticle(nsIURI* aMsgURI, bool* aIsRSSArticle); + +// digest needs to be a pointer to a 16 byte buffer +#define DIGEST_LENGTH 16 + +NS_MSG_BASE nsresult MSGCramMD5(const char* text, int32_t text_len, + const char* key, int32_t key_len, + unsigned char* digest); +NS_MSG_BASE nsresult MSGApopMD5(const char* text, int32_t text_len, + const char* password, int32_t password_len, + unsigned char* digest); + +// helper functions to convert a 64bits PRTime into a 32bits value (compatible +// time_t) and vice versa. +NS_MSG_BASE void PRTime2Seconds(PRTime prTime, uint32_t* seconds); +NS_MSG_BASE void PRTime2Seconds(PRTime prTime, int32_t* seconds); +NS_MSG_BASE void Seconds2PRTime(uint32_t seconds, PRTime* prTime); +// helper function to generate current date+time as a string +NS_MSG_BASE void MsgGenerateNowStr(nsACString& nowStr); + +// Appends the correct summary file extension onto the supplied fileLocation +// and returns it in summaryLocation. +NS_MSG_BASE nsresult GetSummaryFileLocation(nsIFile* fileLocation, + nsIFile** summaryLocation); + +// Gets a special directory and appends the supplied file name onto it. +NS_MSG_BASE nsresult GetSpecialDirectoryWithFileName(const char* specialDirName, + const char* fileName, + nsIFile** result); + +// cleanup temp files with the given filename and extension, including +// the consecutive -NNNN ones that we can find. If there are holes, e.g., +// <filename>-1-10,12.<extension> exist, but <filename>-11.<extension> does not +// we'll clean up 1-10. If the leaks are common, I think the gaps will tend to +// be filled. +NS_MSG_BASE nsresult MsgCleanupTempFiles(const char* fileName, + const char* extension); + +NS_MSG_BASE nsresult MsgGetFileStream(nsIFile* file, + nsIOutputStream** fileStream); + +// Automatically creates an output stream with a suitable buffer +NS_MSG_BASE nsresult MsgNewBufferedFileOutputStream(nsIOutputStream** aResult, + nsIFile* aFile, + int32_t aIOFlags = -1, + int32_t aPerm = -1); + +// Automatically creates an output stream with a suitable buffer, but write to a +// temporary file first, then rename to aFile +NS_MSG_BASE nsresult +MsgNewSafeBufferedFileOutputStream(nsIOutputStream** aResult, nsIFile* aFile, + int32_t aIOFlags = -1, int32_t aPerm = -1); + +// fills in the position of the passed in keyword in the passed in keyword list +// and returns false if the keyword isn't present +NS_MSG_BASE bool MsgFindKeyword(const nsCString& keyword, nsCString& keywords, + int32_t* aStartOfKeyword, int32_t* aLength); + +NS_MSG_BASE bool MsgHostDomainIsTrusted(nsCString& host, + nsCString& trustedMailDomains); + +// gets an nsIFile from a UTF-8 file:// path +NS_MSG_BASE nsresult MsgGetLocalFileFromURI(const nsACString& aUTF8Path, + nsIFile** aFile); + +NS_MSG_BASE void MsgStripQuotedPrintable(nsCString& aSrc); + +/* + * Utility functions that call functions from nsINetUtil + */ + +NS_MSG_BASE nsresult MsgEscapeString(const nsACString& aStr, uint32_t aType, + nsACString& aResult); + +NS_MSG_BASE nsresult MsgUnescapeString(const nsACString& aStr, uint32_t aFlags, + nsACString& aResult); + +NS_MSG_BASE nsresult MsgEscapeURL(const nsACString& aStr, uint32_t aFlags, + nsACString& aResult); + +// Given a message db and a set of keys, fetch the corresponding message +// headers. +NS_MSG_BASE nsresult +MsgGetHeadersFromKeys(nsIMsgDatabase* aDB, const nsTArray<nsMsgKey>& aKeys, + nsTArray<RefPtr<nsIMsgDBHdr>>& aHeaders); + +NS_MSG_BASE nsresult MsgExamineForProxyAsync(nsIChannel* channel, + nsIProtocolProxyCallback* listener, + nsICancelable** result); + +NS_MSG_BASE int32_t MsgFindCharInSet(const nsCString& aString, + const char* aChars, uint32_t aOffset = 0); +NS_MSG_BASE int32_t MsgFindCharInSet(const nsString& aString, + const char16_t* aChars, + uint32_t aOffset = 0); + +// advances bufferOffset to the beginning of the next line, if we don't +// get to maxBufferOffset first. Returns false if we didn't get to the +// next line. +NS_MSG_BASE bool MsgAdvanceToNextLine(const char* buffer, + uint32_t& bufferOffset, + uint32_t maxBufferOffset); + +/** + * Alerts the user that the login to the server failed. Asks whether the + * connection should: retry, cancel, or request a new password. + * + * @param aMsgWindow The message window associated with this action (cannot + * be null). + * @param aHostname The hostname of the server for which the login failed. + * @param aResult The button pressed. 0 for retry, 1 for cancel, + * 2 for enter a new password. + * @return NS_OK for success, NS_ERROR_* if there was a failure in + * creating the dialog. + */ +NS_MSG_BASE nsresult MsgPromptLoginFailed(nsIMsgWindow* aMsgWindow, + const nsACString& aHostname, + const nsACString& aUsername, + const nsAString& aAccountname, + int32_t* aResult); + +/** + * Calculate a PRTime value used to determine if a date is XX + * days ago. This is used by various retention setting algorithms. + */ +NS_MSG_BASE PRTime MsgConvertAgeInDaysToCutoffDate(int32_t ageInDays); + +/** + * Converts the passed in term list to its string representation. + * + * @param aTermList Array of nsIMsgSearchTerms + * @param[out] aOutString result representation of search terms. + * + */ +NS_MSG_BASE nsresult MsgTermListToString( + nsTArray<RefPtr<nsIMsgSearchTerm>> const& aTermList, nsCString& aOutString); + +NS_MSG_BASE nsresult MsgStreamMsgHeaders(nsIInputStream* aInputStream, + nsIStreamListener* aConsumer); + +/** + * convert string to uint64_t + * + * @param str converted string + * @returns uint64_t value for success, 0 for parse failure + */ +NS_MSG_BASE uint64_t ParseUint64Str(const char* str); + +/** + * Detect charset of file + * + * @param aFile The target of nsIFile + * @param[out] aCharset The charset string + */ +NS_MSG_BASE nsresult MsgDetectCharsetFromFile(nsIFile* aFile, + nsACString& aCharset); + +/* + * Converts a buffer to plain text. Some conversions may + * or may not work with certain end charsets which is why we + * need that as an argument to the function. If charset is + * unknown or deemed of no importance NULL could be passed. + * @param[in/out] aConBuf Variable with the text to convert + * @param formatFlowed Use format flowed? + * @param formatOutput Reformat the output? + & @param disallowBreaks Disallow breaks when formatting + */ +NS_MSG_BASE nsresult ConvertBufToPlainText(nsString& aConBuf, bool formatFlowed, + bool formatOutput, + bool disallowBreaks); + +#include "nsEscape.h" + +/** + * Converts a hex string into an integer. + * Processes up to aNumChars characters or the first non-hex char. + * It is not an error if less than aNumChars valid hex digits are found. + */ +NS_MSG_BASE uint64_t MsgUnhex(const char* aHexString, size_t aNumChars); + +/** + * Checks if a string is a valid hex literal containing at least aNumChars + * digits. + */ +NS_MSG_BASE bool MsgIsHex(const char* aHexString, size_t aNumChars); + +/** + * Convert an uint32_t to a nsMsgKey. + * Currently they are mostly the same but we need to preserve the notion that + * nsMsgKey is an opaque value that can't be treated as a generic integer + * (except when storing it into the database). It enables type safety checks and + * may prevent coding errors. + */ +NS_MSG_BASE nsMsgKey msgKeyFromInt(uint32_t aValue); + +NS_MSG_BASE nsMsgKey msgKeyFromInt(uint64_t aValue); + +NS_MSG_BASE uint32_t msgKeyToInt(nsMsgKey aMsgKey); + +/** + * Helper function to extract query part from URL spec. + */ +nsCString MsgExtractQueryPart(const nsACString& spec, + const char* queryToExtract); +/** + * Helper function to remove query part from URL spec or path. + */ +void MsgRemoveQueryPart(nsCString& aSpec); + +/** + * Helper macro for defining getter/setters. Ported from nsISupportsObsolete.h + */ +#define NS_IMPL_GETSET(clazz, attr, type, member) \ + NS_IMETHODIMP clazz::Get##attr(type* result) { \ + NS_ENSURE_ARG_POINTER(result); \ + *result = member; \ + return NS_OK; \ + } \ + NS_IMETHODIMP clazz::Set##attr(type aValue) { \ + member = aValue; \ + return NS_OK; \ + } + +/** + * Macro and helper function for reporting an error, warning or + * informational message to the Error Console + * + * This will require the inclusion of the following files in the source file + * #include "nsIScriptError.h" + * #include "nsIConsoleService.h" + * + */ + +NS_MSG_BASE +void MsgLogToConsole4(const nsAString& aErrorText, const nsAString& aFilename, + uint32_t aLine, uint32_t flags); + +// Macro with filename and line number +#define MSG_LOG_TO_CONSOLE(_text, _flag) \ + MsgLogToConsole4(NS_LITERAL_STRING_FROM_CSTRING(_text), \ + NS_LITERAL_STRING_FROM_CSTRING(__FILE__), __LINE__, _flag) +#define MSG_LOG_ERR_TO_CONSOLE(_text) \ + MSG_LOG_TO_CONSOLE(_text, nsIScriptError::errorFlag) +#define MSG_LOG_WARN_TO_CONSOLE(_text) \ + MSG_LOG_TO_CONSOLE(_text, nsIScriptError::warningFlag) +#define MSG_LOG_INFO_TO_CONSOLE(_text) \ + MSG_LOG_TO_CONSOLE(_text, nsIScriptError::infoFlag) + +// Helper macros to cope with shoddy I/O error reporting (or lack thereof) +#define MSG_NS_ERROR(_txt) \ + do { \ + NS_ERROR(_txt); \ + MSG_LOG_ERR_TO_CONSOLE(_txt); \ + } while (0) +#define MSG_NS_WARNING(_txt) \ + do { \ + NS_WARNING(_txt); \ + MSG_LOG_WARN_TO_CONSOLE(_txt); \ + } while (0) +#define MSG_NS_WARN_IF_FALSE(_val, _txt) \ + do { \ + if (!(_val)) { \ + NS_WARNING(_txt); \ + MSG_LOG_WARN_TO_CONSOLE(_txt); \ + } \ + } while (0) +#define MSG_NS_INFO(_txt) \ + do { \ + MSG_LOCAL_INFO_TO_CONSOLE(_txt); \ + fprintf(stderr, "(info) %s (%s:%d)\n", _txt, __FILE__, __LINE__); \ + } while (0) + +/** + * Perform C-style string escaping. E.g. "foo\r\n" => "foo\\r\\n" + * This is primarily intended for debuggin purposes. + */ +nsCString CEscapeString(nsACString const& s); + +/** + * Synchronously copy the contents of src to dest, until EOF is encountered + * or an error occurs. + * The total number of bytes copied is returned in bytesCopied. + */ +nsresult SyncCopyStream(nsIInputStream* src, nsIOutputStream* dest, + uint64_t& bytesCopied, + size_t bufSize = FILE_IO_BUFFER_SIZE); + +// Used for "@mozilla.org/network/sync-stream-listener;1". +already_AddRefed<nsIStreamListener> SyncStreamListenerCreate(); + +nsresult IsOnSameServer(nsIMsgFolder* folder1, nsIMsgFolder* folder2, + bool* sameServer); + +#endif |