diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-22 20:51:58 +0300 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-22 20:51:58 +0300 | 
| commit | 6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a (patch) | |
| tree | fab23811a5cedc1ebf01479c852ee92ff62b636c /indra/llmessage/lliosocket.h | |
| parent | ef8f4819822288e044ea719feb6af7a1f4df4c4e (diff) | |
| parent | 7bb5afc11ee5a6af78302a8d76a9a619e2baaab2 (diff) | |
Merge pull request #1545 from Ansariel/DRTVWR-600-maint-A
Merge main into DRTVWR-600-maint-a
Diffstat (limited to 'indra/llmessage/lliosocket.h')
| -rw-r--r-- | indra/llmessage/lliosocket.h | 488 | 
1 files changed, 244 insertions, 244 deletions
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index a62b3c0204..0a3f2617e6 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -1,4 +1,4 @@ -/**  +/**   * @file lliosocket.h   * @author Phoenix   * @date 2005-07-31 @@ -7,21 +7,21 @@   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -29,7 +29,7 @@  #ifndef LL_LLIOSOCKET_H  #define LL_LLIOSOCKET_H -/**  +/**   * The socket interface provided here is a simple wraper around apr   * sockets, with a pipe source and sink to read and write off of the   * socket. Every socket only performs non-blocking operations except @@ -48,7 +48,7 @@ extern const std::string CONTEXT_REMOTE_PORT;  class LLHost; -/**  +/**   * @class LLSocket   * @brief Implementation of a wrapper around a socket.   * @@ -62,134 +62,134 @@ class LLHost;  class LLSocket  {  public: -	/**  -	 * @brief Reference counted shared pointers to sockets. -	 */ -	typedef std::shared_ptr<LLSocket> ptr_t; - -	/**  -	 * @brief Type of socket to create. -	 */ -	enum EType -	{ -		STREAM_TCP, -		DATAGRAM_UDP, -	}; - -	/**  -	 * @brief Anonymous enumeration to help identify ports -	 */ -	enum -	{ -		PORT_INVALID = (U16)-1, -		PORT_EPHEMERAL = 0, -	}; - -	/**  -	 * @brief Create a socket. -	 * -	 * This is the call you would use if you intend to create a listen -	 * socket. If you intend the socket to be known to external -	 * clients without prior port notification, do not use -	 * PORT_EPHEMERAL. -	 * @param pool The apr pool to use. A child pool will be created -	 * and associated with the socket. -	 * @param type The type of socket to create -	 * @param port The port for the socket -	 * @param hostname e.g. APR_ANYADDR to listen openly, or "127.0.0.1" -	 * @return A valid socket shared pointer if the call worked. -	 */ -	static ptr_t create( -		apr_pool_t* pool, -		EType type, -		U16 port = PORT_EPHEMERAL, -		const char *hostname = APR_ANYADDR); - -	/**  -	 * @brief Create a LLSocket when you already have an apr socket. -	 * -	 * This method assumes an ephemeral port. This is typically used -	 * by calls which spawn a socket such as a call to -	 * <code>accept()</code> as in the server socket. This call should -	 * not fail if you have a valid apr socket. -	 * Because of the nature of how accept() works, you are expected -	 * to create a new pool for the socket, use that pool for the -	 * accept, and pass it in here where it will be bound with the -	 * socket and destroyed at the same time. -	 * @param socket The apr socket to use  -	 * @param pool The pool used to create the socket. *NOTE: The pool -	 * passed in will be DESTROYED. -	 * @return A valid socket shared pointer if the call worked. -	 */ -	static ptr_t create(apr_socket_t* socket, apr_pool_t* pool); - -	/**  -	 * @brief Perform a blocking connect to a host. Do not use in production. -	 * -	 * @param host The host to connect this socket to. -	 * @return Returns true if the connect was successful. -	 */ -	bool blockingConnect(const LLHost& host); - -	/**  -	 * @brief Get the type of socket -	 */ -	//EType getType() const { return mType; } - -	/**  -	 * @brief Get the port. -	 * -	 * This will return PORT_EPHEMERAL if bind was never called. -	 * @return Returns the port associated with this socket. -	 */ -	U16 getPort() const { return mPort; } - -	/**  -	 * @brief Get the apr socket implementation. -	 * -	 * @return Returns the raw apr socket. -	 */ -	apr_socket_t* getSocket() const { return mSocket; } - -	/**  -	 * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us. -	 * @param timeout Number of microseconds to wait on this socket. Any -	 * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE. -	 */ -	void setBlocking(S32 timeout); - -	/** -	 * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0. -	 */ -	void setNonBlocking(); +    /** +     * @brief Reference counted shared pointers to sockets. +     */ +    typedef std::shared_ptr<LLSocket> ptr_t; + +    /** +     * @brief Type of socket to create. +     */ +    enum EType +    { +        STREAM_TCP, +        DATAGRAM_UDP, +    }; + +    /** +     * @brief Anonymous enumeration to help identify ports +     */ +    enum +    { +        PORT_INVALID = (U16)-1, +        PORT_EPHEMERAL = 0, +    }; + +    /** +     * @brief Create a socket. +     * +     * This is the call you would use if you intend to create a listen +     * socket. If you intend the socket to be known to external +     * clients without prior port notification, do not use +     * PORT_EPHEMERAL. +     * @param pool The apr pool to use. A child pool will be created +     * and associated with the socket. +     * @param type The type of socket to create +     * @param port The port for the socket +     * @param hostname e.g. APR_ANYADDR to listen openly, or "127.0.0.1" +     * @return A valid socket shared pointer if the call worked. +     */ +    static ptr_t create( +        apr_pool_t* pool, +        EType type, +        U16 port = PORT_EPHEMERAL, +        const char *hostname = APR_ANYADDR); + +    /** +     * @brief Create a LLSocket when you already have an apr socket. +     * +     * This method assumes an ephemeral port. This is typically used +     * by calls which spawn a socket such as a call to +     * <code>accept()</code> as in the server socket. This call should +     * not fail if you have a valid apr socket. +     * Because of the nature of how accept() works, you are expected +     * to create a new pool for the socket, use that pool for the +     * accept, and pass it in here where it will be bound with the +     * socket and destroyed at the same time. +     * @param socket The apr socket to use +     * @param pool The pool used to create the socket. *NOTE: The pool +     * passed in will be DESTROYED. +     * @return A valid socket shared pointer if the call worked. +     */ +    static ptr_t create(apr_socket_t* socket, apr_pool_t* pool); + +    /** +     * @brief Perform a blocking connect to a host. Do not use in production. +     * +     * @param host The host to connect this socket to. +     * @return Returns true if the connect was successful. +     */ +    bool blockingConnect(const LLHost& host); + +    /** +     * @brief Get the type of socket +     */ +    //EType getType() const { return mType; } + +    /** +     * @brief Get the port. +     * +     * This will return PORT_EPHEMERAL if bind was never called. +     * @return Returns the port associated with this socket. +     */ +    U16 getPort() const { return mPort; } + +    /** +     * @brief Get the apr socket implementation. +     * +     * @return Returns the raw apr socket. +     */ +    apr_socket_t* getSocket() const { return mSocket; } + +    /** +     * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us. +     * @param timeout Number of microseconds to wait on this socket. Any +     * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE. +     */ +    void setBlocking(S32 timeout); + +    /** +     * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0. +     */ +    void setNonBlocking();  protected: -	/** -	 * @brief Protected constructor since should only make sockets -	 * with one of the two <code>create()</code> calls. -	 */ -	LLSocket(apr_socket_t* socket, apr_pool_t* pool); +    /** +     * @brief Protected constructor since should only make sockets +     * with one of the two <code>create()</code> calls. +     */ +    LLSocket(apr_socket_t* socket, apr_pool_t* pool);  public: -	/**  -	 * @brief Do not call this directly. -	 */ -	~LLSocket(); +    /** +     * @brief Do not call this directly. +     */ +    ~LLSocket();  protected: -	// The apr socket. -	apr_socket_t* mSocket; +    // The apr socket. +    apr_socket_t* mSocket; -	// our memory pool -	apr_pool_t* mPool; +    // our memory pool +    apr_pool_t* mPool; -	// The port if we know it. -	U16 mPort; +    // The port if we know it. +    U16 mPort; -	//EType mType; +    //EType mType;  }; -/**  +/**   * @class LLIOSocketReader   * @brief An LLIOPipe implementation which reads from a socket.   * @see LLIOPipe @@ -201,44 +201,44 @@ protected:  class LLIOSocketReader : public LLIOPipe  {  public: -	LLIOSocketReader(LLSocket::ptr_t socket); -	~LLIOSocketReader(); +    LLIOSocketReader(LLSocket::ptr_t socket); +    ~LLIOSocketReader();  protected: -	/* @name LLIOPipe virtual implementations -	 */ -	//@{ -	/**  -	 * @brief Process the data coming in the socket. -	 * -	 * Since the socket and next pipe must exist for process to make -	 * any sense, this method will return STATUS_PRECONDITION_NOT_MET -	 * unless if they are not known. -	 * If a STATUS_STOP returned by the next link in the chain, this -	 * reader will turn of the socket polling. -	 * @param buffer Pointer to a buffer which needs processing. Probably NULL. -	 * @param bytes Number of bytes to in buffer to process. Probably 0. -	 * @param eos True if this function is the last. Almost always false. -	 * @param read Number of bytes actually processed. -	 * @param pump The pump which is calling process. May be NULL. -	 * @param context A data structure to pass structured data -	 * @return STATUS_OK unless the preconditions are not met. -	 */ -	virtual EStatus process_impl( -		const LLChannelDescriptors& channels, -		buffer_ptr_t& buffer, -		bool& eos, -		LLSD& context, -		LLPumpIO* pump); -	//@} +    /* @name LLIOPipe virtual implementations +     */ +    //@{ +    /** +     * @brief Process the data coming in the socket. +     * +     * Since the socket and next pipe must exist for process to make +     * any sense, this method will return STATUS_PRECONDITION_NOT_MET +     * unless if they are not known. +     * If a STATUS_STOP returned by the next link in the chain, this +     * reader will turn of the socket polling. +     * @param buffer Pointer to a buffer which needs processing. Probably NULL. +     * @param bytes Number of bytes to in buffer to process. Probably 0. +     * @param eos True if this function is the last. Almost always false. +     * @param read Number of bytes actually processed. +     * @param pump The pump which is calling process. May be NULL. +     * @param context A data structure to pass structured data +     * @return STATUS_OK unless the preconditions are not met. +     */ +    virtual EStatus process_impl( +        const LLChannelDescriptors& channels, +        buffer_ptr_t& buffer, +        bool& eos, +        LLSD& context, +        LLPumpIO* pump); +    //@}  protected: -	LLSocket::ptr_t mSource; -	std::vector<U8> mBuffer; -	bool mInitialized; +    LLSocket::ptr_t mSource; +    std::vector<U8> mBuffer; +    bool mInitialized;  }; -/**  +/**   * @class LLIOSocketWriter   * @brief An LLIOPipe implementation which writes to a socket   * @see LLIOPipe @@ -249,42 +249,42 @@ protected:  class LLIOSocketWriter : public LLIOPipe  {  public: -	LLIOSocketWriter(LLSocket::ptr_t socket); -	~LLIOSocketWriter(); +    LLIOSocketWriter(LLSocket::ptr_t socket); +    ~LLIOSocketWriter();  protected: -	/* @name LLIOPipe virtual implementations -	 */ -	//@{ -	/**  -	 * @brief Write the data in buffer to the socket. -	 * -	 * Since the socket pipe must exist for process to make any sense, -	 * this method will return STATUS_PRECONDITION_NOT_MET if it is -	 * not known. -	 * @param buffer Pointer to a buffer which needs processing. -	 * @param bytes Number of bytes to in buffer to process. -	 * @param eos True if this function is the last. -	 * @param read Number of bytes actually processed. -	 * @param pump The pump which is calling process. May be NULL. -	 * @param context A data structure to pass structured data -	 * @return A return code for the write. -	 */ -	virtual EStatus process_impl( -		const LLChannelDescriptors& channels, -		buffer_ptr_t& buffer, -		bool& eos, -		LLSD& context, -		LLPumpIO* pump); -	//@} +    /* @name LLIOPipe virtual implementations +     */ +    //@{ +    /** +     * @brief Write the data in buffer to the socket. +     * +     * Since the socket pipe must exist for process to make any sense, +     * this method will return STATUS_PRECONDITION_NOT_MET if it is +     * not known. +     * @param buffer Pointer to a buffer which needs processing. +     * @param bytes Number of bytes to in buffer to process. +     * @param eos True if this function is the last. +     * @param read Number of bytes actually processed. +     * @param pump The pump which is calling process. May be NULL. +     * @param context A data structure to pass structured data +     * @return A return code for the write. +     */ +    virtual EStatus process_impl( +        const LLChannelDescriptors& channels, +        buffer_ptr_t& buffer, +        bool& eos, +        LLSD& context, +        LLPumpIO* pump); +    //@}  protected: -	LLSocket::ptr_t mDestination; -	U8* mLastWritten; -	bool mInitialized; +    LLSocket::ptr_t mDestination; +    U8* mLastWritten; +    bool mInitialized;  }; -/**  +/**   * @class LLIOServerSocket   * @brief An IOPipe implementation which listens and spawns connected   * sockets. @@ -304,49 +304,49 @@ protected:  class LLIOServerSocket : public LLIOPipe  {  public: -	typedef LLSocket::ptr_t socket_t; -	typedef std::shared_ptr<LLChainIOFactory> factory_t; -	LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor); -	virtual ~LLIOServerSocket(); - -	/**  -	 * @brief Set the timeout for the generated chains. -	 * -	 * This value is passed directly to the LLPumpIO::addChain() -	 * method. The default on construction is set to -	 * DEFAULT_CHAIN_EXPIRY_SECS which is a reasonable value for most -	 * applications based on this library. Avoid passing in -	 * NEVER_CHAIN_EXPIRY_SECS unless you have another method of -	 * harvesting chains. -	 * @param timeout_secs The seconds before timeout for the response chain.  -	 */ -	void setResponseTimeout(F32 timeout_secs); - -	/* @name LLIOPipe virtual implementations -	 */ -	//@{ +    typedef LLSocket::ptr_t socket_t; +    typedef std::shared_ptr<LLChainIOFactory> factory_t; +    LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor); +    virtual ~LLIOServerSocket(); + +    /** +     * @brief Set the timeout for the generated chains. +     * +     * This value is passed directly to the LLPumpIO::addChain() +     * method. The default on construction is set to +     * DEFAULT_CHAIN_EXPIRY_SECS which is a reasonable value for most +     * applications based on this library. Avoid passing in +     * NEVER_CHAIN_EXPIRY_SECS unless you have another method of +     * harvesting chains. +     * @param timeout_secs The seconds before timeout for the response chain. +     */ +    void setResponseTimeout(F32 timeout_secs); + +    /* @name LLIOPipe virtual implementations +     */ +    //@{  protected: -	/**  -	 * @brief Process the data in buffer -	 */ -	virtual EStatus process_impl( -		const LLChannelDescriptors& channels, -		buffer_ptr_t& buffer, -		bool& eos, -		LLSD& context, -		LLPumpIO* pump); -	//@} +    /** +     * @brief Process the data in buffer +     */ +    virtual EStatus process_impl( +        const LLChannelDescriptors& channels, +        buffer_ptr_t& buffer, +        bool& eos, +        LLSD& context, +        LLPumpIO* pump); +    //@}  protected: -	apr_pool_t* mPool; -	socket_t mListenSocket; -	factory_t mReactor; -	bool mInitialized; -	F32 mResponseTimeout; +    apr_pool_t* mPool; +    socket_t mListenSocket; +    factory_t mReactor; +    bool mInitialized; +    F32 mResponseTimeout;  };  #if 0 -/**  +/**   * @class LLIODataSocket   * @brief BRIEF_DESC   * @@ -355,31 +355,31 @@ protected:  class LLIODataSocket : public LLIOSocket  {  public: -	/** -	 * @brief Construct a datagram socket. -	 * -	 * If you pass in LLIOSocket::PORT_EPHEMERAL as the suggested -	 * port, The socket will not be in a 'listen' mode, but can still -	 * read data sent back to it's port. When suggested_port is not -	 * ephemeral or invalid and bind fails, the port discovery -	 * algorithm will search through a limited set of ports to -	 * try to find an open port. If that process fails, getPort() will -	 * return LLIOSocket::PORT_INVALID -	 * @param suggested_port The port you would like to bind. Use -	 * LLIOSocket::PORT_EPHEMERAL for an unspecified port. -	 * @param start_discovery_port The start range for -	 * @param pool The pool to use for allocation. -	 */ -	LLIODataSocket( -		U16 suggested_port, -		U16 start_discovery_port, -		apr_pool_t* pool); -	virtual ~LLIODataSocket(); +    /** +     * @brief Construct a datagram socket. +     * +     * If you pass in LLIOSocket::PORT_EPHEMERAL as the suggested +     * port, The socket will not be in a 'listen' mode, but can still +     * read data sent back to it's port. When suggested_port is not +     * ephemeral or invalid and bind fails, the port discovery +     * algorithm will search through a limited set of ports to +     * try to find an open port. If that process fails, getPort() will +     * return LLIOSocket::PORT_INVALID +     * @param suggested_port The port you would like to bind. Use +     * LLIOSocket::PORT_EPHEMERAL for an unspecified port. +     * @param start_discovery_port The start range for +     * @param pool The pool to use for allocation. +     */ +    LLIODataSocket( +        U16 suggested_port, +        U16 start_discovery_port, +        apr_pool_t* pool); +    virtual ~LLIODataSocket();  protected:  private: -	apr_socket_t* mSocket; +    apr_socket_t* mSocket;  };  #endif  | 
