[empathy: 2/5] Add empathy_message_new_from_entry()
- From: Will Thompson <wjt src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [empathy: 2/5] Add empathy_message_new_from_entry()
- Date: Fri, 28 Aug 2009 12:19:12 +0000 (UTC)
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]