efl_net_socket_udp: expose init() as protected method.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Mon, 19 Dec 2016 19:11:46 +0000 (17:11 -0200)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Mon, 19 Dec 2016 19:11:46 +0000 (17:11 -0200)
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
src/lib/ecore_con/ecore_con_private.h
src/lib/ecore_con/efl_net_dialer_udp.c
src/lib/ecore_con/efl_net_socket_udp.c
src/lib/ecore_con/efl_net_socket_udp.eo

index a5ed29d..03ade07 100644 (file)
@@ -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"
index 34478af..bcc9dea 100644 (file)
@@ -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
index ec7ea9e..e493ec9 100644 (file)
@@ -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;
index ebce857..6c74e44 100644 (file)
@@ -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
index c1e0775..13d0c3f 100644 (file)
@@ -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 {