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()12nsImapSearchResultSequence::nsImapSearchResultSequence() {} 13 14 nsImapSearchResultSequence* CreateSearchResultSequence()15nsImapSearchResultSequence::CreateSearchResultSequence() { 16 return new nsImapSearchResultSequence; 17 } 18 Clear(void)19void 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()28nsImapSearchResultSequence::~nsImapSearchResultSequence() { Clear(); } 29 ResetSequence()30void nsImapSearchResultSequence::ResetSequence() { Clear(); } 31 AddSearchResultLine(const char * searchLine)32void 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)40nsImapSearchResultIterator::nsImapSearchResultIterator( 41 nsImapSearchResultSequence& sequence) 42 : fSequence(sequence) { 43 ResetIterator(); 44 } 45 ~nsImapSearchResultIterator()46nsImapSearchResultIterator::~nsImapSearchResultIterator() {} 47 ResetIterator()48void nsImapSearchResultIterator::ResetIterator() { 49 fSequenceIndex = 0; 50 fCurrentLine = (char*)fSequence.SafeElementAt(fSequenceIndex); 51 fPositionInCurrentLine = fCurrentLine; 52 } 53 GetNextMessageNumber()54int32_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