[ekiga] It's now possible to start a chat with someone
- From: Julien Puydt <jpuydt src gnome org>
- To: svn-commits-list gnome org
- Subject: [ekiga] It's now possible to start a chat with someone
- Date: Thu, 11 Jun 2009 11:42:41 -0400 (EDT)
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]