Line data Source code
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/. */
4 :
5 : #include "CacheLog.h"
6 : #include "CacheIndexIterator.h"
7 : #include "CacheIndex.h"
8 : #include "nsString.h"
9 : #include "mozilla/DebugOnly.h"
10 :
11 :
12 : namespace mozilla {
13 : namespace net {
14 :
15 0 : CacheIndexIterator::CacheIndexIterator(CacheIndex *aIndex, bool aAddNew)
16 : : mStatus(NS_OK)
17 : , mIndex(aIndex)
18 0 : , mAddNew(aAddNew)
19 : {
20 0 : LOG(("CacheIndexIterator::CacheIndexIterator() [this=%p]", this));
21 0 : }
22 :
23 0 : CacheIndexIterator::~CacheIndexIterator()
24 : {
25 0 : LOG(("CacheIndexIterator::~CacheIndexIterator() [this=%p]", this));
26 :
27 0 : Close();
28 0 : }
29 :
30 : nsresult
31 0 : CacheIndexIterator::GetNextHash(SHA1Sum::Hash *aHash)
32 : {
33 0 : LOG(("CacheIndexIterator::GetNextHash() [this=%p]", this));
34 :
35 0 : StaticMutexAutoLock lock(CacheIndex::sLock);
36 :
37 0 : if (NS_FAILED(mStatus)) {
38 0 : return mStatus;
39 : }
40 :
41 0 : if (!mRecords.Length()) {
42 0 : CloseInternal(NS_ERROR_NOT_AVAILABLE);
43 0 : return mStatus;
44 : }
45 :
46 0 : memcpy(aHash, mRecords[mRecords.Length() - 1]->mHash, sizeof(SHA1Sum::Hash));
47 0 : mRecords.RemoveElementAt(mRecords.Length() - 1);
48 :
49 0 : return NS_OK;
50 : }
51 :
52 : nsresult
53 0 : CacheIndexIterator::Close()
54 : {
55 0 : LOG(("CacheIndexIterator::Close() [this=%p]", this));
56 :
57 0 : StaticMutexAutoLock lock(CacheIndex::sLock);
58 :
59 0 : return CloseInternal(NS_ERROR_NOT_AVAILABLE);
60 : }
61 :
62 : nsresult
63 0 : CacheIndexIterator::CloseInternal(nsresult aStatus)
64 : {
65 0 : LOG(("CacheIndexIterator::CloseInternal() [this=%p, status=0x%08" PRIx32 "]", this,
66 : static_cast<uint32_t>(aStatus)));
67 :
68 : // Make sure status will be a failure
69 0 : MOZ_ASSERT(NS_FAILED(aStatus));
70 0 : if (NS_SUCCEEDED(aStatus)) {
71 0 : aStatus = NS_ERROR_UNEXPECTED;
72 : }
73 :
74 0 : if (NS_FAILED(mStatus)) {
75 0 : return NS_ERROR_NOT_AVAILABLE;
76 : }
77 :
78 0 : DebugOnly<bool> removed = mIndex->mIterators.RemoveElement(this);
79 0 : MOZ_ASSERT(removed);
80 0 : mStatus = aStatus;
81 :
82 0 : return NS_OK;
83 : }
84 :
85 : void
86 0 : CacheIndexIterator::AddRecord(CacheIndexRecord *aRecord)
87 : {
88 0 : LOG(("CacheIndexIterator::AddRecord() [this=%p, record=%p]", this, aRecord));
89 :
90 0 : mRecords.AppendElement(aRecord);
91 0 : }
92 :
93 : bool
94 0 : CacheIndexIterator::RemoveRecord(CacheIndexRecord *aRecord)
95 : {
96 0 : LOG(("CacheIndexIterator::RemoveRecord() [this=%p, record=%p]", this,
97 : aRecord));
98 :
99 0 : return mRecords.RemoveElement(aRecord);
100 : }
101 :
102 : bool
103 0 : CacheIndexIterator::ReplaceRecord(CacheIndexRecord *aOldRecord,
104 : CacheIndexRecord *aNewRecord)
105 : {
106 0 : LOG(("CacheIndexIterator::ReplaceRecord() [this=%p, oldRecord=%p, "
107 : "newRecord=%p]", this, aOldRecord, aNewRecord));
108 :
109 0 : if (RemoveRecord(aOldRecord)) {
110 0 : AddRecord(aNewRecord);
111 0 : return true;
112 : }
113 :
114 0 : return false;
115 : }
116 :
117 : } // namespace net
118 : } // namespace mozilla
|