1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef mozilla_dom_PresentationSessionTransport_h
8 #define mozilla_dom_PresentationSessionTransport_h
9 
10 #include "mozilla/RefPtr.h"
11 #include "nsCOMPtr.h"
12 #include "nsIAsyncInputStream.h"
13 #include "nsIPresentationSessionTransport.h"
14 #include "nsIPresentationSessionTransportBuilder.h"
15 #include "nsIStreamListener.h"
16 #include "nsISupportsImpl.h"
17 #include "nsITransport.h"
18 
19 class nsISocketTransport;
20 class nsIInputStreamPump;
21 class nsIScriptableInputStream;
22 class nsIMultiplexInputStream;
23 class nsIAsyncStreamCopier;
24 class nsIInputStream;
25 
26 namespace mozilla {
27 namespace dom {
28 
29 /*
30  * App-to-App transport channel for the presentation session. It's usually
31  * initialized with an |InitWithSocketTransport| call if at the presenting sender
32  * side; whereas it's initialized with an |InitWithChannelDescription| if at the
33  * presenting receiver side. The lifetime is managed in either
34  * |PresentationControllingInfo| (sender side) or |PresentationPresentingInfo|
35  * (receiver side) in PresentationSessionInfo.cpp.
36  */
37 class PresentationTCPSessionTransport final : public nsIPresentationSessionTransport
38                                             , public nsIPresentationTCPSessionTransportBuilder
39                                             , public nsITransportEventSink
40                                             , public nsIInputStreamCallback
41                                             , public nsIStreamListener
42 {
43 public:
44   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
45   NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(PresentationTCPSessionTransport,
46                                            nsIPresentationSessionTransport)
47 
48   NS_DECL_NSIPRESENTATIONSESSIONTRANSPORT
49   NS_DECL_NSIPRESENTATIONSESSIONTRANSPORTBUILDER
50   NS_DECL_NSIPRESENTATIONTCPSESSIONTRANSPORTBUILDER
51   NS_DECL_NSITRANSPORTEVENTSINK
52   NS_DECL_NSIINPUTSTREAMCALLBACK
53   NS_DECL_NSIREQUESTOBSERVER
54   NS_DECL_NSISTREAMLISTENER
55 
56   PresentationTCPSessionTransport();
57 
58   void NotifyCopyComplete(nsresult aStatus);
59 
60 private:
61   ~PresentationTCPSessionTransport();
62 
63   nsresult CreateStream();
64 
65   nsresult CreateInputStreamPump();
66 
67   void EnsureCopying();
68 
69   enum class ReadyState {
70     CONNECTING,
71     OPEN,
72     CLOSING,
73     CLOSED
74   };
75 
76   void SetReadyState(ReadyState aReadyState);
77 
IsReadyToNotifyData()78   bool IsReadyToNotifyData()
79   {
80     return mDataNotificationEnabled && mReadyState == ReadyState::OPEN;
81   }
82 
83   ReadyState mReadyState;
84   bool mAsyncCopierActive;
85   nsresult mCloseStatus;
86   bool mDataNotificationEnabled;
87 
88   uint8_t mRole = 0;
89 
90   // Raw socket streams
91   nsCOMPtr<nsISocketTransport> mTransport;
92   nsCOMPtr<nsIInputStream> mSocketInputStream;
93   nsCOMPtr<nsIOutputStream> mSocketOutputStream;
94 
95   // Input stream machinery
96   nsCOMPtr<nsIInputStreamPump> mInputStreamPump;
97   nsCOMPtr<nsIScriptableInputStream> mInputStreamScriptable;
98 
99   // Output stream machinery
100   nsCOMPtr<nsIMultiplexInputStream> mMultiplexStream;
101   nsCOMPtr<nsIAsyncStreamCopier> mMultiplexStreamCopier;
102 
103   nsCOMPtr<nsIPresentationSessionTransportCallback> mCallback;
104   nsCOMPtr<nsIPresentationSessionTransportBuilderListener> mListener;
105 };
106 
107 } // namespace dom
108 } // namespace mozilla
109 
110 #endif // mozilla_dom_PresentationSessionTransport_h
111