WebrtcTCPSocket.h (3206B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set sw=2 ts=8 et tw=80 ft=cpp : */ 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 file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef webrtc_tcp_socket_h__ 8 #define webrtc_tcp_socket_h__ 9 10 #include <list> 11 12 #include "mozilla/net/WebrtcProxyConfig.h" 13 #include "nsCOMPtr.h" 14 #include "nsIAsyncInputStream.h" 15 #include "nsIAsyncOutputStream.h" 16 #include "nsIAuthPromptProvider.h" 17 #include "nsIHttpChannelInternal.h" 18 #include "nsIInterfaceRequestor.h" 19 #include "nsIProtocolProxyCallback.h" 20 #include "nsIStreamListener.h" 21 #include "nsStringFwd.h" 22 #include "nsTArray.h" 23 24 class nsISocketTransport; 25 26 namespace mozilla::net { 27 28 class WebrtcTCPSocketCallback; 29 class WebrtcTCPData; 30 31 class WebrtcTCPSocket : public nsIHttpUpgradeListener, 32 public nsIStreamListener, 33 public nsIInputStreamCallback, 34 public nsIOutputStreamCallback, 35 public nsIInterfaceRequestor, 36 public nsIAuthPromptProvider, 37 public nsIProtocolProxyCallback { 38 public: 39 NS_DECL_NSIHTTPUPGRADELISTENER 40 NS_DECL_NSIINPUTSTREAMCALLBACK 41 NS_DECL_NSIINTERFACEREQUESTOR 42 NS_DECL_NSIOUTPUTSTREAMCALLBACK 43 NS_DECL_NSIREQUESTOBSERVER 44 NS_DECL_NSISTREAMLISTENER 45 NS_DECL_THREADSAFE_ISUPPORTS 46 NS_FORWARD_SAFE_NSIAUTHPROMPTPROVIDER(mAuthProvider) 47 NS_DECL_NSIPROTOCOLPROXYCALLBACK 48 49 explicit WebrtcTCPSocket(WebrtcTCPSocketCallback* aCallbacks); 50 51 void SetTabId(dom::TabId aTabId); 52 nsresult Open(const nsACString& aHost, const int& aPort, 53 const nsACString& aLocalAddress, const int& aLocalPort, 54 bool aUseTls, 55 const Maybe<net::WebrtcProxyConfig>& aProxyConfig); 56 nsresult Write(nsTArray<uint8_t>&& aBytes); 57 nsresult Close(); 58 59 size_t CountUnwrittenBytes() const; 60 61 protected: 62 virtual ~WebrtcTCPSocket(); 63 64 // protected for gtests 65 virtual void InvokeOnClose(nsresult aReason); 66 virtual void InvokeOnConnected(); 67 virtual void InvokeOnRead(nsTArray<uint8_t>&& aReadData); 68 69 RefPtr<WebrtcTCPSocketCallback> mProxyCallbacks; 70 71 private: 72 bool mClosed; 73 bool mOpened; 74 nsCOMPtr<nsIURI> mURI; 75 bool mTls = false; 76 Maybe<WebrtcProxyConfig> mProxyConfig; 77 nsCString mLocalAddress; 78 uint16_t mLocalPort = 0; 79 nsCString mProxyType; 80 81 nsresult DoProxyConfigLookup(); 82 nsresult OpenWithHttpProxy(); 83 void OpenWithoutHttpProxy(nsIProxyInfo* aSocksProxyInfo); 84 void FinishOpen(); 85 void EnqueueWrite_s(nsTArray<uint8_t>&& aWriteData); 86 87 void CloseWithReason(nsresult aReason); 88 89 size_t mWriteOffset; 90 std::list<WebrtcTCPData> mWriteQueue; 91 nsCOMPtr<nsIAuthPromptProvider> mAuthProvider; 92 93 // Indicates that the channel is CONNECTed 94 nsCOMPtr<nsISocketTransport> mTransport; 95 nsCOMPtr<nsIAsyncInputStream> mSocketIn; 96 nsCOMPtr<nsIAsyncOutputStream> mSocketOut; 97 nsCOMPtr<nsIEventTarget> mMainThread; 98 nsCOMPtr<nsIEventTarget> mSocketThread; 99 nsCOMPtr<nsICancelable> mProxyRequest; 100 }; 101 102 } // namespace mozilla::net 103 104 #endif // webrtc_tcp_socket_h__