changes for getting local mail folder parsing to work

This commit is contained in:
bienvenu%netscape.com 1999-02-11 07:09:26 +00:00
Родитель a27e524d3e
Коммит ecc6b71db3
6 изменённых файлов: 187 добавлений и 48 удалений

Просмотреть файл

@ -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));
}