1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "msgCore.h"  // for pre-compiled headers
7 
8 #include "nsImapSearchResults.h"
9 #include "prmem.h"
10 #include "nsCRT.h"
11 
nsImapSearchResultSequence()12 nsImapSearchResultSequence::nsImapSearchResultSequence() {}
13 
14 nsImapSearchResultSequence*
CreateSearchResultSequence()15 nsImapSearchResultSequence::CreateSearchResultSequence() {
16   return new nsImapSearchResultSequence;
17 }
18 
Clear(void)19 void nsImapSearchResultSequence::Clear(void) {
20   int32_t i = Length();
21   while (0 <= --i) {
22     char* string = ElementAt(i);
23     PR_Free(string);
24   }
25   nsTArray<char*>::Clear();
26 }
27 
~nsImapSearchResultSequence()28 nsImapSearchResultSequence::~nsImapSearchResultSequence() { Clear(); }
29 
ResetSequence()30 void nsImapSearchResultSequence::ResetSequence() { Clear(); }
31 
AddSearchResultLine(const char * searchLine)32 void nsImapSearchResultSequence::AddSearchResultLine(const char* searchLine) {
33   // The first add becomes node 2.  Fix this.
34   char* copiedSequence = PL_strdup(searchLine + 9);  // 9 == "* SEARCH "
35 
36   if (copiedSequence)  // if we can't allocate this then the search won't hit
37     AppendElement(copiedSequence);
38 }
39 
nsImapSearchResultIterator(nsImapSearchResultSequence & sequence)40 nsImapSearchResultIterator::nsImapSearchResultIterator(
41     nsImapSearchResultSequence& sequence)
42     : fSequence(sequence) {
43   ResetIterator();
44 }
45 
~nsImapSearchResultIterator()46 nsImapSearchResultIterator::~nsImapSearchResultIterator() {}
47 
ResetIterator()48 void nsImapSearchResultIterator::ResetIterator() {
49   fSequenceIndex = 0;
50   fCurrentLine = (char*)fSequence.SafeElementAt(fSequenceIndex);
51   fPositionInCurrentLine = fCurrentLine;
52 }
53 
GetNextMessageNumber()54 int32_t nsImapSearchResultIterator::GetNextMessageNumber() {
55   int32_t returnValue = 0;
56   if (fPositionInCurrentLine) {
57     returnValue = atoi(fPositionInCurrentLine);
58 
59     // eat the current number
60     while (isdigit(*++fPositionInCurrentLine))
61       ;
62 
63     if (*fPositionInCurrentLine == 0xD)  // found CR, no more digits on line
64     {
65       fCurrentLine = (char*)fSequence.SafeElementAt(++fSequenceIndex);
66       fPositionInCurrentLine = fCurrentLine;
67     } else  // eat the space
68       fPositionInCurrentLine++;
69   }
70 
71   return returnValue;
72 }
73