]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-message.c
Merge commit 'jtellier/confirm-lose-accounts-settings'
[empathy.git] / libempathy / empathy-message.c
index 41b44bfb3b9497fefcaa791a0ae69a2f9ca20fee..a403766e4b98149a7c3e8f61ca99b31d8da86228 100644 (file)
@@ -41,6 +41,7 @@ typedef struct {
        time_t                    timestamp;
        gboolean                  is_backlog;
        guint                     id;
+       gboolean                  incoming;
 } EmpathyMessagePriv;
 
 static void empathy_message_finalize   (GObject            *object);
@@ -63,6 +64,7 @@ enum {
        PROP_BODY,
        PROP_TIMESTAMP,
        PROP_IS_BACKLOG,
+       PROP_INCOMING,
 };
 
 static void
@@ -123,6 +125,14 @@ empathy_message_class_init (EmpathyMessageClass *class)
                                                               G_PARAM_READWRITE));
 
 
+       g_object_class_install_property (object_class,
+                                        PROP_INCOMING,
+                                        g_param_spec_boolean ("incoming",
+                                                              "Incoming",
+                                                              "If this is an incoming (as opposed to sent) message",
+                                                              FALSE,
+                                                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
        g_type_class_add_private (object_class, sizeof (EmpathyMessagePriv));
 
 }
@@ -179,6 +189,9 @@ message_get_property (GObject    *object,
        case PROP_BODY:
                g_value_set_string (value, priv->body);
                break;
+       case PROP_INCOMING:
+               g_value_set_boolean (value, priv->incoming);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
@@ -212,12 +225,71 @@ message_set_property (GObject      *object,
                empathy_message_set_body (EMPATHY_MESSAGE (object),
                                         g_value_get_string (value));
                break;
+       case PROP_INCOMING:
+               priv->incoming = g_value_get_boolean (value);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
        };
 }
 
+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 +409,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");
@@ -421,7 +480,7 @@ empathy_message_set_is_backlog (EmpathyMessage *message,
        priv->is_backlog = is_backlog;
 
        g_object_notify (G_OBJECT (message), "is-backlog");
-}                              
+}
 
 #define IS_SEPARATOR(ch) (ch == ' ' || ch == ',' || ch == '.' || ch == ':')
 gboolean
@@ -536,6 +595,30 @@ empathy_message_set_id (EmpathyMessage *message, guint id)
        priv->id = id;
 }
 
+void
+empathy_message_set_incoming (EmpathyMessage *message, gboolean incoming)
+{
+       EmpathyMessagePriv *priv;
+
+       g_return_if_fail (EMPATHY_IS_MESSAGE (message));
+
+       priv = GET_PRIV (message);
+
+       priv->incoming = incoming;
+
+       g_object_notify (G_OBJECT (message), "incoming");
+}
+
+gboolean
+empathy_message_is_incoming (EmpathyMessage *message)
+{
+       EmpathyMessagePriv *priv = GET_PRIV (message);
+
+       g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), FALSE);
+
+       return priv->incoming;
+}
+
 gboolean
 empathy_message_equal (EmpathyMessage *message1, EmpathyMessage *message2)
 {