*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
#include <string.h>
+#include <telepathy-glib/util.h>
+
#include "empathy-message.h"
#include "empathy-utils.h"
#include "empathy-enum-types.h"
EmpathyContact *receiver;
gchar *body;
time_t timestamp;
+ gboolean is_backlog;
+ guint id;
+ gboolean incoming;
} EmpathyMessagePriv;
static void empathy_message_finalize (GObject *object);
PROP_RECEIVER,
PROP_BODY,
PROP_TIMESTAMP,
+ PROP_IS_BACKLOG,
+ PROP_INCOMING,
};
static void
G_MAXLONG,
-1,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_IS_BACKLOG,
+ g_param_spec_boolean ("is-backlog",
+ "History message",
+ "If the message belongs to history",
+ FALSE,
+ 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));
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;
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)
{
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");
g_object_notify (G_OBJECT (message), "timestamp");
}
-GDate *
-empathy_message_get_date_and_time (EmpathyMessage *message, time_t *timestamp)
+gboolean
+empathy_message_is_backlog (EmpathyMessage *message)
{
- GDate *date;
+ EmpathyMessagePriv *priv;
- *timestamp = 0;
- if (message) {
- *timestamp = empathy_message_get_timestamp (message);
- }
+ g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), FALSE);
- if (timestamp <= 0) {
- *timestamp = empathy_time_get_current ();
- }
+ priv = GET_PRIV (message);
+
+ return priv->is_backlog;
+}
- date = g_date_new ();
- g_date_set_time_t (date, *timestamp);
+void
+empathy_message_set_is_backlog (EmpathyMessage *message,
+ gboolean is_backlog)
+{
+ EmpathyMessagePriv *priv;
- return date;
+ g_return_if_fail (EMPATHY_IS_MESSAGE (message));
+
+ priv = GET_PRIV (message);
+
+ priv->is_backlog = is_backlog;
+
+ g_object_notify (G_OBJECT (message), "is-backlog");
}
#define IS_SEPARATOR(ch) (ch == ' ' || ch == ',' || ch == '.' || ch == ':')
}
}
+guint
+empathy_message_get_id (EmpathyMessage *message)
+{
+ EmpathyMessagePriv *priv = GET_PRIV (message);
+
+ g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), 0);
+
+ return priv->id;
+}
+
+void
+empathy_message_set_id (EmpathyMessage *message, guint id)
+{
+ EmpathyMessagePriv *priv = GET_PRIV (message);
+
+ 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)
+{
+ EmpathyMessagePriv *priv1;
+ EmpathyMessagePriv *priv2;
+
+ g_return_val_if_fail (EMPATHY_IS_MESSAGE (message1), FALSE);
+ g_return_val_if_fail (EMPATHY_IS_MESSAGE (message2), FALSE);
+
+ priv1 = GET_PRIV (message1);
+ priv2 = GET_PRIV (message2);
+
+ if (priv1->id == priv2->id && !tp_strdiff (priv1->body, priv2->body)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}