diff options
-rw-r--r-- | include/tools/inetmsg.hxx | 114 | ||||
-rw-r--r-- | tools/source/inet/inetmsg.cxx | 535 |
2 files changed, 22 insertions, 627 deletions
diff --git a/include/tools/inetmsg.hxx b/include/tools/inetmsg.hxx index 3d3002cc407b..fa4d159dd147 100644 --- a/include/tools/inetmsg.hxx +++ b/include/tools/inetmsg.hxx @@ -50,9 +50,6 @@ public: : m_aName (rHdr.m_aName), m_aValue (rHdr.m_aValue) {} - ~INetMessageHeader() - {} - INetMessageHeader& operator= (const INetMessageHeader& rHdr) { m_aName = rHdr.m_aName; @@ -62,57 +59,15 @@ public: const OString& GetName() const { return m_aName; } const OString& GetValue() const { return m_aValue; } - - friend SvStream& WriteINetMessageHeader( - SvStream& rStrm, const INetMessageHeader& rHdr) - { - write_uInt16_lenPrefixed_uInt8s_FromOString(rStrm, rHdr.m_aName); - write_uInt16_lenPrefixed_uInt8s_FromOString(rStrm, rHdr.m_aValue); - return rStrm; - } - - friend SvStream& ReadINetMessageHeader ( - SvStream& rStrm, INetMessageHeader& rHdr) - { - rHdr.m_aName = read_uInt16_lenPrefixed_uInt8s_ToOString(rStrm); - rHdr.m_aValue = read_uInt16_lenPrefixed_uInt8s_ToOString(rStrm); - return rStrm; - } -}; - -/** - RFC822 fields -*/ -enum class InetMessageField -{ - BCC = 0, - CC = 1, - COMMENTS = 2, - DATE = 3, - FROM = 4, - IN_REPLY_TO = 5, - KEYWORDS = 6, - MESSAGE_ID = 7, - REFERENCES = 8, - REPLY_TO = 9, - RETURN_PATH = 10, - SENDER = 11, - SUBJECT = 12, - TO = 13, - X_MAILER = 14, - RETURN_RECEIPT_TO = 15, - NUMHDR = 16, }; enum class InetMessageMime { VERSION = 0, - CONTENT_DESCRIPTION = 1, - CONTENT_DISPOSITION = 2, - CONTENT_ID = 3, - CONTENT_TYPE = 4, - CONTENT_TRANSFER_ENCODING = 5, - NUMHDR = 6, + CONTENT_DISPOSITION = 1, + CONTENT_TYPE = 2, + CONTENT_TRANSFER_ENCODING = 3, + NUMHDR = 4, }; class TOOLS_DLLPUBLIC INetMIMEMessage @@ -120,29 +75,12 @@ class TOOLS_DLLPUBLIC INetMIMEMessage ::std::vector< INetMessageHeader* > m_aHeaderList; - sal_uIntPtr m_nDocSize; - OUString m_aDocName; SvLockBytesRef m_xDocLB; - void ListCleanup_Impl(); - void ListCopy (const INetMIMEMessage& rMsg); - - ::std::map<InetMessageField, sal_uIntPtr> m_nRFC822Index; - ::std::map<InetMessageMime, sal_uIntPtr> m_nMIMEIndex; INetMIMEMessage* pParent; ::std::vector< INetMIMEMessage* > aChildren; OString m_aBoundary; - bool bHeaderParsed; - - friend class INetMIMEMessageStream; - - const OString& GetMultipartBoundary() const { return m_aBoundary; } - void SetMultipartBoundary (const OString& rBnd) { m_aBoundary = rBnd; } - - void CleanupImp(); - void CopyImp (const INetMIMEMessage& rMsg); - void SetHeaderParsed() { bHeaderParsed = true; } OUString GetHeaderValue_Impl ( sal_uIntPtr nIndex, INetMIME::HeaderFieldType eType) const @@ -176,23 +114,21 @@ class TOOLS_DLLPUBLIC INetMIMEMessage const OUString &rValue, sal_uIntPtr &rnIndex); - sal_uIntPtr SetRFC822HeaderField ( - const INetMessageHeader &rHeader, sal_uIntPtr nNewIndex); + bool IsMessage() const + { + OUString aType (GetContentType()); + return aType.matchIgnoreAsciiCase("message/"); + } + + INetMIMEMessage (const INetMIMEMessage& rMsg) = delete; + INetMIMEMessage& operator= (const INetMIMEMessage& rMsg) = delete; public: INetMIMEMessage(); - INetMIMEMessage (const INetMIMEMessage& rMsg); ~INetMIMEMessage(); - INetMIMEMessage& operator= (const INetMIMEMessage& rMsg); - sal_uIntPtr GetHeaderCount() const { return m_aHeaderList.size(); } - OUString GetHeaderValue (sal_uIntPtr nIndex) const - { - return GetHeaderValue_Impl (nIndex, INetMIME::HEADER_FIELD_TEXT); - } - INetMessageHeader GetHeaderField (sal_uIntPtr nIndex) const { if ( nIndex < m_aHeaderList.size() ) { @@ -202,36 +138,23 @@ public: } } - sal_uIntPtr SetHeaderField ( - const INetMessageHeader &rField, - sal_uIntPtr nIndex = ((sal_uIntPtr)-1) - ); - - sal_uIntPtr GetDocumentSize() const { return m_nDocSize; } - void SetDocumentSize (sal_uIntPtr nSize) { m_nDocSize = nSize; } - SvLockBytes* GetDocumentLB() const { return m_xDocLB; } void SetDocumentLB (SvLockBytes *pDocLB) { m_xDocLB = pDocLB; } static bool ParseDateField ( const OUString& rDateField, DateTime& rDateTime); - static INetMIMEMessage* CreateMessage ( - const INetMIMEMessage& rMsg); - void SetMIMEVersion (const OUString& rVersion); void SetContentDisposition (const OUString& rDisposition); void SetContentType (const OUString& rType); OUString GetContentType() const { - return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_TYPE)); + return GetHeaderValue_Impl( + m_nMIMEIndex.at(InetMessageMime::CONTENT_TYPE), + INetMIME::HEADER_FIELD_TEXT); } void SetContentTransferEncoding (const OUString& rEncoding); - OUString GetContentTransferEncoding() const - { - return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_TRANSFER_ENCODING)); - } OUString GetDefaultContentType (); @@ -241,11 +164,6 @@ public: { return (IsMessage() || IsMultipart()); } - bool IsMessage() const - { - OUString aType (GetContentType()); - return aType.matchIgnoreAsciiCase("message/"); - } bool IsMultipart() const { OUString aType (GetContentType()); @@ -261,6 +179,8 @@ public: bool EnableAttachMultipartFormDataChild(); bool AttachChild ( INetMIMEMessage& rChildMsg, bool bOwner = true ); + + const OString& GetMultipartBoundary() const { return m_aBoundary; } }; #endif diff --git a/tools/source/inet/inetmsg.cxx b/tools/source/inet/inetmsg.cxx index bf124380ef13..099e6bf4915f 100644 --- a/tools/source/inet/inetmsg.cxx +++ b/tools/source/inet/inetmsg.cxx @@ -40,40 +40,6 @@ inline bool ascii_isLetter( sal_Unicode ch ) return (( (ch >= 0x0041) && (ch <= 0x005A)) || ((ch >= 0x0061) && (ch <= 0x007A))); } -inline sal_Unicode ascii_toLowerCase( sal_Unicode ch ) -{ - if ( (ch >= 0x0041) && (ch <= 0x005A) ) - return ch + 0x20; - else - return ch; -} - -void INetMIMEMessage::ListCleanup_Impl() -{ - // Cleanup. - sal_uIntPtr i, n = m_aHeaderList.size(); - for (i = 0; i < n; i++) - delete m_aHeaderList[ i ]; - m_aHeaderList.clear(); -} - -void INetMIMEMessage::ListCopy (const INetMIMEMessage &rMsg) -{ - if (!(this == &rMsg)) - { - // Cleanup. - ListCleanup_Impl(); - - // Copy. - sal_uIntPtr i, n = rMsg.GetHeaderCount(); - for (i = 0; i < n; i++) - { - INetMessageHeader *p = rMsg.m_aHeaderList[ i ]; - m_aHeaderList.push_back( new INetMessageHeader(*p) ); - } - } -} - void INetMIMEMessage::SetHeaderField_Impl ( INetMIME::HeaderFieldType eType, const OString &rName, @@ -87,43 +53,6 @@ void INetMIMEMessage::SetHeaderField_Impl ( INetMessageHeader (rName, aSink.takeBuffer()), rnIndex); } -static const std::map<InetMessageField, const char *> ImplINetRFC822MessageHeaderData = -{ - { InetMessageField::BCC, "BCC" } , - { InetMessageField::CC, "CC" } , - { InetMessageField::COMMENTS, "Comments" } , - { InetMessageField::DATE, "Date" } , - { InetMessageField::FROM, "From" } , - { InetMessageField::IN_REPLY_TO, "In-Reply-To" } , - { InetMessageField::KEYWORDS, "Keywords" } , - { InetMessageField::MESSAGE_ID, "Message-ID" } , - { InetMessageField::REFERENCES, "References" } , - { InetMessageField::REPLY_TO, "Reply-To" } , - { InetMessageField::RETURN_PATH, "Return-Path" } , - { InetMessageField::SUBJECT, "Subject" } , - { InetMessageField::SENDER, "Sender" } , - { InetMessageField::TO, "To" } , - { InetMessageField::X_MAILER, "X-Mailer" } , - { InetMessageField::RETURN_RECEIPT_TO, "Return-Receipt-To" } , -}; - -/* - State of RFC822 header parsing -*/ -enum class HeaderState -{ - BEGIN, - CHECK, - OK, - JUNK, - - TOKEN_RE, - TOKEN_RETURNMINUS, - TOKEN_XMINUS, - LETTER_C, - LETTER_S -}; - /* ParseDateField and local helper functions. * * Parses a String in (implied) GMT format into class Date and tools::Time objects. @@ -276,483 +205,29 @@ bool INetMIMEMessage::ParseDateField ( (rDateTime.GetHour() > 23) )); } -// Header Field Parser -sal_uIntPtr INetMIMEMessage::SetRFC822HeaderField ( - const INetMessageHeader &rHeader, sal_uIntPtr nNewIndex) -{ - OString aName (rHeader.GetName()); - const sal_Char *pData = aName.getStr(); - const sal_Char *pStop = pData + aName.getLength() + 1; - const sal_Char *check = ""; - - InetMessageField nIdx = static_cast<InetMessageField>(CONTAINER_APPEND); - HeaderState eState = HeaderState::BEGIN; - HeaderState eOkState = HeaderState::OK; - - while (pData < pStop) - { - switch (eState) - { - case HeaderState::BEGIN: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'b': - check = "cc"; - nIdx = InetMessageField::BCC; - break; - - case 'c': - eState = HeaderState::LETTER_C; - break; - - case 'd': - check = "ate"; - nIdx = InetMessageField::DATE; - break; - - case 'f': - check = "rom"; - nIdx = InetMessageField::FROM; - break; - - case 'i': - check = "n-reply-to"; - nIdx = InetMessageField::IN_REPLY_TO; - break; - - case 'k': - check = "eywords"; - nIdx = InetMessageField::KEYWORDS; - break; - - case 'm': - check = "essage-id"; - nIdx = InetMessageField::MESSAGE_ID; - break; - - case 'r': - check = "e"; - eOkState = HeaderState::TOKEN_RE; - break; - - case 's': - eState = HeaderState::LETTER_S; - break; - - case 't': - check = "o"; - nIdx = InetMessageField::TO; - break; - - case 'x': - check = "-"; - eOkState = HeaderState::TOKEN_XMINUS; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::TOKEN_RE: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'f': - check = "erences"; - nIdx = InetMessageField::REFERENCES; - break; - - case 'p': - check = "ly-to"; - nIdx = InetMessageField::REPLY_TO; - break; - - case 't': - check = "urn-"; - eOkState = HeaderState::TOKEN_RETURNMINUS; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::TOKEN_RETURNMINUS: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'p': - check = "ath"; - nIdx = InetMessageField::RETURN_PATH; - break; - - case 'r': - check = "eceipt-to"; - nIdx = InetMessageField::RETURN_RECEIPT_TO; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::TOKEN_XMINUS: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'm': - check = "ailer"; - nIdx = InetMessageField::X_MAILER; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::LETTER_C: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'c': - check = ""; - nIdx = InetMessageField::CC; - break; - - case 'o': - check = "mments"; - nIdx = InetMessageField::COMMENTS; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::LETTER_S: - eState = HeaderState::CHECK; - eOkState = HeaderState::OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'e': - check = "nder"; - nIdx = InetMessageField::SENDER; - break; - - case 'u': - check = "bject"; - nIdx = InetMessageField::SUBJECT; - break; - - default: - eState = HeaderState::JUNK; - break; - } - pData++; - break; - - case HeaderState::CHECK: - if (*check) - { - while (*pData && *check && - (ascii_toLowerCase (*pData) == *check)) - { - pData++; - check++; - } - } - else - { - check = pData; - } - eState = (*check == '\0') ? eOkState : HeaderState::JUNK; - break; - - case HeaderState::OK: - pData = pStop; - SetHeaderField_Impl ( - INetMessageHeader( ImplINetRFC822MessageHeaderData.at(nIdx), rHeader.GetValue() ), - m_nRFC822Index[nIdx]); - nNewIndex = m_nRFC822Index[nIdx]; - break; - - default: // INETMSG_RFC822_JUNK - pData = pStop; - SetHeaderField_Impl(rHeader, nNewIndex); - break; - } - } - return nNewIndex; -} - static const std::map<InetMessageMime, const char*> ImplINetMIMEMessageHeaderData = { { InetMessageMime::VERSION, "MIME-Version"}, - { InetMessageMime::CONTENT_DESCRIPTION, "Content-Description"}, { InetMessageMime::CONTENT_DISPOSITION, "Content-Disposition"}, - { InetMessageMime::CONTENT_ID, "Content-ID"}, { InetMessageMime::CONTENT_TYPE, "Content-Type"}, { InetMessageMime::CONTENT_TRANSFER_ENCODING, "Content-Transfer-Encoding"} }; -enum _ImplINetMIMEMessageHeaderState -{ - INETMSG_MIME_BEGIN, - INETMSG_MIME_CHECK, - INETMSG_MIME_OK, - INETMSG_MIME_JUNK, - - INETMSG_MIME_TOKEN_CONTENT, - INETMSG_MIME_TOKEN_CONTENT_D, - INETMSG_MIME_TOKEN_CONTENT_T -}; - INetMIMEMessage::INetMIMEMessage() - : m_nDocSize(0), - pParent(NULL), - bHeaderParsed(false) + : pParent(NULL) { - for (sal_uInt16 i = 0; i < static_cast<int>(InetMessageField::NUMHDR); i++) - m_nRFC822Index[static_cast<InetMessageField>(i)] = CONTAINER_ENTRY_NOTFOUND; for (sal_uInt16 i = 0; i < static_cast<int>(InetMessageMime::NUMHDR); i++) m_nMIMEIndex[static_cast<InetMessageMime>(i)] = CONTAINER_ENTRY_NOTFOUND; } -INetMIMEMessage::INetMIMEMessage (const INetMIMEMessage& rMsg) - : m_nDocSize(rMsg.m_nDocSize), - m_aDocName(rMsg.m_aDocName), - m_xDocLB(rMsg.m_xDocLB), - pParent(NULL) -{ - ListCopy (rMsg); - m_nRFC822Index = rMsg.m_nRFC822Index; - CopyImp (rMsg); -} - -INetMIMEMessage& INetMIMEMessage::operator= ( - const INetMIMEMessage& rMsg) -{ - if (this != &rMsg) - { - m_nDocSize = rMsg.m_nDocSize; - m_aDocName = rMsg.m_aDocName; - m_xDocLB = rMsg.m_xDocLB; - ListCopy (rMsg); - m_nRFC822Index = rMsg.m_nRFC822Index; - CleanupImp(); - CopyImp (rMsg); - } - return *this; -} - INetMIMEMessage::~INetMIMEMessage() { - ListCleanup_Impl(); - CleanupImp(); -} - -void INetMIMEMessage::CleanupImp() -{ - for( size_t i = 0, n = aChildren.size(); i < n; ++i ) { - delete aChildren[ i ]; - } - aChildren.clear(); -} - -void INetMIMEMessage::CopyImp (const INetMIMEMessage& rMsg) -{ - bHeaderParsed = rMsg.bHeaderParsed; - - size_t i; - m_nMIMEIndex = rMsg.m_nMIMEIndex; - m_aBoundary = rMsg.m_aBoundary; - - for (i = 0; i < rMsg.aChildren.size(); i++) - { - INetMIMEMessage *pChild = rMsg.aChildren[ i ]; - - if (pChild->pParent == &rMsg) - { - pChild = INetMIMEMessage::CreateMessage (*pChild); - pChild->pParent = this; - } - aChildren.push_back( pChild ); + for (auto i: m_aHeaderList) { + delete i; } -} - -INetMIMEMessage *INetMIMEMessage::CreateMessage ( - const INetMIMEMessage& rMsg) -{ - return new INetMIMEMessage (rMsg); -} - -// Header Field Parser -sal_uIntPtr INetMIMEMessage::SetHeaderField ( - const INetMessageHeader &rHeader, sal_uIntPtr nNewIndex) -{ - OString aName (rHeader.GetName()); - const sal_Char *pData = aName.getStr(); - const sal_Char *pStop = pData + aName.getLength() + 1; - const sal_Char *check = ""; - - InetMessageMime nIdx = static_cast<InetMessageMime>(CONTAINER_APPEND); - int eState = INETMSG_MIME_BEGIN; - int eOkState = INETMSG_MIME_OK; - - while (pData < pStop) - { - switch (eState) - { - case INETMSG_MIME_BEGIN: - eState = INETMSG_MIME_CHECK; - eOkState = INETMSG_MIME_OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'c': - check = "ontent-"; - eOkState = INETMSG_MIME_TOKEN_CONTENT; - break; - - case 'm': - check = "ime-version"; - nIdx = InetMessageMime::VERSION; - break; - - default: - eState = INETMSG_MIME_JUNK; - break; - } - pData++; - break; - - case INETMSG_MIME_TOKEN_CONTENT: - eState = INETMSG_MIME_CHECK; - eOkState = INETMSG_MIME_OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'd': - eState = INETMSG_MIME_TOKEN_CONTENT_D; - break; - - case 'i': - check = "d"; - nIdx = InetMessageMime::CONTENT_ID; - break; - - case 't': - eState = INETMSG_MIME_TOKEN_CONTENT_T; - break; - - default: - eState = INETMSG_MIME_JUNK; - break; - } - pData++; - break; - - case INETMSG_MIME_TOKEN_CONTENT_D: - eState = INETMSG_MIME_CHECK; - eOkState = INETMSG_MIME_OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'e': - check = "scription"; - nIdx = InetMessageMime::CONTENT_DESCRIPTION; - break; - - case 'i': - check = "sposition"; - nIdx = InetMessageMime::CONTENT_DISPOSITION; - break; - - default: - eState = INETMSG_MIME_JUNK; - break; - } - pData++; - break; - - case INETMSG_MIME_TOKEN_CONTENT_T: - eState = INETMSG_MIME_CHECK; - eOkState = INETMSG_MIME_OK; - - switch (ascii_toLowerCase (*pData)) - { - case 'r': - check = "ansfer-encoding"; - nIdx = InetMessageMime::CONTENT_TRANSFER_ENCODING; - break; - - case 'y': - check = "pe"; - nIdx = InetMessageMime::CONTENT_TYPE; - break; - - default: - eState = INETMSG_MIME_JUNK; - break; - } - pData++; - break; - - case INETMSG_MIME_CHECK: - if (*check) - { - while (*pData && *check && - (ascii_toLowerCase (*pData) == *check)) - { - pData++; - check++; - } - } - else - { - check = pData; - } - eState = (*check == '\0') ? eOkState : INETMSG_MIME_JUNK; - break; - - case INETMSG_MIME_OK: - pData = pStop; - SetHeaderField_Impl ( - INetMessageHeader( ImplINetMIMEMessageHeaderData.at(nIdx), rHeader.GetValue()), - m_nMIMEIndex[nIdx]); - nNewIndex = m_nMIMEIndex[nIdx]; - break; - - default: // INETMSG_MIME_JUNK - pData = pStop; - nNewIndex = SetRFC822HeaderField(rHeader, nNewIndex); - break; - } + for (auto i: aChildren) { + delete i; } - return nNewIndex; } void INetMIMEMessage::SetMIMEVersion (const OUString& rVersion) |