Mercurial > pidgin.yaz
diff libpurple/mediamanager.c @ 26163:521366dfd8db
Implement functions to register and unregister media elements for use in
allowing plugins and GUIs to alter the pipeline.
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Tue, 03 Feb 2009 22:37:24 +0000 |
parents | 7be8c88d630c |
children | 0e8814c437b2 |
line wrap: on
line diff
--- a/libpurple/mediamanager.c Tue Feb 03 21:37:27 2009 +0000 +++ b/libpurple/mediamanager.c Tue Feb 03 22:37:24 2009 +0000 @@ -39,6 +39,7 @@ struct _PurpleMediaManagerPrivate { GList *medias; + GList *elements; }; #define PURPLE_MEDIA_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerPrivate)) @@ -123,6 +124,8 @@ g_list_delete_link(priv->medias, priv->medias)) { g_object_unref(priv->medias->data); } + for (; priv->elements; priv->elements = + g_list_delete_link(priv->elements, priv->elements)); parent_class->finalize(media); } @@ -225,4 +228,56 @@ return ret; } +PurpleMediaElementInfo * +purple_media_manager_get_element_info(PurpleMediaManager *manager, + const gchar *id) +{ + GList *iter; + + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL); + + iter = manager->priv->elements; + + for (; iter; iter = g_list_next(iter)) { + PurpleMediaElementInfo *info = iter->data; + if (!strcmp(info->id, id)) + return info; + } + + return NULL; +} + +gboolean +purple_media_manager_register_element(PurpleMediaManager *manager, + PurpleMediaElementInfo *info) +{ + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); + g_return_val_if_fail(info != NULL, FALSE); + + if (purple_media_manager_get_element_info(manager, info->id) != NULL) + return FALSE; + + manager->priv->elements = + g_list_prepend(manager->priv->elements, info); + return TRUE; +} + +gboolean +purple_media_manager_unregister_element(PurpleMediaManager *manager, + const gchar *id) +{ + PurpleMediaElementInfo *info; + + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); + + info = purple_media_manager_get_element_info(manager, id); + + if (info == NULL) + return FALSE; + + manager->priv->elements = g_list_remove( + manager->priv->elements, info); + return TRUE; +} + #endif /* USE_VV */