PRBool nsMIMEInputStream::Read(const IPC::Message *aMsg, void **aIter) { using IPC::ReadParam; if (!ReadParam(aMsg, aIter, &mHeaders) || !ReadParam(aMsg, aIter, &mContentLength) || !ReadParam(aMsg, aIter, &mStartedReading)) return PR_FALSE; // nsMIMEInputStream::Init() already appended mHeaderStream & mCLStream mHeaderStream->ShareData(mHeaders.get(), mStartedReading? mHeaders.Length() : 0); mCLStream->ShareData(mContentLength.get(), mStartedReading? mContentLength.Length() : 0); IPC::InputStream inputStream; if (!ReadParam(aMsg, aIter, &inputStream)) return PR_FALSE; nsCOMPtr<nsIInputStream> stream(inputStream); mData = stream; if (stream) { nsresult rv = mStream->AppendStream(mData); if (NS_FAILED(rv)) return PR_FALSE; } if (!ReadParam(aMsg, aIter, &mAddContentLength)) return PR_FALSE; return PR_TRUE; }
nsresult nsMIMEInputStream::Init() { nsresult rv = NS_OK; mStream = do_CreateInstance("@mozilla.org/io/multiplex-input-stream;1", &rv); NS_ENSURE_SUCCESS(rv, rv); mHeaderStream = do_CreateInstance("@mozilla.org/io/string-input-stream;1", &rv); NS_ENSURE_SUCCESS(rv, rv); mCLStream = do_CreateInstance("@mozilla.org/io/string-input-stream;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rv = mStream->AppendStream(mHeaderStream); NS_ENSURE_SUCCESS(rv, rv); rv = mStream->AppendStream(mCLStream); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
NS_IMETHODIMP nsMIMEInputStream::SetData(nsIInputStream *aStream) { NS_ENSURE_FALSE(mStartedReading, NS_ERROR_FAILURE); // Remove the old stream if there is one if (mData) mStream->RemoveStream(2); mData = aStream; if (aStream) mStream->AppendStream(mData); return NS_OK; }
bool nsMIMEInputStream::Deserialize(const InputStreamParams& aParams, const FileDescriptorArray& aFileDescriptors) { if (aParams.type() != InputStreamParams::TMIMEInputStreamParams) { NS_ERROR("Received unknown parameters from the other process!"); return false; } const MIMEInputStreamParams& params = aParams.get_MIMEInputStreamParams(); const OptionalInputStreamParams& wrappedParams = params.optionalStream(); mHeaders = params.headers(); mContentLength = params.contentLength(); mStartedReading = params.startedReading(); // nsMIMEInputStream::Init() already appended mHeaderStream & mCLStream mHeaderStream->ShareData(mHeaders.get(), mStartedReading ? mHeaders.Length() : 0); mCLStream->ShareData(mContentLength.get(), mStartedReading ? mContentLength.Length() : 0); nsCOMPtr<nsIInputStream> stream; if (wrappedParams.type() == OptionalInputStreamParams::TInputStreamParams) { stream = DeserializeInputStream(wrappedParams.get_InputStreamParams(), aFileDescriptors); if (!stream) { NS_WARNING("Failed to deserialize wrapped stream!"); return false; } mData = stream; if (NS_FAILED(mStream->AppendStream(mData))) { NS_WARNING("Failed to append stream!"); return false; } } else { NS_ASSERTION(wrappedParams.type() == OptionalInputStreamParams::Tvoid_t, "Unknown type for OptionalInputStreamParams!"); } mAddContentLength = params.addContentLength(); return true; }