[empathy: 2/5] Add empathy_message_new_from_entry()



commit dec9d4dcf8c7611862221be9eadb53ef52a5bc3b
Author: Will Thompson <will thompson collabora co uk>
Date:   Wed Aug 26 19:46:39 2009 +0100

    Add empathy_message_new_from_entry()
    
    This will be the sole place that user input is parsed for special
    commands like /me; the parsing logic will be removed from EmpathyMessage
    and chat_send().

 libempathy/empathy-message.c |   56 ++++++++++++++++++++++++++++++++++++++++++
 libempathy/empathy-message.h |    1 +
 2 files changed, 57 insertions(+), 0 deletions(-)
---
diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c
index a8fe608..0da5511 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)
 {
diff --git a/libempathy/empathy-message.h b/libempathy/empathy-message.h
index 00064df..f9a4887 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,



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