summaryrefslogtreecommitdiff
path: root/telepathy-glib/message-mixin.c
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-10-14 12:26:12 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-12-09 13:56:25 +0100
commit6cbc8e41c6fdf8f54583aca651a1deb4b9eeebd6 (patch)
tree4fd87d8a57cb5d57cae56dbece109d4a05417576 /telepathy-glib/message-mixin.c
parente0aa2015be252c49446ad8aab8cbac45eb917732 (diff)
downloadtelepathy-glib-6cbc8e41c6fdf8f54583aca651a1deb4b9eeebd6.tar.gz
move TpMessage to its own files
Diffstat (limited to 'telepathy-glib/message-mixin.c')
-rw-r--r--telepathy-glib/message-mixin.c650
1 files changed, 1 insertions, 649 deletions
diff --git a/telepathy-glib/message-mixin.c b/telepathy-glib/message-mixin.c
index da491e8e2..4d16d853c 100644
--- a/telepathy-glib/message-mixin.c
+++ b/telepathy-glib/message-mixin.c
@@ -62,6 +62,7 @@
#include <telepathy-glib/errors.h>
#include <telepathy-glib/gtypes.h>
#include <telepathy-glib/interfaces.h>
+#include <telepathy-glib/message-internal.h>
#define DEBUG_FLAG TP_DEBUG_IM
@@ -147,655 +148,6 @@ static const char * const headers_only_incoming[] = {
#define TP_MESSAGE_MIXIN(o) \
((TpMessageMixin *) tp_mixin_offset_cast (o, TP_MESSAGE_MIXIN_OFFSET (o)))
-
-/**
- * TpMessage:
- *
- * Opaque structure representing a message in the Telepathy messages interface
- * (an array of at least one mapping from string to variant, where the first
- * mapping contains message headers and subsequent mappings contain the
- * message body).
- */
-
-
-struct _TpMessage {
- TpBaseConnection *connection;
-
- /* array of hash tables, allocated string => sliced GValue */
- GPtrArray *parts;
-
- /* handles referenced by this message */
- TpHandleSet *reffed_handles[NUM_TP_HANDLE_TYPES];
-
- /* from here down is implementation-specific for TpMessageMixin */
-
- /* for receiving */
- guint32 incoming_id;
-
- /* for sending */
- DBusGMethodInvocation *outgoing_context;
- TpMessageSendingFlags outgoing_flags;
- gboolean outgoing_text_api;
-};
-
-
-/**
- * tp_message_new:
- * @connection: a connection on which to reference handles
- * @initial_parts: number of parts to create (at least 1)
- * @size_hint: preallocate space for this many parts (at least @initial_parts)
- *
- * <!-- nothing more to say -->
- *
- * Returns: a newly allocated message suitable to be passed to
- * tp_message_mixin_take_received
- *
- * @since 0.7.21
- */
-TpMessage *
-tp_message_new (TpBaseConnection *connection,
- guint initial_parts,
- guint size_hint)
-{
- TpMessage *self;
- guint i;
-
- g_return_val_if_fail (connection != NULL, NULL);
- g_return_val_if_fail (initial_parts >= 1, NULL);
- g_return_val_if_fail (size_hint >= initial_parts, NULL);
-
- self = g_slice_new0 (TpMessage);
- self->connection = g_object_ref (connection);
- self->parts = g_ptr_array_sized_new (size_hint);
- self->incoming_id = G_MAXUINT32;
- self->outgoing_context = NULL;
-
- for (i = 0; i < initial_parts; i++)
- {
- g_ptr_array_add (self->parts, g_hash_table_new_full (g_str_hash,
- g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free));
- }
-
- return self;
-}
-
-
-/**
- * tp_message_destroy:
- * @self: a message
- *
- * Destroy @self.
- *
- * @since 0.7.21
- */
-void
-tp_message_destroy (TpMessage *self)
-{
- guint i;
-
- g_return_if_fail (TP_IS_BASE_CONNECTION (self->connection));
- g_return_if_fail (self->parts != NULL);
- g_return_if_fail (self->parts->len >= 1);
-
- for (i = 0; i < self->parts->len; i++)
- {
- g_hash_table_destroy (g_ptr_array_index (self->parts, i));
- }
-
- g_ptr_array_free (self->parts, TRUE);
-
- for (i = 0; i < NUM_TP_HANDLE_TYPES; i++)
- {
- if (self->reffed_handles[i] != NULL)
- tp_handle_set_destroy (self->reffed_handles[i]);
- }
-
- g_object_unref (self->connection);
-
- g_slice_free (TpMessage, self);
-}
-
-
-/**
- * tp_message_count_parts:
- * @self: a message
- *
- * <!-- nothing more to say -->
- *
- * Returns: the number of parts in the message, including the headers in
- * part 0
- *
- * @since 0.7.21
- */
-guint
-tp_message_count_parts (TpMessage *self)
-{
- return self->parts->len;
-}
-
-
-/**
- * tp_message_peek:
- * @self: a message
- * @part: a part number
- *
- * <!-- nothing more to say -->
- *
- * Returns: the #GHashTable used to implement the given part, or %NULL if the
- * part number is out of range. The hash table is only valid as long as the
- * message is valid and the part is not deleted.
- *
- * @since 0.7.21
- */
-const GHashTable *
-tp_message_peek (TpMessage *self,
- guint part)
-{
- if (part >= self->parts->len)
- return NULL;
-
- return g_ptr_array_index (self->parts, part);
-}
-
-
-/**
- * tp_message_append_part:
- * @self: a message
- *
- * Append a body part to the message.
- *
- * Returns: the part number
- *
- * @since 0.7.21
- */
-guint
-tp_message_append_part (TpMessage *self)
-{
- g_ptr_array_add (self->parts, g_hash_table_new_full (g_str_hash,
- g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free));
- return self->parts->len - 1;
-}
-
-/**
- * tp_message_delete_part:
- * @self: a message
- * @part: a part number, which must be strictly greater than 0, and strictly
- * less than the number returned by tp_message_count_parts()
- *
- * Delete the given body part from the message.
- *
- * @since 0.7.21
- */
-void
-tp_message_delete_part (TpMessage *self,
- guint part)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (part > 0);
-
- g_hash_table_unref (g_ptr_array_remove_index (self->parts, part));
-}
-
-
-static void
-_ensure_handle_set (TpMessage *self,
- TpHandleType handle_type)
-{
- if (self->reffed_handles[handle_type] == NULL)
- {
- TpHandleRepoIface *handles = tp_base_connection_get_handles (
- self->connection, handle_type);
-
- g_return_if_fail (handles != NULL);
-
- self->reffed_handles[handle_type] = tp_handle_set_new (handles);
- }
-}
-
-
-/**
- * tp_message_ref_handle:
- * @self: a message
- * @handle_type: a handle type, greater than %TP_HANDLE_TYPE_NONE and less than
- * %NUM_TP_HANDLE_TYPES
- * @handle: a handle of the given type
- *
- * Reference the given handle until this message is destroyed.
- *
- * @since 0.7.21
- */
-void
-tp_message_ref_handle (TpMessage *self,
- TpHandleType handle_type,
- TpHandle handle)
-{
- g_return_if_fail (handle_type > TP_HANDLE_TYPE_NONE);
- g_return_if_fail (handle_type < NUM_TP_HANDLE_TYPES);
- g_return_if_fail (handle != 0);
-
- _ensure_handle_set (self, handle_type);
-
- tp_handle_set_add (self->reffed_handles[handle_type], handle);
-}
-
-
-/**
- * tp_message_ref_handles:
- * @self: a message
- * @handle_type: a handle type, greater than %TP_HANDLE_TYPE_NONE and less
- * than %NUM_TP_HANDLE_TYPES
- * @handles: a set of handles of the given type
- *
- * References all of the given handles until this message is destroyed.
- *
- * @since 0.7.21
- */
-static void
-tp_message_ref_handles (TpMessage *self,
- TpHandleType handle_type,
- TpIntset *handles)
-{
- TpIntset *updated;
-
- g_return_if_fail (handle_type > TP_HANDLE_TYPE_NONE);
- g_return_if_fail (handle_type < NUM_TP_HANDLE_TYPES);
- g_return_if_fail (!tp_intset_is_member (handles, 0));
-
- _ensure_handle_set (self, handle_type);
-
- updated = tp_handle_set_update (self->reffed_handles[handle_type], handles);
- tp_intset_destroy (updated);
-}
-
-
-/**
- * tp_message_delete_key:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- *
- * Remove the given key and its value from the given part.
- *
- * Returns: %TRUE if the key previously existed
- *
- * @since 0.7.21
- */
-gboolean
-tp_message_delete_key (TpMessage *self,
- guint part,
- const gchar *key)
-{
- g_return_val_if_fail (part < self->parts->len, FALSE);
-
- return g_hash_table_remove (g_ptr_array_index (self->parts, part), key);
-}
-
-
-/**
- * tp_message_set_handle:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @handle_type: a handle type
- * @handle_or_0: a handle of that type, or 0
- *
- * If @handle_or_0 is not zero, reference it with tp_message_ref_handle().
- *
- * Set @key in part @part of @self to have @handle_or_0 as an unsigned integer
- * value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_handle (TpMessage *self,
- guint part,
- const gchar *key,
- TpHandleType handle_type,
- TpHandle handle_or_0)
-{
- if (handle_or_0 != 0)
- tp_message_ref_handle (self, handle_type, handle_or_0);
-
- tp_message_set_uint32 (self, part, key, handle_or_0);
-}
-
-
-/**
- * tp_message_set_boolean:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @b: a boolean value
- *
- * Set @key in part @part of @self to have @b as a boolean value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_boolean (TpMessage *self,
- guint part,
- const gchar *key,
- gboolean b)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_boolean (b));
-}
-
-
-/**
- * tp_message_set_int16:
- * @s: a message
- * @p: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @k: a key in the mapping representing the part
- * @i: an integer value
- *
- * Set @key in part @part of @self to have @i as a signed integer value.
- *
- * @since 0.7.21
- */
-
-/**
- * tp_message_set_int32:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @i: an integer value
- *
- * Set @key in part @part of @self to have @i as a signed integer value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_int32 (TpMessage *self,
- guint part,
- const gchar *key,
- gint32 i)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_int (i));
-}
-
-
-/**
- * tp_message_set_int64:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @i: an integer value
- *
- * Set @key in part @part of @self to have @i as a signed integer value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_int64 (TpMessage *self,
- guint part,
- const gchar *key,
- gint64 i)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_int64 (i));
-}
-
-
-/**
- * tp_message_set_uint16:
- * @s: a message
- * @p: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @k: a key in the mapping representing the part
- * @u: an unsigned integer value
- *
- * Set @key in part @part of @self to have @u as an unsigned integer value.
- *
- * @since 0.7.21
- */
-
-/**
- * tp_message_set_uint32:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @u: an unsigned integer value
- *
- * Set @key in part @part of @self to have @u as an unsigned integer value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_uint32 (TpMessage *self,
- guint part,
- const gchar *key,
- guint32 u)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_uint (u));
-}
-
-
-/**
- * tp_message_set_uint64:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @u: an unsigned integer value
- *
- * Set @key in part @part of @self to have @u as an unsigned integer value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_uint64 (TpMessage *self,
- guint part,
- const gchar *key,
- guint64 u)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_uint64 (u));
-}
-
-
-/**
- * tp_message_set_string:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @s: a string value
- *
- * Set @key in part @part of @self to have @s as a string value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_string (TpMessage *self,
- guint part,
- const gchar *key,
- const gchar *s)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
- g_return_if_fail (s != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_string (s));
-}
-
-
-/**
- * tp_message_set_string_printf:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @fmt: a printf-style format string for the string value
- * @...: arguments for the format string
- *
- * Set @key in part @part of @self to have a string value constructed from a
- * printf-style format string.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_string_printf (TpMessage *self,
- guint part,
- const gchar *key,
- const gchar *fmt,
- ...)
-{
- va_list va;
- gchar *s;
-
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
- g_return_if_fail (fmt != NULL);
-
- va_start (va, fmt);
- s = g_strdup_vprintf (fmt, va);
- va_end (va);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_new_take_string (s));
-}
-
-
-/**
- * tp_message_set_bytes:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @len: a number of bytes
- * @bytes: an array of @len bytes
- *
- * Set @key in part @part of @self to have @bytes as a byte-array value.
- *
- * @since 0.7.21
- */
-void
-tp_message_set_bytes (TpMessage *self,
- guint part,
- const gchar *key,
- guint len,
- gconstpointer bytes)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
- g_return_if_fail (bytes != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key),
- tp_g_value_slice_new_bytes (len, bytes));
-}
-
-
-/**
- * tp_message_set:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @source: a value
- *
- * Set @key in part @part of @self to have a copy of @source as its value.
- *
- * If @source represents a data structure containing handles, they should
- * all be referenced with tp_message_ref_handle() first.
- *
- * @since 0.7.21
- */
-void
-tp_message_set (TpMessage *self,
- guint part,
- const gchar *key,
- const GValue *source)
-{
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
- g_return_if_fail (source != NULL);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key), tp_g_value_slice_dup (source));
-}
-
-
-/**
- * tp_message_take_message:
- * @self: a message
- * @part: a part number, which must be strictly less than the number
- * returned by tp_message_count_parts()
- * @key: a key in the mapping representing the part
- * @message: another (distinct) message created for the same #TpBaseConnection
- *
- * Set @key in part @part of @self to have @message as an aa{sv} value (that
- * is, an array of Message_Part), and take ownership of @message. The caller
- * should not use @message after passing it to this function. All handle
- * references owned by @message will subsequently belong to and be released
- * with @self.
- *
- * @since 0.7.21
- */
-void
-tp_message_take_message (TpMessage *self,
- guint part,
- const gchar *key,
- TpMessage *message)
-{
- guint i;
-
- g_return_if_fail (self != NULL);
- g_return_if_fail (part < self->parts->len);
- g_return_if_fail (key != NULL);
- g_return_if_fail (message != NULL);
- g_return_if_fail (self != message);
- g_return_if_fail (self->connection == message->connection);
-
- g_hash_table_insert (g_ptr_array_index (self->parts, part),
- g_strdup (key),
- tp_g_value_slice_new_take_boxed (TP_ARRAY_TYPE_MESSAGE_PART_LIST,
- message->parts));
-
- /* Now that @self has stolen @message's parts, replace them with a stub to
- * keep tp_message_destroy happy.
- */
- message->parts = g_ptr_array_sized_new (1);
- g_ptr_array_add (message->parts, g_hash_table_new_full (g_str_hash,
- g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free));
-
- for (i = 0; i < NUM_TP_HANDLE_TYPES; i++)
- {
- if (message->reffed_handles[i] != NULL)
- tp_message_ref_handles (self, i,
- tp_handle_set_peek (message->reffed_handles[i]));
- }
-
- tp_message_destroy (message);
-}
-
-
/**
* tp_message_mixin_get_offset_quark:
*