]> git.0d.be Git - empathy.git/commitdiff
Add empathy_message_new_from_entry()
authorWill Thompson <will.thompson@collabora.co.uk>
Wed, 26 Aug 2009 18:46:39 +0000 (19:46 +0100)
committerWill Thompson <will.thompson@collabora.co.uk>
Thu, 27 Aug 2009 20:16:52 +0000 (21:16 +0100)
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
libempathy/empathy-message.h

index a8fe6084cfe1495d54b8a5128f8671e08cad7b29..0da55112de70d65d681024ccda132e00eaaf4581 100644 (file)
@@ -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)
 {
index 00064df57c0cd9c035a6698563d2efc690f9c95a..f9a4887033a12476865603a6533512c8b6462e6f 100644 (file)
@@ -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,