[ekiga] It's now possible to start a chat with someone



commit 59cb840ab73806b2b14cfb91eef9375cb6104e72
Author: Julien Puydt <jpuydt noether localdomain>
Date:   Wed Dec 3 21:22:07 2008 +0100

    It's now possible to start a chat with someone

 lib/engine/components/loudmouth/Makefile.am        |    4 +-
 .../components/loudmouth/loudmouth-account.cpp     |    5 +-
 .../components/loudmouth/loudmouth-account.h       |    2 +
 lib/engine/components/loudmouth/loudmouth-bank.cpp |    5 +-
 lib/engine/components/loudmouth/loudmouth-bank.h   |    3 +
 .../components/loudmouth/loudmouth-chat-simple.cpp |   22 ++++--
 .../components/loudmouth/loudmouth-chat-simple.h   |    8 +-
 .../components/loudmouth/loudmouth-dialect.cpp     |   88 ++++++++++++++++++++
 .../components/loudmouth/loudmouth-dialect.h       |   64 ++++++++++++++
 lib/engine/components/loudmouth/loudmouth-heap.cpp |   56 ++++++++++++-
 lib/engine/components/loudmouth/loudmouth-heap.h   |   11 ++-
 lib/engine/components/loudmouth/loudmouth-main.cpp |   10 ++-
 .../components/loudmouth/loudmouth-presentity.cpp  |   11 +++
 .../components/loudmouth/loudmouth-presentity.h    |    6 ++
 14 files changed, 275 insertions(+), 20 deletions(-)
---
diff --git a/lib/engine/components/loudmouth/Makefile.am b/lib/engine/components/loudmouth/Makefile.am
index 24635fa..993884a 100644
--- a/lib/engine/components/loudmouth/Makefile.am
+++ b/lib/engine/components/loudmouth/Makefile.am
@@ -24,6 +24,8 @@ libgmloudmouth_la_SOURCES = \
 	$(loudmouth_dir)/loudmouth-presentity.h \
 	$(loudmouth_dir)/loudmouth-presentity.cpp \
 	$(loudmouth_dir)/loudmouth-chat-simple.h \
-	$(loudmouth_dir)/loudmouth-chat-simple.cpp
+	$(loudmouth_dir)/loudmouth-chat-simple.cpp \
+	$(loudmouth_dir)/loudmouth-dialect.h \
+	$(loudmouth_dir)/loudmouth-dialect.cpp
 
 libgmloudmouth_la_LDFLAGS = -export-dynamic -no-undefined $(SIGC_LIBS) $(LOUDMOUTH_LIBS)
