]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/socket.h
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / net / socket.h
index f97588415b1e5df052b1138a1e706f596810fc0b..b89c175bda040d2e22b17ba3335cdefd225616bb 100644 (file)
@@ -1,53 +1,63 @@
 #ifndef MSP_NET_SOCKET_H_
 #define MSP_NET_SOCKET_H_
 
+#include <memory>
+#include <msp/core/except.h>
 #include <msp/io/eventobject.h>
 #include <msp/io/handle.h>
-#include "constants.h"
+#include "mspnet_api.h"
 #include "sockaddr.h"
 
 namespace Msp {
 namespace Net {
 
-#ifdef WIN32
-typedef int socklen_t;
-#endif
-
-
-class bad_socket_state: public std::logic_error
+class MSPNET_API bad_socket_state: public invalid_state
 {
 public:
-       bad_socket_state(const std::string &w): std::logic_error(w) { }
-       virtual ~bad_socket_state() throw() { }
+       bad_socket_state(const std::string &w): invalid_state(w) { }
 };
 
 
-class Socket: public IO::EventObject
+class MSPNET_API Socket: public IO::EventObject
 {
 protected:
+       enum SocketEvent
+       {
+               S_NONE = IO::P_NONE,
+               S_INPUT = IO::P_INPUT,
+               S_CONNECT = 4096,
+               S_ACCEPT = 8192
+       };
+
        struct Private;
 
-       Private *priv;
-       SockAddr *local_addr;
+       std::unique_ptr<Private> priv;
+       std::unique_ptr<SockAddr> local_addr;
 
        Socket(const Private &);
        Socket(Family, int, int);
+private:
+       void platform_init();
+       void platform_cleanup();
 public:
        ~Socket();
 
-       virtual void set_block(bool);
-       virtual const IO::Handle &get_event_handle();
+       void set_block(bool) override;
+       void set_inherit(bool) override;
+       const IO::Handle &get_handle(IO::Mode) override;
+       const IO::Handle &get_event_handle() override;
 
        /** Associates the socket with a local address.  There must be no existing
        users of the address. */
        void bind(const SockAddr &);
 
+       bool is_bound() const { return static_cast<bool>(local_addr); }
        const SockAddr &get_local_address() const;
 
        void set_timeout(const Time::TimeDelta &);
 protected:
-       int set_option(int, int, const void *, socklen_t);
-       int get_option(int, int, void *, socklen_t *) const;
+       void set_socket_events(unsigned);
+       void set_platform_events(unsigned);
 };
 
 } // namespace Net