зеркало из https://github.com/mozilla/gecko-dev.git
changes for getting local mail folder parsing to work
This commit is contained in:
Родитель
a27e524d3e
Коммит
ecc6b71db3
|
@ -34,18 +34,67 @@
|
|||
# endif /* XP_WIN */
|
||||
#endif /* XP_MAC */
|
||||
|
||||
nsMsgLineBuffer::nsMsgLineBuffer(nsMsgLineBufferHandler *handler, PRBool convertNewlinesP)
|
||||
nsByteArray::nsByteArray()
|
||||
{
|
||||
m_handler = handler;
|
||||
m_buffer = NULL;
|
||||
m_bufferSize = 0;
|
||||
m_bufferPos = 0;
|
||||
}
|
||||
|
||||
nsByteArray::~nsByteArray()
|
||||
{
|
||||
PR_FREEIF(m_buffer);
|
||||
}
|
||||
|
||||
nsresult nsByteArray::GrowBuffer(PRUint32 desired_size, PRUint32 quantum)
|
||||
{
|
||||
if (m_bufferSize <= desired_size)
|
||||
{
|
||||
char *new_buf;
|
||||
PRUint32 increment = desired_size - m_bufferSize;
|
||||
if (increment < quantum) /* always grow by a minimum of N bytes */
|
||||
increment = quantum;
|
||||
|
||||
|
||||
new_buf = (m_buffer
|
||||
? (char *) PR_REALLOC (m_buffer, (m_bufferSize + increment))
|
||||
: (char *) PR_MALLOC (m_bufferSize + increment));
|
||||
if (! new_buf)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
m_buffer = new_buf;
|
||||
m_bufferSize += increment;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
nsresult nsByteArray::AppendString(const char *string)
|
||||
{
|
||||
PRUint32 strLength = (string) ? PL_strlen(string) : 0;
|
||||
return AppendBuffer(string, strLength);
|
||||
|
||||
}
|
||||
|
||||
nsresult nsByteArray::AppendBuffer(const char *buffer, PRUint32 length)
|
||||
{
|
||||
nsresult ret = NS_OK;
|
||||
if (m_bufferPos + length > m_bufferSize)
|
||||
ret = GrowBuffer(m_bufferPos + length, 1024);
|
||||
if (ret == NS_OK)
|
||||
{
|
||||
memcpy(m_buffer + m_bufferPos, buffer, length);
|
||||
m_bufferPos += length;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
nsMsgLineBuffer::nsMsgLineBuffer(nsMsgLineBufferHandler *handler, PRBool convertNewlinesP)
|
||||
{
|
||||
m_handler = handler;
|
||||
m_convertNewlinesP = convertNewlinesP;
|
||||
}
|
||||
|
||||
nsMsgLineBuffer::~nsMsgLineBuffer()
|
||||
{
|
||||
PR_FREEIF(m_buffer);
|
||||
}
|
||||
|
||||
PRInt32 nsMsgLineBuffer::BufferInput(const char *net_buffer, PRInt32 net_buffer_size)
|
||||
|
@ -94,7 +143,7 @@ PRInt32 nsMsgLineBuffer::BufferInput(const char *net_buffer, PRInt32 net_buffer_
|
|||
newline++;
|
||||
}
|
||||
newline++;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,7 +155,7 @@ PRInt32 nsMsgLineBuffer::BufferInput(const char *net_buffer, PRInt32 net_buffer_
|
|||
|
||||
if (desired_size >= m_bufferSize)
|
||||
{
|
||||
status = GrowBuffer (desired_size, sizeof(char), 1024);
|
||||
status = GrowBuffer (desired_size, 1024);
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
@ -133,46 +182,31 @@ PRInt32 nsMsgLineBuffer::BufferInput(const char *net_buffer, PRInt32 net_buffer_
|
|||
return 0;
|
||||
}
|
||||
|
||||
PRInt32 nsMsgLineBuffer::GrowBuffer(PRUint32 desired_size, PRUint32 element_size, PRUint32 quantum)
|
||||
PRInt32 nsMsgLineBuffer::EmbeddedLineHandler(char *line, PRUint32 line_length)
|
||||
{
|
||||
if (m_bufferSize <= desired_size)
|
||||
{
|
||||
char *new_buf;
|
||||
PRUint32 increment = desired_size - m_bufferSize;
|
||||
if (increment < quantum) /* always grow by a minimum of N bytes */
|
||||
increment = quantum;
|
||||
|
||||
|
||||
new_buf = (m_buffer
|
||||
? (char *) PR_REALLOC (m_buffer, (m_bufferSize + increment)
|
||||
* (element_size / sizeof(char)))
|
||||
: (char *) PR_MALLOC ((m_bufferSize + increment)
|
||||
* (element_size / sizeof(char))));
|
||||
if (! new_buf)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
m_buffer = new_buf;
|
||||
m_bufferSize += increment;
|
||||
}
|
||||
return 0;
|
||||
NS_ASSERTION(FALSE, "must override this method if you don't provide a handler");
|
||||
return 0;
|
||||
}
|
||||
|
||||
PRInt32 nsMsgLineBuffer::ConvertAndSendBuffer()
|
||||
{
|
||||
/* Convert the line terminator to the native form.
|
||||
*/
|
||||
|
||||
char *buf = m_buffer;
|
||||
PRUint32 length = m_bufferSize;
|
||||
PRInt32 length = m_bufferPos - 1;
|
||||
|
||||
char* newline;
|
||||
|
||||
PR_ASSERT(buf && length > 0);
|
||||
if (!buf || length <= 0) return -1;
|
||||
if (!buf || length <= 0)
|
||||
return -1;
|
||||
newline = buf + length;
|
||||
|
||||
PR_ASSERT(newline[-1] == CR || newline[-1] == LF);
|
||||
if (newline[-1] != CR && newline[-1] != LF) return -1;
|
||||
if (newline[-1] != CR && newline[-1] != LF)
|
||||
return -1;
|
||||
|
||||
|
||||
if (!m_convertNewlinesP)
|
||||
{
|
||||
}
|
||||
|
@ -202,6 +236,18 @@ PRInt32 nsMsgLineBuffer::ConvertAndSendBuffer()
|
|||
}
|
||||
#endif
|
||||
|
||||
return m_handler->HandleLine(buf, length);
|
||||
return (m_handler) ? m_handler->HandleLine(buf, length) : EmbeddedLineHandler(buf, length);
|
||||
}
|
||||
|
||||
// If there's still some data (non CRLF terminated) flush it out
|
||||
PRInt32 nsMsgLineBuffer::FlushLastLine()
|
||||
{
|
||||
char *buf = m_buffer + m_bufferPos;
|
||||
PRInt32 length = m_bufferPos - 1;
|
||||
if (length > 0)
|
||||
return (m_handler) ? m_handler->HandleLine(buf, length) : EmbeddedLineHandler(buf, length);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -20,13 +20,34 @@
|
|||
|
||||
#include "msgCore.h" // precompiled header...
|
||||
|
||||
class nsMsgLineBufferHandler
|
||||
// I can't believe I have to have this stupid class, but I can't find
|
||||
// anything suitable (nsStrImpl might be, when its done). nsIByteBuffer
|
||||
// would do, if I had a stream for input, which I don't.
|
||||
|
||||
class nsByteArray
|
||||
{
|
||||
public:
|
||||
nsByteArray();
|
||||
virtual ~nsByteArray();
|
||||
PRUint32 GetSize() {return m_bufferSize;}
|
||||
nsresult GrowBuffer(PRUint32 desired_size, PRUint32 quantum = 1024);
|
||||
nsresult AppendString(const char *string);
|
||||
nsresult AppendBuffer(const char *buffer, PRUint32 length);
|
||||
char *GetBuffer() {return m_buffer;}
|
||||
protected:
|
||||
char *m_buffer;
|
||||
PRUint32 m_bufferSize;
|
||||
PRUint32 m_bufferPos; // write Pos in m_buffer - where the next byte should go.
|
||||
};
|
||||
|
||||
|
||||
class nsMsgLineBufferHandler : public nsByteArray
|
||||
{
|
||||
public:
|
||||
virtual PRInt32 HandleLine(char *line, PRUint32 line_length) = 0;
|
||||
};
|
||||
|
||||
class nsMsgLineBuffer
|
||||
class nsMsgLineBuffer : nsByteArray
|
||||
{
|
||||
public:
|
||||
nsMsgLineBuffer(nsMsgLineBufferHandler *handler, PRBool convertNewlinesP);
|
||||
|
@ -36,16 +57,17 @@ public:
|
|||
// Not sure why anyone cares, by NNTPHost seems to want to know the buf pos.
|
||||
PRUint32 GetBufferPos() {return m_bufferPos;}
|
||||
|
||||
virtual PRInt32 EmbeddedLineHandler(char *line, PRUint32 line_length);
|
||||
// flush last line, though it won't be CRLF terminated.
|
||||
virtual PRInt32 FlushLastLine();
|
||||
protected:
|
||||
PRInt32 GrowBuffer(PRUint32 desired_size, PRUint32 element_size, PRUint32 quantum);
|
||||
nsMsgLineBuffer(PRBool convertNewlinesP);
|
||||
|
||||
PRInt32 ConvertAndSendBuffer();
|
||||
|
||||
|
||||
char *m_buffer;
|
||||
PRUint32 m_bufferSize;
|
||||
nsMsgLineBufferHandler *m_handler;
|
||||
PRUint32 m_bufferPos;
|
||||
PRBool m_convertNewlinesP;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -91,6 +91,8 @@ typedef struct _MessageHdrStruct
|
|||
class nsMsgDatabase : nsDBChangeAnnouncer
|
||||
{
|
||||
public:
|
||||
friend class nsMsgHdr; // use this to get access to cached tokens for hdr fields
|
||||
|
||||
nsMsgDatabase();
|
||||
virtual ~nsMsgDatabase();
|
||||
|
||||
|
@ -108,6 +110,7 @@ public:
|
|||
// create a new message header from a hdrStruct. Caller must release resulting header,
|
||||
// after adding any extra properties they want.
|
||||
virtual nsresult CreateNewHdr(PRBool *newThread, MessageHdrStruct *hdrStruct, nsMsgHdr **newHdr, PRBool notify = FALSE);
|
||||
virtual nsresult CreateNewHdr(MessageKey key, nsMsgHdr **newHdr);
|
||||
// extract info from an nsMsgHdr into a MessageHdrStruct
|
||||
virtual nsresult GetMsgHdrStructFromnsMsgHdr(nsMsgHdr *msgHdr, MessageHdrStruct &hdrStruct);
|
||||
|
||||
|
@ -260,6 +263,7 @@ protected:
|
|||
mdb_token m_flagsColumnToken;
|
||||
mdb_token m_priorityColumnToken;
|
||||
mdb_token m_statusOffsetColumnToken;
|
||||
mdb_token m_numLinesColumnToken;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -33,7 +33,7 @@ class nsMsgDatabase;
|
|||
class nsMsgHdr
|
||||
{
|
||||
public:
|
||||
nsMsgHdr();
|
||||
// nsMsgHdr();
|
||||
nsMsgHdr(nsMsgDatabase *db, mdbRow *dbRow);
|
||||
void Init();
|
||||
|
||||
|
@ -47,6 +47,16 @@ public:
|
|||
uint16 GetNumReferences();
|
||||
nsresult GetStringReference(PRInt32 refNum, nsString &resultReference);
|
||||
time_t GetDate();
|
||||
nsresult SetDate(time_t date);
|
||||
nsresult SetMessageId(const char *messageId);
|
||||
nsresult SetReferences(const char *references);
|
||||
nsresult SetCCList(const char *ccList);
|
||||
// rfc822 is false when recipients is a newsgroup list
|
||||
nsresult SetRecipients(const char *recipients, PRBool rfc822 = PR_TRUE);
|
||||
nsresult SetAuthor(const char *author);
|
||||
nsresult SetSubject(const char *subject);
|
||||
|
||||
nsresult SetStatusOffset(PRUint32 statusOffset);
|
||||
|
||||
// flag handling routines
|
||||
virtual PRUint32 GetFlags() {return m_flags;}
|
||||
|
@ -59,7 +69,10 @@ public:
|
|||
MessageKey GetThreadId();
|
||||
void SetMessageKey(MessageKey inKey) {m_messageKey = inKey;}
|
||||
virtual PRUint32 GetMessageSize() {return m_messageSize;}
|
||||
|
||||
void SetMessageSize(PRUint32 messageSize);
|
||||
void SetLineCount(PRUint32 lineCount);
|
||||
void SetPriority(MSG_PRIORITY priority) { m_priority = priority;}
|
||||
void SetPriority(const char *priority);
|
||||
// this is almost always the m_messageKey, except for the first message.
|
||||
// NeoAccess doesn't allow fID's of 0.
|
||||
virtual PRUint32 GetMessageOffset() {return m_messageKey;}
|
||||
|
@ -67,6 +80,9 @@ public:
|
|||
|
||||
mdbRow *GetMDBRow() {return m_mdbRow;}
|
||||
protected:
|
||||
nsresult SetStringColumn(const char *str, mdb_token token);
|
||||
nsresult SetUInt32Column(PRUint32 value, mdb_token token);
|
||||
|
||||
nsrefcnt mRefCnt;
|
||||
|
||||
MessageKey m_threadId;
|
||||
|
@ -76,6 +92,7 @@ protected:
|
|||
PRUint32 m_statusOffset; // offset in a local mail message of the mozilla status hdr
|
||||
PRUint32 m_flags;
|
||||
PRUint16 m_numReferences; // x-ref header for threading
|
||||
MSG_PRIORITY m_priority;
|
||||
|
||||
// nsMsgHdrs will have to know what db and row they belong to, since they are really
|
||||
// just a wrapper around the msg row in the mdb. This could cause problems,
|
||||
|
|
|
@ -355,6 +355,7 @@ const char *kMessageSizeColumnName = "size";
|
|||
const char *kFlagsColumnName = "flags";
|
||||
const char *kPriorityColumnName = "priority";
|
||||
const char *kStatusOffsetColumnName = "statusOfset";
|
||||
const char *kNumLinesColumnName = "numLines";
|
||||
|
||||
struct mdbOid gAllMsgHdrsTableOID;
|
||||
|
||||
|
@ -419,6 +420,7 @@ nsresult nsMsgDatabase::InitMDBInfo()
|
|||
GetStore()->StringToToken(GetEnv(), kFlagsColumnName, &m_flagsColumnToken);
|
||||
GetStore()->StringToToken(GetEnv(), kPriorityColumnName, &m_priorityColumnToken);
|
||||
GetStore()->StringToToken(GetEnv(), kStatusOffsetColumnName, &m_statusOffsetColumnToken);
|
||||
GetStore()->StringToToken(GetEnv(), kNumLinesColumnName, &m_numLinesColumnToken);
|
||||
|
||||
err = GetStore()->StringToToken(GetEnv(), kMsgHdrsTableKind, &m_hdrTableKindToken);
|
||||
if (err == NS_OK)
|
||||
|
@ -1046,6 +1048,24 @@ nsresult nsMsgDatabase::ListNextUnread(ListContext **pContext, nsMsgHdr **pResul
|
|||
return dbErr;
|
||||
}
|
||||
|
||||
nsresult nsMsgDatabase::CreateNewHdr(MessageKey key, nsMsgHdr **pnewHdr)
|
||||
{
|
||||
nsresult err = NS_OK;
|
||||
mdbRow *hdrRow;
|
||||
struct mdbOid allMsgHdrsTableOID;
|
||||
|
||||
if (!pnewHdr || !m_mdbAllMsgHeadersTable)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
allMsgHdrsTableOID.mOid_Scope = m_hdrRowScopeToken;
|
||||
allMsgHdrsTableOID.mOid_Id = key;
|
||||
|
||||
err = GetStore()->NewRowWithOid(GetEnv(), m_hdrRowScopeToken,
|
||||
&allMsgHdrsTableOID, &hdrRow);
|
||||
if (err == NS_OK)
|
||||
*pnewHdr = new nsMsgHdr(this, hdrRow);
|
||||
return err;
|
||||
}
|
||||
|
||||
nsresult nsMsgDatabase::CreateNewHdr(PRBool *newThread, MessageHdrStruct *hdrStruct, nsMsgHdr **pnewHdr, PRBool notify /* = FALSE */)
|
||||
{
|
||||
|
@ -1159,7 +1179,7 @@ nsresult nsMsgDatabase::RowCellColumnToUInt32(mdbRow *hdrRow, mdb_token columnTo
|
|||
yarn->mYarn_Buf = str->ToNewCString();
|
||||
yarn->mYarn_Size = PL_strlen((const char *) yarn->mYarn_Buf) + 1;
|
||||
yarn->mYarn_Fill = yarn->mYarn_Size;
|
||||
yarn->mYarn_Form = 0; // what to do with this? Should be parsed out of the mime2 header?
|
||||
yarn->mYarn_Form = 0; // what to do with this? we're storing csid in the msg hdr...
|
||||
return yarn;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,14 +20,6 @@
|
|||
#include "nsMsgHdr.h"
|
||||
#include "nsMsgDatabase.h"
|
||||
|
||||
nsMsgHdr::nsMsgHdr()
|
||||
{
|
||||
mRefCnt = 1;
|
||||
Init();
|
||||
m_mdb = NULL;
|
||||
m_mdbRow = NULL;
|
||||
}
|
||||
|
||||
nsMsgHdr::nsMsgHdr(nsMsgDatabase *db, mdbRow *dbRow)
|
||||
{
|
||||
mRefCnt = 1;
|
||||
|
@ -140,3 +132,41 @@ time_t nsMsgHdr::GetDate()
|
|||
{
|
||||
return m_date;
|
||||
}
|
||||
|
||||
nsresult nsMsgHdr::SetMessageId(const char *messageId)
|
||||
{
|
||||
return SetStringColumn(messageId, m_mdb->m_messageIdColumnToken);
|
||||
}
|
||||
|
||||
void nsMsgHdr::SetMessageSize(PRUint32 messageSize)
|
||||
{
|
||||
SetUInt32Column(m_mdb->m_messageSizeColumnToken, messageSize);
|
||||
}
|
||||
|
||||
void nsMsgHdr::SetLineCount(PRUint32 lineCount)
|
||||
{
|
||||
SetUInt32Column(m_mdb->m_numLinesColumnToken, lineCount);
|
||||
}
|
||||
|
||||
void nsMsgHdr::SetPriority(const char *priority)
|
||||
{
|
||||
// ### TODO
|
||||
// m_priority = MSG_GetPriorityFromString(priority);
|
||||
m_priority = MSG_NormalPriority;
|
||||
}
|
||||
|
||||
nsresult nsMsgHdr::SetStringColumn(const char *str, mdb_token token)
|
||||
{
|
||||
struct mdbYarn yarn;
|
||||
yarn.mYarn_Buf = (void *) (str ? str : "");
|
||||
yarn.mYarn_Size = PL_strlen((const char *) yarn.mYarn_Buf) + 1;
|
||||
yarn.mYarn_Fill = yarn.mYarn_Size;
|
||||
yarn.mYarn_Form = 0;
|
||||
return m_mdbRow->AddColumn(m_mdb->GetEnv(), token, &yarn);
|
||||
}
|
||||
|
||||
nsresult nsMsgHdr::SetUInt32Column(PRUint32 value, mdb_token token)
|
||||
{
|
||||
struct mdbYarn yarn;
|
||||
return m_mdbRow->AddColumn(m_mdb->GetEnv(), token, nsMsgDatabase::UInt32ToYarn(&yarn, value));
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче