forked from mirrors/gecko-dev
		
	 3f2298c2f6
			
		
	
	
		3f2298c2f6
		
	
	
	
	
		
			
			MozReview-Commit-ID: 666LNaHyiuQ --HG-- extra : rebase_source : f3a24e0342d8dcdf9020dd473bc6b1045cbc533b
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* vim:set ts=2 sw=2 et cindent: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef nsUDPSocket_h__
 | |
| #define nsUDPSocket_h__
 | |
| 
 | |
| #include "nsIUDPSocket.h"
 | |
| #include "mozilla/Mutex.h"
 | |
| #include "nsIOutputStream.h"
 | |
| #include "nsAutoPtr.h"
 | |
| #include "nsCycleCollectionParticipant.h"
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace net {
 | |
| 
 | |
| class nsUDPSocket final : public nsASocketHandler
 | |
|                         , public nsIUDPSocket
 | |
| {
 | |
| public:
 | |
|   NS_DECL_THREADSAFE_ISUPPORTS
 | |
|   NS_DECL_NSIUDPSOCKET
 | |
| 
 | |
|   // nsASocketHandler methods:
 | |
|   virtual void OnSocketReady(PRFileDesc* fd, int16_t outFlags) override;
 | |
|   virtual void OnSocketDetached(PRFileDesc* fd) override;
 | |
|   virtual void IsLocal(bool* aIsLocal) override;
 | |
| 
 | |
|   uint64_t ByteCountSent() override { return mByteWriteCount; }
 | |
|   uint64_t ByteCountReceived() override { return mByteReadCount; }
 | |
| 
 | |
|   void AddOutputBytes(uint64_t aBytes);
 | |
| 
 | |
|   nsUDPSocket();
 | |
| 
 | |
| private:
 | |
|   virtual ~nsUDPSocket();
 | |
| 
 | |
|   void OnMsgClose();
 | |
|   void OnMsgAttach();
 | |
| 
 | |
|   // try attaching our socket (mFD) to the STS's poll list.
 | |
|   nsresult TryAttach();
 | |
| 
 | |
|   friend class SetSocketOptionRunnable;
 | |
|   nsresult SetSocketOption(const PRSocketOptionData& aOpt);
 | |
|   nsresult JoinMulticastInternal(const PRNetAddr& aAddr,
 | |
|                                  const PRNetAddr& aIface);
 | |
|   nsresult LeaveMulticastInternal(const PRNetAddr& aAddr,
 | |
|                                   const PRNetAddr& aIface);
 | |
|   nsresult SetMulticastInterfaceInternal(const PRNetAddr& aIface);
 | |
| 
 | |
|   void CloseSocket();
 | |
| 
 | |
|   // lock protects access to mListener;
 | |
|   // so mListener is not cleared while being used/locked.
 | |
|   Mutex                                mLock;
 | |
|   PRFileDesc                          *mFD;
 | |
|   NetAddr                              mAddr;
 | |
|   OriginAttributes                     mOriginAttributes;
 | |
|   nsCOMPtr<nsIUDPSocketListener>       mListener;
 | |
|   nsCOMPtr<nsIEventTarget>             mListenerTarget;
 | |
|   bool                                 mAttached;
 | |
|   RefPtr<nsSocketTransportService>     mSts;
 | |
| 
 | |
|   uint64_t   mByteReadCount;
 | |
|   uint64_t   mByteWriteCount;
 | |
| };
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| class nsUDPMessage : public nsIUDPMessage
 | |
| {
 | |
| public:
 | |
|   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 | |
|   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsUDPMessage)
 | |
|   NS_DECL_NSIUDPMESSAGE
 | |
| 
 | |
|   nsUDPMessage(NetAddr* aAddr,
 | |
|                nsIOutputStream* aOutputStream,
 | |
|                FallibleTArray<uint8_t>& aData);
 | |
| 
 | |
| private:
 | |
|   virtual ~nsUDPMessage();
 | |
| 
 | |
|   NetAddr mAddr;
 | |
|   nsCOMPtr<nsIOutputStream> mOutputStream;
 | |
|   FallibleTArray<uint8_t> mData;
 | |
|   JS::Heap<JSObject*> mJsobj;
 | |
| };
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| class nsUDPOutputStream : public nsIOutputStream
 | |
| {
 | |
| public:
 | |
|   NS_DECL_THREADSAFE_ISUPPORTS
 | |
|   NS_DECL_NSIOUTPUTSTREAM
 | |
| 
 | |
|   nsUDPOutputStream(nsUDPSocket* aSocket,
 | |
|                     PRFileDesc* aFD,
 | |
|                     PRNetAddr& aPrClientAddr);
 | |
| 
 | |
| private:
 | |
|   virtual ~nsUDPOutputStream() = default;
 | |
| 
 | |
|   RefPtr<nsUDPSocket>       mSocket;
 | |
|   PRFileDesc                  *mFD;
 | |
|   PRNetAddr                   mPrClientAddr;
 | |
|   bool                        mIsClosed;
 | |
| };
 | |
| 
 | |
| } // namespace net
 | |
| } // namespace mozilla
 | |
| 
 | |
| #endif // nsUDPSocket_h__
 |