already_AddRefed<nsIInputStream> DeserializeInputStream(const InputStreamParams& aParams, const nsTArray<FileDescriptor>& aFileDescriptors) { nsCOMPtr<nsIInputStream> stream; nsCOMPtr<nsIIPCSerializableInputStream> serializable; switch (aParams.type()) { case InputStreamParams::TStringInputStreamParams: serializable = do_CreateInstance(kStringInputStreamCID); break; case InputStreamParams::TFileInputStreamParams: serializable = do_CreateInstance(kFileInputStreamCID); break; case InputStreamParams::TPartialFileInputStreamParams: serializable = do_CreateInstance(kPartialFileInputStreamCID); break; case InputStreamParams::TBufferedInputStreamParams: serializable = do_CreateInstance(kBufferedInputStreamCID); break; case InputStreamParams::TMIMEInputStreamParams: serializable = do_CreateInstance(kMIMEInputStreamCID); break; case InputStreamParams::TMultiplexInputStreamParams: serializable = do_CreateInstance(kMultiplexInputStreamCID); break; // When the input stream already exists in this process, all we need to do // is retrieve the original instead of sending any data over the wire. case InputStreamParams::TRemoteInputStreamParams: { if (NS_WARN_IF(XRE_GetProcessType() != GoannaProcessType_Default)) { return nullptr; } const nsID& id = aParams.get_RemoteInputStreamParams().id(); nsRefPtr<FileImpl> blobImpl = BlobParent::GetBlobImplForID(id); MOZ_ASSERT(blobImpl, "Invalid blob contents"); // If fetching the internal stream fails, we ignore it and return a // null stream. nsCOMPtr<nsIInputStream> stream; nsresult rv = blobImpl->GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv) || !stream) { NS_WARNING("Couldn't obtain a valid stream from the blob"); } return stream.forget(); } case InputStreamParams::TSameProcessInputStreamParams: { MOZ_ASSERT(aFileDescriptors.IsEmpty()); const SameProcessInputStreamParams& params = aParams.get_SameProcessInputStreamParams(); stream = dont_AddRef( reinterpret_cast<nsIInputStream*>(params.addRefedInputStream())); MOZ_ASSERT(stream); return stream.forget(); } default: MOZ_ASSERT(false, "Unknown params!"); return nullptr; } MOZ_ASSERT(serializable); if (!serializable->Deserialize(aParams, aFileDescriptors)) { MOZ_ASSERT(false, "Deserialize failed!"); return nullptr; } stream = do_QueryInterface(serializable); MOZ_ASSERT(stream); return stream.forget(); }
already_AddRefed<nsIInputStream> DeserializeInputStream(const InputStreamParams& aParams, const nsTArray<FileDescriptor>& aFileDescriptors) { MOZ_ASSERT(NS_IsMainThread()); nsCOMPtr<nsIIPCSerializableInputStream> serializable; switch (aParams.type()) { case InputStreamParams::TStringInputStreamParams: serializable = do_CreateInstance(kStringInputStreamCID); break; case InputStreamParams::TFileInputStreamParams: serializable = do_CreateInstance(kFileInputStreamCID); break; case InputStreamParams::TPartialFileInputStreamParams: serializable = do_CreateInstance(kPartialFileInputStreamCID); break; case InputStreamParams::TBufferedInputStreamParams: serializable = do_CreateInstance(kBufferedInputStreamCID); break; case InputStreamParams::TMIMEInputStreamParams: serializable = do_CreateInstance(kMIMEInputStreamCID); break; case InputStreamParams::TMultiplexInputStreamParams: serializable = do_CreateInstance(kMultiplexInputStreamCID); break; // When the input stream already exists in this process, all we need to do // is retrieve the original instead of sending any data over the wire. case InputStreamParams::TRemoteInputStreamParams: { nsCOMPtr<nsIDOMBlob> domBlob; const RemoteInputStreamParams& params = aParams.get_RemoteInputStreamParams(); domBlob = params.remoteBlobParent() ? static_cast<BlobParent*>(params.remoteBlobParent())->GetBlob() : static_cast<BlobChild*>(params.remoteBlobChild())->GetBlob(); MOZ_ASSERT(domBlob, "Invalid blob contents"); // If fetching the internal stream fails, we ignore it and return a // null stream. nsCOMPtr<nsIInputStream> stream; nsresult rv = domBlob->GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv) || !stream) { NS_WARNING("Couldn't obtain a valid stream from the blob"); } return stream.forget(); } default: MOZ_ASSERT(false, "Unknown params!"); return nullptr; } MOZ_ASSERT(serializable); if (!serializable->Deserialize(aParams, aFileDescriptors)) { MOZ_ASSERT(false, "Deserialize failed!"); return nullptr; } nsCOMPtr<nsIInputStream> stream = do_QueryInterface(serializable); MOZ_ASSERT(stream); return stream.forget(); }