Mozilla/mozilla/network/cache/nu/src/nsMemStream.cpp
dmose%mozilla.org ce50f7d151 updated license boilerplate to xPL 1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52900 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 02:47:15 +00:00

126 lines
3.0 KiB
C++

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsMemStream.h"
#include "prmem.h"
#include "prlog.h" /* Assert */
#ifndef XP_MAC
#include "memory.h"
#else
#include "cstring"
#endif
static const PRUint32 kPageSize = 1024;//4096;
nsMemStream::nsMemStream():m_AllocSize(0),m_Size(0),m_pStart(0),m_ReadOffset(0),m_WriteOffset(0)
{
}
nsMemStream::~nsMemStream()
{
PR_FREEIF(m_pStart);
}
/*
nsrefcnt nsMemStream::AddRef(void)
{
return ++m_RefCnt;
}
nsrefcnt nsMemStream::Release(void)
{
if (--m_RefCnt == 0)
{
delete this;
return 0;
}
return m_RefCnt;
}
nsresult nsMemStream::QueryInterface(const nsIID& aIID,
void** aInstancePtrResult)
{
return NS_OK;
}
*/
PRInt32 nsMemStream::Read(void* o_Buffer, PRUint32 i_Len)
{
if (m_Size > 0)
{
PR_ASSERT(m_pStart); //This has to be there if m_Size > 0
char* pCurrentRead = (char*) m_pStart + m_ReadOffset;
unsigned int validLen = m_Size - m_ReadOffset;
if (0 == validLen)
return 0;
if (validLen > i_Len)
validLen = i_Len;
memcpy(o_Buffer, pCurrentRead, validLen);
m_ReadOffset += validLen;
return validLen;
}
return 0;
}
void nsMemStream::Reset()
{
m_ReadOffset = 0;
}
PRInt32 nsMemStream::Write(const void* i_Buffer, PRUint32 i_Len)
{
if (!m_pStart)
{
m_pStart = PR_Calloc(1, kPageSize);
if (!m_pStart)
{
PR_Free(m_pStart);
return 0;
}
m_WriteOffset = 0;
m_AllocSize = kPageSize;
}
unsigned int validLen = m_AllocSize - m_Size;
while (validLen < i_Len)
{
//Alloc some more
m_pStart = PR_Realloc(m_pStart, m_AllocSize+kPageSize);
if (!m_pStart)
{
PR_Free(m_pStart);
m_AllocSize = 0;
m_WriteOffset = 0;
m_Size = 0;
return 0;
}
m_AllocSize += kPageSize;
validLen += kPageSize;
}
char* pCurrentWrite = (char*)m_pStart + m_WriteOffset;
memcpy(pCurrentWrite, i_Buffer, i_Len);
m_WriteOffset += i_Len;
m_Size += i_Len;
return i_Len;
}