diff options
author | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-04-28 00:57:59 +0800 |
---|---|---|
committer | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-04-28 00:57:59 +0800 |
commit | 92172bae28e5fa2a91d87bc9e715c9bad01d888f (patch) | |
tree | 5ab52ee86f040652b5caa29bae94455b3ee51221 /libempathy | |
parent | 2430f28d4659fdfc428b0bdf89d774b0c7b9cdc6 (diff) | |
parent | 474cd4639af3a45919b69ae4a3cc637c376e90bd (diff) | |
download | gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar.gz gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar.bz2 gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar.lz gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar.xz gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.tar.zst gsoc2013-empathy-92172bae28e5fa2a91d87bc9e715c9bad01d888f.zip |
Merge remote-tracking branch 'pochu-public/log-window-619866' into empathy-skype
Conflicts:
libempathy-gtk/empathy-log-window.c
libempathy/empathy-message.c
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/Makefile.am | 2 | ||||
-rw-r--r-- | libempathy/action-chain-internal.h | 51 | ||||
-rw-r--r-- | libempathy/action-chain.c | 192 | ||||
-rw-r--r-- | libempathy/empathy-message.c | 43 |
4 files changed, 275 insertions, 13 deletions
diff --git a/libempathy/Makefile.am b/libempathy/Makefile.am index 95c561261..571980dd8 100644 --- a/libempathy/Makefile.am +++ b/libempathy/Makefile.am @@ -26,6 +26,7 @@ BUILT_SOURCES = \ noinst_LTLIBRARIES = libempathy.la libempathy_headers = \ + action-chain-internal.h \ empathy-account-settings.h \ empathy-auth-factory.h \ empathy-channel-factory.h \ @@ -67,6 +68,7 @@ libempathy_headers = \ libempathy_la_SOURCES = \ $(libempathy_headers) \ + action-chain.c \ empathy-account-settings.c \ empathy-auth-factory.c \ empathy-channel-factory.c \ diff --git a/libempathy/action-chain-internal.h b/libempathy/action-chain-internal.h new file mode 100644 index 000000000..14750c938 --- /dev/null +++ b/libempathy/action-chain-internal.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk> + */ + +#ifndef __TPL_ACTION_CHAIN_H__ +#define __TPL_ACTION_CHAIN_H__ + +#include <glib-object.h> +#include <gio/gio.h> + +typedef struct { + GQueue *chain; + GSimpleAsyncResult *simple; + gboolean running; +} TplActionChain; + +TplActionChain *_tpl_action_chain_new_async (GObject *obj, + GAsyncReadyCallback cb, + gpointer user_data); +void _tpl_action_chain_free (TplActionChain *self); +typedef void (*TplPendingAction) (TplActionChain *ctx, gpointer user_data); +void _tpl_action_chain_append (TplActionChain *self, TplPendingAction func, + gpointer user_data); +void _tpl_action_chain_prepend (TplActionChain *self, TplPendingAction func, + gpointer user_data); +void _tpl_action_chain_start (TplActionChain *self); +void _tpl_action_chain_continue (TplActionChain *self); +void _tpl_action_chain_terminate (TplActionChain *self, const GError *error); +void _tpl_action_chain_clear (TplActionChain *self); + +gpointer _tpl_action_chain_get_object (TplActionChain *self); +gboolean _tpl_action_chain_new_finish (GObject *source, + GAsyncResult *result, GError **error); + +#endif // __TPL_ACTION_CHAIN_H__ diff --git a/libempathy/action-chain.c b/libempathy/action-chain.c new file mode 100644 index 000000000..b6bf25ab9 --- /dev/null +++ b/libempathy/action-chain.c @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2009 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk> + */ + +#include "config.h" +#include "action-chain-internal.h" + +typedef struct { + TplPendingAction action; + gpointer user_data; +} TplActionLink; + + +TplActionChain * +_tpl_action_chain_new_async (GObject *obj, + GAsyncReadyCallback cb, + gpointer user_data) +{ + TplActionChain *ret = g_slice_new0 (TplActionChain); + + ret->chain = g_queue_new (); + ret->simple = g_simple_async_result_new (obj, cb, user_data, + _tpl_action_chain_new_async); + + g_object_set_data (G_OBJECT (ret->simple), "chain", ret); + + return ret; +} + + +static void +link_free (TplActionLink *l) +{ + g_slice_free (TplActionLink, l); +} + + +void +_tpl_action_chain_free (TplActionChain *self) +{ + g_queue_foreach (self->chain, (GFunc) link_free, NULL); + g_queue_free (self->chain); + g_object_unref (self->simple); + g_slice_free (TplActionChain, self); +} + + +gpointer // FIXME GObject * +_tpl_action_chain_get_object (TplActionChain *self) +{ + GObject *obj; + + g_return_val_if_fail (self != NULL && self->simple != NULL, NULL); + + obj = g_async_result_get_source_object (G_ASYNC_RESULT (self->simple)); + g_object_unref (obj); /* don't want the extra ref */ + + return obj; +} + + +void +_tpl_action_chain_prepend (TplActionChain *self, + TplPendingAction func, + gpointer user_data) +{ + TplActionLink *l; + + l = g_slice_new0 (TplActionLink); + l->action = func; + l->user_data = user_data; + + g_queue_push_head (self->chain, l); +} + + +void +_tpl_action_chain_append (TplActionChain *self, + TplPendingAction func, + gpointer user_data) +{ + TplActionLink *l; + + l = g_slice_new0 (TplActionLink); + l->action = func; + l->user_data = user_data; + + g_queue_push_tail (self->chain, l); +} + +void +_tpl_action_chain_start (TplActionChain *self) +{ + g_return_if_fail (!g_queue_is_empty (self->chain)); + + if (self->running) + return; + + _tpl_action_chain_continue (self); +} + +void +_tpl_action_chain_continue (TplActionChain *self) +{ + if (g_queue_is_empty (self->chain)) + { + self->running = FALSE; + g_simple_async_result_complete (self->simple); + } + else + { + TplActionLink *l = g_queue_pop_head (self->chain); + + self->running = TRUE; + l->action (self, l->user_data); + link_free (l); + if (g_queue_is_empty (self->chain)) + self->running = FALSE; + } +} + + +void +_tpl_action_chain_clear (TplActionChain *self) +{ + g_queue_foreach (self->chain, (GFunc) link_free, NULL); + g_queue_clear (self->chain); +} + +void +_tpl_action_chain_terminate (TplActionChain *self, + const GError *error) +{ + GSimpleAsyncResult *simple = self->simple; + + g_assert (error != NULL); + + g_simple_async_result_set_from_error (simple, error); + g_simple_async_result_complete (simple); +} + + +/** + * _tpl_action_chain_new_finish: + * @source: the #GObject pass to _tpl_action_chain_new_async() + * @result: the #GAsyncResult pass in callback + * @error: a pointer to a #GError that will be set on error, or NULL to ignore + * + * Get the result from running the action chain (%TRUE if the chain completed + * successfully, %FALSE with @error set if it was terminated). + * + * This function also frees the chain. + * + * Returns: %TRUE on success, %FALSE with @error set on error. + */ +gboolean +_tpl_action_chain_new_finish (GObject *source, + GAsyncResult *result, + GError **error) +{ + TplActionChain *chain; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, source, + _tpl_action_chain_new_async), FALSE); + + chain = g_object_get_data (G_OBJECT (result), "chain"); + + g_return_val_if_fail (chain != NULL, FALSE); + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), + error)) + return FALSE; + + _tpl_action_chain_free (chain); + return TRUE; +} diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index 076a10053..322fb2df9 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -26,6 +26,8 @@ #include <string.h> +#include <glib/gi18n-lib.h> + #include <telepathy-glib/util.h> #include <telepathy-glib/account.h> #include <telepathy-glib/account-manager.h> @@ -33,6 +35,7 @@ #include <telepathy-logger/entity.h> #include <telepathy-logger/event.h> #include <telepathy-logger/text-event.h> +#include <telepathy-logger/call-event.h> #include "empathy-message.h" #include "empathy-utils.h" @@ -302,19 +305,33 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) tpl_event_get_account_path (logevent)); g_object_unref (acc_man); - /* TODO Currently only TplTextEvent exists as subclass of TplEvent, in - * future more TplEvent will exist and EmpathyMessage should probably - * be enhanced to support other types of log entries (ie TplCallEvent). - * - * For now we just check (simply) that we are dealing with the only supported type, - * then there will be a if/then/else or switch handling all the supported - * cases. - */ - if (!TPL_IS_TEXT_EVENT (logevent)) - return NULL; - - body = g_strdup (tpl_text_event_get_message ( - TPL_TEXT_EVENT (logevent))); + if (TPL_IS_TEXT_EVENT (logevent)) { + body = g_strdup (tpl_text_event_get_message ( + TPL_TEXT_EVENT (logevent))); + + retval = empathy_message_new (body); + + empathy_message_set_tptype (retval, + tpl_text_event_get_message_type (TPL_TEXT_EVENT (logevent))); + empathy_message_set_is_backlog (retval, TRUE); + + g_free (body); + } else if (TPL_IS_CALL_EVENT (logevent)) { + TplCallEvent *call = TPL_CALL_EVENT (logevent); + if (tpl_call_event_get_end_reason (call) == TPL_CALL_END_REASON_NO_ANSWER) + body = g_strdup_printf (_("Missed call from %s"), + tpl_entity_get_alias (tpl_event_get_sender (logevent))); + else if (tpl_entity_get_entity_type (tpl_event_get_sender (logevent)) == TPL_ENTITY_SELF) + body = g_strdup_printf (_("Called %s"), + tpl_entity_get_alias (tpl_event_get_receiver (logevent))); + else + body = g_strdup_printf (_("Call from %s"), + tpl_entity_get_alias (tpl_event_get_sender (logevent))); + + retval = empathy_message_new (body); + g_free (body); + } + receiver = tpl_event_get_receiver (logevent); sender = tpl_event_get_sender (logevent); |