NS_IMETHODIMP nsOutputStreamTransport::OpenOutputStream(PRUint32 flags, PRUint32 segsize, PRUint32 segcount, nsIOutputStream **result) { NS_ENSURE_TRUE(!mInProgress, NS_ERROR_IN_PROGRESS); nsresult rv; nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; // XXX if the caller requests an unbuffered stream, then perhaps // we'd want to simply return mSink; however, then we would // not be writing to mSink on a background thread. is this ok? PRBool nonblocking = !(flags & OPEN_BLOCKING); net_ResolveSegmentParams(segsize, segcount); nsIMemory *segalloc = net_GetSegmentAlloc(segsize); nsCOMPtr<nsIAsyncInputStream> pipeIn; rv = NS_NewPipe2(getter_AddRefs(pipeIn), getter_AddRefs(mPipeOut), PR_TRUE, nonblocking, segsize, segcount, segalloc); if (NS_FAILED(rv)) return rv; mInProgress = PR_TRUE; // startup async copy process... rv = NS_AsyncCopy(pipeIn, this, target, NS_ASYNCCOPY_VIA_READSEGMENTS, segsize); if (NS_SUCCEEDED(rv)) NS_ADDREF(*result = mPipeOut); return rv; }
NS_IMETHODIMP nsInputStreamTransport::OpenInputStream(uint32_t flags, uint32_t segsize, uint32_t segcount, nsIInputStream **result) { NS_ENSURE_TRUE(!mInProgress, NS_ERROR_IN_PROGRESS); nsresult rv; nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; // XXX if the caller requests an unbuffered stream, then perhaps // we'd want to simply return mSource; however, then we would // not be reading mSource on a background thread. is this ok? bool nonblocking = !(flags & OPEN_BLOCKING); net_ResolveSegmentParams(segsize, segcount); nsCOMPtr<nsIAsyncOutputStream> pipeOut; rv = NS_NewPipe2(getter_AddRefs(mPipeIn), getter_AddRefs(pipeOut), nonblocking, true, segsize, segcount); if (NS_FAILED(rv)) return rv; mInProgress = true; // startup async copy process... rv = NS_AsyncCopy(this, pipeOut, target, NS_ASYNCCOPY_VIA_WRITESEGMENTS, segsize); if (NS_SUCCEEDED(rv)) NS_ADDREF(*result = mPipeIn); return rv; }