// static already_AddRefed<ReadStream> ReadStream::Create(const CacheReadStreamOrVoid& aReadStreamOrVoid) { if (aReadStreamOrVoid.type() == CacheReadStreamOrVoid::Tvoid_t) { return nullptr; } return Create(aReadStreamOrVoid.get_CacheReadStream()); }
already_AddRefed<nsIInputStream> CacheOpParent::DeserializeCacheStream(const CacheReadStreamOrVoid& aStreamOrVoid) { if (aStreamOrVoid.type() == CacheReadStreamOrVoid::Tvoid_t) { return nullptr; } nsCOMPtr<nsIInputStream> stream; const CacheReadStream& readStream = aStreamOrVoid.get_CacheReadStream(); // Option 1: A push stream actor was sent for nsPipe data if (readStream.pushStreamParent()) { MOZ_ASSERT(!readStream.controlParent()); CachePushStreamParent* pushStream = static_cast<CachePushStreamParent*>(readStream.pushStreamParent()); stream = pushStream->TakeReader(); MOZ_ASSERT(stream); return stream.forget(); } // Option 2: One of our own ReadStreams was passed back to us with a stream // control actor. stream = ReadStream::Create(readStream); if (stream) { return stream.forget(); } // Option 3: A stream was serialized using normal methods. nsAutoTArray<FileDescriptor, 4> fds; if (readStream.fds().type() == OptionalFileDescriptorSet::TPFileDescriptorSetChild) { FileDescriptorSetParent* fdSetActor = static_cast<FileDescriptorSetParent*>(readStream.fds().get_PFileDescriptorSetParent()); MOZ_ASSERT(fdSetActor); fdSetActor->ForgetFileDescriptors(fds); MOZ_ASSERT(!fds.IsEmpty()); if (!fdSetActor->Send__delete__(fdSetActor)) { // child process is gone, warn and allow actor to clean up normally NS_WARNING("Cache failed to delete fd set actor."); } } return DeserializeInputStream(readStream.params(), fds); }
already_AddRefed<nsIInputStream> CacheOpParent::DeserializeCacheStream(const CacheReadStreamOrVoid& aStreamOrVoid) { if (aStreamOrVoid.type() == CacheReadStreamOrVoid::Tvoid_t) { return nullptr; } nsCOMPtr<nsIInputStream> stream; const CacheReadStream& readStream = aStreamOrVoid.get_CacheReadStream(); // Option 1: One of our own ReadStreams was passed back to us with a stream // control actor. stream = ReadStream::Create(readStream); if (stream) { return stream.forget(); } // Option 2: A stream was serialized using normal methods or passed // as a PSendStream actor. Use the standard method for // extracting the resulting stream. return DeserializeIPCStream(readStream.stream()); }