Imported version 0.2-1
[mstardict] / src / lib / sockets.hpp
1 #ifndef _SOCKETS_HPP_\r
2 #define _SOCKETS_HPP_\r
3 \r
4 #include <glib.h>\r
5 #include <string>\r
6 #include <map>\r
7 #ifndef _WIN32\r
8 #  include <netdb.h>\r
9 #else\r
10 #  include <WinSock.h>\r
11 typedef unsigned long in_addr_t;\r
12 #endif\r
13 \r
14 //! A platform-independent socket API.\r
15 class Socket {\r
16 public:\r
17         //! Creates a stream (TCP) socket. Returns -1 on failure.\r
18         static int socket();\r
19 \r
20         //! Closes a socket.\r
21         static void close(int socket);\r
22 \r
23         //! Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure.\r
24         static bool set_non_blocking(int socket);\r
25 \r
26         //! Read text from the specified socket. Returns false on error.\r
27         static bool nb_read(int socket, std::string& s, bool *eof);\r
28 \r
29         //! Write text to the specified socket. Returns false on error.\r
30         static bool nb_write(int socket, std::string& s, int *bytesSoFar);\r
31 \r
32         // The next four methods are appropriate for servers.\r
33 \r
34         //! Allow the port the specified socket is bound to to be re-bound immediately so \r
35         //! server re-starts are not delayed. Returns false on failure.\r
36         static bool set_reuse_addr(int socket);\r
37 \r
38         //! Bind to a specified port\r
39         static bool bind(int socket, int port);\r
40 \r
41         //! Set socket in listen mode\r
42         static bool listen(int socket, int backlog);\r
43 \r
44         //! Accept a client connection request\r
45         static int accept(int socket);\r
46 \r
47         typedef void (*on_resolved_func)(gpointer data, bool resolved, in_addr_t sa);\r
48         static void resolve(std::string& host, gpointer data, on_resolved_func func);\r
49 \r
50         //! Connect a socket to a server (from a client)\r
51         typedef void (*on_connected_func)(gpointer data, bool succeeded);\r
52         static void connect(int socket, in_addr_t sa, int port, gpointer data, on_connected_func func);\r
53 \r
54 \r
55         //! Returns last errno\r
56         static int get_error_code();\r
57 \r
58         //! Returns message corresponding to last error\r
59         static std::string get_error_msg();\r
60 private:\r
61         struct DnsQueryData {\r
62                 std::string host;\r
63                 gpointer data;\r
64                 on_resolved_func func;\r
65                 bool resolved;\r
66                 in_addr_t sa;\r
67     };\r
68     static gpointer dns_thread(gpointer data);\r
69     static gboolean dns_main_thread_cb(gpointer data);\r
70         static std::map<std::string, in_addr_t> dns_map;\r
71         struct ConnectData {\r
72                 int sd;\r
73                 in_addr_t sa;\r
74                 int port;\r
75                 gpointer data;\r
76                 on_connected_func func;\r
77                 bool succeeded;\r
78     };\r
79     static gpointer connect_thread(gpointer data);\r
80     static gboolean connect_main_thread_cb(gpointer data);\r
81 };\r
82 \r
83 \r
84 #endif//!_SOCKETS_HPP_\r