From 302bf1b523012e11b60425d6eee1221ebc2724eb Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Sun, 3 Nov 2019 00:17:46 -0400 Subject: Issue #1258 - Part 1: Import mailnews, ldap, and mork from comm-esr52.9.1 --- mailnews/imap/src/nsImapServerResponseParser.h | 269 +++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 mailnews/imap/src/nsImapServerResponseParser.h (limited to 'mailnews/imap/src/nsImapServerResponseParser.h') diff --git a/mailnews/imap/src/nsImapServerResponseParser.h b/mailnews/imap/src/nsImapServerResponseParser.h new file mode 100644 index 000000000..5b46f8a43 --- /dev/null +++ b/mailnews/imap/src/nsImapServerResponseParser.h @@ -0,0 +1,269 @@ +/* -*- Mode: C++; tab-width: 4; 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 _nsIMAPServerResponseParser_H_ +#define _nsIMAPServerResponseParser_H_ + +#include "mozilla/Attributes.h" +#include "nsIMAPHostSessionList.h" +#include "nsImapSearchResults.h" +#include "nsStringGlue.h" +#include "MailNewsTypes.h" +#include "nsTArray.h" +#include "nsImapUtils.h" +#include "nsAutoPtr.h" + +class nsIMAPNamespace; +class nsIMAPNamespaceList; +class nsIMAPBodyShell; +class nsIMAPBodypart; +class nsImapSearchResultIterator; +class nsImapFlagAndUidState; +class nsCString; + +#include "nsIMAPGenericParser.h" + +class nsImapServerResponseParser : public nsIMAPGenericParser +{ +public: + nsImapServerResponseParser(nsImapProtocol &imapConnection); + virtual ~nsImapServerResponseParser(); + + // Overridden from the base parser class + virtual bool LastCommandSuccessful() override; + virtual void HandleMemoryFailure() override; + + // aignoreBadAndNOResponses --> don't throw a error dialog if this command results in a NO or Bad response + // from the server..in other words the command is "exploratory" and we don't really care if it succeeds or fails. + // This value is typically FALSE for almost all cases. + virtual void ParseIMAPServerResponse(const char *aCurrentCommand, + bool aIgnoreBadAndNOResponses, + char *aGreetingWithCapability = NULL); + virtual void InitializeState(); + bool CommandFailed(); + void SetCommandFailed(bool failed); + + enum eIMAPstate { + kNonAuthenticated, + kAuthenticated, + kFolderSelected + } ; + + virtual eIMAPstate GetIMAPstate(); + virtual bool WaitingForMoreClientInput() { return fWaitingForMoreClientInput; } + const char *GetSelectedMailboxName(); // can be NULL + + // if we get a PREAUTH greeting from the server, initialize the parser to begin in + // the kAuthenticated state + void PreauthSetAuthenticatedState(); + + // these functions represent the state of the currently selected + // folder + bool CurrentFolderReadOnly(); + int32_t NumberOfMessages(); + int32_t NumberOfRecentMessages(); + int32_t NumberOfUnseenMessages(); + int32_t FolderUID(); + uint32_t CurrentResponseUID(); + uint32_t HighestRecordedUID(); + void SetCurrentResponseUID(uint32_t uid); + bool IsNumericString(const char *string); + uint32_t SizeOfMostRecentMessage(); + void SetTotalDownloadSize(int32_t newSize) { fTotalDownloadSize = newSize; } + + nsImapSearchResultIterator *CreateSearchResultIterator(); + void ResetSearchResultSequence() {fSearchResults->ResetSequence();} + + // create a struct mailbox_spec from our info, used in + // libmsg c interface + nsImapMailboxSpec *CreateCurrentMailboxSpec(const char *mailboxName = nullptr); + + // Resets the flags state. + void ResetFlagInfo(); + + // set this to false if you don't want to alert the user to server + // error messages + void SetReportingErrors(bool reportThem) { fReportingErrors=reportThem;} + bool GetReportingErrors() { return fReportingErrors; } + + eIMAPCapabilityFlags GetCapabilityFlag() { return fCapabilityFlag; } + void SetCapabilityFlag(eIMAPCapabilityFlags capability) {fCapabilityFlag = capability;} + bool ServerHasIMAP4Rev1Capability() { return ((fCapabilityFlag & kIMAP4rev1Capability) != 0); } + bool ServerHasACLCapability() { return ((fCapabilityFlag & kACLCapability) != 0); } + bool ServerHasNamespaceCapability() { return ((fCapabilityFlag & kNamespaceCapability) != 0); } + bool ServerIsNetscape3xServer() { return fServerIsNetscape3xServer; } + bool ServerHasServerInfo() {return ((fCapabilityFlag & kXServerInfoCapability) != 0); } + bool ServerIsAOLServer() {return ((fCapabilityFlag & kAOLImapCapability) != 0); } + void SetFetchingFlags(bool aFetchFlags) { fFetchingAllFlags = aFetchFlags;} + void ResetCapabilityFlag() ; + + nsCString& GetMailAccountUrl() { return fMailAccountUrl; } + const char *GetXSenderInfo() { return fXSenderInfo; } + void FreeXSenderInfo() { PR_FREEIF(fXSenderInfo); } + nsCString& GetManageListsUrl() { return fManageListsUrl; } + nsCString& GetManageFiltersUrl() {return fManageFiltersUrl;} + const char *GetManageFolderUrl() {return fFolderAdminUrl;} + nsCString &GetServerID() {return fServerIdResponse;} + + // Call this when adding a pipelined command to the session + void IncrementNumberOfTaggedResponsesExpected(const char *newExpectedTag); + + // Interrupt a Fetch, without really Interrupting (through netlib) + bool GetLastFetchChunkReceived(); + void ClearLastFetchChunkReceived(); + virtual uint16_t SupportsUserFlags() { return fSupportsUserDefinedFlags; } + virtual uint16_t SettablePermanentFlags() { return fSettablePermanentFlags;} + void SetFlagState(nsIImapFlagAndUidState *state); + bool GetDownloadingHeaders(); + bool GetFillingInShell(); + void UseCachedShell(nsIMAPBodyShell *cachedShell); + void SetHostSessionList(nsIImapHostSessionList *aHostSession); + char *fAuthChallenge; // the challenge returned by the server in + //response to authenticate using CRAM-MD5 or NTLM + bool fCondStoreEnabled; + bool fUseModSeq; // can use mod seq for currently selected folder + uint64_t fHighestModSeq; + +protected: + virtual void flags(); + virtual void envelope_data(); + virtual void xaolenvelope_data(); + virtual void parse_address(nsAutoCString &addressLine); + virtual void internal_date(); + virtual nsresult BeginMessageDownload(const char *content_type); + + virtual void response_data(); + virtual void resp_text(); + virtual void resp_cond_state(bool isTagged); + virtual void text_mime2(); + virtual void text(); + virtual void parse_folder_flags(); + virtual void enable_data(); + virtual void language_data(); + virtual void authChallengeResponse_data(); + virtual void resp_text_code(); + virtual void response_done(); + virtual void response_tagged(); + virtual void response_fatal(); + virtual void resp_cond_bye(); + virtual void id_data(); + virtual void mailbox_data(); + virtual void numeric_mailbox_data(); + virtual void capability_data(); + virtual void xserverinfo_data(); + virtual void xmailboxinfo_data(); + virtual void namespace_data(); + virtual void myrights_data(bool unsolicited); + virtual void acl_data(); + virtual void bodystructure_data(); + nsIMAPBodypart *bodystructure_part(char *partNum, nsIMAPBodypart *parentPart); + nsIMAPBodypart *bodystructure_leaf(char *partNum, nsIMAPBodypart *parentPart); + nsIMAPBodypart *bodystructure_multipart(char *partNum, nsIMAPBodypart *parentPart); + virtual void mime_data(); + virtual void mime_part_data(); + virtual void mime_header_data(); + virtual void quota_data(); + virtual void msg_fetch(); + virtual void msg_obsolete(); + virtual void msg_fetch_headers(const char *partNum); + virtual void msg_fetch_content(bool chunk, int32_t origin, const char *content_type); + virtual bool msg_fetch_quoted(); + virtual bool msg_fetch_literal(bool chunk, int32_t origin); + virtual void mailbox_list(bool discoveredFromLsub); + virtual void mailbox(nsImapMailboxSpec *boxSpec); + + virtual void ProcessOkCommand(const char *commandToken); + virtual void ProcessBadCommand(const char *commandToken); + virtual void PreProcessCommandToken(const char *commandToken, + const char *currentCommand); + virtual void PostProcessEndOfLine(); + + // Overridden from the nsIMAPGenericParser, to retrieve the next line + // from the open socket. + virtual bool GetNextLineForParser(char **nextLine) override; + // overriden to do logging + virtual void SetSyntaxError(bool error, const char *msg = nullptr) override; + +private: + bool fCurrentCommandFailed; + bool fReportingErrors; + + + bool fCurrentFolderReadOnly; + bool fCurrentLineContainedFlagInfo; + bool fFetchingAllFlags; + bool fWaitingForMoreClientInput; + // Is the server a Netscape 3.x Messaging Server? + bool fServerIsNetscape3xServer; + bool fDownloadingHeaders; + bool fCurrentCommandIsSingleMessageFetch; + bool fGotPermanentFlags; + imapMessageFlagsType fSavedFlagInfo; + nsTArray fCustomFlags; + + uint16_t fSupportsUserDefinedFlags; + uint16_t fSettablePermanentFlags; + + int32_t fFolderUIDValidity; + int32_t fNumberOfUnseenMessages; + int32_t fNumberOfExistingMessages; + int32_t fNumberOfRecentMessages; + uint32_t fCurrentResponseUID; + uint32_t fHighestRecordedUID; + // used to handle server that sends msg size after headers + uint32_t fReceivedHeaderOrSizeForUID; + int32_t fSizeOfMostRecentMessage; + int32_t fTotalDownloadSize; + + int32_t fStatusUnseenMessages; + int32_t fStatusRecentMessages; + uint32_t fStatusNextUID; + uint32_t fStatusExistingMessages; + + int fNumberOfTaggedResponsesExpected; + + char *fCurrentCommandTag; + + nsCString fZeroLengthMessageUidString; + + char *fSelectedMailboxName; + + nsImapSearchResultSequence *fSearchResults; + + nsCOMPtr fFlagState; // NOT owned by us, it's a copy, do not destroy + + eIMAPstate fIMAPstate; + + eIMAPCapabilityFlags fCapabilityFlag; + nsCString fMailAccountUrl; + char *fNetscapeServerVersionString; + char *fXSenderInfo; /* changed per message download */ + char *fLastAlert; /* used to avoid displaying the same alert over and over */ + char *fMsgID; /* MessageID for Gmail only (X-GM-MSGID) */ + char *fThreadID; /* ThreadID for Gmail only (X-GM-THRID) */ + char *fLabels; /* Labels for Gmail only (X-GM-LABELS) [will include parens, removed while passing to hashTable ]*/ + nsCString fManageListsUrl; + nsCString fManageFiltersUrl; + char *fFolderAdminUrl; + nsCString fServerIdResponse; // RFC + + int32_t fFetchResponseIndex; + + // used for aborting a fetch stream when we're pseudo-Interrupted + int32_t numberOfCharsInThisChunk; + int32_t charsReadSoFar; + bool fLastChunk; + + // points to the current body shell, if any + RefPtr m_shell; + + // The connection object + nsImapProtocol &fServerConnection; + + nsIImapHostSessionList *fHostSessionList; + nsTArray fCopyResponseKeyArray; +}; + +#endif -- cgit v1.2.3