Mozilla/mozilla/network/cache/nu/src/nsMemModule.cpp
gagan%netscape.com d440707c51 CacheStubs- Added InfoAsHTML for about:cache and CacheObject's Reset.
nsCacheManager- InfoAsHTML for about:cache.

nsCacheObject/nsMemStream- Reset function for rereads.


git-svn-id: svn://10.0.0.236/trunk@10357 18797224-902f-48f8-a5cc-f745e15eee43
1998-09-18 05:49:01 +00:00

252 lines
5.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "prtypes.h"
#include "plstr.h"
#include "prlog.h"
#include "nsMemModule.h"
#include "nsMemCacheObject.h"
#include "nsCacheManager.h"
#include "nsMemStream.h"
/*
* nsMemModule
*
* Gagan Saksena 02/02/98
*
*/
//NS_DEFINE_IID(kMemModuleIID, NS_MEMMODULE_IID);
nsMemModule::nsMemModule(const PRUint32 size):
m_pFirstObject(0),
nsCacheModule(size)
{
SetSize(size);
}
nsMemModule::~nsMemModule()
{
if (m_pFirstObject) {
delete m_pFirstObject;
m_pFirstObject = 0;
}
}
PRBool nsMemModule::AddObject(nsCacheObject* io_pObject)
{
#if 0
if (io_pObject)
{
m_ht.Put(io_pObject->Address(), io_pObject);
}
return PR_FALSE;
#endif
if (io_pObject)
{
MonitorLocker ml(this);
PR_ASSERT(io_pObject->Stream()); // A valid stream does exist for this
if (m_pFirstObject)
{
LastObject()->Next(new nsMemCacheObject(io_pObject));
}
else
{
m_pFirstObject = new nsMemCacheObject(io_pObject);
}
m_Entries++;
io_pObject->Module(nsCacheManager::MEM);
return PR_TRUE;
}
return PR_FALSE;
}
PRBool nsMemModule::Contains(const char* i_url) const
{
MonitorLocker ml((nsMonitorable*)this);
if (m_pFirstObject && i_url && *i_url)
{
nsMemCacheObject* pObj = m_pFirstObject;
do
{
if (0 == PL_strcasecmp(pObj->ThisObject()->Address(), i_url))
return PR_TRUE;
pObj = pObj->Next();
}
while (pObj);
}
return PR_FALSE;
}
PRBool nsMemModule::Contains(nsCacheObject* i_pObject) const
{
MonitorLocker ml((nsMonitorable*)this);
if (i_pObject && *i_pObject->Address())
{
return this->Contains(i_pObject->Address());
}
return 0;
}
void nsMemModule::GarbageCollect(void)
{
MonitorLocker ml(this);
if (m_Entries > 0)
{
nsEnumeration* pEnum = Enumeration();
PRUint32 index = 0;
while (pEnum->HasMoreElements())
{
nsCacheObject* pObj = (nsCacheObject*) pEnum->NextElement();
if (pObj && pObj->IsExpired())
{
PRBool status = Remove(index);
PR_ASSERT(status == PR_TRUE);
}
++index;
}
}
}
nsCacheObject* nsMemModule::GetObject(const PRUint32 i_index) const
{
MonitorLocker ml((nsMonitorable*)this);
nsMemCacheObject* pNth = 0;
if (m_pFirstObject)
{
PRUint32 index = 0;
pNth = m_pFirstObject;
while (pNth->Next() && (index++ != i_index ))
{
pNth = pNth->Next();
}
}
return pNth->ThisObject();
}
nsCacheObject* nsMemModule::GetObject(const char* i_url) const
{
MonitorLocker ml((nsMonitorable*)this);
if (m_pFirstObject && i_url && *i_url)
{
nsMemCacheObject* pObj = m_pFirstObject;
do
{
if (0 == PL_strcasecmp(pObj->ThisObject()->Address(), i_url))
return pObj->ThisObject();
pObj = pObj->Next();
}
while (pObj);
}
return 0;
}
nsStream* nsMemModule::GetStreamFor(const nsCacheObject* i_pObject)
{
MonitorLocker ml(this);
if (i_pObject)
{
if (Contains((nsCacheObject*)i_pObject))
{
nsStream* pStream = i_pObject->Stream();
if (pStream)
return pStream;
}
// Set up a new stream for this object
return new nsMemStream();
}
return 0;
}
nsMemCacheObject* nsMemModule::LastObject(void) const
{
MonitorLocker ml((nsMonitorable*)this);
nsMemCacheObject* pLast = 0;
if (m_pFirstObject)
{
pLast = m_pFirstObject;
while (pLast->Next())
pLast = pLast->Next();
}
return pLast;
}
PRBool nsMemModule::ReduceSizeTo(const PRUint32 i_NewSize)
{
//TODO
return PR_TRUE;
}
PRBool nsMemModule::Remove(const char* i_url)
{
//TODO
return PR_FALSE;
}
PRBool nsMemModule::Remove(const PRUint32 i_index)
{
//TODO
return PR_FALSE;
}
/*
NS_IMETHOD nsMemModule::QueryInterface(const nsIID& aIID, void** aInstancePtr)
{
}
NS_IMETHOD_(nsrefcnt) nsMemModule::AddRef(void)
{
}
NS_IMETHOD_(nsrefcnt) nsMemModule::Release(void)
{
}
*/
/*
PRUint32 nsMemModule::nsMemKey::HashValue()
{
return 0;
}
PRBool nsMemModule::nsMemKey::Equals(nsHashKey *aKey)
{
return PR_FALSE;
}
nsHashKey* nsMemModule::nsMemKey::Clone()
{
return new nsMemModule::nsMemKey();
}
nsMemModule::nsMemKey::neMemKey()
{
}
*/