#include <string.h>
#include <telepathy-glib/util.h>
+#include <telepathy-glib/account.h>
+#include <telepathy-glib/account-manager.h>
+
+#include <telepathy-logger/entity.h>
+#include <telepathy-logger/entry.h>
+#include <telepathy-logger/entry-text.h>
#include "empathy-message.h"
#include "empathy-utils.h"
gboolean is_backlog;
guint id;
gboolean incoming;
+ TpChannelTextMessageFlags flags;
} EmpathyMessagePriv;
static void empathy_message_finalize (GObject *object);
PROP_TIMESTAMP,
PROP_IS_BACKLOG,
PROP_INCOMING,
+ PROP_FLAGS,
};
static void
FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_FLAGS,
+ g_param_spec_uint ("flags",
+ "Flags",
+ "The TpChannelTextMessageFlags of this message",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_type_class_add_private (object_class, sizeof (EmpathyMessagePriv));
}
};
}
-static gboolean
-has_prefix_case (const gchar *s,
- const gchar *prefix)
-{
- return g_ascii_strncasecmp (s, prefix, strlen (prefix)) == 0;
-}
-
-/*
- * Constructs an EmpathyMessage based on user input, which may include "/me"
- * and friends.
- *
- * Returns: an #EmpathyMessage if @message could be parsed, or %NULL if
- * @message was an unknown command.
- */
EmpathyMessage *
-empathy_message_new_from_entry (const gchar *message)
+empathy_message_new (const gchar *body)
{
- TpChannelTextMessageType t = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL;
-
- g_return_val_if_fail (message != NULL, NULL);
-
- if (message[0] == '/') {
- if (g_ascii_strcasecmp (message, "/me") == 0) {
- message = "";
- t = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION;
- } else if (has_prefix_case (message, "/me ")) {
- message += strlen ("/me ");
- t = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION;
- } else if (has_prefix_case (message, "/say ")) {
- message += strlen ("/say ");
- } else {
- /* Also allow messages with two slashes before the
- * first space, so it is possible to send a /unix/path.
- * This heuristic is kind of crap.
- */
- gboolean second_slash = FALSE;
- const gchar *m = message + 1;
-
- while (!second_slash && *m != '\0' && *m != ' ') {
- if (*m == '/')
- second_slash = TRUE;
-
- m++;
- }
-
- if (!second_slash)
- return NULL;
- }
- }
-
return g_object_new (EMPATHY_TYPE_MESSAGE,
- "type", t,
- "body", message,
+ "body", body,
NULL);
}
EmpathyMessage *
-empathy_message_new (const gchar *body)
+empathy_message_from_tpl_log_entry (TplEntry *logentry)
{
- return g_object_new (EMPATHY_TYPE_MESSAGE,
- "body", body,
- NULL);
+ EmpathyMessage *retval = NULL;
+ TpAccountManager *acc_man = NULL;
+ TpAccount *account = NULL;
+ TplEntity *receiver = NULL;
+ TplEntity *sender = NULL;
+ gchar *body= NULL;
+ EmpathyContact *contact;
+
+ g_return_val_if_fail (TPL_IS_ENTRY (logentry), NULL);
+
+ acc_man = tp_account_manager_dup ();
+ /* FIXME Currently Empathy shows in the log viewer only valid accounts, so it
+ * won't be selected any non-existing (ie removed) account.
+ * When #610455 will be fixed, calling tp_account_manager_ensure_account ()
+ * might add a not existing account to the AM. tp_account_new () probably
+ * will be the best way to handle it.
+ * Note: When creating an EmpathyContact from a TplEntity instance, the
+ * TpAccount is passed *only* to let EmpathyContact be able to retrieve the
+ * avatar (contact_get_avatar_filename () need a TpAccount).
+ * If the way EmpathyContact stores the avatar is changes, it might not be
+ * needed anymore any TpAccount passing and the following call will be
+ * useless */
+ account = tp_account_manager_ensure_account (acc_man,
+ tpl_entry_get_account_path (logentry));
+ g_object_unref (acc_man);
+
+ /* TODO Currently only TplLogEntryText exists as subclass of TplEntry, in
+ * future more TplEntry will exist and EmpathyMessage should probably
+ * be enhanced to support other types of log entries (ie TplLogEntryCall).
+ *
+ * For now we just check (simply) that we are dealing with the only supported type,
+ * then there will be a if/then/else or switch handling all the supported
+ * cases.
+ */
+ if (!TPL_IS_ENTRY_TEXT (logentry))
+ return NULL;
+
+ body = g_strdup (tpl_entry_text_get_message (
+ TPL_ENTRY_TEXT (logentry)));
+ receiver = tpl_entry_get_receiver (logentry);
+ sender = tpl_entry_get_sender (logentry);
+
+ retval = empathy_message_new (body);
+ if (receiver != NULL) {
+ contact = empathy_contact_from_tpl_contact (account, receiver);
+ empathy_message_set_receiver (retval, contact);
+ g_object_unref (contact);
+ }
+
+ if (sender != NULL) {
+ contact = empathy_contact_from_tpl_contact (account, sender);
+ empathy_message_set_sender (retval, contact);
+ g_object_unref (contact);
+ }
+
+ empathy_message_set_timestamp (retval,
+ tpl_entry_get_timestamp (logentry));
+ empathy_message_set_id (retval,
+ tpl_entry_text_get_pending_msg_id (TPL_ENTRY_TEXT (logentry)));
+ empathy_message_set_is_backlog (retval, TRUE);
+
+ g_free (body);
+
+ return retval;
}
TpChannelTextMessageType
gchar *cf_msg, *cf_to;
gchar *ch;
gboolean ret_val;
+ TpChannelTextMessageFlags flags;
g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), FALSE);
return FALSE;
}
- to = empathy_contact_get_name (contact);
+ to = empathy_contact_get_alias (contact);
if (!to) {
return FALSE;
}
+ flags = empathy_message_get_flags (message);
+ if (flags & TP_CHANNEL_TEXT_MESSAGE_FLAG_SCROLLBACK) {
+ /* FIXME: Ideally we shouldn't highlight scrollback messages only if they
+ * have already been received by the user before (and so are in the logs) */
+ return FALSE;
+ }
+
cf_msg = g_utf8_casefold (msg, -1);
cf_to = g_utf8_casefold (to, -1);
return "notice";
case TP_CHANNEL_TEXT_MESSAGE_TYPE_AUTO_REPLY:
return "auto-reply";
+ case TP_CHANNEL_TEXT_MESSAGE_TYPE_DELIVERY_REPORT:
+ return "delivery-report";
+ case TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
default:
return "normal";
}
priv1 = GET_PRIV (message1);
priv2 = GET_PRIV (message2);
- if (priv1->id == priv2->id && !tp_strdiff (priv1->body, priv2->body)) {
+ if (priv1->timestamp == priv2->timestamp &&
+ !tp_strdiff (priv1->body, priv2->body)) {
return TRUE;
}
return FALSE;
}
+
+TpChannelTextMessageFlags
+empathy_message_get_flags (EmpathyMessage *self)
+{
+ EmpathyMessagePriv *priv = GET_PRIV (self);
+
+ g_return_val_if_fail (EMPATHY_IS_MESSAGE (self), 0);
+
+ return priv->flags;
+}
+
+void
+empathy_message_set_flags (EmpathyMessage *self,
+ TpChannelTextMessageFlags flags)
+{
+ EmpathyMessagePriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_MESSAGE (self));
+
+ priv = GET_PRIV (self);
+
+ priv->flags = flags;
+
+ g_object_notify (G_OBJECT (self), "flags");
+}