blob: 4bf07311aab859a640cc5e180a226d9f88fbeccf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _TOOLS_INETMSG_HXX
#define _TOOLS_INETMSG_HXX
#include "tools/toolsdllapi.h"
#include <sal/types.h>
#ifndef _RTL_TEXTENC_H_
#include <rtl/textenc.h>
#endif
#ifndef _TOOLS_INETMIME_HXX
#include <tools/inetmime.hxx>
#endif
#include <tools/list.hxx>
#include <tools/stream.hxx>
#include <tools/string.hxx>
class DateTime;
/*=======================================================================
*
* INetMessageHeader Interface.
*
*=====================================================================*/
class INetMessageHeader
{
ByteString m_aName;
ByteString m_aValue;
public:
INetMessageHeader (void)
{}
INetMessageHeader (
const ByteString& rName, const ByteString& rValue)
: m_aName (rName), m_aValue (rValue)
{}
INetMessageHeader (
const INetMessageHeader& rHdr)
: m_aName (rHdr.m_aName), m_aValue (rHdr.m_aValue)
{}
~INetMessageHeader (void)
{}
INetMessageHeader& operator= (const INetMessageHeader& rHdr)
{
m_aName = rHdr.m_aName;
m_aValue = rHdr.m_aValue;
return *this;
}
const ByteString& GetName (void) const { return m_aName; }
const ByteString& GetValue (void) const { return m_aValue; }
friend SvStream& operator<< (
SvStream& rStrm, const INetMessageHeader& rHdr)
{
#ifdef ENABLE_BYTESTRING_STREAM_OPERATORS
rStrm << rHdr.m_aName;
rStrm << rHdr.m_aValue;
#else
rStrm.WriteByteString (rHdr.m_aName);
rStrm.WriteByteString (rHdr.m_aValue);
#endif
return rStrm;
}
friend SvStream& operator>> (
SvStream& rStrm, INetMessageHeader& rHdr)
{
#ifdef ENABLE_BYTESTRING_STREAM_OPERATORS
rStrm >> rHdr.m_aName;
rStrm >> rHdr.m_aValue;
#else
rStrm.ReadByteString (rHdr.m_aName);
rStrm.ReadByteString (rHdr.m_aValue);
#endif
return rStrm;
}
};
/*=======================================================================
*
* INetMessage Interface.
*
*=====================================================================*/
class INetMessage
{
List m_aHeaderList;
sal_uIntPtr m_nDocSize;
UniString m_aDocName;
SvLockBytesRef m_xDocLB;
void ListCleanup_Impl (void);
void ListCopy (const INetMessage& rMsg);
protected:
UniString GetHeaderName_Impl (
sal_uIntPtr nIndex, rtl_TextEncoding eEncoding) const
{
INetMessageHeader *p =
(INetMessageHeader*)(m_aHeaderList.GetObject(nIndex));
if (p)
return UniString(p->GetName(), eEncoding);
else
return UniString();
}
UniString GetHeaderValue_Impl (
sal_uIntPtr nIndex, INetMIME::HeaderFieldType eType) const
{
INetMessageHeader *p =
(INetMessageHeader*)(m_aHeaderList.GetObject(nIndex));
if (p)
return INetMIME::decodeHeaderFieldBody (eType, p->GetValue());
else
return UniString();
}
void SetHeaderField_Impl (
const INetMessageHeader &rHeader, sal_uIntPtr &rnIndex)
{
INetMessageHeader *p = new INetMessageHeader (rHeader);
if (m_aHeaderList.Count() <= rnIndex)
{
m_aHeaderList.Insert (p, LIST_APPEND);
rnIndex = m_aHeaderList.Count() - 1;
}
else
{
p = (INetMessageHeader*)(m_aHeaderList.Replace(p, rnIndex));
delete p;
}
}
void SetHeaderField_Impl (
INetMIME::HeaderFieldType eType,
const ByteString &rName,
const UniString &rValue,
sal_uIntPtr &rnIndex);
virtual SvStream& operator<< (SvStream& rStrm) const;
virtual SvStream& operator>> (SvStream& rStrm);
public:
INetMessage (void) : m_nDocSize(0) {}
virtual ~INetMessage (void);
INetMessage (const INetMessage& rMsg)
: m_nDocSize (rMsg.m_nDocSize),
m_aDocName (rMsg.m_aDocName),
m_xDocLB (rMsg.m_xDocLB)
{
ListCopy (rMsg);
}
INetMessage& operator= (const INetMessage& rMsg)
{
m_nDocSize = rMsg.m_nDocSize;
m_aDocName = rMsg.m_aDocName;
m_xDocLB = rMsg.m_xDocLB;
ListCopy (rMsg);
return *this;
}
sal_uIntPtr GetHeaderCount (void) const { return m_aHeaderList.Count(); }
UniString GetHeaderName (sal_uIntPtr nIndex) const
{
return GetHeaderName_Impl (nIndex, RTL_TEXTENCODING_ASCII_US);
}
UniString GetHeaderValue (sal_uIntPtr nIndex) const
{
return GetHeaderValue_Impl (nIndex, INetMIME::HEADER_FIELD_TEXT);
}
INetMessageHeader GetHeaderField (sal_uIntPtr nIndex) const
{
INetMessageHeader *p =
(INetMessageHeader*)(m_aHeaderList.GetObject(nIndex));
if (p)
return INetMessageHeader(*p);
else
return INetMessageHeader();
}
sal_uIntPtr SetHeaderField (
const UniString& rName,
const UniString& rValue,
sal_uIntPtr nIndex = LIST_APPEND);
virtual sal_uIntPtr SetHeaderField (
const INetMessageHeader &rField, sal_uIntPtr nIndex = LIST_APPEND);
sal_uIntPtr GetDocumentSize (void) const { return m_nDocSize; }
void SetDocumentSize (sal_uIntPtr nSize) { m_nDocSize = nSize; }
const UniString& GetDocumentName (void) const { return m_aDocName; }
void SetDocumentName (const UniString& rName) { m_aDocName = rName; }
SvLockBytes* GetDocumentLB (void) const { return m_xDocLB; }
void SetDocumentLB (SvLockBytes *pDocLB) { m_xDocLB = pDocLB; }
friend SvStream& operator<< (
SvStream& rStrm, const INetMessage& rMsg)
{
return rMsg.operator<< (rStrm);
}
friend SvStream& operator>> (
SvStream& rStrm, INetMessage& rMsg)
{
return rMsg.operator>> (rStrm);
}
};
/*=======================================================================
*
* INetMessageHeaderIterator Interface.
*
*=====================================================================*/
class INetMessageHeaderIterator
{
sal_uIntPtr nValueCount;
List aValueList;
UniString aEmptyString;
public:
INetMessageHeaderIterator (
const INetMessage& rMsg, const UniString& rHdrName);
virtual ~INetMessageHeaderIterator (void);
sal_uIntPtr GetValueCount (void) const { return nValueCount; }
const UniString& GetValue (sal_uIntPtr nIndex) const
{
if (nIndex < nValueCount)
{
return *((UniString*)(aValueList.GetObject(nIndex)));
}
else
{
return aEmptyString;
}
}
};
/*=======================================================================
*
* INetRFC822Message Interface.
*
*=====================================================================*/
#define INETMSG_RFC822_BCC 0
#define INETMSG_RFC822_CC 1
#define INETMSG_RFC822_COMMENTS 2
#define INETMSG_RFC822_DATE 3
#define INETMSG_RFC822_FROM 4
#define INETMSG_RFC822_IN_REPLY_TO 5
#define INETMSG_RFC822_KEYWORDS 6
#define INETMSG_RFC822_MESSAGE_ID 7
#define INETMSG_RFC822_REFERENCES 8
#define INETMSG_RFC822_REPLY_TO 9
#define INETMSG_RFC822_RETURN_PATH 10
#define INETMSG_RFC822_SENDER 11
#define INETMSG_RFC822_SUBJECT 12
#define INETMSG_RFC822_TO 13
#define INETMSG_RFC822_X_MAILER 14
#define INETMSG_RFC822_RETURN_RECEIPT_TO 15
#define INETMSG_RFC822_NUMHDR 16
class TOOLS_DLLPUBLIC INetRFC822Message : public INetMessage
{
sal_uIntPtr m_nIndex[INETMSG_RFC822_NUMHDR];
protected:
virtual SvStream& operator<< (SvStream& rStrm) const;
virtual SvStream& operator>> (SvStream& rStrm);
public:
INetRFC822Message (void);
INetRFC822Message (const INetRFC822Message& rMsg);
virtual ~INetRFC822Message (void);
INetRFC822Message& operator= (const INetRFC822Message& rMsg);
static sal_Bool GenerateDateField (
const DateTime& rDateTime, UniString& rDateField);
static sal_Bool ParseDateField (
const UniString& rDateField, DateTime& rDateTime);
using INetMessage::SetHeaderField;
virtual sal_uIntPtr SetHeaderField (
const INetMessageHeader &rHeader, sal_uIntPtr nIndex = LIST_APPEND);
/** Header fields.
*/
void SetBCC (const UniString& rBCC);
UniString GetBCC (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_BCC],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetCC (const UniString& rCC);
UniString GetCC (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_CC],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetComments (const UniString& rComments);
UniString GetComments (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_COMMENTS],
INetMIME::HEADER_FIELD_TEXT);
}
void SetDate (const UniString& rDate);
UniString GetDate (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_DATE],
INetMIME::HEADER_FIELD_STRUCTURED);
}
void SetFrom (const UniString& rFrom);
UniString GetFrom (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_FROM],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetInReplyTo (const UniString& rInReplyTo);
UniString GetInReplyTo (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_IN_REPLY_TO],
INetMIME::HEADER_FIELD_ADDRESS); // ??? MESSAGE_ID ???
}
void SetKeywords (const UniString& rKeywords);
UniString GetKeywords (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_KEYWORDS],
INetMIME::HEADER_FIELD_PHRASE);
}
void SetMessageID (const UniString& rMessageID);
UniString GetMessageID (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_MESSAGE_ID],
INetMIME::HEADER_FIELD_MESSAGE_ID);
}
void SetReferences (const UniString& rReferences);
UniString GetReferences (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_REFERENCES],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetReplyTo (const UniString& rReplyTo);
UniString GetReplyTo (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_REPLY_TO],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetReturnPath (const UniString& rReturnPath);
UniString GetReturnPath (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_RETURN_PATH],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetReturnReceiptTo (const UniString& rReturnReceiptTo);
UniString GetReturnReceiptTo (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_RETURN_RECEIPT_TO],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetSender (const UniString& rSender);
UniString GetSender (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_SENDER],
INetMIME::HEADER_FIELD_ADDRESS);
}
void SetSubject (const UniString& rSubject);
UniString GetSubject (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_SUBJECT],
INetMIME::HEADER_FIELD_TEXT);
}
void SetTo (const UniString& rTo);
UniString GetTo (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_TO],
INetMIME::HEADER_FIELD_TEXT);
}
void SetXMailer (const UniString& rXMailer);
UniString GetXMailer (void) const
{
return GetHeaderValue_Impl (
m_nIndex[INETMSG_RFC822_X_MAILER],
INetMIME::HEADER_FIELD_TEXT);
}
/** Stream operators.
*/
friend SvStream& operator<< (
SvStream& rStrm, const INetRFC822Message& rMsg)
{
return rMsg.operator<< (rStrm);
}
friend SvStream& operator>> (
SvStream& rStrm, INetRFC822Message& rMsg)
{
return rMsg.operator>> (rStrm);
}
};
/*=======================================================================
*
* INetMIMEMessage Interface.
*
*=====================================================================*/
#define INETMSG_MIME_VERSION 0
#define INETMSG_MIME_CONTENT_DESCRIPTION 1
#define INETMSG_MIME_CONTENT_DISPOSITION 2
#define INETMSG_MIME_CONTENT_ID 3
#define INETMSG_MIME_CONTENT_TYPE 4
#define INETMSG_MIME_CONTENT_TRANSFER_ENCODING 5
#define INETMSG_MIME_NUMHDR 6
enum INetMessageContainerType
{
INETMSG_MESSAGE_RFC822,
INETMSG_MULTIPART_MIXED,
INETMSG_MULTIPART_ALTERNATIVE,
INETMSG_MULTIPART_DIGEST,
INETMSG_MULTIPART_PARALLEL,
INETMSG_MULTIPART_RELATED,
INETMSG_MULTIPART_FORM_DATA
};
class TOOLS_DLLPUBLIC INetMIMEMessage : public INetRFC822Message
{
sal_uIntPtr m_nIndex[INETMSG_MIME_NUMHDR];
INetMIMEMessage *pParent;
sal_uIntPtr nNumChildren;
List aChildren;
ByteString m_aBoundary;
sal_Bool bHeaderParsed;
friend class INetMIMEMessageStream;
void SetChildCount (sal_uIntPtr nCount) { nNumChildren = nCount; }
const ByteString& GetMultipartBoundary (void) const { return m_aBoundary; }
void SetMultipartBoundary (const ByteString& rBnd) { m_aBoundary = rBnd; }
void CleanupImp (void);
void CopyImp (const INetMIMEMessage& rMsg);
void SetHeaderParsed() { bHeaderParsed = sal_True; }
protected:
virtual SvStream& operator<< (SvStream& rStrm) const;
virtual SvStream& operator>> (SvStream& rStrm);
public:
INetMIMEMessage (void);
INetMIMEMessage (const INetMIMEMessage& rMsg);
virtual ~INetMIMEMessage (void);
INetMIMEMessage& operator= (const INetMIMEMessage& rMsg);
sal_Bool HeaderParsed() const { return bHeaderParsed; }
virtual INetMIMEMessage* CreateMessage (
const INetMIMEMessage& rMsg) const;
using INetRFC822Message::SetHeaderField;
virtual sal_uIntPtr SetHeaderField (
const INetMessageHeader &rHeader, sal_uIntPtr nIndex = LIST_APPEND);
/** Header fields.
*/
void SetMIMEVersion (const UniString& rVersion);
UniString GetMIMEVersion (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_VERSION]);
}
void SetContentDescription (const UniString& rDescription);
UniString GetContentDescription (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_CONTENT_DESCRIPTION]);
}
void SetContentDisposition (const UniString& rDisposition);
UniString GetContentDisposition (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_CONTENT_DISPOSITION]);
}
void SetContentID (const UniString& rID);
UniString GetContentID (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_CONTENT_ID]);
}
void SetContentType (const UniString& rType);
UniString GetContentType (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_CONTENT_TYPE]);
}
void SetContentTransferEncoding (const UniString& rEncoding);
UniString GetContentTransferEncoding (void) const
{
return GetHeaderValue (m_nIndex[INETMSG_MIME_CONTENT_TRANSFER_ENCODING]);
}
virtual void GetDefaultContentType (UniString& rContentType);
/** Message container methods.
*/
sal_Bool IsContainer (void) const
{
return (IsMessage() || IsMultipart());
}
sal_Bool IsMessage (void) const
{
UniString aType (GetContentType());
return (aType.CompareIgnoreCaseToAscii("message/", 8) == 0);
}
sal_Bool IsMultipart (void) const
{
UniString aType (GetContentType());
return (aType.CompareIgnoreCaseToAscii("multipart/", 10) == 0);
}
sal_uIntPtr GetChildCount (void) const { return nNumChildren; }
INetMIMEMessage* GetChild (sal_uIntPtr nIndex) const
{
return ((INetMIMEMessage *)(aChildren.GetObject (nIndex)));
}
INetMIMEMessage* GetParent (void) const { return pParent; }
sal_Bool EnableAttachChild (
INetMessageContainerType eType = INETMSG_MULTIPART_MIXED);
sal_Bool AttachChild (
INetMIMEMessage& rChildMsg, sal_Bool bOwner = sal_True);
sal_Bool DetachChild (
sal_uIntPtr nIndex, INetMIMEMessage& rChildMsg) const;
/** Stream operators.
*/
friend SvStream& operator<< (
SvStream& rStrm, const INetMIMEMessage& rMsg)
{
return rMsg.operator<< (rStrm);
}
friend SvStream& operator>> (
SvStream& rStrm, INetMIMEMessage& rMsg)
{
return rMsg.operator>> (rStrm);
}
};
#endif /* !_TOOLS_INETMSG_HXX */