Changed nsCacheEntryDescriptor to implement nsITransport as a wrapper that checks access priviledges for the underlying transport provided by the device.

Added code to lazily allocate the underlying transport for the cache descriptor.

Added NS_ENSURE_ARG_POINTER() to all necessary interface methods. r=beard.
This commit is contained in:
gordon%netscape.com 2001-03-01 02:25:07 +00:00
Родитель 97fd732b36
Коммит 47a7b44c2c
2 изменённых файлов: 122 добавлений и 67 удалений

170
netwerk/cache/src/nsCacheEntryDescriptor.cpp поставляемый
Просмотреть файл

@ -21,6 +21,7 @@
* Gordon Sheridan, 22-February-2001 * Gordon Sheridan, 22-February-2001
*/ */
#include "nsICache.h"
#include "nsCacheService.h" #include "nsCacheService.h"
#include "nsCacheEntryDescriptor.h" #include "nsCacheEntryDescriptor.h"
#include "nsCacheEntry.h" #include "nsCacheEntry.h"
@ -49,6 +50,7 @@ nsresult
nsCacheEntryDescriptor::Create(nsCacheEntry * entry, nsCacheAccessMode accessGranted, nsCacheEntryDescriptor::Create(nsCacheEntry * entry, nsCacheAccessMode accessGranted,
nsICacheEntryDescriptor ** result) nsICacheEntryDescriptor ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
nsresult rv = nsnull; nsresult rv = nsnull;
nsCacheEntryDescriptor * descriptor = nsCacheEntryDescriptor * descriptor =
@ -67,6 +69,7 @@ nsCacheEntryDescriptor::Create(nsCacheEntry * entry, nsCacheAccessMode accessGr
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetKey(char ** result) nsCacheEntryDescriptor::GetKey(char ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
nsCString * key; nsCString * key;
@ -94,45 +97,45 @@ nsCacheEntryDescriptor::GetKey(char ** result)
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetFetchCount(PRInt32 *fetchCount) nsCacheEntryDescriptor::GetFetchCount(PRInt32 *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!fetchCount) return NS_ERROR_NULL_POINTER;
*fetchCount = mCacheEntry->FetchCount(); *result = mCacheEntry->FetchCount();
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetLastFetched(PRTime *lastFetched) nsCacheEntryDescriptor::GetLastFetched(PRTime *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!lastFetched) return NS_ERROR_NULL_POINTER;
*lastFetched = mCacheEntry->LastFetched(); *result = mCacheEntry->LastFetched();
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetLastValidated(PRTime *lastValidated) nsCacheEntryDescriptor::GetLastValidated(PRTime *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!lastValidated) return NS_ERROR_NULL_POINTER;
*lastValidated = mCacheEntry->LastValidated(); *result = mCacheEntry->LastValidated();
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetExpirationTime(PRTime *expirationTime) nsCacheEntryDescriptor::GetExpirationTime(PRTime *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!expirationTime) return NS_ERROR_NULL_POINTER;
*expirationTime = mCacheEntry->ExpirationTime(); *result = mCacheEntry->ExpirationTime();
return NS_OK; return NS_OK;
} }
@ -147,22 +150,22 @@ nsCacheEntryDescriptor::SetExpirationTime(PRTime expirationTime)
} }
NS_IMETHODIMP nsCacheEntryDescriptor::IsStreamBased(PRBool *streamBased) NS_IMETHODIMP nsCacheEntryDescriptor::IsStreamBased(PRBool *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!streamBased) return NS_ERROR_NULL_POINTER; *result = mCacheEntry->IsStreamData(); //** which name is better?
*streamBased = mCacheEntry->IsStreamData(); //** which name is better?
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP nsCacheEntryDescriptor::GetDataSize(PRUint32 *dataSize) NS_IMETHODIMP nsCacheEntryDescriptor::GetDataSize(PRUint32 *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!dataSize) return NS_ERROR_NULL_POINTER;
*dataSize = mCacheEntry->DataSize(); *result = mCacheEntry->DataSize();
return NS_OK; return NS_OK;
} }
@ -176,22 +179,25 @@ NS_IMETHODIMP nsCacheEntryDescriptor::SetDataSize(PRUint32 dataSize)
} }
NS_IMETHODIMP nsCacheEntryDescriptor::GetTransport(nsITransport * *aTransport) NS_IMETHODIMP nsCacheEntryDescriptor::GetTransport(nsITransport ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!mCacheEntry->IsStreamData()) return NS_ERROR_CACHE_DATA_IS_NOT_STREAM; if (!mCacheEntry->IsStreamData()) return NS_ERROR_CACHE_DATA_IS_NOT_STREAM;
return nsCacheService::GlobalInstance()->GetTransportForEntry(mCacheEntry, mAccessGranted, aTransport); NS_ADDREF(*result = this);
return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetCacheElement(nsISupports * *cacheElement) nsCacheEntryDescriptor::GetCacheElement(nsISupports ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (mCacheEntry->IsStreamData()) return NS_ERROR_CACHE_DATA_IS_STREAM; if (mCacheEntry->IsStreamData()) return NS_ERROR_CACHE_DATA_IS_STREAM;
return mCacheEntry->GetData(cacheElement); return mCacheEntry->GetData(result);
} }
@ -206,16 +212,18 @@ nsCacheEntryDescriptor::SetCacheElement(nsISupports * cacheElement)
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetAccessGranted(nsCacheAccessMode *accessGranted) nsCacheEntryDescriptor::GetAccessGranted(nsCacheAccessMode *result)
{ {
*accessGranted = mAccessGranted; NS_ENSURE_ARG_POINTER(result);
*result = mAccessGranted;
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetStoragePolicy(nsCacheStoragePolicy *policy) nsCacheEntryDescriptor::GetStoragePolicy(nsCacheStoragePolicy *result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
@ -274,7 +282,7 @@ nsCacheEntryDescriptor::Close()
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetMetaDataElement(const char *key, char **result) nsCacheEntryDescriptor::GetMetaDataElement(const char *key, char ** result)
{ {
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
@ -310,8 +318,9 @@ nsCacheEntryDescriptor::SetMetadataElement(const char *key, const char *value)
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetMetaDataEnumerator(nsISimpleEnumerator **_retval) nsCacheEntryDescriptor::GetMetaDataEnumerator(nsISimpleEnumerator ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
@ -319,8 +328,9 @@ nsCacheEntryDescriptor::GetMetaDataEnumerator(nsISimpleEnumerator **_retval)
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetSecurityInfo(nsISupports * *aSecurityInfo) nsCacheEntryDescriptor::GetSecurityInfo(nsISupports ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
@ -328,8 +338,9 @@ nsCacheEntryDescriptor::GetSecurityInfo(nsISupports * *aSecurityInfo)
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::GetProgressEventSink(nsIProgressEventSink * *aProgressEventSink) nsCacheEntryDescriptor::GetProgressEventSink(nsIProgressEventSink ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
@ -337,65 +348,106 @@ nsCacheEntryDescriptor::GetProgressEventSink(nsIProgressEventSink * *aProgressEv
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::SetProgressEventSink(nsIProgressEventSink * aProgressEventSink) nsCacheEntryDescriptor::SetProgressEventSink(nsIProgressEventSink * progressEventSink)
{ {
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!progressEventSink) return NS_ERROR_NULL_POINTER;
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::OpenInputStream(PRUint32 offset, nsCacheEntryDescriptor::OpenInputStream(PRUint32 offset,
PRUint32 count, PRUint32 count,
PRUint32 flags, PRUint32 flags,
nsIInputStream **result) nsIInputStream ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!(mAccessGranted & nsICache::ACCESS_READ))
return NS_ERROR_CACHE_READ_ACCESS_DENIED;
if (!mTransport) {
nsresult rv;
rv = nsCacheService::GlobalInstance()->
GetTransportForEntry(mCacheEntry,
mAccessGranted,
getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
}
*result = nsnull; return mTransport->OpenInputStream(offset, count, flags, result);
return NS_ERROR_NOT_IMPLEMENTED;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::OpenOutputStream(PRUint32 offset, nsCacheEntryDescriptor::OpenOutputStream(PRUint32 offset,
PRUint32 count, PRUint32 count,
PRUint32 flags, PRUint32 flags,
nsIOutputStream **result) nsIOutputStream ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!(mAccessGranted & nsICache::ACCESS_WRITE))
return NS_ERROR_CACHE_WRITE_ACCESS_DENIED;
if (!mTransport) {
nsresult rv;
rv = nsCacheService::GlobalInstance()->
GetTransportForEntry(mCacheEntry,
mAccessGranted,
getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
}
*result = nsnull; return mTransport->OpenOutputStream(offset, count, flags, result);
return NS_ERROR_NOT_IMPLEMENTED;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::AsyncRead(nsIStreamListener *listener, nsCacheEntryDescriptor::AsyncRead(nsIStreamListener * listener,
nsISupports * ctxt, nsISupports * ctxt,
PRUint32 offset, PRUint32 offset,
PRUint32 count, PRUint32 count,
PRUint32 flags, PRUint32 flags,
nsIRequest **result) nsIRequest ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!(mAccessGranted & nsICache::ACCESS_READ))
return NS_ERROR_CACHE_READ_ACCESS_DENIED;
if (!mTransport) {
nsresult rv;
rv = nsCacheService::GlobalInstance()->
GetTransportForEntry(mCacheEntry,
mAccessGranted,
getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
}
*result = nsnull; return mTransport->AsyncRead(listener, ctxt, offset, count, flags, result);
return NS_ERROR_NOT_IMPLEMENTED;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsCacheEntryDescriptor::AsyncWrite(nsIStreamProvider *provider, nsCacheEntryDescriptor::AsyncWrite(nsIStreamProvider * provider,
nsISupports * ctxt, nsISupports * ctxt,
PRUint32 offset, PRUint32 offset,
PRUint32 count, PRUint32 count,
PRUint32 flags, PRUint32 flags,
nsIRequest **result) nsIRequest ** result)
{ {
NS_ENSURE_ARG_POINTER(result);
if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE; if (!mCacheEntry) return NS_ERROR_NOT_AVAILABLE;
if (!(mAccessGranted & nsICache::ACCESS_WRITE))
return NS_ERROR_CACHE_WRITE_ACCESS_DENIED;
if (!mTransport) {
nsresult rv;
rv = nsCacheService::GlobalInstance()->
GetTransportForEntry(mCacheEntry,
mAccessGranted,
getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
}
*result = nsnull; return mTransport->AsyncWrite(provider, ctxt, offset, count, flags, result);
return NS_ERROR_NOT_IMPLEMENTED;
} }

11
netwerk/cache/src/nsCacheEntryDescriptor.h поставляемый
Просмотреть файл

@ -28,7 +28,9 @@
#include "nsICacheEntryDescriptor.h" #include "nsICacheEntryDescriptor.h"
#include "nsCacheEntry.h" #include "nsCacheEntry.h"
class nsCacheEntryDescriptor : public nsICacheEntryDescriptor class nsCacheEntryDescriptor :
public nsICacheEntryDescriptor,
public nsITransport
{ {
public: public:
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
@ -55,9 +57,10 @@ public:
protected: protected:
PRCList mListLink; PRCList mListLink;
nsCacheEntry * mCacheEntry; // we are a child of the entry nsCacheEntry * mCacheEntry; // we are a child of the entry
nsCacheAccessMode mAccessGranted; nsCacheAccessMode mAccessGranted;
nsCOMPtr<nsITransport> mTransport;
}; };