nsresult nsZipDataStream::Init(nsZipWriter *aWriter, nsIOutputStream *aStream, nsZipHeader *aHeader, int32_t aCompression) { mWriter = aWriter; mHeader = aHeader; mStream = aStream; mHeader->mCRC = crc32(0L, Z_NULL, 0); nsresult rv = NS_NewSimpleStreamListener(getter_AddRefs(mOutput), aStream, nullptr); NS_ENSURE_SUCCESS(rv, rv); if (aCompression > 0) { mHeader->mMethod = ZIP_METHOD_DEFLATE; nsCOMPtr<nsIStreamConverter> converter = new nsDeflateConverter(aCompression); NS_ENSURE_TRUE(converter, NS_ERROR_OUT_OF_MEMORY); rv = converter->AsyncConvertData("uncompressed", "rawdeflate", mOutput, nullptr); NS_ENSURE_SUCCESS(rv, rv); mOutput = do_QueryInterface(converter, &rv); NS_ENSURE_SUCCESS(rv, rv); } else { mHeader->mMethod = ZIP_METHOD_STORE; } return NS_OK; }
inline nsresult nsZipWriter::BeginProcessingRemoval(int32_t aPos) { // Open the zip file for reading nsCOMPtr<nsIInputStream> inputStream; nsresult rv = NS_NewLocalFileInputStream(getter_AddRefs(inputStream), mFile); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIInputStreamPump> pump; rv = NS_NewInputStreamPump(getter_AddRefs(pump), inputStream, -1, -1, 0, 0, true); if (NS_FAILED(rv)) { inputStream->Close(); return rv; } nsCOMPtr<nsIStreamListener> listener; rv = NS_NewSimpleStreamListener(getter_AddRefs(listener), mStream, this); if (NS_FAILED(rv)) { inputStream->Close(); return rv; } nsCOMPtr<nsISeekableStream> seekable = do_QueryInterface(mStream); rv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, mHeaders[aPos]->mOffset); if (NS_FAILED(rv)) { inputStream->Close(); return rv; } uint32_t shift = (mHeaders[aPos + 1]->mOffset - mHeaders[aPos]->mOffset); mCDSOffset -= shift; int32_t pos2 = aPos + 1; while (pos2 < mHeaders.Count()) { mEntryHash.Put(mHeaders[pos2]->mName, pos2 - 1); mHeaders[pos2]->mOffset -= shift; pos2++; } mEntryHash.Remove(mHeaders[aPos]->mName); mHeaders.RemoveObjectAt(aPos); mCDSDirty = true; rv = pump->AsyncRead(listener, nullptr); if (NS_FAILED(rv)) { inputStream->Close(); Cleanup(); return rv; } return NS_OK; }
NS_IMETHODIMP nsWebDAVService::GetToOutputStream(nsIWebDAVResource *resource, nsIOutputStream *stream, nsIWebDAVOperationListener *listener, nsIInterfaceRequestor *notificationCallbacks, nsISupports *closure) { nsCOMPtr<nsIRequestObserver> getObserver; nsresult rv; rv = NS_WD_NewGetOperationRequestObserver(resource, listener, closure, stream, getter_AddRefs(getObserver)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIStreamListener> streamListener; rv = NS_NewSimpleStreamListener(getter_AddRefs(streamListener), stream, getObserver); NS_ENSURE_SUCCESS(rv, rv); return Get(resource, streamListener, notificationCallbacks); }