/* -*- 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 _nsMimeBaseEmitter_h_ #define _nsMimeBaseEmitter_h_ #include "prio.h" #include "nsIMimeEmitter.h" #include "nsMimeRebuffer.h" #include "nsIStreamListener.h" #include "nsIInputStream.h" #include "nsIOutputStream.h" #include "nsIURI.h" #include "nsIChannel.h" #include "nsIStringBundle.h" #include "nsCOMPtr.h" #include "nsTArray.h" #include "nsIMimeConverter.h" #include "nsIInterfaceRequestor.h" // // The base emitter will serve as the place to do all of the caching, // sorting, etc... of mail headers and bodies for this internally developed // emitter library. The other emitter classes in this file (nsMimeHTMLEmitter, // etc.) will only be concerned with doing output processing ONLY. // // // Used for keeping track of the attachment information... // typedef struct { char* displayName; char* urlSpec; char* contentType; bool isExternalAttachment; } attachmentInfoType; // // For header info... // typedef struct { char* name; char* value; } headerInfoType; class nsMimeBaseEmitter : public nsIMimeEmitter, public nsIInterfaceRequestor { public: nsMimeBaseEmitter(); // nsISupports interface NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIMIMEEMITTER NS_DECL_NSIINTERFACEREQUESTOR // Utility output functions... NS_IMETHOD UtilityWrite(const nsACString& buf); NS_IMETHOD UtilityWriteCRLF(const char* buf); // For string bundle usage... char* MimeGetStringByName(const char* aHeaderName); char* MimeGetStringByID(int32_t aID); char* LocalizeHeaderName(const char* aHeaderName, const char* aDefaultName); // For header processing... const char* GetHeaderValue(const char* aHeaderName); // To write out a stored header array as HTML virtual nsresult WriteHeaderFieldHTMLPrefix(const nsACString& name); virtual nsresult WriteHeaderFieldHTML(const char* field, const char* value); virtual nsresult WriteHeaderFieldHTMLPostfix(); protected: virtual ~nsMimeBaseEmitter(); // Internal methods... void CleanupHeaderArray(nsTArray* aArray); // For header output... nsresult DumpSubjectFromDate(); nsresult DumpToCC(); nsresult DumpRestOfHeaders(); nsresult OutputGenericHeader(const char* aHeaderVal); nsresult WriteHelper(const nsACString& buf, uint32_t* countWritten); // For string bundle usage... nsCOMPtr m_stringBundle; // for translated strings nsCOMPtr m_headerStringBundle; // for non-translated header strings // For buffer management on output MimeRebuffer* mBufferMgr; // mscott // don't ref count the streams....the emitter is owned by the converter // which owns these streams... // nsIOutputStream* mOutStream; nsIInputStream* mInputStream; nsIStreamListener* mOutListener; nsCOMPtr mChannel; // For gathering statistics on processing... uint32_t mTotalWritten; uint32_t mTotalRead; // Output control and info... bool mDocHeader; // For header determination... nsIURI* mURL; // the url for the data being processed... int32_t mHeaderDisplayType; // The setting for header output... nsCString mHTMLHeaders; // HTML Header Data... // For attachment processing... int32_t mAttachCount; nsTArray* mAttachArray; attachmentInfoType* mCurrentAttachment; // For header caching... nsTArray* mHeaderArray; nsTArray* mEmbeddedHeaderArray; // For body caching... bool mBodyStarted; nsCString mBody; bool mFirstHeaders; // For the format being used... int32_t mFormat; // For I18N Conversion... nsCOMPtr mUnicodeConverter; nsString mCharset; nsresult GenerateDateString(const char* dateString, nsACString& formattedDate, bool showDateForToday); // The caller is expected to free the result of GetLocalizedDateString char* GetLocalizedDateString(const char* dateString); }; #endif /* _nsMimeBaseEmitter_h_ */