Bug 1904139 - Don't re-initialize platform font list from GetDefaultFont. r=jfkthame
[gecko.git] / netwerk / base / nsBaseContentStream.h
blob13a3766857c4cc5b700bbfff2cfc2fc1b9576a1f
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef nsBaseContentStream_h__
7 #define nsBaseContentStream_h__
9 #include "nsIAsyncInputStream.h"
10 #include "nsIEventTarget.h"
11 #include "nsCOMPtr.h"
13 //-----------------------------------------------------------------------------
14 // nsBaseContentStream is designed to be subclassed with the intention of being
15 // used to satisfy the nsBaseChannel::OpenContentStream method.
17 // The subclass typically overrides the default Available, ReadSegments and
18 // CloseWithStatus methods. By default, Read is implemented in terms of
19 // ReadSegments, and Close is implemented in terms of CloseWithStatus. If
20 // CloseWithStatus is overriden, then the subclass will usually want to call
21 // the base class' CloseWithStatus method before returning.
23 // If the stream is non-blocking, then readSegments may return the exception
24 // NS_BASE_STREAM_WOULD_BLOCK if there is no data available and the stream is
25 // not at the "end-of-file" or already closed. This error code must not be
26 // returned from the Available implementation. When the caller receives this
27 // error code, he may choose to call the stream's AsyncWait method, in which
28 // case the base stream will have a non-null PendingCallback. When the stream
29 // has data or encounters an error, it should be sure to dispatch a pending
30 // callback if one exists (see DispatchCallback). The implementation of the
31 // base stream's CloseWithStatus (and Close) method will ensure that any
32 // pending callback is dispatched. It is the responsibility of the subclass
33 // to ensure that the pending callback is dispatched when it wants to have its
34 // ReadSegments method called again.
36 class nsBaseContentStream : public nsIAsyncInputStream {
37 public:
38 NS_DECL_THREADSAFE_ISUPPORTS
39 NS_DECL_NSIINPUTSTREAM
40 NS_DECL_NSIASYNCINPUTSTREAM
42 explicit nsBaseContentStream(bool nonBlocking)
43 : mStatus(NS_OK), mNonBlocking(nonBlocking) {}
45 nsresult Status() { return mStatus; }
46 bool IsNonBlocking() { return mNonBlocking; }
47 bool IsClosed() { return NS_FAILED(mStatus); }
49 // Called to test if the stream has a pending callback.
50 bool HasPendingCallback() { return mCallback != nullptr; }
52 // The current dispatch target (may be null) for the pending callback if any.
53 nsIEventTarget* CallbackTarget() { return mCallbackTarget; }
55 // Called to dispatch a pending callback. If there is no pending callback,
56 // then this function does nothing. Pass true to this function to cause the
57 // callback to occur asynchronously; otherwise, the callback will happen
58 // before this function returns.
59 void DispatchCallback(bool async = true);
61 // Helper function to make code more self-documenting.
62 void DispatchCallbackSync() { DispatchCallback(false); }
64 protected:
65 virtual ~nsBaseContentStream() = default;
67 private:
68 // Called from the base stream's AsyncWait method when a pending callback
69 // is installed on the stream.
70 virtual void OnCallbackPending() {}
72 private:
73 nsCOMPtr<nsIInputStreamCallback> mCallback;
74 nsCOMPtr<nsIEventTarget> mCallbackTarget;
75 nsresult mStatus;
76 bool mNonBlocking;
79 #endif // nsBaseContentStream_h__