Bumping manifests a=b2g-bump
[gecko.git] / netwerk / cache2 / CacheIndexIterator.cpp
blobad43ec53a36c666ca2b95e02b237a191c7cfde76
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "CacheLog.h"
6 #include "CacheIndexIterator.h"
7 #include "CacheIndex.h"
8 #include "nsString.h"
9 #include "mozilla/DebugOnly.h"
12 namespace mozilla {
13 namespace net {
15 CacheIndexIterator::CacheIndexIterator(CacheIndex *aIndex, bool aAddNew)
16 : mStatus(NS_OK)
17 , mIndex(aIndex)
18 , mAddNew(aAddNew)
20 LOG(("CacheIndexIterator::CacheIndexIterator() [this=%p]", this));
23 CacheIndexIterator::~CacheIndexIterator()
25 LOG(("CacheIndexIterator::~CacheIndexIterator() [this=%p]", this));
27 Close();
30 nsresult
31 CacheIndexIterator::GetNextHash(SHA1Sum::Hash *aHash)
33 LOG(("CacheIndexIterator::GetNextHash() [this=%p]", this));
35 CacheIndexAutoLock lock(mIndex);
37 if (NS_FAILED(mStatus)) {
38 return mStatus;
41 if (!mRecords.Length()) {
42 CloseInternal(NS_ERROR_NOT_AVAILABLE);
43 return mStatus;
46 memcpy(aHash, mRecords[mRecords.Length() - 1]->mHash, sizeof(SHA1Sum::Hash));
47 mRecords.RemoveElementAt(mRecords.Length() - 1);
49 return NS_OK;
52 nsresult
53 CacheIndexIterator::Close()
55 LOG(("CacheIndexIterator::Close() [this=%p]", this));
57 CacheIndexAutoLock lock(mIndex);
59 return CloseInternal(NS_ERROR_NOT_AVAILABLE);
62 nsresult
63 CacheIndexIterator::CloseInternal(nsresult aStatus)
65 LOG(("CacheIndexIterator::CloseInternal() [this=%p, status=0x%08x]", this,
66 aStatus));
68 // Make sure status will be a failure
69 MOZ_ASSERT(NS_FAILED(aStatus));
70 if (NS_SUCCEEDED(aStatus)) {
71 aStatus = NS_ERROR_UNEXPECTED;
74 if (NS_FAILED(mStatus)) {
75 return NS_ERROR_NOT_AVAILABLE;
78 DebugOnly<bool> removed = mIndex->mIterators.RemoveElement(this);
79 MOZ_ASSERT(removed);
80 mStatus = aStatus;
82 return NS_OK;
85 void
86 CacheIndexIterator::AddRecord(CacheIndexRecord *aRecord)
88 LOG(("CacheIndexIterator::AddRecord() [this=%p, record=%p]", this, aRecord));
90 mRecords.AppendElement(aRecord);
93 void
94 CacheIndexIterator::AddRecords(const nsTArray<CacheIndexRecord *> &aRecords)
96 LOG(("CacheIndexIterator::AddRecords() [this=%p]", this));
98 mRecords.AppendElements(aRecords);
101 bool
102 CacheIndexIterator::RemoveRecord(CacheIndexRecord *aRecord)
104 LOG(("CacheIndexIterator::RemoveRecord() [this=%p, record=%p]", this,
105 aRecord));
107 return mRecords.RemoveElement(aRecord);
110 bool
111 CacheIndexIterator::ReplaceRecord(CacheIndexRecord *aOldRecord,
112 CacheIndexRecord *aNewRecord)
114 LOG(("CacheIndexIterator::ReplaceRecord() [this=%p, oldRecord=%p, "
115 "newRecord=%p]", this, aOldRecord, aNewRecord));
117 if (RemoveRecord(aOldRecord)) {
118 AddRecord(aNewRecord);
119 return true;
122 return false;
125 } // net
126 } // mozilla