diff --git a/base/public/nsFileSpecStreaming.h b/base/public/nsFileSpecStreaming.h new file mode 100644 index 00000000000..1f07a3e0f6c --- /dev/null +++ b/base/public/nsFileSpecStreaming.h @@ -0,0 +1,47 @@ +/* -*- 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. + */ + +// Functions for nsPersistentFileDescriptor that depend on streams, and so +// cannot be made independent of base. + +#include "nscore.h" +#include "nsError.h" + +class nsPersistentFileDescriptor; +class nsInputStream; +class nsOutputStream; +class nsIInputStream; +class nsIOutputStream; +class nsFileURL; +class nsFileSpec; + +NS_BASE nsOutputStream& operator << (nsOutputStream& s, const nsFileURL& spec); +NS_BASE nsresult ReadDescriptor( + nsIInputStream* aStream, nsPersistentFileDescriptor&); +NS_BASE nsresult WriteDescriptor( + nsIOutputStream* aStream, + const nsPersistentFileDescriptor&); + // writes the data to a file +NS_BASE nsInputStream& operator >> ( + nsInputStream&, + nsPersistentFileDescriptor&); + // reads the data from a file +NS_BASE nsOutputStream& operator << ( + nsOutputStream&, + const nsPersistentFileDescriptor&); + // writes the data to a file diff --git a/base/src/nsFileSpecStreaming.cpp b/base/src/nsFileSpecStreaming.cpp new file mode 100644 index 00000000000..bfe68bbd19b --- /dev/null +++ b/base/src/nsFileSpecStreaming.cpp @@ -0,0 +1,82 @@ +#include "nsFileSpecStreaming.h" + +#include "nsIInputStream.h" +#include "nsIOutputStream.h" +#include "nsFileStream.h" +#include "nsFileSpec.h" + +#define MAX_PERSISTENT_DATA_SIZE 1000 + +//---------------------------------------------------------------------------------------- +nsOutputStream& operator << (nsOutputStream& s, const nsFileURL& url) +//---------------------------------------------------------------------------------------- +{ + return s << url.GetURLString(); +} + +//---------------------------------------------------------------------------------------- +nsresult ReadDescriptor( + nsIInputStream* aStream, + nsPersistentFileDescriptor& desc) +//---------------------------------------------------------------------------------------- +{ + nsInputStream inputStream(aStream); + inputStream >> desc; + return NS_OK; +} + +//---------------------------------------------------------------------------------------- +nsresult WriteDescriptor( + nsIOutputStream* aStream, + const nsPersistentFileDescriptor& desc) +//---------------------------------------------------------------------------------------- +{ + nsOutputStream outputStream(aStream); + outputStream << desc; + return NS_OK; +} + +//---------------------------------------------------------------------------------------- +nsInputStream& operator >> (nsInputStream& s, nsPersistentFileDescriptor& d) +// reads the data from a file +//---------------------------------------------------------------------------------------- +{ + char bigBuffer[MAX_PERSISTENT_DATA_SIZE + 1]; + // The first 8 bytes of the data should be a hex version of the data size to follow. + PRInt32 bytesRead = 8; + bytesRead = s.read(bigBuffer, bytesRead); + if (bytesRead != 8) + return s; + bigBuffer[8] = '\0'; + sscanf(bigBuffer, "%x", (PRUint32*)&bytesRead); + if (bytesRead > MAX_PERSISTENT_DATA_SIZE) + { + // Try to tolerate encoded values with no length header + bytesRead = 8 + s.read(bigBuffer + 8, MAX_PERSISTENT_DATA_SIZE - 8); + } + else + { + // Now we know how many bytes to read, do it. + bytesRead = s.read(bigBuffer, bytesRead); + } + d.SetData(bigBuffer, bytesRead); + return s; +} + +//---------------------------------------------------------------------------------------- +nsOutputStream& operator << (nsOutputStream& s, const nsPersistentFileDescriptor& d) +// writes the data to a file +//---------------------------------------------------------------------------------------- +{ + char littleBuf[9]; + PRInt32 dataSize; + nsSimpleCharString data; + d.GetData(data, dataSize); + // First write (in hex) the length of the data to follow. Exactly 8 bytes + sprintf(littleBuf, "%0.8x", dataSize); + s << littleBuf; + // Now write the data itself + s << (const char*)data; + return s; +} + diff --git a/xpcom/io/nsFileSpecStreaming.cpp b/xpcom/io/nsFileSpecStreaming.cpp new file mode 100644 index 00000000000..bfe68bbd19b --- /dev/null +++ b/xpcom/io/nsFileSpecStreaming.cpp @@ -0,0 +1,82 @@ +#include "nsFileSpecStreaming.h" + +#include "nsIInputStream.h" +#include "nsIOutputStream.h" +#include "nsFileStream.h" +#include "nsFileSpec.h" + +#define MAX_PERSISTENT_DATA_SIZE 1000 + +//---------------------------------------------------------------------------------------- +nsOutputStream& operator << (nsOutputStream& s, const nsFileURL& url) +//---------------------------------------------------------------------------------------- +{ + return s << url.GetURLString(); +} + +//---------------------------------------------------------------------------------------- +nsresult ReadDescriptor( + nsIInputStream* aStream, + nsPersistentFileDescriptor& desc) +//---------------------------------------------------------------------------------------- +{ + nsInputStream inputStream(aStream); + inputStream >> desc; + return NS_OK; +} + +//---------------------------------------------------------------------------------------- +nsresult WriteDescriptor( + nsIOutputStream* aStream, + const nsPersistentFileDescriptor& desc) +//---------------------------------------------------------------------------------------- +{ + nsOutputStream outputStream(aStream); + outputStream << desc; + return NS_OK; +} + +//---------------------------------------------------------------------------------------- +nsInputStream& operator >> (nsInputStream& s, nsPersistentFileDescriptor& d) +// reads the data from a file +//---------------------------------------------------------------------------------------- +{ + char bigBuffer[MAX_PERSISTENT_DATA_SIZE + 1]; + // The first 8 bytes of the data should be a hex version of the data size to follow. + PRInt32 bytesRead = 8; + bytesRead = s.read(bigBuffer, bytesRead); + if (bytesRead != 8) + return s; + bigBuffer[8] = '\0'; + sscanf(bigBuffer, "%x", (PRUint32*)&bytesRead); + if (bytesRead > MAX_PERSISTENT_DATA_SIZE) + { + // Try to tolerate encoded values with no length header + bytesRead = 8 + s.read(bigBuffer + 8, MAX_PERSISTENT_DATA_SIZE - 8); + } + else + { + // Now we know how many bytes to read, do it. + bytesRead = s.read(bigBuffer, bytesRead); + } + d.SetData(bigBuffer, bytesRead); + return s; +} + +//---------------------------------------------------------------------------------------- +nsOutputStream& operator << (nsOutputStream& s, const nsPersistentFileDescriptor& d) +// writes the data to a file +//---------------------------------------------------------------------------------------- +{ + char littleBuf[9]; + PRInt32 dataSize; + nsSimpleCharString data; + d.GetData(data, dataSize); + // First write (in hex) the length of the data to follow. Exactly 8 bytes + sprintf(littleBuf, "%0.8x", dataSize); + s << littleBuf; + // Now write the data itself + s << (const char*)data; + return s; +} + diff --git a/xpcom/io/nsFileSpecStreaming.h b/xpcom/io/nsFileSpecStreaming.h new file mode 100644 index 00000000000..1f07a3e0f6c --- /dev/null +++ b/xpcom/io/nsFileSpecStreaming.h @@ -0,0 +1,47 @@ +/* -*- 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. + */ + +// Functions for nsPersistentFileDescriptor that depend on streams, and so +// cannot be made independent of base. + +#include "nscore.h" +#include "nsError.h" + +class nsPersistentFileDescriptor; +class nsInputStream; +class nsOutputStream; +class nsIInputStream; +class nsIOutputStream; +class nsFileURL; +class nsFileSpec; + +NS_BASE nsOutputStream& operator << (nsOutputStream& s, const nsFileURL& spec); +NS_BASE nsresult ReadDescriptor( + nsIInputStream* aStream, nsPersistentFileDescriptor&); +NS_BASE nsresult WriteDescriptor( + nsIOutputStream* aStream, + const nsPersistentFileDescriptor&); + // writes the data to a file +NS_BASE nsInputStream& operator >> ( + nsInputStream&, + nsPersistentFileDescriptor&); + // reads the data from a file +NS_BASE nsOutputStream& operator << ( + nsOutputStream&, + const nsPersistentFileDescriptor&); + // writes the data to a file