[telepathy-gabble/master] Construct incoming sessions with peer+resource

Will Thompson will.thompson at collabora.co.uk
Tue Jun 9 06:56:22 PDT 2009


---
 src/jingle-factory.c |   55 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index 59b72d6..1c072c0 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -688,6 +688,49 @@ _jingle_factory_unregister_session (GabbleJingleFactory *factory,
   g_hash_table_remove (priv->sessions, sid);
 }
 
+static GabbleJingleSession *
+create_session_for_si (GabbleJingleFactory *self,
+    const gchar *sid,
+    const gchar *from,
+    JingleDialect dialect,
+    GError **error)
+{
+  GabbleJingleFactoryPrivate *priv = self->priv;
+  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
+      (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
+  const gchar *resource;
+  GabbleJingleSession *sess;
+  TpHandle peer;
+  GError *error_ = NULL;
+
+  resource = strchr (from, '/');
+
+  if (resource == NULL || *resource == '\0')
+    {
+      g_set_error (error, GABBLE_XMPP_ERROR,
+          XMPP_ERROR_BAD_REQUEST, "IQ sender '%s' has no resource", from);
+      return NULL;
+    }
+
+  resource++;
+
+  peer = tp_handle_ensure (contact_repo, from, NULL, &error_);
+
+  if (peer == 0)
+    {
+      g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST,
+          "Couldn't parse sender '%s': %s", from, error_->message);
+      g_error_free (error_);
+      return NULL;
+    }
+
+  sess = create_session (self, sid, peer, resource, FALSE);
+  g_object_set (sess, "dialect", dialect, NULL);
+
+  tp_handle_unref (contact_repo, peer);
+  return sess;
+}
+
 static LmHandlerResult
 jingle_cb (LmMessageHandler *handler,
            LmConnection *lmconn,
@@ -697,7 +740,7 @@ jingle_cb (LmMessageHandler *handler,
   GabbleJingleFactory *self = GABBLE_JINGLE_FACTORY (user_data);
   GabbleJingleFactoryPrivate *priv = self->priv;
   GError *error = NULL;
-  const gchar *sid;
+  const gchar *sid, *from;
   GabbleJingleSession *sess;
   gboolean new_session = FALSE;
   JingleAction action;
@@ -710,7 +753,9 @@ jingle_cb (LmMessageHandler *handler,
       return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
     }
 
+  from = lm_message_node_get_attribute (lm_message_get_node (msg), "from");
   sess = g_hash_table_lookup (priv->sessions, sid);
+
   if (sess == NULL)
     {
       if (action != JINGLE_ACTION_SESSION_INITIATE)
@@ -719,9 +764,13 @@ jingle_cb (LmMessageHandler *handler,
               XMPP_ERROR_JINGLE_UNKNOWN_SESSION, "session %s is unknown", sid);
           goto REQUEST_ERROR;
         }
+
+      sess = create_session_for_si (self, sid, from, dialect, &error);
+
+      if (sess == NULL)
+        goto REQUEST_ERROR;
+
       new_session = TRUE;
-      sess = create_session (self, sid, 0, NULL, FALSE);
-      g_object_set (sess, "dialect", dialect, NULL);
     }
 
   /* now act on the message */
-- 
1.5.6.5




More information about the telepathy-commits mailing list