/soc/2015/igor.gajowiak/chatlog: d809626cdbb6: Implemented loggi...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: d809626cdbb64664cc934c8d72266ea9fff930b4 Author: Igor Gajowiak <[email protected]> Date: 2015-07-02 01:11 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/d809626cdbb6 Description: Implemented logging messages in a database. diffstat: libpurple/conversation.c | 2 + libpurple/core.c | 3 + libpurple/genericlog.c | 217 +++++++++++++++++++++++- libpurple/genericlog.h | 51 ++++- libpurple/plugins/log/Makefile.am | 8 + libpurple/plugins/log/logsqlite.c | 335 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 593 insertions(+), 23 deletions(-) diffs (truncated from 776 to 300 lines): diff --git a/libpurple/conversation.c b/libpurple/conversation.c --- a/libpurple/conversation.c +++ b/libpurple/conversation.c @@ -28,6 +28,7 @@ #include "dbus-maybe.h" #include "debug.h" #include "enums.h" +#include "genericlog.h" #include "notify.h" #include "prefs.h" #include "protocol.h" @@ -632,6 +633,7 @@ void ops->write_conv(conv, pmsg); } + purple_genericlog_logim(account, pmsg); add_message_to_history(conv, pmsg); purple_signal_emit(purple_conversations_get_handle(), diff --git a/libpurple/core.c b/libpurple/core.c --- a/libpurple/core.c +++ b/libpurple/core.c @@ -28,6 +28,7 @@ #include "debug.h" #include "dnsquery.h" #include "xfer.h" +#include "genericlog.h" #include "glibcompat.h" #include "http.h" #include "idle.h" @@ -175,6 +176,7 @@ purple_core_init(const char *ui) */ purple_plugins_init(); + purple_genericlog_init(); purple_keyring_init(); /* before accounts */ purple_theme_manager_init(); @@ -271,6 +273,7 @@ purple_core_quit(void) purple_statuses_uninit(); purple_accounts_uninit(); purple_keyring_uninit(); /* after accounts */ + purple_genericlog_uninit(); purple_sound_uninit(); purple_theme_manager_uninit(); purple_xfers_uninit(); diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c --- a/libpurple/genericlog.c +++ b/libpurple/genericlog.c @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include <string.h> + #include "genericlog.h" #define PURPLE_GENERICLOG_GET_PRIVATE(obj) \ @@ -41,23 +43,160 @@ enum static GObjectClass *parent_class; static GParamSpec *properties[PROP_LAST]; +static GList *purple_genericlogs = NULL; +static PurpleGenericLog *purple_genericlog_inuse = NULL; +static GList *purple_genericlog_loaded_plugins = NULL; + /**************************************************************************/ -/* API implementation +/* API implementation */ /**************************************************************************/ +PurpleGenericLog* +purple_genericlog_find_by_id(const gchar* id) +{ + GList *it; + for (it = purple_genericlogs; it != NULL; it = it->next) { + PurpleGenericLog *log = it->data; + const gchar *curr_id = purple_genericlog_get_id(log); + if (g_strcmp0(id, curr_id) == 0) + return log; + } + return NULL; +} + +PurpleGenericLog* +purple_genericlog_get_inuse() +{ + return purple_genericlog_inuse; +} + +const gchar* +purple_genericlog_get_name(const PurpleGenericLog* log) +{ + PurpleGenericLogPrivate *log_priv = PURPLE_GENERICLOG_GET_PRIVATE(log); + return log_priv->name; +} + +const gchar* +purple_genericlog_get_id(const PurpleGenericLog* log) +{ + PurpleGenericLogPrivate *p_log = PURPLE_GENERICLOG_GET_PRIVATE(log); + return p_log->id; +} + +void +purple_genericlog_register(PurpleGenericLog* log) +{ + const gchar *id = NULL; + id = purple_genericlog_get_id(log); + + g_return_if_fail(id != NULL); + + if(purple_genericlog_find_by_id(id) != NULL) { + purple_debug_info("genericlog", "logger is already registered"); + return; + } + + g_object_ref(log); + purple_genericlogs = g_list_prepend(purple_genericlogs, log); +} + +void +purple_genericlog_unregister(PurpleGenericLog* log) +{ + PurpleGenericLog *fallback; + + g_return_if_fail(log != NULL); + + GList* log_node = g_list_find(purple_genericlogs, log); + + g_return_if_fail(log_node != NULL); + + fallback = purple_genericlog_find_by_id(PURPLE_GENERICLOG_DEFAULT); + + if (purple_genericlog_inuse == log) { + if (purple_genericlog_inuse != fallback) { + purple_genericlog_set_active_log(PURPLE_GENERICLOG_DEFAULT); + } else { + purple_debug_error("genericlog", "unable to unregister the default log"); + return; + } + } + + g_object_unref(log); + purple_genericlogs = g_list_delete_link(purple_genericlogs, log_node); +} + +GError* +purple_genericlog_set_active_log(const gchar* id) +{ + GError *error = NULL; + PurpleGenericLog *log = purple_genericlog_find_by_id(id); + + if(!log) { + return g_error_new(purple_genericlog_error_domain(), + PURPLE_GENERICLOG_ERROR_NOLOG, "log does not exist"); + } + + if(purple_genericlog_inuse) { + if(strcmp(id, purple_genericlog_get_id(purple_genericlog_inuse)) == 0) { + purple_debug_info("genericlog", "log is already active"); + return NULL; + } + else { + PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse); + error = klass->deactivate(); + if(error) + return error; + + g_object_unref(purple_genericlog_inuse); + purple_genericlog_inuse = NULL; + } + } + + g_assert(purple_genericlog_inuse == NULL); + + PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(log); + error = klass->activate(); + // TODO: should we activate previous log if this fails? + if (error) + return error; + + purple_genericlog_inuse = log; + g_object_ref(purple_genericlog_inuse); + + return NULL; +} + +GError* +purple_genericlog_logim(PurpleAccount *account, PurpleMessage *msg) +{ + PurpleGenericLogClass *klass = + PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse); + return klass->log_im(account, msg); +} + +GError* +purple_genericlog_mark_as_read(PurpleMessage* msg) +{ + PurpleGenericLogClass *klass = + PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse); + return klass->mark_as_read(msg); +} /**************************************************************************/ -/* Error Codes +/* Error Codes */ /**************************************************************************/ -GQuark purple_genericlog_error_domain(void) +GQuark +purple_genericlog_error_domain(void) { return g_quark_from_static_string("libpurple generic log"); } /**************************************************************************/ -/* GObject stuff +/* GObject stuff */ /**************************************************************************/ static void @@ -127,8 +266,9 @@ purple_genericlog_class_init(PurpleGener */ klass->log_im = NULL; klass->mark_as_read = NULL; - klass->get_conversations = NULL; klass->get_messages = NULL; + klass->activate = NULL; + klass->deactivate = NULL; klass->reserved1 = NULL; klass->reserved2 = NULL; @@ -163,7 +303,7 @@ GType purple_genericlog_get_type(void) static const GTypeInfo info = { .class_size = sizeof(PurpleGenericLogClass), .class_init = (GClassInitFunc)purple_genericlog_class_init, - .instance_size = sizeof(PurpleMessage), + .instance_size = sizeof(PurpleGenericLog), .instance_init = purple_genericlog_instance_init, }; @@ -174,23 +314,76 @@ GType purple_genericlog_get_type(void) } /**************************************************************************/ -/* Log Subsystem +/* Log Subsystem */ /**************************************************************************/ void -purple_logng_init(void) +purple_genericlog_init(void) { - // TODO: implement this + GList *plugins, *it; + + plugins = purple_plugins_find_all(); + for (it = plugins; it != NULL; it = it->next) { + PurplePlugin *plugin = PURPLE_PLUGIN(it->data); + PurplePluginInfo *info = purple_plugin_get_info(plugin); + + if (strncmp(purple_plugin_info_get_id(info), "genericlog-", 11) != 0) + continue; + + if (purple_plugin_load(plugin, NULL)) { + g_object_ref(plugin); + purple_genericlog_loaded_plugins = g_list_prepend( + purple_genericlog_loaded_plugins, plugin); + } + } + g_list_free(plugins); + + GError *error = purple_genericlog_set_active_log(PURPLE_GENERICLOG_DEFAULT); + + if(error) { + purple_debug_error("genericlog", "setting active log failed"); + g_error_free(error); + } } void -purple_logng_uninit(void) +purple_genericlog_uninit(void) { - // TODO: implement this + GList *it; + + if (purple_genericlog_inuse) { + PurpleGenericLogClass *klass = + PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse); + klass->deactivate(); + + g_object_unref(purple_genericlog_inuse); + purple_genericlog_inuse = NULL; + } + + for (it = g_list_first(purple_genericlogs); it != NULL; + it = g_list_next(it)) _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits