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