summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/src/nsImapSearchResults.cpp
blob: 0932126a465efd7fca2c8f72c550ff8cd64505b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "msgCore.h"  // for pre-compiled headers

#include "nsImapSearchResults.h"
#include "prmem.h"
#include "nsCRT.h"

nsImapSearchResultSequence::nsImapSearchResultSequence() {}

nsImapSearchResultSequence*
nsImapSearchResultSequence::CreateSearchResultSequence() {
  return new nsImapSearchResultSequence;
}

void nsImapSearchResultSequence::Clear(void) {
  int32_t i = Length();
  while (0 <= --i) {
    char* string = ElementAt(i);
    PR_Free(string);
  }
  nsTArray<char*>::Clear();
}

nsImapSearchResultSequence::~nsImapSearchResultSequence() { Clear(); }

void nsImapSearchResultSequence::ResetSequence() { Clear(); }

void nsImapSearchResultSequence::AddSearchResultLine(const char* searchLine) {
  // The first add becomes node 2.  Fix this.
  char* copiedSequence = PL_strdup(searchLine + 9);  // 9 == "* SEARCH "

  if (copiedSequence)  // if we can't allocate this then the search won't hit
    AppendElement(copiedSequence);
}

nsImapSearchResultIterator::nsImapSearchResultIterator(
    nsImapSearchResultSequence& sequence)
    : fSequence(sequence) {
  ResetIterator();
}

nsImapSearchResultIterator::~nsImapSearchResultIterator() {}

void nsImapSearchResultIterator::ResetIterator() {
  fSequenceIndex = 0;
  fCurrentLine = (char*)fSequence.SafeElementAt(fSequenceIndex);
  fPositionInCurrentLine = fCurrentLine;
}

int32_t nsImapSearchResultIterator::GetNextMessageNumber() {
  int32_t returnValue = 0;
  if (fPositionInCurrentLine) {
    returnValue = atoi(fPositionInCurrentLine);

    // eat the current number
    while (isdigit(*++fPositionInCurrentLine))
      ;

    if (*fPositionInCurrentLine == 0xD)  // found CR, no more digits on line
    {
      fCurrentLine = (char*)fSequence.SafeElementAt(++fSequenceIndex);
      fPositionInCurrentLine = fCurrentLine;
    } else  // eat the space
      fPositionInCurrentLine++;
  }

  return returnValue;
}