Mercurial > pidgin
comparison libpurple/plugin.c @ 21187:a8332645ce5b
Honor the return value of a plugin's unload function.
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Sat, 06 Oct 2007 22:43:55 +0000 |
| parents | df58938e9f61 |
| children | a06ddc1513e2 |
comparison
equal
deleted
inserted
replaced
| 20743:c757b4773a77 | 21187:a8332645ce5b |
|---|---|
| 641 gboolean | 641 gboolean |
| 642 purple_plugin_unload(PurplePlugin *plugin) | 642 purple_plugin_unload(PurplePlugin *plugin) |
| 643 { | 643 { |
| 644 #ifdef PURPLE_PLUGINS | 644 #ifdef PURPLE_PLUGINS |
| 645 GList *l; | 645 GList *l; |
| 646 GList *ll; | |
| 646 | 647 |
| 647 g_return_val_if_fail(plugin != NULL, FALSE); | 648 g_return_val_if_fail(plugin != NULL, FALSE); |
| 648 | |
| 649 loaded_plugins = g_list_remove(loaded_plugins, plugin); | |
| 650 if ((plugin->info != NULL) && PURPLE_IS_PROTOCOL_PLUGIN(plugin)) | |
| 651 protocol_plugins = g_list_remove(protocol_plugins, plugin); | |
| 652 | |
| 653 g_return_val_if_fail(purple_plugin_is_loaded(plugin), FALSE); | 649 g_return_val_if_fail(purple_plugin_is_loaded(plugin), FALSE); |
| 654 | 650 |
| 655 purple_debug_info("plugins", "Unloading plugin %s\n", plugin->info->name); | 651 purple_debug_info("plugins", "Unloading plugin %s\n", plugin->info->name); |
| 656 | 652 |
| 657 /* cancel any pending dialogs the plugin has */ | |
| 658 purple_request_close_with_handle(plugin); | |
| 659 purple_notify_close_with_handle(plugin); | |
| 660 | |
| 661 plugin->loaded = FALSE; | |
| 662 | |
| 663 /* Unload all plugins that depend on this plugin. */ | 653 /* Unload all plugins that depend on this plugin. */ |
| 664 while ((l = plugin->dependent_plugins) != NULL) | 654 for (l = plugin->dependent_plugins, l != NULL, l = ll) { |
| 665 { | |
| 666 const char * dep_name = (const char *)l->data; | 655 const char * dep_name = (const char *)l->data; |
| 667 PurplePlugin *dep_plugin; | 656 PurplePlugin *dep_plugin; |
| 657 | |
| 658 /* Store a pointer to the next element in the list. | |
| 659 * This is because we'll be modifying this list in the loop. */ | |
| 660 ll = l->next; | |
| 668 | 661 |
| 669 dep_plugin = purple_plugins_find_with_id(dep_name); | 662 dep_plugin = purple_plugins_find_with_id(dep_name); |
| 670 | 663 |
| 671 if (dep_plugin != NULL && purple_plugin_is_loaded(dep_plugin)) | 664 if (dep_plugin != NULL && purple_plugin_is_loaded(dep_plugin)) |
| 672 { | 665 { |
| 676 | 669 |
| 677 tmp = g_strdup_printf(_("The dependent plugin %s failed to unload."), | 670 tmp = g_strdup_printf(_("The dependent plugin %s failed to unload."), |
| 678 _(dep_plugin->info->name)); | 671 _(dep_plugin->info->name)); |
| 679 | 672 |
| 680 purple_notify_error(NULL, NULL, | 673 purple_notify_error(NULL, NULL, |
| 681 _("There were errors unloading the plugin."), tmp); | 674 _("There were errors unloading the plugin."), tmp); |
| 682 g_free(tmp); | 675 g_free(tmp); |
| 676 | |
| 677 return FALSE; | |
| 683 } | 678 } |
| 684 } | 679 else |
| 685 } | 680 { |
| 686 | 681 plugin->dependent_plugins = g_list_remove(plugin->dependent_plugins, dep_name); |
| 687 /* Remove this plugin from each dependency's dependent_plugins list. */ | 682 } |
| 688 for (l = plugin->info->dependencies; l != NULL; l = l->next) | 683 } |
| 689 { | |
| 690 const char *dep_name = (const char *)l->data; | |
| 691 PurplePlugin *dependency; | |
| 692 | |
| 693 dependency = purple_plugins_find_with_id(dep_name); | |
| 694 | |
| 695 if (dependency != NULL) | |
| 696 dependency->dependent_plugins = g_list_remove(dependency->dependent_plugins, plugin->info->id); | |
| 697 else | |
| 698 purple_debug_error("plugins", "Unable to remove from dependency list for %s\n", dep_name); | |
| 699 } | 684 } |
| 700 | 685 |
| 701 if (plugin->native_plugin) { | 686 if (plugin->native_plugin) { |
| 702 if (plugin->info->unload != NULL) | 687 if (plugin->info->unload != NULL) |
| 703 plugin->info->unload(plugin); | 688 if (!plugin->info->unload(plugin)) |
| 689 return FALSE; | |
| 704 | 690 |
| 705 if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL) { | 691 if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL) { |
| 706 PurplePluginProtocolInfo *prpl_info; | 692 PurplePluginProtocolInfo *prpl_info; |
| 707 GList *l; | 693 GList *l; |
| 708 | 694 |
| 722 if (prpl_info->protocol_options != NULL) { | 708 if (prpl_info->protocol_options != NULL) { |
| 723 g_list_free(prpl_info->protocol_options); | 709 g_list_free(prpl_info->protocol_options); |
| 724 prpl_info->protocol_options = NULL; | 710 prpl_info->protocol_options = NULL; |
| 725 } | 711 } |
| 726 } | 712 } |
| 727 } | 713 } else { |
| 728 else { | |
| 729 PurplePlugin *loader; | 714 PurplePlugin *loader; |
| 730 PurplePluginLoaderInfo *loader_info; | 715 PurplePluginLoaderInfo *loader_info; |
| 731 | 716 |
| 732 loader = find_loader_for_plugin(plugin); | 717 loader = find_loader_for_plugin(plugin); |
| 733 | 718 |
| 735 return FALSE; | 720 return FALSE; |
| 736 | 721 |
| 737 loader_info = PURPLE_PLUGIN_LOADER_INFO(loader); | 722 loader_info = PURPLE_PLUGIN_LOADER_INFO(loader); |
| 738 | 723 |
| 739 if (loader_info->unload != NULL) | 724 if (loader_info->unload != NULL) |
| 740 loader_info->unload(plugin); | 725 if (!loader_info->unload(plugin)) |
| 741 } | 726 return FALSE; |
| 727 } | |
| 728 | |
| 729 /* cancel any pending dialogs the plugin has */ | |
| 730 purple_request_close_with_handle(plugin); | |
| 731 purple_notify_close_with_handle(plugin); | |
| 742 | 732 |
| 743 purple_signals_disconnect_by_handle(plugin); | 733 purple_signals_disconnect_by_handle(plugin); |
| 744 purple_plugin_ipc_unregister_all(plugin); | 734 purple_plugin_ipc_unregister_all(plugin); |
| 735 | |
| 736 loaded_plugins = g_list_remove(loaded_plugins, plugin); | |
| 737 if ((plugin->info != NULL) && PURPLE_IS_PROTOCOL_PLUGIN(plugin)) | |
| 738 protocol_plugins = g_list_remove(protocol_plugins, plugin); | |
| 739 plugin->loaded = FALSE; | |
| 745 | 740 |
| 746 /* TODO */ | 741 /* TODO */ |
| 747 if (unload_cb != NULL) | 742 if (unload_cb != NULL) |
| 748 unload_cb(plugin, unload_cb_data); | 743 unload_cb(plugin, unload_cb_data); |
| 749 | 744 |
| 1389 } | 1384 } |
| 1390 } | 1385 } |
| 1391 | 1386 |
| 1392 if (probe_cb != NULL) | 1387 if (probe_cb != NULL) |
| 1393 probe_cb(probe_cb_data); | 1388 probe_cb(probe_cb_data); |
| 1389 | |
| 1394 #endif /* PURPLE_PLUGINS */ | 1390 #endif /* PURPLE_PLUGINS */ |
| 1395 } | 1391 } |
| 1396 | 1392 |
| 1397 gboolean | 1393 gboolean |
| 1398 purple_plugin_register(PurplePlugin *plugin) | 1394 purple_plugin_register(PurplePlugin *plugin) |
