Mozilla/mozilla/mailnews/base/util/nsMsgFileStream.cpp
bienvenu%nventure.com 0bd8185e84 fix 33451 remove nsFileSpec, sr=mscott
git-svn-id: svn://10.0.0.236/trunk@224989 18797224-902f-48f8-a5cc-f745e15eee43
2007-04-25 03:25:02 +00:00

161 lines
3.7 KiB
C++

#include "nsILocalFile.h"
#include "nsMsgFileStream.h"
#include "nsInt64.h"
nsMsgFileStream::nsMsgFileStream()
{
mFileDesc = nsnull;
}
nsMsgFileStream::~nsMsgFileStream()
{
if (mFileDesc)
PR_Close(mFileDesc);
}
NS_IMPL_ISUPPORTS3(nsMsgFileStream, nsIInputStream, nsIOutputStream, nsISeekableStream)
nsresult nsMsgFileStream::InitWithFile(nsILocalFile *file)
{
return file->OpenNSPRFileDesc(PR_RDWR|PR_CREATE_FILE, 0664, &mFileDesc);
}
NS_IMETHODIMP
nsMsgFileStream::Seek(PRInt32 whence, PRInt64 offset)
{
if (mFileDesc == nsnull)
return NS_BASE_STREAM_CLOSED;
nsInt64 cnt = PR_Seek64(mFileDesc, offset, (PRSeekWhence)whence);
if (cnt == nsInt64(-1)) {
return NS_ErrorAccordingToNSPR();
}
return NS_OK;
}
NS_IMETHODIMP
nsMsgFileStream::Tell(PRInt64 *result)
{
if (mFileDesc == nsnull)
return NS_BASE_STREAM_CLOSED;
nsInt64 cnt = PR_Seek64(mFileDesc, 0, PR_SEEK_CUR);
if (cnt == nsInt64(-1)) {
return NS_ErrorAccordingToNSPR();
}
*result = cnt;
return NS_OK;
}
NS_IMETHODIMP
nsMsgFileStream::SetEOF()
{
if (mFileDesc == nsnull)
return NS_BASE_STREAM_CLOSED;
return NS_ERROR_NOT_IMPLEMENTED;
}
/* void close (); */
NS_IMETHODIMP nsMsgFileStream::Close()
{
nsresult rv = NS_OK;
if (mFileDesc && (PR_Close(mFileDesc) == PR_FAILURE))
rv = NS_BASE_STREAM_OSERROR;
mFileDesc = nsnull;
return rv;
}
/* unsigned long available (); */
NS_IMETHODIMP nsMsgFileStream::Available(PRUint32 *aResult)
{
if (!mFileDesc)
return NS_BASE_STREAM_CLOSED;
PRInt32 avail = PR_Available(mFileDesc);
if (avail == -1)
return NS_ErrorAccordingToNSPR();
*aResult = avail;
return NS_OK;
}
/* [noscript] unsigned long read (in charPtr aBuf, in unsigned long aCount); */
NS_IMETHODIMP nsMsgFileStream::Read(char * aBuf, PRUint32 aCount, PRUint32 *aResult)
{
if (!mFileDesc)
{
*aResult = 0;
return NS_OK;
}
PRInt32 bytesRead = PR_Read(mFileDesc, aBuf, aCount);
if (bytesRead == -1)
return NS_ErrorAccordingToNSPR();
*aResult = bytesRead;
return NS_OK;
}
/* [noscript] unsigned long readSegments (in nsWriteSegmentFun aWriter, in voidPtr aClosure, in unsigned long aCount); */
NS_IMETHODIMP nsMsgFileStream::ReadSegments(nsWriteSegmentFun aWriter, void * aClosure, PRUint32 aCount, PRUint32 *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* boolean isNonBlocking (); */
NS_IMETHODIMP nsMsgFileStream::IsNonBlocking(PRBool *aNonBlocking)
{
*aNonBlocking = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsMsgFileStream::Write(const char *buf, PRUint32 count, PRUint32 *result)
{
if (mFileDesc == nsnull)
return NS_BASE_STREAM_CLOSED;
PRInt32 cnt = PR_Write(mFileDesc, buf, count);
if (cnt == -1) {
return NS_ErrorAccordingToNSPR();
}
*result = cnt;
return NS_OK;
}
NS_IMETHODIMP
nsMsgFileStream::Flush(void)
{
if (mFileDesc == nsnull)
return NS_BASE_STREAM_CLOSED;
PRInt32 cnt = PR_Sync(mFileDesc);
if (cnt == -1)
return NS_ErrorAccordingToNSPR();
return NS_OK;
}
NS_IMETHODIMP
nsMsgFileStream::WriteFrom(nsIInputStream *inStr, PRUint32 count, PRUint32 *_retval)
{
NS_NOTREACHED("WriteFrom (see source comment)");
return NS_ERROR_NOT_IMPLEMENTED;
// File streams intentionally do not support this method.
// If you need something like this, then you should wrap
// the file stream using nsIBufferedOutputStream
}
NS_IMETHODIMP
nsMsgFileStream::WriteSegments(nsReadSegmentFun reader, void * closure, PRUint32 count, PRUint32 *_retval)
{
NS_NOTREACHED("WriteSegments (see source comment)");
return NS_ERROR_NOT_IMPLEMENTED;
// File streams intentionally do not support this method.
// If you need something like this, then you should wrap
// the file stream using nsIBufferedOutputStream
}