Merge tracemonkey into mozilla-central. a=blockers
[mozilla-central.git] / startupcache / StartupCacheUtils.cpp
blob538b25171541b113594158c7cba9257abf0f84dc
2 #include "nsCOMPtr.h"
3 #include "nsIInputStream.h"
4 #include "nsIStringStream.h"
5 #include "nsAutoPtr.h"
6 #include "StartupCacheUtils.h"
7 #include "mozilla/scache/StartupCache.h"
9 namespace mozilla {
10 namespace scache {
12 NS_EXPORT nsresult
13 NS_NewObjectInputStreamFromBuffer(char* buffer, PRUint32 len,
14 nsIObjectInputStream** stream)
16 nsCOMPtr<nsIStringInputStream> stringStream
17 = do_CreateInstance("@mozilla.org/io/string-input-stream;1");
18 nsCOMPtr<nsIObjectInputStream> objectInput
19 = do_CreateInstance("@mozilla.org/binaryinputstream;1");
21 stringStream->AdoptData(buffer, len);
22 objectInput->SetInputStream(stringStream);
24 objectInput.forget(stream);
25 return NS_OK;
28 NS_EXPORT nsresult
29 NS_NewObjectOutputWrappedStorageStream(nsIObjectOutputStream **wrapperStream,
30 nsIStorageStream** stream)
32 nsCOMPtr<nsIStorageStream> storageStream;
34 nsresult rv = NS_NewStorageStream(256, PR_UINT32_MAX, getter_AddRefs(storageStream));
35 NS_ENSURE_SUCCESS(rv, rv);
37 nsCOMPtr<nsIObjectOutputStream> objectOutput
38 = do_CreateInstance("@mozilla.org/binaryoutputstream;1");
39 nsCOMPtr<nsIOutputStream> outputStream
40 = do_QueryInterface(storageStream);
42 objectOutput->SetOutputStream(outputStream);
44 #ifdef DEBUG
45 // Wrap in debug stream to detect unsupported writes of
46 // multiply-referenced non-singleton objects
47 StartupCache* sc = StartupCache::GetSingleton();
48 NS_ENSURE_TRUE(sc, NS_ERROR_UNEXPECTED);
49 nsCOMPtr<nsIObjectOutputStream> debugStream;
50 sc->GetDebugObjectOutputStream(objectOutput, getter_AddRefs(debugStream));
51 debugStream.forget(wrapperStream);
52 #else
53 objectOutput.forget(wrapperStream);
54 #endif
56 storageStream.forget(stream);
57 return NS_OK;
60 NS_EXPORT nsresult
61 NS_NewBufferFromStorageStream(nsIStorageStream *storageStream,
62 char** buffer, PRUint32* len)
64 nsresult rv;
65 nsCOMPtr<nsIInputStream> inputStream;
66 rv = storageStream->NewInputStream(0, getter_AddRefs(inputStream));
67 NS_ENSURE_SUCCESS(rv, rv);
69 PRUint32 avail, read;
70 rv = inputStream->Available(&avail);
71 NS_ENSURE_SUCCESS(rv, rv);
73 nsAutoArrayPtr<char> temp (new char[avail]);
74 rv = inputStream->Read(temp, avail, &read);
75 if (NS_SUCCEEDED(rv) && avail != read)
76 rv = NS_ERROR_UNEXPECTED;
78 if (NS_FAILED(rv)) {
79 return rv;
82 *len = avail;
83 *buffer = temp.forget();
84 return NS_OK;