barbieri pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=a995529a46fe0ceddb28a67fd1d34e0dc456fc66
commit a995529a46fe0ceddb28a67fd1d34e0dc456fc66 Author: Gustavo Sverzut Barbieri <[email protected]> Date: Mon Dec 19 17:11:46 2016 -0200 efl_net_socket_udp: expose init() as protected method. remove one more TODO: since Efl.Net.Ip.Address was introduced we can now expose Efl.Net.Socket.Udp.init as a protected method that will configure the internal address we use for the remote peer. This allow subclasses to override or call such methods. --- src/lib/ecore_con/Ecore_Con_Eo.h | 4 ++-- src/lib/ecore_con/ecore_con_private.h | 2 -- src/lib/ecore_con/efl_net_dialer_udp.c | 8 ++++++-- src/lib/ecore_con/efl_net_socket_udp.c | 13 +++++++++---- src/lib/ecore_con/efl_net_socket_udp.eo | 9 +++++++++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/lib/ecore_con/Ecore_Con_Eo.h b/src/lib/ecore_con/Ecore_Con_Eo.h index a5ed29d..03ade07 100644 --- a/src/lib/ecore_con/Ecore_Con_Eo.h +++ b/src/lib/ecore_con/Ecore_Con_Eo.h @@ -1,5 +1,7 @@ #include "efl_net_types.eot.h" +#include "efl_net_ip_address.eo.h" + #include "efl_net_socket.eo.h" #include "efl_net_dialer.eo.h" #include "efl_net_server.eo.h" @@ -43,5 +45,3 @@ #include "efl_net_control_access_point.eo.h" #include "efl_net_control.eo.h" #include "efl_net_session.eo.h" - -#include "efl_net_ip_address.eo.h" diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index 34478af..bcc9dea 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -171,8 +171,6 @@ void _ecore_con_local_mkpath(const char *path, mode_t mode); void _efl_net_server_udp_client_init(Eo *client, SOCKET fd, const struct sockaddr *addr, socklen_t addrlen, const char *str); void _efl_net_server_udp_client_feed(Eo *client, Eina_Rw_Slice slice); -void _efl_net_socket_udp_init(Eo *o, const struct sockaddr *addr, socklen_t addrlen, const char *str); - #ifndef _WIN32 Eina_Bool efl_net_unix_fmt(char *buf, size_t buflen, SOCKET fd, const struct sockaddr_un *addr, socklen_t addrlen); #endif diff --git a/src/lib/ecore_con/efl_net_dialer_udp.c b/src/lib/ecore_con/efl_net_dialer_udp.c index ec7ea9e..e493ec9 100644 --- a/src/lib/ecore_con/efl_net_dialer_udp.c +++ b/src/lib/ecore_con/efl_net_dialer_udp.c @@ -1,5 +1,6 @@ #define EFL_NET_DIALER_UDP_PROTECTED 1 #define EFL_NET_DIALER_PROTECTED 1 +#define EFL_NET_SOCKET_UDP_PROTECTED 1 #define EFL_NET_SOCKET_FD_PROTECTED 1 #define EFL_NET_SOCKET_PROTECTED 1 #define EFL_IO_READER_PROTECTED 1 @@ -93,6 +94,7 @@ static Eina_Error _efl_net_dialer_udp_resolved_bind(Eo *o, Efl_Net_Dialer_Udp_Data *pd EINA_UNUSED, struct addrinfo *addr) { Eina_Error err = 0; + Eo *remote_address; char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")]; SOCKET fd; int family = addr->ai_family; @@ -160,10 +162,12 @@ _efl_net_dialer_udp_resolved_bind(Eo *o, Efl_Net_Dialer_Udp_Data *pd EINA_UNUSED } } - if (efl_net_ip_port_fmt(buf, sizeof(buf), addr->ai_addr)) + remote_address = efl_net_ip_address_create_sockaddr(EFL_NET_IP_ADDRESS_CLASS, addr->ai_addr); + if (remote_address) { - _efl_net_socket_udp_init(o, addr->ai_addr, addr->ai_addrlen, buf); + efl_net_socket_udp_init(o, remote_address); efl_event_callback_call(o, EFL_NET_DIALER_EVENT_RESOLVED, NULL); + efl_del(remote_address); } efl_net_dialer_connected_set(o, EINA_TRUE); return 0; diff --git a/src/lib/ecore_con/efl_net_socket_udp.c b/src/lib/ecore_con/efl_net_socket_udp.c index ebce857..6c74e44 100644 --- a/src/lib/ecore_con/efl_net_socket_udp.c +++ b/src/lib/ecore_con/efl_net_socket_udp.c @@ -53,17 +53,22 @@ typedef struct _Efl_Net_Socket_Udp_Data Eina_Bool reuse_port; } Efl_Net_Socket_Udp_Data; -// TODO: once we have Efl_Net_Ip_Address, make this protected and declared in .eo void -_efl_net_socket_udp_init(Eo *o, const struct sockaddr *addr, socklen_t addrlen, const char *str) +_efl_net_socket_udp_init(Eo *o, Efl_Net_Socket_Udp_Data *pd, Efl_Net_Ip_Address *remote_address) { - Efl_Net_Socket_Udp_Data *pd = efl_data_scope_get(o, MY_CLASS); + const struct sockaddr *addr = efl_net_ip_address_sockaddr_get(remote_address); + socklen_t addrlen; + + EINA_SAFETY_ON_NULL_RETURN(addr); + + if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); + else addrlen = sizeof(struct sockaddr_in6); pd->addr_remote = malloc(addrlen); EINA_SAFETY_ON_NULL_RETURN(pd->addr_remote); memcpy(pd->addr_remote, addr, addrlen); pd->addr_remote_len = addrlen; - efl_net_socket_address_remote_set(o, str); + efl_net_socket_address_remote_set(o, efl_net_ip_address_string_get(remote_address)); } static Eina_Error diff --git a/src/lib/ecore_con/efl_net_socket_udp.eo b/src/lib/ecore_con/efl_net_socket_udp.eo index c1e0775..13d0c3f 100644 --- a/src/lib/ecore_con/efl_net_socket_udp.eo +++ b/src/lib/ecore_con/efl_net_socket_udp.eo @@ -1,3 +1,5 @@ +import efl_net_ip_address; + class Efl.Net.Socket.Udp (Efl.Net.Socket.Fd) { [[A base UDP socket. @@ -162,6 +164,13 @@ class Efl.Net.Socket.Udp (Efl.Net.Socket.Fd) { address: string @nonull; [[Address to bind to]] } } + + init @protected { + [[Initialize the socket to communicate with given IP address]] + params { + remote_address: Efl.Net.Ip.Address; [[The remote address this socket will communicate with]] + } + } } implements { --
