Made write and read do an implicit open. Added a FileContents attribute to allow simple conversion between an entire file and a string.

This commit is contained in:
mcmullen%netscape.com 1999-06-14 22:05:41 +00:00
parent b13ee0d438
commit 1c381a5f09
3 changed files with 161 additions and 41 deletions

View File

@ -410,6 +410,71 @@ NS_IMETHODIMP nsFileSpecImpl::isStreamOpen(PRBool *_retval)
return NS_OK; return NS_OK;
} }
//----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::GetInputStream(nsIInputStream** _retval)
//----------------------------------------------------------------------------------------
{
TEST_OUT_PTR(_retval)
if (!mInputStream)
openStreamForReading();
*_retval = mInputStream;
NS_IF_ADDREF(mInputStream);
return NS_OK;
}
//----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::GetOutputStream(nsIOutputStream** _retval)
//----------------------------------------------------------------------------------------
{
TEST_OUT_PTR(_retval)
if (!mOutputStream)
openStreamForWriting();
*_retval = mOutputStream;
NS_IF_ADDREF(mOutputStream);
return NS_OK;
}
//----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::SetFileContents(char* inString)
//----------------------------------------------------------------------------------------
{
nsresult rv = openStreamForWriting();
if (NS_FAILED(rv))
return rv;
PRInt32 count;
rv = write(inString, PL_strlen(inString), &count);
nsresult rv2 = closeStream();
return NS_FAILED(rv) ? rv : rv2;
}
//----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::GetFileContents(char** _retval)
//----------------------------------------------------------------------------------------
{
TEST_OUT_PTR(_retval)
*_retval = nsnull;
nsresult rv = openStreamForReading();
if (NS_FAILED(rv))
return rv;
PRInt32 theSize;
rv = GetFileSize((PRUint32*)&theSize);
if (NS_SUCCEEDED(rv))
rv = read(_retval, theSize, &theSize);
if (NS_SUCCEEDED(rv))
(*_retval)[theSize] = 0;
nsresult rv2 = closeStream();
return NS_FAILED(rv) ? rv : rv2;
}
//----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::GetFileSpec(nsFileSpec *aFileSpec)
//----------------------------------------------------------------------------------------
{
TEST_OUT_PTR(aFileSpec)
*aFileSpec = mFileSpec;
return NS_OK;
}
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
NS_IMETHODIMP nsFileSpecImpl::eof(PRBool *_retval) NS_IMETHODIMP nsFileSpecImpl::eof(PRBool *_retval)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
@ -428,6 +493,8 @@ NS_IMETHODIMP nsFileSpecImpl::read(char** buffer, PRInt32 requestedCount, PRInt3
{ {
TEST_OUT_PTR(_retval) TEST_OUT_PTR(_retval)
TEST_OUT_PTR(buffer) TEST_OUT_PTR(buffer)
if (!mInputStream)
openStreamForReading();
if (!*buffer) if (!*buffer)
*buffer = (char*)PR_Malloc(requestedCount + 1); *buffer = (char*)PR_Malloc(requestedCount + 1);
if (!mInputStream) if (!mInputStream)
@ -443,6 +510,8 @@ NS_IMETHODIMP nsFileSpecImpl::readLine(char** line, PRInt32 bufferSize, PRBool *
{ {
TEST_OUT_PTR(wasTruncated) TEST_OUT_PTR(wasTruncated)
TEST_OUT_PTR(line) TEST_OUT_PTR(line)
if (!mInputStream)
openStreamForReading();
if (!*line) if (!*line)
*line = (char*)PR_Malloc(bufferSize + 1); *line = (char*)PR_Malloc(bufferSize + 1);
if (!mInputStream) if (!mInputStream)
@ -459,6 +528,8 @@ NS_IMETHODIMP nsFileSpecImpl::write(const char * data, PRInt32 requestedCount, P
TEST_OUT_PTR(_retval) TEST_OUT_PTR(_retval)
if (!mOutputStream) if (!mOutputStream)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
if (!mOutputStream)
openStreamForWriting();
nsOutputFileStream s(mOutputStream); nsOutputFileStream s(mOutputStream);
*_retval = s.write(data, requestedCount); *_retval = s.write(data, requestedCount);
return s.error(); return s.error();
@ -516,34 +587,7 @@ NS_IMETHODIMP nsFileSpecImpl::endline()
return s.error(); return s.error();
} }
//======================================================================================== NS_IMPL_ISUPPORTS(nsDirectoryIteratorImpl, nsIDirectoryIterator::GetIID())
class nsDirectoryIteratorImpl
//========================================================================================
: public nsIDirectoryIterator
{
public:
nsDirectoryIteratorImpl();
virtual ~nsDirectoryIteratorImpl();
NS_DECL_ISUPPORTS
NS_IMETHOD Init(nsIFileSpec *parent);
NS_IMETHOD exists(PRBool *_retval);
NS_IMETHOD next();
NS_IMETHOD GetCurrentSpec(nsIFileSpec * *aCurrentSpec);
protected:
nsDirectoryIterator* mDirectoryIterator;
}; // class nsDirectoryIteratorImpl
static NS_DEFINE_IID(kIDirectoryIteratorIID, NS_IDIRECTORYITERATOR_IID);
NS_IMPL_ISUPPORTS(nsDirectoryIteratorImpl, kIDirectoryIteratorIID)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsDirectoryIteratorImpl::nsDirectoryIteratorImpl() nsDirectoryIteratorImpl::nsDirectoryIteratorImpl()
@ -601,6 +645,26 @@ NS_IMETHODIMP nsDirectoryIteratorImpl::GetCurrentSpec(nsIFileSpec * *aCurrentSpe
return nsFileSpecImpl::MakeInterface(mDirectoryIterator->Spec(), aCurrentSpec); return nsFileSpecImpl::MakeInterface(mDirectoryIterator->Spec(), aCurrentSpec);
} }
//----------------------------------------------------------------------------------------
NS_METHOD nsDirectoryIteratorImpl::Create(nsISupports* outer, const nsIID& aIID, void* *aIFileSpec)
//----------------------------------------------------------------------------------------
{
if (aIFileSpec == NULL)
return NS_ERROR_NULL_POINTER;
nsDirectoryIteratorImpl* it = new nsDirectoryIteratorImpl;
if (!it)
return NS_ERROR_OUT_OF_MEMORY;
nsresult rv = it->QueryInterface(aIID, aIFileSpec);
if (NS_FAILED(rv))
{
delete it;
return rv;
}
return rv;
}
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
NS_METHOD nsFileSpecImpl::Create(nsISupports* outer, const nsIID& aIID, void* *aIFileSpec) NS_METHOD nsFileSpecImpl::Create(nsISupports* outer, const nsIID& aIID, void* *aIFileSpec)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
@ -613,7 +677,8 @@ NS_METHOD nsFileSpecImpl::Create(nsISupports* outer, const nsIID& aIID, void* *a
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
nsresult rv = it->QueryInterface(aIID, aIFileSpec); nsresult rv = it->QueryInterface(aIID, aIFileSpec);
if (NS_FAILED(rv)) { if (NS_FAILED(rv))
{
delete it; delete it;
return rv; return rv;
} }
@ -634,22 +699,12 @@ nsresult NS_NewFileSpecWithSpec(nsFileSpec aSrcFileSpec, nsIFileSpec **result)
nsresult NS_NewFileSpec(nsIFileSpec** result) nsresult NS_NewFileSpec(nsIFileSpec** result)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!result) return nsFileSpecImpl::Create(nsnull, nsIFileSpec::GetIID(), result);
return NS_ERROR_NULL_POINTER;
nsFileSpecImpl* it = new nsFileSpecImpl;
if (!it)
return NS_ERROR_OUT_OF_MEMORY;
return it->QueryInterface(nsIFileSpec::GetIID(), (void **) result);
} }
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
nsresult NS_NewDirectoryIterator(nsIDirectoryIterator** result) nsresult NS_NewDirectoryIterator(nsIDirectoryIterator** result)
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
{ {
if (!result) return nsDirectoryIteratorImpl::Create(nsnull, nsIDirectoryIterator::GetIID(), result);
return NS_ERROR_NULL_POINTER;
nsDirectoryIteratorImpl* it = new nsDirectoryIteratorImpl();
if (!it)
return NS_ERROR_OUT_OF_MEMORY;
return it->QueryInterface(kIDirectoryIteratorIID, (void **) result);
} }

View File

@ -128,6 +128,14 @@ class NS_COM nsFileSpecImpl
/* boolean isOpen (); */ /* boolean isOpen (); */
NS_IMETHOD isStreamOpen(PRBool *_retval); NS_IMETHOD isStreamOpen(PRBool *_retval);
NS_IMETHOD GetInputStream(nsIInputStream**);
NS_IMETHOD GetOutputStream(nsIOutputStream**);
NS_IMETHOD GetFileContents(char**);
NS_IMETHOD SetFileContents(char*);
NS_IMETHOD GetFileSpec(nsFileSpec *aFileSpec);
/* boolean eof (); */ /* boolean eof (); */
NS_IMETHOD eof(PRBool *_retval); NS_IMETHOD eof(PRBool *_retval);
@ -178,4 +186,36 @@ class NS_COM nsFileSpecImpl
}; // class nsFileSpecImpl }; // class nsFileSpecImpl
//========================================================================================
class nsDirectoryIteratorImpl
//========================================================================================
: public nsIDirectoryIterator
{
public:
nsDirectoryIteratorImpl();
virtual ~nsDirectoryIteratorImpl();
NS_DECL_ISUPPORTS
NS_IMETHOD Init(nsIFileSpec *parent);
NS_IMETHOD exists(PRBool *_retval);
NS_IMETHOD next();
NS_IMETHOD GetCurrentSpec(nsIFileSpec * *aCurrentSpec);
//----------------------
// COM Cruft
//----------------------
static NS_METHOD Create(nsISupports* outer, const nsIID& aIID, void* *aIFileSpec);
protected:
nsDirectoryIterator* mDirectoryIterator;
}; // class nsDirectoryIteratorImpl
#endif // _FILESPECIMPL_H_ #endif // _FILESPECIMPL_H_

View File

@ -28,6 +28,8 @@
interface nsIFileURL; interface nsIFileURL;
interface nsIFilePath; interface nsIFilePath;
interface nsIOutputStream;
interface nsIInputStream;
// Define Progid and CID // Define Progid and CID
%{C++ %{C++
@ -37,8 +39,11 @@ interface nsIFilePath;
#define NS_FILESPEC_PROGID "component://netscape/filespec" #define NS_FILESPEC_PROGID "component://netscape/filespec"
#define NS_FILESPEC_CLASSNAME "File Spec" #define NS_FILESPEC_CLASSNAME "File Spec"
%} %}
native nsFileSpec(nsFileSpec);
[scriptable, uuid(d8c0a080-0868-11d3-915f-d9d889d48e3c)] [scriptable, uuid(d8c0a080-0868-11d3-915f-d9d889d48e3c)]
interface nsIFileSpec : nsISupports interface nsIFileSpec : nsISupports
{ {
@ -59,6 +64,11 @@ interface nsIFileSpec : nsISupports
attribute string LeafName; attribute string LeafName;
readonly attribute nsIFileSpec Parent; readonly attribute nsIFileSpec Parent;
readonly attribute nsIInputStream InputStream;
readonly attribute nsIOutputStream OutputStream;
[nonscriptable] readonly attribute nsFileSpec FileSpec;
attribute string FileContents;
void makeUnique(); void makeUnique();
void makeUniqueWithSuggestedName(in string suggestedName); void makeUniqueWithSuggestedName(in string suggestedName);
@ -104,6 +114,16 @@ interface nsIFileSpec : nsISupports
}; };
// Define Progid and CID
%{C++
// {a3020981-2018-11d3-915f-a957795b7ebc}
#define NS_DIRECTORYITERATOR_CID \
{ 0xa3020981, 0x2018, 0x11d3, { 0x91, 0x5f, 0xa9, 0x57, 0x79, 0x5b, 0x7e, 0xbc } }
#define NS_DIRECTORYITERATOR_PROGID "component://netscape/directoryiterator"
#define NS_DIRECTORYITERATOR_CLASSNAME "nsIDirectoryIterator"
%}
[scriptable, uuid(d8c0a083-0868-11d3-915f-d9d889d48e3c)] [scriptable, uuid(d8c0a083-0868-11d3-915f-d9d889d48e3c)]
interface nsIDirectoryIterator : nsISupports interface nsIDirectoryIterator : nsISupports
{ {
@ -118,4 +138,9 @@ interface nsIDirectoryIterator : nsISupports
NS_COM nsresult NS_NewFileSpecWithSpec(nsFileSpec aSrcFileSpec, nsIFileSpec **result); NS_COM nsresult NS_NewFileSpecWithSpec(nsFileSpec aSrcFileSpec, nsIFileSpec **result);
NS_COM nsresult NS_NewFileSpec(nsIFileSpec** result); NS_COM nsresult NS_NewFileSpec(nsIFileSpec** result);
NS_COM nsresult NS_NewDirectoryIterator(nsIDirectoryIterator** result); NS_COM nsresult NS_NewDirectoryIterator(nsIDirectoryIterator** result);
#define NS_BOOL_ACCESSOR(_method) { PRBool rv; return NS_SUCCEEDED(f->_method(&rv)) && rv; }
inline PRBool Exists(nsIFileSpec* f) NS_BOOL_ACCESSOR(exists)
inline PRBool Exists(nsIDirectoryIterator* f) NS_BOOL_ACCESSOR(exists)
inline PRBool IsDirectory(nsIFileSpec* f) NS_BOOL_ACCESSOR(isDirectory)
%} %}