/dev/twasilczyk/imgupload: 501ed6c0631e: Imgupload: initial impl...
Tomasz Wasilczyk
twasilczyk at pidgin.im
Mon May 19 04:01:36 EDT 2014
Changeset: 501ed6c0631eb8a0c7f047423f5d5d5883d538f0
Author: Tomasz Wasilczyk <twasilczyk at pidgin.im>
Date: 2014-05-19 10:01 +0200
Branch: default
URL: https://hg.pidgin.im/dev/twasilczyk/imgupload/rev/501ed6c0631e
Description:
Imgupload: initial implementation and basic hooks
diffstat:
libpurple/plugin.c | 21 ++++++
libpurple/plugin.h | 24 +++++++
pidgin/plugins/Makefile.am | 4 +
pidgin/plugins/imgupload.c | 140 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 189 insertions(+), 0 deletions(-)
diffs (265 lines):
diff --git a/libpurple/plugin.c b/libpurple/plugin.c
--- a/libpurple/plugin.c
+++ b/libpurple/plugin.c
@@ -184,12 +184,32 @@ purple_plugin_new(gboolean native, const
plugin->native_plugin = native;
plugin->path = g_strdup(path);
+ plugin->extra_data = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, NULL);
PURPLE_DBUS_REGISTER_POINTER(plugin, PurplePlugin);
return plugin;
}
+void
+purple_plugin_set_data(PurplePlugin *plugin, const gchar *key, gpointer value)
+{
+ g_return_if_fail(plugin != NULL);
+ g_return_if_fail(plugin->extra_data != NULL);
+
+ g_hash_table_insert(plugin->extra_data, g_strdup(key), value);
+}
+
+gpointer
+purple_plugin_get_data(PurplePlugin *plugin, const gchar *key)
+{
+ g_return_val_if_fail(plugin != NULL, NULL);
+ g_return_val_if_fail(plugin->extra_data != NULL, NULL);
+
+ return g_hash_table_lookup(plugin->extra_data, key);
+}
+
PurplePlugin *
purple_plugin_probe(const char *filename)
{
@@ -876,6 +896,7 @@ purple_plugin_destroy(PurplePlugin *plug
g_free(plugin->path);
g_free(plugin->error);
+ g_hash_table_destroy(plugin->extra_data);
PURPLE_DBUS_UNREGISTER_POINTER(plugin);
diff --git a/libpurple/plugin.h b/libpurple/plugin.h
--- a/libpurple/plugin.h
+++ b/libpurple/plugin.h
@@ -187,6 +187,7 @@ struct _PurplePlugin
gboolean unloadable;
GList *dependent_plugins;
gpointer ui_data;
+ GHashTable *extra_data;
/*< private >*/
void (*_purple_reserved1)(void);
@@ -297,6 +298,29 @@ GType purple_plugin_get_type(void);
PurplePlugin *purple_plugin_new(gboolean native, const char *path);
/**
+ * purple_plugin_set_data:
+ * @plugin: The plugin.
+ * @key: The data key.
+ * @value: The data to set.
+ *
+ * Sets extra data for particular plugin.
+ */
+void
+purple_plugin_set_data(PurplePlugin *plugin, const gchar *key, gpointer value);
+
+/**
+ * purple_plugin_get_data:
+ * @plugin: The plugin.
+ * @key: The data key.
+ *
+ * Gets extra data for particular plugin.
+ *
+ * Returns: data set previously with #purple_plugin_set_data.
+ */
+gpointer
+purple_plugin_get_data(PurplePlugin *plugin, const gchar *key);
+
+/**
* purple_plugin_probe:
* @filename: The plugin's filename.
*
diff --git a/pidgin/plugins/Makefile.am b/pidgin/plugins/Makefile.am
--- a/pidgin/plugins/Makefile.am
+++ b/pidgin/plugins/Makefile.am
@@ -43,6 +43,7 @@ gtk_signals_test_la_LDFLAGS = -module @P
gtkbuddynote_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
history_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
iconaway_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
+imgupload_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
markerline_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
notify_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
relnot_la_LDFLAGS = -module @PLUGIN_LDFLAGS@
@@ -61,6 +62,7 @@ plugin_LTLIBRARIES = \
gtkbuddynote.la \
history.la \
iconaway.la \
+ imgupload.la \
markerline.la \
notify.la \
relnot.la \
@@ -85,6 +87,7 @@ gtk_signals_test_la_SOURCES = gtk-signal
gtkbuddynote_la_SOURCES = gtkbuddynote.c
history_la_SOURCES = history.c
iconaway_la_SOURCES = iconaway.c
+imgupload_la_SOURCES = imgupload.c
markerline_la_SOURCES = markerline.c
notify_la_SOURCES = notify.c
relnot_la_SOURCES = relnot.c
@@ -102,6 +105,7 @@ gtk_signals_test_la_LIBADD = @PIDGIN_LI
gtkbuddynote_la_LIBADD = @PIDGIN_LIBS@
history_la_LIBADD = @PIDGIN_LIBS@
iconaway_la_LIBADD = @PIDGIN_LIBS@
+imgupload_la_LIBADD = @PIDGIN_LIBS@
markerline_la_LIBADD = @PIDGIN_LIBS@ $(WEBKIT_LIBS)
notify_la_LIBADD = @PIDGIN_LIBS@
relnot_la_LIBADD = @PIDGIN_LIBS@
diff --git a/pidgin/plugins/imgupload.c b/pidgin/plugins/imgupload.c
new file mode 100644
--- /dev/null
+++ b/pidgin/plugins/imgupload.c
@@ -0,0 +1,140 @@
+/*
+ * Image Upload - an inline images implementation for protocols without
+ * support for such feature.
+ *
+ * Copyright (C) 2014, Tomasz Wasilczyk <twasilczyk at pidgin.im>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ */
+
+#include "internal.h"
+
+#include "debug.h"
+#include "glibcompat.h"
+#include "version.h"
+
+#include "gtk3compat.h"
+#include "gtkconv.h"
+#include "gtkplugin.h"
+#include "gtkutils.h"
+#include "gtkwebviewtoolbar.h"
+#include "pidginstock.h"
+
+/******************************************************************************
+ *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ * Plugin setup
+ ******************************************************************************/
+
+static void
+imgup_prpl_init(PurplePlugin *prpl)
+{
+ PurplePluginProtocolInfo *prpl_info;
+
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+ if (prpl_info->options & OPT_PROTO_IM_IMAGE)
+ return;
+
+ purple_plugin_set_data(prpl, "imgupload-set", GINT_TO_POINTER(TRUE));
+ prpl_info->options |= OPT_PROTO_IM_IMAGE;
+}
+
+static void
+imgup_prpl_uninit(PurplePlugin *prpl)
+{
+ PurplePluginProtocolInfo *prpl_info;
+
+ if (!purple_plugin_get_data(prpl, "imgupload-set"))
+ return;
+
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+ prpl_info->options &= ~OPT_PROTO_IM_IMAGE;
+
+ purple_plugin_set_data(prpl, "imgupload-set", NULL);
+}
+
+static gboolean
+imgup_plugin_load(PurplePlugin *plugin)
+{
+ GList *it;
+
+ it = purple_plugins_get_protocols();
+ for (; it; it = g_list_next(it)) {
+ PurplePlugin *prpl = it->data;
+ imgup_prpl_init(prpl);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+imgup_plugin_unload(PurplePlugin *plugin)
+{
+ GList *it;
+
+ it = purple_plugins_get_protocols();
+ for (; it; it = g_list_next(it)) {
+ PurplePlugin *prpl = it->data;
+ imgup_prpl_uninit(prpl);
+ }
+
+ return TRUE;
+}
+
+static PurplePluginInfo imgup_info =
+{
+ PURPLE_PLUGIN_MAGIC,
+ PURPLE_MAJOR_VERSION,
+ PURPLE_MINOR_VERSION,
+ PURPLE_PLUGIN_STANDARD,
+ PIDGIN_PLUGIN_TYPE,
+ 0,
+ NULL,
+ PURPLE_PRIORITY_DEFAULT,
+ "gtk-imgupload",
+ N_("Image Upload"),
+ DISPLAY_VERSION,
+ N_("Inline images implementation for protocols without such feature."),
+ N_("Adds inline images support for protocols lacking this feature by "
+ "uploading them to the external service."),
+ "Tomasz Wasilczyk <twasilczyk at pidgin.im>",
+ PURPLE_WEBSITE,
+ imgup_plugin_load,
+ imgup_plugin_unload,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ /* padding */
+ NULL, NULL, NULL, NULL
+};
+
+static void
+imgup_init_plugin(PurplePlugin *plugin)
+{
+#if 0
+ purple_prefs_add_none("/plugins");
+ purple_prefs_add_none("/plugins/gtk");
+ purple_prefs_add_none("/plugins/gtk/imgupload");
+#endif
+}
+
+PURPLE_INIT_PLUGIN(imgupload, imgup_init_plugin, imgup_info)
More information about the Commits
mailing list