michael@0: /* vim:set ts=2 sw=2 et cindent: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef nsUDPSocket_h__ michael@0: #define nsUDPSocket_h__ michael@0: michael@0: #include "nsIUDPSocket.h" michael@0: #include "mozilla/Mutex.h" michael@0: #include "nsIOutputStream.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "nsCycleCollectionParticipant.h" michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: class nsUDPSocket : public nsASocketHandler michael@0: , public nsIUDPSocket michael@0: { michael@0: public: michael@0: NS_DECL_THREADSAFE_ISUPPORTS michael@0: NS_DECL_NSIUDPSOCKET michael@0: michael@0: // nsASocketHandler methods: michael@0: virtual void OnSocketReady(PRFileDesc* fd, int16_t outFlags); michael@0: virtual void OnSocketDetached(PRFileDesc* fd); michael@0: virtual void IsLocal(bool* aIsLocal); michael@0: michael@0: uint64_t ByteCountSent() { return mByteWriteCount; } michael@0: uint64_t ByteCountReceived() { return mByteReadCount; } michael@0: michael@0: void AddOutputBytes(uint64_t aBytes); michael@0: michael@0: nsUDPSocket(); michael@0: michael@0: // This must be public to support older compilers (xlC_r on AIX) michael@0: virtual ~nsUDPSocket(); michael@0: michael@0: private: michael@0: void OnMsgClose(); michael@0: void OnMsgAttach(); michael@0: michael@0: // try attaching our socket (mFD) to the STS's poll list. michael@0: nsresult TryAttach(); michael@0: michael@0: // lock protects access to mListener; michael@0: // so mListener is not cleared while being used/locked. michael@0: mozilla::Mutex mLock; michael@0: PRFileDesc *mFD; michael@0: mozilla::net::NetAddr mAddr; michael@0: nsCOMPtr mListener; michael@0: nsCOMPtr mListenerTarget; michael@0: bool mAttached; michael@0: nsRefPtr mSts; michael@0: michael@0: uint64_t mByteReadCount; michael@0: uint64_t mByteWriteCount; michael@0: }; michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: class nsUDPMessage : public nsIUDPMessage michael@0: { michael@0: public: michael@0: NS_DECL_CYCLE_COLLECTING_ISUPPORTS michael@0: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsUDPMessage) michael@0: NS_DECL_NSIUDPMESSAGE michael@0: michael@0: nsUDPMessage(mozilla::net::NetAddr* aAddr, michael@0: nsIOutputStream* aOutputStream, michael@0: FallibleTArray& aData); michael@0: michael@0: private: michael@0: virtual ~nsUDPMessage(); michael@0: michael@0: mozilla::net::NetAddr mAddr; michael@0: nsCOMPtr mOutputStream; michael@0: FallibleTArray mData; michael@0: JS::Heap mJsobj; michael@0: }; michael@0: michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: class nsUDPOutputStream : public nsIOutputStream michael@0: { michael@0: public: michael@0: NS_DECL_THREADSAFE_ISUPPORTS michael@0: NS_DECL_NSIOUTPUTSTREAM michael@0: michael@0: nsUDPOutputStream(nsUDPSocket* aSocket, michael@0: PRFileDesc* aFD, michael@0: PRNetAddr& aPrClientAddr); michael@0: virtual ~nsUDPOutputStream(); michael@0: michael@0: private: michael@0: nsRefPtr mSocket; michael@0: PRFileDesc *mFD; michael@0: PRNetAddr mPrClientAddr; michael@0: bool mIsClosed; michael@0: }; michael@0: michael@0: #endif // nsUDPSocket_h__