зеркало из https://github.com/mozilla/gecko-dev.git
314 строки
8.6 KiB
C++
314 строки
8.6 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public
|
|
* License Version 1.1 (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.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
#include "msg.h"
|
|
#include "xp.h"
|
|
#include "mailhdr.h"
|
|
#include "maildb.h"
|
|
#include "newshdr.h"
|
|
#include "imapoff.h"
|
|
#include "msg_srch.h" // for MSG_GetPriorityFromString
|
|
#include "msgdbapi.h"
|
|
#include "msgstrob.h"
|
|
|
|
/* ****************************************************************** */
|
|
/** MailMessageHdr Class **/
|
|
/* ****************************************************************** */
|
|
MailMessageHdr::MailMessageHdr()
|
|
{
|
|
m_priority = 0;
|
|
m_byteLength = 0;
|
|
m_statusOffset = 0;
|
|
m_numLines = 0;
|
|
if (!m_dbHeaderHandle)
|
|
m_dbHeaderHandle = GetNewMailHeaderHandle();
|
|
}
|
|
|
|
MailMessageHdr::MailMessageHdr(MSG_HeaderHandle handle) : DBMessageHdr(handle)
|
|
{
|
|
m_priority = 0;
|
|
m_byteLength = 0;
|
|
m_statusOffset = 0;
|
|
m_numLines = 0;
|
|
}
|
|
|
|
MailMessageHdr::~MailMessageHdr()
|
|
{
|
|
}
|
|
|
|
MSG_PRIORITY MailMessageHdr::GetPriority()
|
|
{
|
|
m_priority = MSG_HeaderHandle_GetPriority(GetHandle());
|
|
switch (m_priority) {
|
|
case MSG_PriorityNotSet:
|
|
case MSG_NoPriority:
|
|
return MSG_NormalPriority;
|
|
default:
|
|
return (MSG_PRIORITY) m_priority;
|
|
}
|
|
}
|
|
|
|
void MailMessageHdr::CopyFromMsgHdr(MailMessageHdr *msgHdr, MSG_DBHandle srcDBHandle, MSG_DBHandle destDBHandle)
|
|
{
|
|
MSG_HeaderHandle_CopyFromMailMsgHdr(m_dbHeaderHandle, msgHdr->m_dbHeaderHandle, srcDBHandle, destDBHandle);
|
|
}
|
|
|
|
void MailMessageHdr::CopyFromMsgHdr(NewsMessageHdr *msgHdr, MSG_DBHandle srcDB, MSG_DBHandle destDB)
|
|
{
|
|
DBMessageHdr::CopyFromDBMsgHdr(msgHdr, srcDB, destDB);
|
|
}
|
|
|
|
void MailMessageHdr::CopyFromMsgHdr(DBMessageHdr *msgHdr, MSG_DBHandle srcDB, MSG_DBHandle destDB)
|
|
{
|
|
DBMessageHdr::CopyFromDBMsgHdr(msgHdr, srcDB, destDB);
|
|
}
|
|
|
|
void MailMessageHdr::SetPriority(MSG_PRIORITY priority)
|
|
{
|
|
if (priority < 0 || priority > MSG_HighestPriority)
|
|
{
|
|
priority = MSG_NoPriority;
|
|
#ifdef DEBUG_bienvenu
|
|
XP_ASSERT(FALSE);
|
|
#endif
|
|
}
|
|
m_priority = (unsigned char) priority;
|
|
MSG_HeaderHandle_SetPriority(GetHandle(), (MSG_PRIORITY) m_priority);
|
|
}
|
|
|
|
void MailMessageHdr::SetPriority(const char *priority)
|
|
{
|
|
m_priority = MSG_GetPriorityFromString(priority);
|
|
}
|
|
|
|
|
|
void MailMessageHdr::SetByteLength(uint32 byteLength)
|
|
{
|
|
m_byteLength = byteLength;
|
|
MSG_HeaderHandle_SetByteLength(GetHandle(), byteLength);
|
|
}
|
|
|
|
void MailMessageHdr::SetStatusOffset(uint16 statusOffset)
|
|
{
|
|
m_statusOffset = statusOffset;
|
|
MSG_HeaderHandle_SetStatusOffset(GetHandle(), statusOffset);
|
|
}
|
|
|
|
uint16 MailMessageHdr::GetStatusOffset()
|
|
{
|
|
return MSG_HeaderHandle_GetStatusOffset(GetHandle());
|
|
}
|
|
|
|
void MailMessageHdr::SetRecipients(const char *recipients, MSG_DBHandle dbHandle, XP_Bool rfc822)
|
|
{
|
|
MSG_HeaderHandle_SetRecipients(m_dbHeaderHandle, recipients, dbHandle, rfc822);
|
|
}
|
|
|
|
|
|
int32 MailMessageHdr::GetNumRecipients()
|
|
{
|
|
return MSG_HeaderHandle_GetNumRecipients(m_dbHeaderHandle);
|
|
}
|
|
|
|
int32 MailMessageHdr::GetNumCCRecipients()
|
|
{
|
|
return MSG_HeaderHandle_GetNumCCRecipients(m_dbHeaderHandle);
|
|
}
|
|
|
|
void MailMessageHdr::GetRecipients(XPStringObj &recipient, MSG_DBHandle dbHandle)
|
|
{
|
|
char *addressList;
|
|
MSG_HeaderHandle_GenerateAddressList(m_dbHeaderHandle, dbHandle, &addressList);
|
|
|
|
recipient.SetStrPtr(addressList);
|
|
}
|
|
|
|
void MailMessageHdr::GetCCList(XPStringObj &ccList, MSG_DBHandle dbHandle)
|
|
{
|
|
char *addressList;
|
|
MSG_HeaderHandle_GenerateCCAddressList(m_dbHeaderHandle, dbHandle, &addressList);
|
|
|
|
ccList.SetStrPtr(addressList);
|
|
}
|
|
|
|
void MailMessageHdr::GetFullRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
char *address;
|
|
MSG_HeaderHandle_GetFullRecipient(m_dbHeaderHandle, dbHandle, whichRecipient, &address);
|
|
recipient.SetStrPtr(address);
|
|
}
|
|
|
|
void MailMessageHdr::GetFullCCRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
char *address;
|
|
MSG_HeaderHandle_GetFullCCRecipient(m_dbHeaderHandle, dbHandle, whichRecipient, &address);
|
|
recipient.SetStrPtr(address);
|
|
}
|
|
|
|
void MailMessageHdr::GetNameOfRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
XPStringObj fullRecipient;
|
|
|
|
if (GetNumRecipients() != 0)
|
|
{
|
|
GetFullRecipient(fullRecipient, whichRecipient, dbHandle);
|
|
char *name = MSG_ExtractRFC822AddressNames(fullRecipient);
|
|
if (name != NULL)
|
|
{
|
|
recipient = name;
|
|
XP_FREE(name);
|
|
return;
|
|
}
|
|
}
|
|
recipient = "";
|
|
}
|
|
|
|
void MailMessageHdr::GetMailboxOfRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
XPStringObj fullRecipient;
|
|
|
|
if (GetNumRecipients() != 0)
|
|
{
|
|
GetFullRecipient(fullRecipient, whichRecipient, dbHandle);
|
|
char *mailbox = MSG_ExtractRFC822AddressMailboxes(fullRecipient);
|
|
if (mailbox != NULL)
|
|
{
|
|
recipient = mailbox;
|
|
XP_FREE(mailbox);
|
|
return;
|
|
}
|
|
}
|
|
recipient = "";
|
|
}
|
|
|
|
void MailMessageHdr::GetNameOfCCRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
XPStringObj fullRecipient;
|
|
|
|
if (GetNumCCRecipients() != 0)
|
|
{
|
|
GetFullCCRecipient(fullRecipient, whichRecipient, dbHandle);
|
|
char *name = MSG_ExtractRFC822AddressNames(fullRecipient);
|
|
if (name != NULL)
|
|
{
|
|
recipient = name;
|
|
XP_FREE(name);
|
|
return;
|
|
}
|
|
}
|
|
recipient = "";
|
|
}
|
|
|
|
void MailMessageHdr::GetMailboxOfCCRecipient(XPStringObj &recipient, int whichRecipient, MSG_DBHandle dbHandle)
|
|
{
|
|
XPStringObj fullRecipient;
|
|
|
|
if (GetNumCCRecipients() != 0)
|
|
{
|
|
GetFullCCRecipient(fullRecipient, whichRecipient, dbHandle);
|
|
char *mailbox = MSG_ExtractRFC822AddressMailboxes(fullRecipient);
|
|
if (mailbox != NULL)
|
|
{
|
|
recipient = mailbox;
|
|
XP_FREE(mailbox);
|
|
return;
|
|
}
|
|
}
|
|
recipient = "";
|
|
}
|
|
|
|
|
|
void MailMessageHdr::SetCCList(const char *cclist, MSG_DBHandle dbHandle)
|
|
{
|
|
MSG_HeaderHandle_SetCCRecipients(m_dbHeaderHandle, cclist, dbHandle);
|
|
}
|
|
|
|
int32 MailMessageHdr::AddToOfflineMessage(const char *block, int32 length, MSG_DBHandle dbHandle)
|
|
{
|
|
return MSG_HeaderHandle_AddToOfflineMessage(m_dbHeaderHandle, block, length, dbHandle);
|
|
}
|
|
|
|
int32 MailMessageHdr::ReadFromOfflineMessage(char *block, int32 length, int32 offset, MSG_DBHandle dbHandle)
|
|
{
|
|
return MSG_HeaderHandle_ReadFromOfflineMessage(m_dbHeaderHandle, block, length, offset, dbHandle);
|
|
}
|
|
|
|
void MailMessageHdr::PurgeOfflineMessage(MSG_DBHandle dbHandle)
|
|
{
|
|
MSG_HeaderHandle_PurgeOfflineMessage(m_dbHeaderHandle, dbHandle);
|
|
}
|
|
|
|
|
|
uint32 MailMessageHdr::WriteOfflineMessage(XP_File destinationFile,
|
|
MSG_DBHandle dbHandle,
|
|
XP_Bool needEnvelope)
|
|
{
|
|
uint32 bytesAttempted = 0;
|
|
uint32 filedBytes = 0;
|
|
XP_FileSeek(destinationFile, 0, SEEK_END);
|
|
|
|
// if writing to a local mail folder
|
|
// this message needs a Berkely envlope
|
|
if (needEnvelope)
|
|
{
|
|
char *envelope = msg_GetDummyEnvelope(); // not allocated, do not free
|
|
if (envelope)
|
|
{
|
|
bytesAttempted += XP_STRLEN(envelope);
|
|
filedBytes += XP_FileWrite(envelope, XP_STRLEN(envelope), destinationFile);
|
|
}
|
|
}
|
|
|
|
if (filedBytes == bytesAttempted)
|
|
{
|
|
// this message needs an X-MOZILLA_STATUS line
|
|
char status_buf[X_MOZILLA_STATUS_LEN + 10];
|
|
PR_snprintf(status_buf, X_MOZILLA_STATUS_LEN + 10,
|
|
X_MOZILLA_STATUS_FORMAT LINEBREAK, GetFlags());
|
|
bytesAttempted += XP_STRLEN(status_buf);
|
|
filedBytes += XP_FileWrite(status_buf, XP_STRLEN(status_buf), destinationFile);
|
|
|
|
uint32 dbFlags = GetFlags();
|
|
char *status2_buf = NULL;
|
|
MessageDB::ConvertDBFlagsToPublicFlags(&dbFlags);
|
|
dbFlags &= (MSG_FLAG_MDN_REPORT_NEEDED | MSG_FLAG_MDN_REPORT_SENT | MSG_FLAG_TEMPLATE);
|
|
status2_buf = PR_smprintf(X_MOZILLA_STATUS2_FORMAT LINEBREAK, dbFlags);
|
|
if (status2_buf)
|
|
{
|
|
bytesAttempted += XP_STRLEN(status2_buf);
|
|
filedBytes += XP_FileWrite(status2_buf, XP_STRLEN(status2_buf), destinationFile);
|
|
XP_FREEIF(status2_buf);
|
|
}
|
|
|
|
int32 bytesWritten = MSG_HeaderHandle_WriteOfflineMessageBody(m_dbHeaderHandle, dbHandle, destinationFile);
|
|
//DMB TODO - not quite right...do we need to know how many bytes we tried to write?
|
|
filedBytes += bytesWritten;
|
|
bytesAttempted += bytesWritten;
|
|
}
|
|
return (filedBytes == bytesAttempted) ? filedBytes : 0;
|
|
}
|
|
|
|
int32 MailMessageHdr::GetOfflineMessageLength(MSG_DBHandle dbHandle)
|
|
{
|
|
return MSG_HeaderHandle_GetOfflineMessageLength(m_dbHeaderHandle, dbHandle);
|
|
}
|
|
|