\ No newline at end of file
diff --git a/lib/engine/components/loudmouth/loudmouth-account.cpp b/lib/engine/components/loudmouth/loudmouth-account.cpp
index b78c076..ff30417 100644
--- a/lib/engine/components/loudmouth/loudmouth-account.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-account.cpp
@@ -65,13 +65,14 @@ on_authenticate_c (LmConnection* /*unused*/,
 /* and here is the C++ code : */
 
 LM::Account::Account (gmref_ptr<Ekiga::PersonalDetails> details_,
+		      gmref_ptr<Dialect> dialect_,
 		      gmref_ptr<Cluster> cluster_,
 		      const std::string user_,
 		      const std::string password_,
 		      const std::string resource_,
 		      const std::string server_,
 		      unsigned port_):
-  details(details_), cluster(cluster_), user(user_), password(password_), resource(resource_), server(server_), port(port_), connection(0)
+  details(details_), dialect(dialect_), cluster(cluster_), user(user_), password(password_), resource(resource_), server(server_), port(port_), connection(0)
 {
   connection = lm_connection_new (NULL);
   lm_connection_set_disconnect_function (connection, (LmDisconnectFunction)on_disconnected_c,
@@ -146,7 +147,7 @@ LM::Account::on_authenticate (bool result)
 {
   if (result) {
 
-    heap = gmref_ptr<Heap> (new Heap (details, connection));
+    heap = gmref_ptr<Heap> (new Heap (details, dialect, connection));
     cluster->add_heap (heap);
   } else {
 
diff --git a/lib/engine/components/loudmouth/loudmouth-account.h b/lib/engine/components/loudmouth/loudmouth-account.h
index e466882..753b633 100644
--- a/lib/engine/components/loudmouth/loudmouth-account.h
+++ b/lib/engine/components/loudmouth/loudmouth-account.h
@@ -48,6 +48,7 @@ namespace LM
   {
   public:
     Account (gmref_ptr<Ekiga::PersonalDetails> details_,
+	     gmref_ptr<Dialect> dialect_,
 	     gmref_ptr<Cluster> cluster_,
 	     const std::string user_,
 	     const std::string password_,
@@ -69,6 +70,7 @@ namespace LM
   private:
 
     gmref_ptr<Ekiga::PersonalDetails> details;
+    gmref_ptr<Dialect> dialect;
     gmref_ptr<Cluster> cluster;
 
     std::string user;
diff --git a/lib/engine/components/loudmouth/loudmouth-bank.cpp b/lib/engine/components/loudmouth/loudmouth-bank.cpp
index 06b9bb9..29a96bf 100644
--- a/lib/engine/components/loudmouth/loudmouth-bank.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-bank.cpp
@@ -38,10 +38,11 @@
 #include "loudmouth-bank.h"
 
 LM::Bank::Bank (gmref_ptr<Ekiga::PersonalDetails> details_,
+		gmref_ptr<Dialect> dialect_,
 		gmref_ptr<Cluster> cluster_):
-  details(details_), cluster(cluster_)
+  details(details_), cluster(cluster_), dialect(dialect_)
 {
-  account = gmref_ptr<Account>(new Account (details, cluster, "premier", "premier", "ekiga", "localhost"));
+  account = gmref_ptr<Account>(new Account (details, dialect, cluster, "premier", "premier", "ekiga", "localhost"));
 }
 
 LM::Bank::~Bank ()
diff --git a/lib/engine/components/loudmouth/loudmouth-bank.h b/lib/engine/components/loudmouth/loudmouth-bank.h
index fdaa26a..2b4ee2e 100644
--- a/lib/engine/components/loudmouth/loudmouth-bank.h
+++ b/lib/engine/components/loudmouth/loudmouth-bank.h
@@ -39,6 +39,7 @@
 #include "services.h"
 
 #include "loudmouth-account.h"
+#include "loudmouth-dialect.h"
 
 namespace LM
 {
@@ -48,6 +49,7 @@ namespace LM
   {
   public:
     Bank (gmref_ptr<Ekiga::PersonalDetails> details_,
+	  gmref_ptr<Dialect> dialect_,
 	  gmref_ptr<Cluster> cluster_);
 
     ~Bank ();
@@ -62,6 +64,7 @@ namespace LM
 
     gmref_ptr<Ekiga::PersonalDetails> details;
     gmref_ptr<Cluster> cluster;
+    gmref_ptr<Dialect> dialect;
     gmref_ptr<Account> account;
   };
 };
diff --git a/lib/engine/components/loudmouth/loudmouth-chat-simple.cpp b/lib/engine/components/loudmouth/loudmouth-chat-simple.cpp
index ea558b0..8e8132f 100644
--- a/lib/engine/components/loudmouth/loudmouth-chat-simple.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-chat-simple.cpp
@@ -35,17 +35,14 @@
 
 #include "loudmouth-chat-simple.h"
 
-LM::SimpleChat::SimpleChat (LmConnection* connection_,
-			    gmref_ptr<Presentity> presentity_):
-  connection(connection_), presentity(presentity_)
+LM::SimpleChat::SimpleChat (gmref_ptr<Presentity> presentity_):
+  presentity(presentity_)
 {
-  lm_connection_ref (connection);
   presentity->has_chat = true;
 }
 
 LM::SimpleChat::~SimpleChat ()
 {
-  lm_connection_unref (connection);
   presentity->has_chat = false;
 }
 
@@ -72,7 +69,7 @@ LM::SimpleChat::send_message (const std::string msg)
 {
   bool result = false;
 
-  if (lm_connection_is_authenticated (connection)) {
+  if (lm_connection_is_authenticated (presentity->get_connection ())) {
 
     result = true;
     LmMessage* message = lm_message_new (NULL, LM_MESSAGE_TYPE_MESSAGE);
@@ -81,7 +78,7 @@ LM::SimpleChat::send_message (const std::string msg)
 				    "type", "chat",
 				    NULL);
     lm_message_node_add_child (lm_message_get_node (message), "body", msg.c_str ());
-    lm_connection_send (connection, message, NULL);
+    lm_connection_send (presentity->get_connection (), message, NULL);
     lm_message_unref (message);
     for (std::list<gmref_ptr<Ekiga::ChatObserver> >::iterator iter = observers.begin ();
 	 iter != observers.end ();
@@ -94,6 +91,17 @@ LM::SimpleChat::send_message (const std::string msg)
   return result;
 }
 
+void
+LM::SimpleChat::got_message (const std::string msg)
+{
+  for (std::list<gmref_ptr<Ekiga::ChatObserver> >::iterator iter = observers.begin ();
+       iter != observers.end ();
+       ++iter) {
+
+    (*iter)->message (presentity->get_name (), msg);
+  }
+}
+
 bool
 LM::SimpleChat::populate_menu (Ekiga::MenuBuilder& /*builder*/)
 {
diff --git a/lib/engine/components/loudmouth/loudmouth-chat-simple.h b/lib/engine/components/loudmouth/loudmouth-chat-simple.h
index 5efe69f..07b8cd5 100644
--- a/lib/engine/components/loudmouth/loudmouth-chat-simple.h
+++ b/lib/engine/components/loudmouth/loudmouth-chat-simple.h
@@ -47,8 +47,7 @@ namespace LM
   {
   public:
 
-    SimpleChat (LmConnection* connection_,
-		gmref_ptr<Presentity> presentity_);
+    SimpleChat (gmref_ptr<Presentity> presentity_);
 
     ~SimpleChat ();
 
@@ -64,9 +63,12 @@ namespace LM
 
     gmref_ptr<Ekiga::Presentity> get_presentity () const;
 
+    /* specific api */
+
+    void got_message (const std::string msg);
+
   private:
 
-    LmConnection* connection;
     gmref_ptr<Presentity> presentity;
     std::list<gmref_ptr<Ekiga::ChatObserver> > observers;
   };
diff --git a/lib/engine/components/loudmouth/loudmouth-dialect.cpp b/lib/engine/components/loudmouth/loudmouth-dialect.cpp
new file mode 100644
index 0000000..f92a9d4
--- /dev/null
+++ b/lib/engine/components/loudmouth/loudmouth-dialect.cpp
@@ -0,0 +1,88 @@
+
+/*
+ * Ekiga -- A VoIP and Video-Conferencing application
+ * Copyright (C) 2000-2008 Damien Sandras
+
+ * This program is free software; you can  redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version. This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Ekiga is licensed under the GPL license and as a special exception, you
+ * have permission to link or otherwise combine this program with the
+ * programs OPAL, OpenH323 and PWLIB, and distribute the combination, without
+ * applying the requirements of the GNU GPL to the OPAL, OpenH323 and PWLIB
+ * programs, as long as you do follow the requirements of the GNU GPL for all
+ * the rest of the software thus combined.
+ */
+
+
+/*
+ *                         loudmouth-dialect.cpp  -  description
+ *                         ------------------------------------------
+ *   begin                : written in 2008 by Julien Puydt
+ *   copyright            : (c) 2008 by Julien Puydt
+ *   description          : implementation of the loudmouth dialect
+ *
+ */
+
+#include <iostream>
+
+#include "loudmouth-dialect.h"
+
+LM::Dialect::Dialect ()
+{
+}
+
+LM::Dialect::~Dialect ()
+{
+  std::cout << __PRETTY_FUNCTION__ << std::endl;
+}
+
+void
+LM::Dialect::push_message (gmref_ptr<Presentity> presentity,
+			   const std::string msg)
+{
+  bool found = false;
+
+  for (simple_iterator iter = simple_begin ();
+       iter != simple_end ();
+       ++iter) {
+
+    if (presentity == (*iter)->get_presentity ()) {
+
+      (*iter)->got_message (msg);
+      found = true;
+      break;
+    }
+  }
+
+  if ( !found) {
+
+    gmref_ptr<SimpleChat> chat(new SimpleChat (presentity));
+
+    add_simple_chat (chat);
+    chat->got_message (msg);
+  }
+}
+
+void
+LM::Dialect::open_chat (gmref_ptr<Presentity> presentity)
+{
+  gmref_ptr<SimpleChat> chat(new SimpleChat (presentity));
+  add_simple_chat (chat);
+  chat->user_requested.emit ();
+}
+
+bool
+LM::Dialect::populate_menu (Ekiga::MenuBuilder& /*builder*/)
+{
+  return false;
+}
diff --git a/lib/engine/components/loudmouth/loudmouth-dialect.h b/lib/engine/components/loudmouth/loudmouth-dialect.h
new file mode 100644
index 0000000..71936f2
--- /dev/null
+++ b/lib/engine/components/loudmouth/loudmouth-dialect.h
@@ -0,0 +1,64 @@
+
+/*
+ * Ekiga -- A VoIP and Video-Conferencing application
+ * Copyright (C) 2000-2008 Damien Sandras
+
+ * This program is free software; you can  redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version. This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Ekiga is licensed under the GPL license and as a special exception, you
+ * have permission to link or otherwise combine this program with the
+ * programs OPAL, OpenH323 and PWLIB, and distribute the combination, without
+ * applying the requirements of the GNU GPL to the OPAL, OpenH323 and PWLIB
+ * programs, as long as you do follow the requirements of the GNU GPL for all
+ * the rest of the software thus combined.
+ */
+
+
+/*
+ *                         loudmouth-dialect.h  -  description
+ *                         ------------------------------------------
+ *   begin                : written in 2008 by Julien Puydt
+ *   copyright            : (c) 2008 by Julien Puydt
+ *   description          : declaration of the loudmouth dialect
+ *
+ */
+
+#ifndef __LOUDMOUTH_DIALECT_H__
+#define __LOUDMOUTH_DIALECT_H__
+
+#include "dialect-impl.h"
+#include "loudmouth-chat-simple.h"
+
+namespace LM
+{
+  class Dialect:
+    public Ekiga::DialectImpl<SimpleChat>
+  {
+  public:
+
+    Dialect ();
+
+    ~Dialect ();
+
+    bool populate_menu (Ekiga::MenuBuilder& builder);
+
+    /* specific */
+
+    void push_message (gmref_ptr<Presentity>,
+		       const std::string msg);
+
+    void open_chat (gmref_ptr<Presentity> presentity);
+  };
+};
+
+#endif
diff --git a/lib/engine/components/loudmouth/loudmouth-heap.cpp b/lib/engine/components/loudmouth/loudmouth-heap.cpp
index 8cd0a95..d8ec685 100644
--- a/lib/engine/components/loudmouth/loudmouth-heap.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-heap.cpp
@@ -59,9 +59,19 @@ presence_handler_c (LmMessageHandler* /*handler*/,
   return heap->presence_handler (message);
 }
 
+static LmHandlerResult
+message_handler_c (LmMessageHandler* /*handler*/,
+		   LmConnection* /*connection*/,
+		   LmMessage* message,
+		   LM::Heap* heap)
+{
+  return heap->message_handler (message);
+}
+
 LM::Heap::Heap (gmref_ptr<Ekiga::PersonalDetails> details_,
+		gmref_ptr<Dialect> dialect_,
 		LmConnection* connection_):
-  details(details_), connection(connection_)
+  details(details_), dialect(dialect_), connection(connection_)
 {
   details->updated.connect (sigc::mem_fun (this, &LM::Heap::on_personal_details_updated));
 
@@ -73,6 +83,9 @@ LM::Heap::Heap (gmref_ptr<Ekiga::PersonalDetails> details_,
   presence_lm_handler = lm_message_handler_new ((LmHandleMessageFunction)presence_handler_c, this, NULL);
   lm_connection_register_message_handler (connection, presence_lm_handler, LM_MESSAGE_TYPE_PRESENCE, LM_HANDLER_PRIORITY_NORMAL);
 
+  message_lm_handler = lm_message_handler_new ((LmHandleMessageFunction)message_handler_c, this, NULL);
+  lm_connection_register_message_handler (connection, message_lm_handler, LM_MESSAGE_TYPE_MESSAGE, LM_HANDLER_PRIORITY_NORMAL);
+
   { // populate the roster
     LmMessage* roster_request = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
     LmMessageNode* node = lm_message_node_add_child (lm_message_get_node (roster_request), "query", NULL);
@@ -99,6 +112,10 @@ LM::Heap::~Heap ()
   lm_message_handler_unref (presence_lm_handler);
   presence_lm_handler = 0;
 
+  lm_connection_unregister_message_handler (connection, message_lm_handler, LM_MESSAGE_TYPE_MESSAGE);
+  lm_message_handler_unref (message_lm_handler);
+  message_lm_handler = 0;
+
   lm_connection_unref (connection);
   connection = 0;
 
@@ -226,6 +243,36 @@ LM::Heap::presence_handler (LmMessage* message)
   return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
 }
 
+LmHandlerResult
+LM::Heap::message_handler (LmMessage* message)
+{
+  const gchar* from_c = lm_message_node_get_attribute (lm_message_get_node (message), "from");
+  const gchar* type_attr = lm_message_node_get_attribute (lm_message_get_node (message), "type");
+  std::string base_jid;
+
+  if (from_c != 0) {
+
+    std::string from (from_c);
+    std::string::size_type index = from.find ('/');
+    base_jid = std::string (from, 0, index);
+  }
+
+  gmref_ptr<Presentity> item = find_item (base_jid);
+
+  if (type_attr == NULL
+      || (type_attr != NULL && strcmp (type_attr, "normal") == 0)
+      || (type_attr != NULL && strcmp (type_attr, "chat") == 0)) {
+
+    LmMessageNode* body = lm_message_node_find_child (lm_message_get_node (message), "body");
+    if (lm_message_node_get_value (body) != NULL) {
+
+      dialect->push_message (item, lm_message_node_get_value (body));
+    }
+  }
+
+  return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
 void
 LM::Heap::parse_roster (LmMessageNode* query)
 {
@@ -256,6 +303,7 @@ LM::Heap::parse_roster (LmMessageNode* query)
     if ( !found) {
 
       gmref_ptr<Presentity> presentity(new Presentity (connection, node));
+      presentity->chat_requested.connect (sigc::bind (sigc::mem_fun (this, &LM::Heap::on_chat_requested), presentity));
       add_presentity (presentity);
     }
   }
@@ -384,3 +432,9 @@ LM::Heap::on_personal_details_updated ()
   lm_connection_send (connection, message, NULL);
   lm_message_unref (message);
 }
+
+void
+LM::Heap::on_chat_requested (gmref_ptr<Presentity> presentity)
+{
+  dialect->open_chat (presentity);
+}
diff --git a/lib/engine/components/loudmouth/loudmouth-heap.h b/lib/engine/components/loudmouth/loudmouth-heap.h
index 05e91b4..ce72ba2 100644
--- a/lib/engine/components/loudmouth/loudmouth-heap.h
+++ b/lib/engine/components/loudmouth/loudmouth-heap.h
@@ -38,7 +38,7 @@
 
 #include "heap-impl.h"
 #include "personal-details.h"
-#include "loudmouth-presentity.h"
+#include "loudmouth-dialect.h"
 
 namespace LM
 {
@@ -49,6 +49,7 @@ namespace LM
   public:
 
     Heap (gmref_ptr<Ekiga::PersonalDetails> details_,
+	  gmref_ptr<Dialect> dialect_,
 	  LmConnection* connection_);
 
     ~Heap ();
@@ -68,16 +69,22 @@ namespace LM
 
     LmHandlerResult presence_handler (LmMessage* message);
 
+    LmHandlerResult message_handler (LmMessage* message);
+
   private:
 
     gmref_ptr<Ekiga::PersonalDetails> details;
 
+    gmref_ptr<Dialect> dialect;
+
     LmConnection* connection;
 
     LmMessageHandler* iq_lm_handler;
 
     LmMessageHandler* presence_lm_handler;
 
+    LmMessageHandler* message_lm_handler;
+
     void parse_roster (LmMessageNode* query);
 
     void add_item ();
@@ -91,6 +98,8 @@ namespace LM
     gmref_ptr<Presentity> find_item (const std::string jid);
 
     void on_personal_details_updated ();
+
+    void on_chat_requested (gmref_ptr<Presentity> presentity);
   };
 };
 
diff --git a/lib/engine/components/loudmouth/loudmouth-main.cpp b/lib/engine/components/loudmouth/loudmouth-main.cpp
index 562ec0e..f5f1479 100644
--- a/lib/engine/components/loudmouth/loudmouth-main.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-main.cpp
@@ -38,6 +38,7 @@
 #include "loudmouth-main.h"
 
 #include "presence-core.h"
+#include "chat-core.h"
 #include "personal-details.h"
 
 #include "loudmouth-cluster.h"
@@ -50,13 +51,16 @@ loudmouth_init (Ekiga::ServiceCore &services,
 {
   bool result = false;
   gmref_ptr<Ekiga::PresenceCore> presence (services.get ("presence-core"));
+  gmref_ptr<Ekiga::ChatCore> chat (services.get ("chat-core"));
   gmref_ptr<Ekiga::PersonalDetails> details (services.get ("personal-details"));
 
-  if (presence && details) {
+  if (presence && chat && details) {
 
-    gmref_ptr<LM::Cluster> cluster(new LM::Cluster ());
-    gmref_ptr<LM::Bank> bank (new LM::Bank (details, cluster));
+    gmref_ptr<LM::Dialect> dialect(new LM::Dialect);
+    gmref_ptr<LM::Cluster> cluster(new LM::Cluster);
+    gmref_ptr<LM::Bank> bank (new LM::Bank (details, dialect, cluster));
     services.add (bank);
+    chat->add_dialect (dialect);
     presence->add_cluster (cluster);
     result = true;
   }
diff --git a/lib/engine/components/loudmouth/loudmouth-presentity.cpp b/lib/engine/components/loudmouth/loudmouth-presentity.cpp
index a6fb2ef..5974c1d 100644
--- a/lib/engine/components/loudmouth/loudmouth-presentity.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-presentity.cpp
@@ -182,6 +182,11 @@ LM::Presentity::populate_menu (Ekiga::MenuBuilder& builder)
     builder.add_action ("stop", _("Stop getting his/her status"), sigc::mem_fun (this, &LM::Presentity::stop_to));
   }
 
+  if ( !has_chat) {
+
+    builder.add_action ("chat", _("Start chat"), chat_requested.make_slot ());
+  }
+
   builder.add_action ("remove", _("_Remove"),
 		      sigc::mem_fun (this, &LM::Presentity::remove_presentity));
   return true;
@@ -193,6 +198,12 @@ LM::Presentity::get_jid () const
   return lm_message_node_get_attribute (item, "jid");
 }
 
+LmConnection*
+LM::Presentity::get_connection () const
+{
+  return connection;
+}
+
 void
 LM::Presentity::update (LmMessageNode* item_)
 {
diff --git a/lib/engine/components/loudmouth/loudmouth-presentity.h b/lib/engine/components/loudmouth/loudmouth-presentity.h
index 0f2dd93..33d7dd9 100644
--- a/lib/engine/components/loudmouth/loudmouth-presentity.h
+++ b/lib/engine/components/loudmouth/loudmouth-presentity.h
@@ -69,11 +69,17 @@ namespace LM
 
     const std::string get_jid () const;
 
+    LmConnection* get_connection () const;
+
     void update (LmMessageNode* item_);
 
     void push_presence (const std::string resource,
 			LmMessageNode* presence);
 
+    bool has_chat;
+
+    sigc::signal<void> chat_requested;
+
   private:
     LmConnection* connection;
     LmMessageNode* item;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]