aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-chat.c32
-rw-r--r--libempathy/empathy-message.c73
-rw-r--r--libempathy/empathy-message.h1
3 files changed, 68 insertions, 38 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 9096beeae..a979c9e76 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -391,34 +391,20 @@ chat_send (EmpathyChat *chat,
chat_sent_message_add (chat, msg);
- if (g_str_has_prefix (msg, "/clear")) {
+ if (strcmp (msg, "/clear") == 0) {
empathy_chat_view_clear (chat->view);
return;
}
- /* Blacklist messages begining by '/', except for "/me" and "/say"
- * because they are handled in EmpathyMessage */
- if (msg[0] == '/' &&
- !g_str_has_prefix (msg, "/me") &&
- !g_str_has_prefix (msg, "/say")) {
- /* Also allow messages with two slashes before the first space,
- * so it is possible to send an /unix/path */
- int slash_count = 0, i;
- for (i = 0; msg[i] && msg[i] != ' ' && slash_count < 2; i++) {
- if (msg[i] == '/')
- slash_count++;
- }
- if (slash_count == 1) {
- empathy_chat_view_append_event (chat->view,
- _("Unsupported command"));
- return;
- }
- }
+ message = empathy_message_new_from_entry (msg);
- /* We can send the message */
- message = empathy_message_new (msg);
- empathy_tp_chat_send (priv->tp_chat, message);
- g_object_unref (message);
+ if (message == NULL) {
+ empathy_chat_view_append_event (chat->view,
+ _("Unsupported command"));
+ } else {
+ empathy_tp_chat_send (priv->tp_chat, message);
+ g_object_unref (message);
+ }
}
static void
diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c
index a8fe6084c..34a466752 100644
--- a/libempathy/empathy-message.c
+++ b/libempathy/empathy-message.c
@@ -218,6 +218,62 @@ message_set_property (GObject *object,
};
}
+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)
+{
+ 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,
+ NULL);
+}
+
EmpathyMessage *
empathy_message_new (const gchar *body)
{
@@ -337,28 +393,15 @@ empathy_message_set_body (EmpathyMessage *message,
const gchar *body)
{
EmpathyMessagePriv *priv = GET_PRIV (message);
- TpChannelTextMessageType type;
g_return_if_fail (EMPATHY_IS_MESSAGE (message));
g_free (priv->body);
- priv->body = NULL;
-
- type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL;
- if (g_str_has_prefix (body, "/me")) {
- type = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION;
- body += 4;
- }
- else if (g_str_has_prefix (body, "/say")) {
- body += 5;
- }
if (body) {
priv->body = g_strdup (body);
- }
-
- if (type != priv->type) {
- empathy_message_set_tptype (message, type);
+ } else {
+ priv->body = NULL;
}
g_object_notify (G_OBJECT (message), "body");
diff --git a/libempathy/empathy-message.h b/libempathy/empathy-message.h
index 00064df57..f9a488703 100644
--- a/libempathy/empathy-message.h
+++ b/libempathy/empathy-message.h
@@ -52,6 +52,7 @@ struct _EmpathyMessageClass {
};
GType empathy_message_get_type (void) G_GNUC_CONST;
+EmpathyMessage * empathy_message_new_from_entry (const gchar *message);
EmpathyMessage * empathy_message_new (const gchar *body);
TpChannelTextMessageType empathy_message_get_tptype (EmpathyMessage *message);
void empathy_message_set_tptype (EmpathyMessage *message,