|
1 /* -*- Mode: C++; tab-width: 4; 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 "nsSupportsArrayEnumerator.h" |
|
7 #include "nsISupportsArray.h" |
|
8 |
|
9 nsSupportsArrayEnumerator::nsSupportsArrayEnumerator(nsISupportsArray* array) |
|
10 : mArray(array), mCursor(0) |
|
11 { |
|
12 NS_ASSERTION(array, "null array"); |
|
13 NS_ADDREF(mArray); |
|
14 } |
|
15 |
|
16 nsSupportsArrayEnumerator::~nsSupportsArrayEnumerator() |
|
17 { |
|
18 NS_RELEASE(mArray); |
|
19 } |
|
20 |
|
21 NS_IMPL_ISUPPORTS(nsSupportsArrayEnumerator, nsIBidirectionalEnumerator, nsIEnumerator) |
|
22 |
|
23 NS_IMETHODIMP |
|
24 nsSupportsArrayEnumerator::First() |
|
25 { |
|
26 mCursor = 0; |
|
27 uint32_t cnt; |
|
28 nsresult rv = mArray->Count(&cnt); |
|
29 if (NS_FAILED(rv)) return rv; |
|
30 int32_t end = (int32_t)cnt; |
|
31 if (mCursor < end) |
|
32 return NS_OK; |
|
33 else |
|
34 return NS_ERROR_FAILURE; |
|
35 } |
|
36 |
|
37 NS_IMETHODIMP |
|
38 nsSupportsArrayEnumerator::Next() |
|
39 { |
|
40 uint32_t cnt; |
|
41 nsresult rv = mArray->Count(&cnt); |
|
42 if (NS_FAILED(rv)) return rv; |
|
43 int32_t end = (int32_t)cnt; |
|
44 if (mCursor < end) // don't count upward forever |
|
45 mCursor++; |
|
46 if (mCursor < end) |
|
47 return NS_OK; |
|
48 else |
|
49 return NS_ERROR_FAILURE; |
|
50 } |
|
51 |
|
52 NS_IMETHODIMP |
|
53 nsSupportsArrayEnumerator::CurrentItem(nsISupports **aItem) |
|
54 { |
|
55 NS_ASSERTION(aItem, "null out parameter"); |
|
56 uint32_t cnt; |
|
57 nsresult rv = mArray->Count(&cnt); |
|
58 if (NS_FAILED(rv)) return rv; |
|
59 if (mCursor >= 0 && mCursor < (int32_t)cnt) { |
|
60 return mArray->GetElementAt(mCursor, aItem); |
|
61 } |
|
62 return NS_ERROR_FAILURE; |
|
63 } |
|
64 |
|
65 NS_IMETHODIMP |
|
66 nsSupportsArrayEnumerator::IsDone() |
|
67 { |
|
68 uint32_t cnt; |
|
69 nsresult rv = mArray->Count(&cnt); |
|
70 if (NS_FAILED(rv)) return rv; |
|
71 // XXX This is completely incompatible with the meaning of nsresult. |
|
72 // NS_ENUMERATOR_FALSE is defined to be 1. (bug 778111) |
|
73 return (mCursor >= 0 && mCursor < (int32_t)cnt) |
|
74 ? (nsresult)NS_ENUMERATOR_FALSE : NS_OK; |
|
75 } |
|
76 |
|
77 //////////////////////////////////////////////////////////////////////////////// |
|
78 |
|
79 NS_IMETHODIMP |
|
80 nsSupportsArrayEnumerator::Last() |
|
81 { |
|
82 uint32_t cnt; |
|
83 nsresult rv = mArray->Count(&cnt); |
|
84 if (NS_FAILED(rv)) return rv; |
|
85 mCursor = cnt - 1; |
|
86 return NS_OK; |
|
87 } |
|
88 |
|
89 NS_IMETHODIMP |
|
90 nsSupportsArrayEnumerator::Prev() |
|
91 { |
|
92 if (mCursor >= 0) |
|
93 --mCursor; |
|
94 if (mCursor >= 0) |
|
95 return NS_OK; |
|
96 else |
|
97 return NS_ERROR_FAILURE; |
|
98 } |
|
99 |