Added support for Gossip filetransfer patch.
authorMikael Hallendal <micke@imendio.com>
Sun, 10 Jun 2007 18:03:38 +0200
changeset 266 730617b8c682
parent 265 ebfc8419758d
child 267 c27883ae51f7
Added support for Gossip filetransfer patch. Added lm_connection_get_full_jid and lm_connection_get_client_host.
loudmouth/lm-connection.c
loudmouth/lm-connection.h
loudmouth/lm-internals.h
loudmouth/lm-sock.c
--- a/loudmouth/lm-connection.c	Sun Apr 29 22:09:44 2007 +0200
+++ b/loudmouth/lm-connection.c	Sun Jun 10 18:03:38 2007 +0200
@@ -54,6 +54,7 @@
 	GMainContext *context;
 	gchar        *server;
 	gchar        *jid;
+	gchar        *resource;
 	guint         port;
 
 	LmSSL        *ssl;
@@ -210,6 +211,7 @@
 	g_free (connection->server);
 	g_free (connection->jid);
 	g_free (connection->stream_id);
+	g_free (connection->resource);
 
 	if (connection->parser) {
 		lm_parser_free (connection->parser);
@@ -1617,6 +1619,7 @@
 	connection->context           = NULL;
 	connection->port              = LM_CONNECTION_DEFAULT_PORT;
 	connection->jid               = NULL;
+	connection->resource          = NULL;
 	connection->ssl               = NULL;
 	connection->proxy             = NULL;
 	connection->disconnect_cb     = NULL;
@@ -1863,6 +1866,8 @@
 	data->password = g_strdup (password);
 	data->resource = g_strdup (resource);
 	
+	/* assume that this is our visible resource. */
+	connection->resource = g_strdup (resource);
 	handler = lm_message_handler_new (connection_auth_req_reply, 
 					  data, 
 					  (GDestroyNotify) auth_req_data_free);
@@ -2075,6 +2080,23 @@
 }
 
 /**
+ * lm_connection_get_full_jid:
+ * @connection: an #LmConnection
+ *
+ * Creates a full jid for @connection out of the connection jid and the 
+ * resource used for authentication.
+ *
+ * Return value: A newly created string representing the full jid.
+ **/
+gchar *
+lm_connection_get_full_jid (LmConnection *connection)
+{
+	g_return_val_if_fail (connection != NULL, NULL);
+
+	return g_strconcat(connection->jid, "/", connection->resource, NULL);
+}
+
+/**
  * lm_connection_set_jid:
  * @connection: an #LmConnection
  * @jid: JID to be used for @connection
@@ -2483,6 +2505,21 @@
 
 	return connection_send (connection, str, -1, error);
 }
+
+/**
+ * lm_connection_get_client_host:
+ * @connection: An #LmConnection
+ *
+ * Returns the local host name of the connection.
+ *
+ * Return value: A newly allocated string representing the local host name.
+ **/
+gchar *
+lm_connection_get_local_host (LmConnection *connection)
+{
+	return _lm_sock_get_local_host (connection->fd);
+}
+
 /**
  * lm_connection_get_state:
  * @connection: Connection to get state on
--- a/loudmouth/lm-connection.h	Sun Apr 29 22:09:44 2007 +0200
+++ b/loudmouth/lm-connection.h	Sun Jun 10 18:03:38 2007 +0200
@@ -118,7 +118,7 @@
 void          lm_connection_set_jid           (LmConnection       *connection,
 					       const gchar        *jid);
 const gchar * lm_connection_get_jid           (LmConnection       *connection);
-
+gchar *       lm_connection_get_full_jid      (LmConnection       *connection);
 guint         lm_connection_get_port          (LmConnection       *connection);
 void          lm_connection_set_port          (LmConnection       *connection,
 					       guint               port);
@@ -159,6 +159,7 @@
 					       const gchar        *str,
 					       GError            **error);
 LmConnectionState lm_connection_get_state     (LmConnection       *connection);
+gchar *       lm_connection_get_local_host    (LmConnection       *connection);
 LmConnection* lm_connection_ref               (LmConnection       *connection);
 void          lm_connection_unref             (LmConnection       *connection);
 
--- a/loudmouth/lm-internals.h	Sun Apr 29 22:09:44 2007 +0200
+++ b/loudmouth/lm-internals.h	Sun Jun 10 18:03:38 2007 +0200
@@ -94,6 +94,7 @@
 int              _lm_sock_connect                 (LmSocket               sock,
 						   const struct sockaddr *name,
 						   int                    namelen);
+gchar          * _lm_sock_get_local_host          (LmSocket               socket);
 gboolean         _lm_sock_is_blocking_error       (int                    err);
 gboolean         _lm_sock_is_blocking_success     (int                    err);
 int              _lm_sock_get_last_error          (void);
--- a/loudmouth/lm-sock.c	Sun Apr 29 22:09:44 2007 +0200
+++ b/loudmouth/lm-sock.c	Sun Jun 10 18:03:38 2007 +0200
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/socket.h>
+#include <arpa/inet.h>
 #include <fcntl.h>
 #define LM_SHUTDOWN SHUT_RDWR
 
@@ -43,6 +44,8 @@
 #include "lm-sock.h"
 #include "lm-debug.h"
 
+#define IPV6_MAX_ADDRESS_LEN 46 /* 45 + '\0' */
+
 static gboolean initialised = FALSE;
 
 gboolean
@@ -161,6 +164,40 @@
 	return connect (sock, name, namelen);
 }
 
+gchar *
+_lm_sock_get_local_host (LmSocket   sock)
+{
+	struct sockaddr      addr_info;
+	void                *sock_addr;
+	socklen_t            namelen;
+	char                 addrbuf[IPV6_MAX_ADDRESS_LEN];
+	const char          *host;
+
+	namelen = sizeof (struct sockaddr);
+	if (getsockname (sock, &addr_info, &namelen)) {
+		return NULL;
+	}
+
+	switch (addr_info.sa_family) {
+		case AF_INET: 
+			
+			sock_addr = & (((struct sockaddr_in *) &addr_info)->sin_addr);
+			break;
+		case AF_INET6:
+			sock_addr = & (((struct sockaddr_in6 *) &addr_info)->sin6_addr);
+			break;
+		default:
+			return NULL;
+	}
+	/* inet_ntoa has been obsoleted in favour of inet_ntop */
+	host = inet_ntop (addr_info.sa_family,
+			  sock_addr,
+			  addrbuf,
+			  IPV6_MAX_ADDRESS_LEN);
+
+	return g_strdup (host);
+}
+
 gboolean
 _lm_sock_is_blocking_error (int err)
 {