diff options
Diffstat (limited to 'comm/mailnews/imap/src/nsImapServerResponseParser.h')
-rw-r--r-- | comm/mailnews/imap/src/nsImapServerResponseParser.h | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/comm/mailnews/imap/src/nsImapServerResponseParser.h b/comm/mailnews/imap/src/nsImapServerResponseParser.h new file mode 100644 index 0000000000..43d6a73611 --- /dev/null +++ b/comm/mailnews/imap/src/nsImapServerResponseParser.h @@ -0,0 +1,275 @@ +/* -*- 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 "../public/nsIImapHostSessionList.h" +#include "nsImapSearchResults.h" +#include "nsString.h" +#include "MailNewsTypes.h" +#include "nsTArray.h" +#include "nsImapUtils.h" + +class nsImapSearchResultIterator; +class nsIImapFlagAndUidState; + +#include "nsImapGenericParser.h" + +class nsImapServerResponseParser : public nsImapGenericParser { + public: + explicit 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); + bool UntaggedResponse(); + + enum eIMAPstate { kNonAuthenticated, kAuthenticated, kFolderSelected }; + + virtual eIMAPstate GetIMAPstate(); + virtual bool WaitingForMoreClientInput() { + return fWaitingForMoreClientInput; + } + const char* GetSelectedMailboxName(); // can be NULL + bool IsStdJunkNotJunkUseOk() { return fStdJunkNotJunkUseOk; } + + // 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 FolderUID(); + uint32_t CurrentResponseUID(); + uint32_t HighestRecordedUID(); + void ResetHighestRecordedUID(); + 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 + already_AddRefed<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(); + int32_t GetNumBytesFetched(); + void ClearNumBytesFetched(); + virtual uint16_t SupportsUserFlags() { return fSupportsUserDefinedFlags; } + virtual uint16_t SettablePermanentFlags() { return fSettablePermanentFlags; } + void SetFlagState(nsIImapFlagAndUidState* state); + bool GetDownloadingHeaders(); + void SetHostSessionList(nsIImapHostSessionList* aHostSession); + char* fAuthChallenge; // the challenge returned by the server in + // response to authenticate using CRAM-MD5 or NTLM + bool fUtf8AcceptEnabled; + 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(bool calledForFlags); + 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 mime_part_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; + // overridden to do logging + virtual void SetSyntaxError(bool error, const char* msg = nullptr) override; + + private: + bool fCurrentCommandFailed; + bool fUntaggedResponse; + 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; + bool fStdJunkNotJunkUseOk; + imapMessageFlagsType fSavedFlagInfo; + nsTArray<nsCString> fCustomFlags; + + uint16_t fSupportsUserDefinedFlags; + uint16_t fSettablePermanentFlags; + + int32_t fFolderUIDValidity; + int32_t fSeqNumOfFirstUnseenMsg; + 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; + int32_t fStatusExistingMessages; + uint32_t fNextUID; + + int fNumberOfTaggedResponsesExpected; + + char* fCurrentCommandTag; + + nsCString fZeroLengthMessageUidString; + + char* fSelectedMailboxName; + + nsImapSearchResultSequence* fSearchResults; + + nsCOMPtr<nsIImapFlagAndUidState> + 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; + + // Flags split of \r and \n between chunks in msg_fetch_literal(). + bool fNextChunkStartsWithNewline; + + // The connection object + nsImapProtocol& fServerConnection; + + RefPtr<nsIImapHostSessionList> fHostSessionList; + nsTArray<nsMsgKey> fCopyResponseKeyArray; +}; + +#endif |