int testStripRe(const char *encodedInput, char *expectedOutput, bool expectedDidModify) { // call NS_StripRE with the appropriate args char *modifiedSubject; bool didModify; const char *encodedInout = encodedInput; PRUint32 length = strlen(encodedInout); didModify = NS_MsgStripRE(&encodedInout, &length, &modifiedSubject); // make sure we got the right results if (didModify != expectedDidModify) return 2; if (didModify) { if (strcmp(expectedOutput, modifiedSubject)) { return 3; } } else if (strcmp(expectedOutput, encodedInout)) { return 4; } // test passed return 0; }
nsresult nsNNTPNewsgroupList::AddHeader(const char *header, const char *value) { nsresult rv = NS_OK; // The From, Date, and Subject headers have special requirements. if (PL_strcmp(header, "from") == 0) { rv = m_newMsgHdr->SetAuthor(value); } else if (PL_strcmp(header, "date") == 0) { PRTime date; PRStatus status = PR_ParseTimeString (value, false, &date); if (PR_SUCCESS == status) rv = m_newMsgHdr->SetDate(date); } else if (PL_strcmp(header, "subject") == 0) { const char *subject = value; uint32_t subjectLen = strlen(value); uint32_t flags = 0; // ### should call IsHeaderRead here... /* strip "Re: " */ nsCString modifiedSubject; if (NS_MsgStripRE(&subject, &subjectLen, getter_Copies(modifiedSubject))) // this will make sure read flags agree with newsrc (void) m_newMsgHdr->OrFlags(nsMsgMessageFlags::HasRe, &flags); if (! (flags & nsMsgMessageFlags::Read)) rv = m_newMsgHdr->OrFlags(nsMsgMessageFlags::New, &flags); rv = m_newMsgHdr->SetSubject(modifiedSubject.IsEmpty() ? subject : modifiedSubject.get()); } else if (PL_strcmp(header, "message-id") == 0) { rv = m_newMsgHdr->SetMessageId(value); } else if (PL_strcmp(header, "references") == 0) { rv = m_newMsgHdr->SetReferences(value); } else if (PL_strcmp(header, "bytes") == 0) { rv = m_newMsgHdr->SetMessageSize(atol(value)); } else if (PL_strcmp(header, "lines") == 0) { rv = m_newMsgHdr->SetLineCount(atol(value)); } else if (m_filterHeaders.Contains(nsDependentCString(header))) { rv = m_newMsgHdr->SetStringProperty(header, value); } return rv; }
nsresult nsNNTPNewsgroupList::ParseLine(char *line, uint32_t * message_number) { nsresult rv = NS_OK; nsCOMPtr <nsIMsgDBHdr> newMsgHdr; char *dateStr = nullptr; // keep track of date str, for filters char *authorStr = nullptr; // keep track of author str, for filters if (!line || !message_number) { return NS_ERROR_NULL_POINTER; } char *next = line; #define GET_TOKEN() \ line = next; \ next = (line ? PL_strchr (line, '\t') : 0); \ if (next) *next++ = 0 GET_TOKEN (); /* message number */ *message_number = atol(line); if (atol(line) == 0) /* bogus xover data */ return NS_ERROR_UNEXPECTED; m_newsDB->CreateNewHdr(*message_number, getter_AddRefs(newMsgHdr)); NS_ASSERTION(newMsgHdr, "CreateNewHdr didn't fail, but it returned a null newMsgHdr"); if (!newMsgHdr) return NS_ERROR_NULL_POINTER; GET_TOKEN (); /* subject */ if (line) { const char *subject = line; /* #### const evilness */ uint32_t subjectLen = strlen(line); uint32_t flags = 0; // ### should call IsHeaderRead here... /* strip "Re: " */ nsCString modifiedSubject; if (NS_MsgStripRE(&subject, &subjectLen, getter_Copies(modifiedSubject))) (void) newMsgHdr->OrFlags(nsMsgMessageFlags::HasRe, &flags); // this will make sure read flags agree with newsrc if (! (flags & nsMsgMessageFlags::Read)) rv = newMsgHdr->OrFlags(nsMsgMessageFlags::New, &flags); rv = newMsgHdr->SetSubject(modifiedSubject.IsEmpty() ? subject : modifiedSubject.get()); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); /* author */ if (line) { authorStr = line; rv = newMsgHdr->SetAuthor(line); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); if (line) { dateStr = line; PRTime date; PRStatus status = PR_ParseTimeString (line, false, &date); if (PR_SUCCESS == status) { rv = newMsgHdr->SetDate(date); /* date */ if (NS_FAILED(rv)) return rv; } } GET_TOKEN (); /* message id */ if (line) { char *strippedId = line; if (strippedId[0] == '<') strippedId++; char * lastChar = strippedId + PL_strlen(strippedId) -1; if (*lastChar == '>') *lastChar = '\0'; rv = newMsgHdr->SetMessageId(strippedId); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); /* references */ if (line) { rv = newMsgHdr->SetReferences(line); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); /* bytes */ if (line) { uint32_t msgSize = 0; msgSize = (line) ? atol (line) : 0; rv = newMsgHdr->SetMessageSize(msgSize); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); /* lines */ if (line) { uint32_t numLines = 0; numLines = line ? atol (line) : 0; rv = newMsgHdr->SetLineCount(numLines); if (NS_FAILED(rv)) return rv; } GET_TOKEN (); /* xref */ m_newHeaders.AppendObject(newMsgHdr); return NS_OK; }