forked from mirrors/gecko-dev
		
	 65c6bee9d6
			
		
	
	
		65c6bee9d6
		
	
	
	
	
		
			
			MozReview-Commit-ID: rGjabnP2iz --HG-- extra : rebase_source : 1ef6c5ce028ac9ebd9f3176d57835c43fe46bada
		
			
				
	
	
		
			118 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* 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 "CacheLog.h"
 | |
| #include "CacheIndexIterator.h"
 | |
| #include "CacheIndex.h"
 | |
| #include "nsString.h"
 | |
| #include "mozilla/DebugOnly.h"
 | |
| 
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace net {
 | |
| 
 | |
| CacheIndexIterator::CacheIndexIterator(CacheIndex *aIndex, bool aAddNew)
 | |
|   : mStatus(NS_OK)
 | |
|   , mIndex(aIndex)
 | |
|   , mAddNew(aAddNew)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::CacheIndexIterator() [this=%p]", this));
 | |
| }
 | |
| 
 | |
| CacheIndexIterator::~CacheIndexIterator()
 | |
| {
 | |
|   LOG(("CacheIndexIterator::~CacheIndexIterator() [this=%p]", this));
 | |
| 
 | |
|   Close();
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| CacheIndexIterator::GetNextHash(SHA1Sum::Hash *aHash)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::GetNextHash() [this=%p]", this));
 | |
| 
 | |
|   StaticMutexAutoLock lock(CacheIndex::sLock);
 | |
| 
 | |
|   if (NS_FAILED(mStatus)) {
 | |
|     return mStatus;
 | |
|   }
 | |
| 
 | |
|   if (!mRecords.Length()) {
 | |
|     CloseInternal(NS_ERROR_NOT_AVAILABLE);
 | |
|     return mStatus;
 | |
|   }
 | |
| 
 | |
|   memcpy(aHash, mRecords[mRecords.Length() - 1]->mHash, sizeof(SHA1Sum::Hash));
 | |
|   mRecords.RemoveLastElement();
 | |
| 
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| CacheIndexIterator::Close()
 | |
| {
 | |
|   LOG(("CacheIndexIterator::Close() [this=%p]", this));
 | |
| 
 | |
|   StaticMutexAutoLock lock(CacheIndex::sLock);
 | |
| 
 | |
|   return CloseInternal(NS_ERROR_NOT_AVAILABLE);
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| CacheIndexIterator::CloseInternal(nsresult aStatus)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::CloseInternal() [this=%p, status=0x%08" PRIx32 "]", this,
 | |
|        static_cast<uint32_t>(aStatus)));
 | |
| 
 | |
|   // Make sure status will be a failure
 | |
|   MOZ_ASSERT(NS_FAILED(aStatus));
 | |
|   if (NS_SUCCEEDED(aStatus)) {
 | |
|     aStatus = NS_ERROR_UNEXPECTED;
 | |
|   }
 | |
| 
 | |
|   if (NS_FAILED(mStatus)) {
 | |
|     return NS_ERROR_NOT_AVAILABLE;
 | |
|   }
 | |
| 
 | |
|   DebugOnly<bool> removed = mIndex->mIterators.RemoveElement(this);
 | |
|   MOZ_ASSERT(removed);
 | |
|   mStatus = aStatus;
 | |
| 
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| void
 | |
| CacheIndexIterator::AddRecord(CacheIndexRecord *aRecord)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::AddRecord() [this=%p, record=%p]", this, aRecord));
 | |
| 
 | |
|   mRecords.AppendElement(aRecord);
 | |
| }
 | |
| 
 | |
| bool
 | |
| CacheIndexIterator::RemoveRecord(CacheIndexRecord *aRecord)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::RemoveRecord() [this=%p, record=%p]", this,
 | |
|        aRecord));
 | |
| 
 | |
|   return mRecords.RemoveElement(aRecord);
 | |
| }
 | |
| 
 | |
| bool
 | |
| CacheIndexIterator::ReplaceRecord(CacheIndexRecord *aOldRecord,
 | |
|                                   CacheIndexRecord *aNewRecord)
 | |
| {
 | |
|   LOG(("CacheIndexIterator::ReplaceRecord() [this=%p, oldRecord=%p, "
 | |
|        "newRecord=%p]", this, aOldRecord, aNewRecord));
 | |
| 
 | |
|   if (RemoveRecord(aOldRecord)) {
 | |
|     AddRecord(aNewRecord);
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| } // namespace net
 | |
| } // namespace mozilla
 |