nsCacheSession::nsCacheSession(const char * clientID, nsCacheStoragePolicy storagePolicy, bool streamBased) : mClientID(clientID), mInfo(0) { SetStoragePolicy(storagePolicy); if (streamBased) MarkStreamBased(); else SetStoragePolicy(nsICache::STORE_IN_MEMORY); MarkDoomEntriesIfExpired(); }
nsresult nsCacheEntry::RequestAccess(nsCacheRequest * request, nsCacheAccessMode *accessGranted) { nsresult rv = NS_OK; if (!IsInitialized()) { // brand new, unbound entry request->mKey = nsnull; // steal ownership of the key string if (request->IsStreamBased()) MarkStreamBased(); MarkInitialized(); *accessGranted = request->AccessRequested() & nsICache::ACCESS_WRITE; NS_ASSERTION(*accessGranted, "new cache entry for READ-ONLY request"); PR_APPEND_LINK(request, &mRequestQ); return rv; } if (IsDoomed()) return NS_ERROR_CACHE_ENTRY_DOOMED; if (IsStreamData() != request->IsStreamBased()) { *accessGranted = nsICache::ACCESS_NONE; return request->IsStreamBased() ? NS_ERROR_CACHE_DATA_IS_NOT_STREAM : NS_ERROR_CACHE_DATA_IS_STREAM; } if (PR_CLIST_IS_EMPTY(&mDescriptorQ)) { // 1st descriptor for existing bound entry *accessGranted = request->AccessRequested(); if (*accessGranted & nsICache::ACCESS_WRITE) { MarkInvalid(); } else { MarkValid(); } } else { // nth request for existing, bound entry *accessGranted = request->AccessRequested() & ~nsICache::ACCESS_WRITE; if (!IsValid()) rv = NS_ERROR_CACHE_WAIT_FOR_VALIDATION; } PR_APPEND_LINK(request,&mRequestQ); return rv; }
nsCacheEntry::nsCacheEntry(nsCString * key, PRBool streamBased, nsCacheStoragePolicy storagePolicy) : mKey(key), mFetchCount(0), mLastFetched(0), mLastModified(0), mExpirationTime(NO_EXPIRATION_TIME), mFlags(0), mDataSize(0), mCacheDevice(nsnull), mData(nsnull) { MOZ_COUNT_CTOR(nsCacheEntry); PR_INIT_CLIST(this); PR_INIT_CLIST(&mRequestQ); PR_INIT_CLIST(&mDescriptorQ); if (streamBased) MarkStreamBased(); SetStoragePolicy(storagePolicy); }