LCOV - code coverage report
Current view: top level - include/tools - inetmsg.hxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 53 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 25 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : #ifndef INCLUDED_TOOLS_INETMSG_HXX
      20             : #define INCLUDED_TOOLS_INETMSG_HXX
      21             : 
      22             : #include <tools/toolsdllapi.h>
      23             : #include <rtl/string.hxx>
      24             : #include <rtl/textenc.h>
      25             : #include <rtl/ustring.hxx>
      26             : #include <tools/inetmime.hxx>
      27             : #include <tools/stream.hxx>
      28             : 
      29             : #include <vector>
      30             : #include <map>
      31             : 
      32             : class DateTime;
      33             : 
      34             : class INetMessageHeader
      35             : {
      36             :     OString m_aName;
      37             :     OString m_aValue;
      38             : 
      39             : public:
      40           0 :     INetMessageHeader()
      41           0 :     {}
      42             : 
      43           0 :     INetMessageHeader (
      44             :         const OString& rName, const OString& rValue)
      45           0 :         : m_aName (rName), m_aValue (rValue)
      46           0 :     {}
      47             : 
      48           0 :     INetMessageHeader (
      49             :         const INetMessageHeader& rHdr)
      50           0 :         : m_aName (rHdr.m_aName), m_aValue (rHdr.m_aValue)
      51           0 :     {}
      52             : 
      53           0 :     ~INetMessageHeader()
      54           0 :     {}
      55             : 
      56             :     INetMessageHeader& operator= (const INetMessageHeader& rHdr)
      57             :     {
      58             :         m_aName  = rHdr.m_aName;
      59             :         m_aValue = rHdr.m_aValue;
      60             :         return *this;
      61             :     }
      62             : 
      63           0 :     const OString& GetName() const { return m_aName; }
      64           0 :     const OString& GetValue() const { return m_aValue; }
      65             : 
      66             :     friend SvStream& WriteINetMessageHeader(
      67             :         SvStream& rStrm, const INetMessageHeader& rHdr)
      68             :     {
      69             :         write_uInt16_lenPrefixed_uInt8s_FromOString(rStrm, rHdr.m_aName);
      70             :         write_uInt16_lenPrefixed_uInt8s_FromOString(rStrm, rHdr.m_aValue);
      71             :         return rStrm;
      72             :     }
      73             : 
      74             :     friend SvStream& ReadINetMessageHeader (
      75             :         SvStream& rStrm, INetMessageHeader& rHdr)
      76             :     {
      77             :         rHdr.m_aName = read_uInt16_lenPrefixed_uInt8s_ToOString(rStrm);
      78             :         rHdr.m_aValue = read_uInt16_lenPrefixed_uInt8s_ToOString(rStrm);
      79             :         return rStrm;
      80             :     }
      81             : };
      82             : 
      83             : typedef ::std::vector< INetMessageHeader* > HeaderList_impl;
      84             : 
      85             : /**
      86             :   RFC822 fields
      87             : */
      88             : enum class InetMessageField
      89             : {
      90             :     BCC                =  0,
      91             :     CC                 =  1,
      92             :     COMMENTS           =  2,
      93             :     DATE               =  3,
      94             :     FROM               =  4,
      95             :     IN_REPLY_TO        =  5,
      96             :     KEYWORDS           =  6,
      97             :     MESSAGE_ID         =  7,
      98             :     REFERENCES         =  8,
      99             :     REPLY_TO           =  9,
     100             :     RETURN_PATH        = 10,
     101             :     SENDER             = 11,
     102             :     SUBJECT            = 12,
     103             :     TO                 = 13,
     104             :     X_MAILER           = 14,
     105             :     RETURN_RECEIPT_TO  = 15,
     106             :     NUMHDR             = 16,
     107             : };
     108             : 
     109             : enum class InetMessageMime
     110             : {
     111             :     VERSION                    = 0,
     112             :     CONTENT_DESCRIPTION        = 1,
     113             :     CONTENT_DISPOSITION        = 2,
     114             :     CONTENT_ID                 = 3,
     115             :     CONTENT_TYPE               = 4,
     116             :     CONTENT_TRANSFER_ENCODING  = 5,
     117             :     NUMHDR                     = 6,
     118             : };
     119             : 
     120             : enum INetMessageContainerType
     121             : {
     122             :     INETMSG_MESSAGE_RFC822,
     123             :     INETMSG_MULTIPART_MIXED,
     124             :     INETMSG_MULTIPART_ALTERNATIVE,
     125             :     INETMSG_MULTIPART_DIGEST,
     126             :     INETMSG_MULTIPART_PARALLEL,
     127             :     INETMSG_MULTIPART_RELATED,
     128             :     INETMSG_MULTIPART_FORM_DATA
     129             : };
     130             : 
     131             : class INetMIMEMessage;
     132             : typedef ::std::vector< INetMIMEMessage* > INetMIMEMessgeList_impl;
     133             : 
     134             : class TOOLS_DLLPUBLIC INetMIMEMessage
     135             : {
     136             :     HeaderList_impl m_aHeaderList;
     137             : 
     138             :     sal_uIntPtr     m_nDocSize;
     139             :     OUString        m_aDocName;
     140             :     SvLockBytesRef  m_xDocLB;
     141             : 
     142             :     void ListCleanup_Impl();
     143             :     void ListCopy (const INetMIMEMessage& rMsg);
     144             : 
     145             :     ::std::map<InetMessageField, sal_uIntPtr> m_nRFC822Index;
     146             : 
     147             :     ::std::map<InetMessageMime, sal_uIntPtr>  m_nMIMEIndex;
     148             :     INetMIMEMessage*        pParent;
     149             :     INetMIMEMessgeList_impl aChildren;
     150             :     OString                 m_aBoundary;
     151             :     bool                    bHeaderParsed;
     152             : 
     153             :     friend class INetMIMEMessageStream;
     154             : 
     155           0 :     const OString& GetMultipartBoundary() const { return m_aBoundary; }
     156           0 :     void SetMultipartBoundary (const OString& rBnd) { m_aBoundary = rBnd; }
     157             : 
     158             :     void CleanupImp();
     159             :     void CopyImp    (const INetMIMEMessage& rMsg);
     160           0 :     void SetHeaderParsed() { bHeaderParsed = true; }
     161             : 
     162             :     OUString GetHeaderName_Impl (
     163             :         sal_uIntPtr nIndex, rtl_TextEncoding eEncoding) const
     164             :     {
     165             :         if ( nIndex < m_aHeaderList.size() ) {
     166             :             return OStringToOUString(m_aHeaderList[ nIndex ]->GetName(), eEncoding);
     167             :         } else {
     168             :             return OUString();
     169             :         }
     170             :     }
     171             : 
     172           0 :     OUString GetHeaderValue_Impl (
     173             :         sal_uIntPtr nIndex, INetMIME::HeaderFieldType eType) const
     174             :     {
     175           0 :         if ( nIndex < m_aHeaderList.size() ) {
     176           0 :             return INetMIME::decodeHeaderFieldBody(eType, m_aHeaderList[ nIndex ]->GetValue());
     177             :         } else {
     178           0 :             return OUString();
     179             :         }
     180             :     }
     181             : 
     182           0 :     void SetHeaderField_Impl (
     183             :         const INetMessageHeader &rHeader, sal_uIntPtr &rnIndex)
     184             :     {
     185           0 :         INetMessageHeader *p = new INetMessageHeader (rHeader);
     186           0 :         if (m_aHeaderList.size() <= rnIndex)
     187             :         {
     188           0 :             rnIndex = m_aHeaderList.size();
     189           0 :             m_aHeaderList.push_back( p );
     190             :         }
     191             :         else
     192             :         {
     193           0 :             delete m_aHeaderList[ rnIndex ];
     194           0 :             m_aHeaderList[ rnIndex ] = p;
     195             :         }
     196           0 :     }
     197             : 
     198             :     void SetHeaderField_Impl (
     199             :         INetMIME::HeaderFieldType  eType,
     200             :         const OString &rName,
     201             :         const OUString &rValue,
     202             :         sal_uIntPtr &rnIndex);
     203             : 
     204             :     sal_uIntPtr SetRFC822HeaderField (
     205             :         const INetMessageHeader &rHeader, sal_uIntPtr nNewIndex);
     206             : 
     207             : public:
     208             :     INetMIMEMessage();
     209             :     INetMIMEMessage (const INetMIMEMessage& rMsg);
     210             :     ~INetMIMEMessage();
     211             : 
     212             :     INetMIMEMessage& operator= (const INetMIMEMessage& rMsg);
     213             : 
     214           0 :     sal_uIntPtr GetHeaderCount() const { return m_aHeaderList.size(); }
     215             : 
     216             :     OUString GetHeaderName (sal_uIntPtr nIndex) const
     217             :     {
     218             :         return GetHeaderName_Impl (nIndex, RTL_TEXTENCODING_ASCII_US);
     219             :     }
     220             : 
     221           0 :     OUString GetHeaderValue (sal_uIntPtr nIndex) const
     222             :     {
     223           0 :         return GetHeaderValue_Impl (nIndex, INetMIME::HEADER_FIELD_TEXT);
     224             :     }
     225             : 
     226           0 :     INetMessageHeader GetHeaderField (sal_uIntPtr nIndex) const
     227             :     {
     228           0 :         if ( nIndex < m_aHeaderList.size() ) {
     229           0 :             return INetMessageHeader( *m_aHeaderList[ nIndex ] );
     230             :         } else {
     231           0 :             return INetMessageHeader();
     232             :         }
     233             :     }
     234             : 
     235             :     sal_uIntPtr SetHeaderField (
     236             :         const INetMessageHeader &rField,
     237             :         sal_uIntPtr nIndex = ((sal_uIntPtr)-1)
     238             :     );
     239             : 
     240           0 :     sal_uIntPtr GetDocumentSize() const { return m_nDocSize; }
     241           0 :     void  SetDocumentSize (sal_uIntPtr nSize) { m_nDocSize = nSize; }
     242             : 
     243             :     const OUString& GetDocumentName() const { return m_aDocName; }
     244             :     void  SetDocumentName (const OUString& rName) { m_aDocName = rName; }
     245             : 
     246           0 :     SvLockBytes* GetDocumentLB() const { return m_xDocLB; }
     247           0 :     void         SetDocumentLB (SvLockBytes *pDocLB) { m_xDocLB = pDocLB; }
     248             : 
     249             :     static bool ParseDateField (
     250             :         const OUString& rDateField, DateTime& rDateTime);
     251             : 
     252             :     bool HeaderParsed() const { return bHeaderParsed; }
     253             : 
     254             :     static INetMIMEMessage* CreateMessage (
     255             :         const INetMIMEMessage& rMsg);
     256             : 
     257             :     // Header fields.
     258             : 
     259             :     OUString GetBCC() const
     260             :     {
     261             :         return GetHeaderValue_Impl (
     262             :             m_nRFC822Index.at(InetMessageField::BCC),
     263             :             INetMIME::HEADER_FIELD_ADDRESS);
     264             :     }
     265             : 
     266             :     OUString GetCC() const
     267             :     {
     268             :         return GetHeaderValue_Impl (
     269             :             m_nRFC822Index.at(InetMessageField::CC),
     270             :             INetMIME::HEADER_FIELD_ADDRESS);
     271             :     }
     272             : 
     273             :     OUString GetComments() const
     274             :     {
     275             :         return GetHeaderValue_Impl (
     276             :             m_nRFC822Index.at(InetMessageField::COMMENTS),
     277             :             INetMIME::HEADER_FIELD_TEXT);
     278             :     }
     279             : 
     280             :     OUString GetDate() const
     281             :     {
     282             :         return GetHeaderValue_Impl (
     283             :             m_nRFC822Index.at(InetMessageField::DATE),
     284             :             INetMIME::HEADER_FIELD_STRUCTURED);
     285             :     }
     286             : 
     287             :     OUString GetFrom() const
     288             :     {
     289             :         return GetHeaderValue_Impl (
     290             :             m_nRFC822Index.at(InetMessageField::FROM),
     291             :             INetMIME::HEADER_FIELD_ADDRESS);
     292             :     }
     293             : 
     294             :     OUString GetInReplyTo() const
     295             :     {
     296             :         return GetHeaderValue_Impl (
     297             :             m_nRFC822Index.at(InetMessageField::REPLY_TO),
     298             :             INetMIME::HEADER_FIELD_ADDRESS); // ??? MESSAGE_ID ???
     299             :     }
     300             : 
     301             :     OUString GetKeywords() const
     302             :     {
     303             :         return GetHeaderValue_Impl (
     304             :             m_nRFC822Index.at(InetMessageField::KEYWORDS),
     305             :             INetMIME::HEADER_FIELD_PHRASE);
     306             :     }
     307             : 
     308             :     OUString GetMessageID() const
     309             :     {
     310             :         return GetHeaderValue_Impl (
     311             :             m_nRFC822Index.at(InetMessageField::MESSAGE_ID),
     312             :             INetMIME::HEADER_FIELD_MESSAGE_ID);
     313             :     }
     314             : 
     315             :     OUString GetReferences() const
     316             :     {
     317             :         return GetHeaderValue_Impl (
     318             :             m_nRFC822Index.at(InetMessageField::REFERENCES),
     319             :             INetMIME::HEADER_FIELD_ADDRESS);
     320             :     }
     321             : 
     322             :     OUString GetReplyTo() const
     323             :     {
     324             :         return GetHeaderValue_Impl (
     325             :             m_nRFC822Index.at(InetMessageField::REPLY_TO),
     326             :             INetMIME::HEADER_FIELD_ADDRESS);
     327             :     }
     328             : 
     329             :     OUString GetReturnPath() const
     330             :     {
     331             :         return GetHeaderValue_Impl (
     332             :             m_nRFC822Index.at(InetMessageField::RETURN_PATH),
     333             :             INetMIME::HEADER_FIELD_ADDRESS);
     334             :     }
     335             : 
     336             :     OUString GetReturnReceiptTo() const
     337             :     {
     338             :         return GetHeaderValue_Impl (
     339             :             m_nRFC822Index.at(InetMessageField::RETURN_RECEIPT_TO),
     340             :             INetMIME::HEADER_FIELD_ADDRESS);
     341             :     }
     342             : 
     343             :     OUString GetSender() const
     344             :     {
     345             :         return GetHeaderValue_Impl (
     346             :             m_nRFC822Index.at(InetMessageField::SENDER),
     347             :             INetMIME::HEADER_FIELD_ADDRESS);
     348             :     }
     349             : 
     350             :     OUString GetSubject() const
     351             :     {
     352             :         return GetHeaderValue_Impl (
     353             :             m_nRFC822Index.at(InetMessageField::SUBJECT),
     354             :             INetMIME::HEADER_FIELD_TEXT);
     355             :     }
     356             : 
     357             :     OUString GetTo() const
     358             :     {
     359             :         return GetHeaderValue_Impl (
     360             :             m_nRFC822Index.at(InetMessageField::TO),
     361             :             INetMIME::HEADER_FIELD_TEXT);
     362             :     }
     363             : 
     364             :     void     SetMIMEVersion (const OUString& rVersion);
     365             :     OUString GetMIMEVersion() const
     366             :     {
     367             :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::VERSION));
     368             :     }
     369             : 
     370             :     OUString GetContentDescription() const
     371             :     {
     372             :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_DESCRIPTION));
     373             :     }
     374             : 
     375             :     void     SetContentDisposition (const OUString& rDisposition);
     376             :     OUString GetContentDisposition() const
     377             :     {
     378             :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_DISPOSITION));
     379             :     }
     380             : 
     381             :     OUString GetContentID() const
     382             :     {
     383             :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_ID));
     384             :     }
     385             : 
     386             :     void     SetContentType (const OUString& rType);
     387           0 :     OUString GetContentType() const
     388             :     {
     389           0 :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_TYPE));
     390             :     }
     391             : 
     392             :     void     SetContentTransferEncoding (const OUString& rEncoding);
     393           0 :     OUString GetContentTransferEncoding() const
     394             :     {
     395           0 :         return GetHeaderValue (m_nMIMEIndex.at(InetMessageMime::CONTENT_TRANSFER_ENCODING));
     396             :     }
     397             : 
     398             :     OUString GetDefaultContentType ();
     399             : 
     400             :     // Message container methods.
     401             : 
     402           0 :     bool IsContainer() const
     403             :     {
     404           0 :         return (IsMessage() || IsMultipart());
     405             :     }
     406           0 :     bool IsMessage() const
     407             :     {
     408           0 :         OUString aType (GetContentType());
     409           0 :         return aType.matchIgnoreAsciiCase("message/");
     410             :     }
     411           0 :     bool IsMultipart() const
     412             :     {
     413           0 :         OUString aType (GetContentType());
     414           0 :         return aType.matchIgnoreAsciiCase("multipart/");
     415             :     }
     416             : 
     417           0 :     INetMIMEMessage* GetChild (sal_uIntPtr nIndex) const
     418             :     {
     419           0 :         return ( nIndex < aChildren.size() ) ? aChildren[ nIndex ] : NULL;
     420             :     }
     421           0 :     INetMIMEMessage* GetParent() const { return pParent; }
     422             : 
     423             :     bool EnableAttachChild (
     424             :         INetMessageContainerType eType = INETMSG_MULTIPART_MIXED);
     425             :     bool AttachChild (
     426             :         INetMIMEMessage& rChildMsg, bool bOwner = true );
     427             : };
     428             : 
     429             : #endif
     430             : 
     431             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11