bool cmd_search_engine(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); jumanji_t* jumanji = (jumanji_t*) session->global.data; if (jumanji->global.search_engines == NULL) { return false; } if (girara_list_size(argument_list) < 2) { return false; } char* identifier = (char*) girara_list_nth(argument_list, 0); char* url = (char*) girara_list_nth(argument_list, 1); /* search for existing search engine */ if (girara_list_size(jumanji->global.search_engines) > 0) { girara_list_iterator_t* iter = girara_list_iterator(jumanji->global.search_engines); do { jumanji_search_engine_t* search_engine = (jumanji_search_engine_t*) girara_list_iterator_data(iter); if (search_engine == NULL) { continue; } if (!g_strcmp0(search_engine->identifier, identifier)) { g_free(search_engine->url); search_engine->url = g_strdup(url); return true; } } while (girara_list_iterator_next(iter)); girara_list_iterator_free(iter); } /* create new entry */ jumanji_search_engine_t* search_engine = malloc(sizeof(jumanji_search_engine_t)); if (search_engine == NULL) { return false; } search_engine->url = g_strdup(url); search_engine->identifier = g_strdup(identifier); girara_list_append(jumanji->global.search_engines, search_engine); return true; }
bool cmd_marks_delete(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = (zathura_t*) session->global.data; if (girara_list_size(argument_list) < 1) { return false; } if (girara_list_size(zathura->global.marks) == 0) { return false; } GIRARA_LIST_FOREACH(argument_list, char*, iter, key_string) if (key_string == NULL) { continue; } for (unsigned int i = 0; i < strlen(key_string); i++) { char key = key_string[i]; if (((key >= 0x41 && key <= 0x5A) || (key >= 0x61 && key <= 0x7A)) == false) { continue; } /* search for existing mark */ girara_list_iterator_t* mark_iter = girara_list_iterator(zathura->global.marks); do { zathura_mark_t* mark = (zathura_mark_t*) girara_list_iterator_data(mark_iter); if (mark == NULL) { continue; } if (mark->key == key) { girara_list_remove(zathura->global.marks, mark); continue; } } while (girara_list_iterator_next(mark_iter) != NULL); girara_list_iterator_free(mark_iter); } GIRARA_LIST_FOREACH_END(argument_list, char*, iter, key_string); return true; }
void zathura_plugin_manager_load(zathura_plugin_manager_t* plugin_manager) { if (plugin_manager == NULL || plugin_manager->path == NULL) { return; } GIRARA_LIST_FOREACH(plugin_manager->path, char*, iter, plugindir) /* read all files in the plugin directory */ GDir* dir = g_dir_open(plugindir, 0, NULL); if (dir == NULL) { girara_error("could not open plugin directory: %s", plugindir); girara_list_iterator_next(iter); continue; } char* name = NULL; while ((name = (char*) g_dir_read_name(dir)) != NULL) { char* path = g_build_filename(plugindir, name, NULL); if (g_file_test(path, G_FILE_TEST_IS_REGULAR) == 0) { girara_debug("%s is not a regular file. Skipping.", path); g_free(path); continue; } if (check_suffix(path) == false) { girara_debug("%s is not a plugin file. Skipping.", path); g_free(path); continue; } zathura_plugin_t* plugin = NULL; /* load plugin */ GModule* handle = g_module_open(path, G_MODULE_BIND_LOCAL); if (handle == NULL) { girara_error("could not load plugin %s (%s)", path, g_module_error()); g_free(path); continue; } /* resolve symbols and check API and ABI version*/ zathura_plugin_api_version_t api_version = NULL; if (g_module_symbol(handle, PLUGIN_API_VERSION_FUNCTION, (gpointer*) &api_version) == FALSE || api_version == NULL) { girara_error("could not find '%s' function in plugin %s", PLUGIN_API_VERSION_FUNCTION, path); g_free(path); g_module_close(handle); continue; } if (api_version() != ZATHURA_API_VERSION) { girara_error("plugin %s has been built againt zathura with a different API version (plugin: %d, zathura: %d)", path, api_version(), ZATHURA_API_VERSION); g_free(path); g_module_close(handle); continue; } zathura_plugin_abi_version_t abi_version = NULL; if (g_module_symbol(handle, PLUGIN_ABI_VERSION_FUNCTION, (gpointer*) &abi_version) == FALSE || abi_version == NULL) { girara_error("could not find '%s' function in plugin %s", PLUGIN_ABI_VERSION_FUNCTION, path); g_free(path); g_module_close(handle); continue; } if (abi_version() != ZATHURA_ABI_VERSION) { girara_error("plugin %s has been built againt zathura with a different ABI version (plugin: %d, zathura: %d)", path, abi_version(), ZATHURA_ABI_VERSION); g_free(path); g_module_close(handle); continue; } zathura_plugin_register_service_t register_service = NULL; if (g_module_symbol(handle, PLUGIN_REGISTER_FUNCTION, (gpointer*) ®ister_service) == FALSE || register_service == NULL) { girara_error("could not find '%s' function in plugin %s", PLUGIN_REGISTER_FUNCTION, path); g_free(path); g_module_close(handle); continue; } plugin = g_try_malloc0(sizeof(zathura_plugin_t)); if (plugin == NULL) { girara_error("Failed to allocate memory for plugin."); g_free(path); g_module_close(handle); continue; } plugin->content_types = girara_list_new2(g_free); plugin->handle = handle; register_service(plugin); /* register functions */ if (plugin->register_function == NULL) { girara_error("plugin has no document functions register function"); g_free(path); g_free(plugin); g_module_close(handle); continue; } plugin->register_function(&(plugin->functions)); plugin->path = path; bool ret = register_plugin(plugin_manager, plugin); if (ret == false) { girara_error("could not register plugin %s", path); zathura_plugin_free(plugin); } else { girara_debug("successfully loaded plugin %s", path); zathura_plugin_version_function_t plugin_major = NULL, plugin_minor = NULL, plugin_rev = NULL; g_module_symbol(handle, PLUGIN_VERSION_MAJOR_FUNCTION, (gpointer*) &plugin_major); g_module_symbol(handle, PLUGIN_VERSION_MINOR_FUNCTION, (gpointer*) &plugin_minor); g_module_symbol(handle, PLUGIN_VERSION_REVISION_FUNCTION, (gpointer*) &plugin_rev); if (plugin_major != NULL && plugin_minor != NULL && plugin_rev != NULL) { plugin->version.major = plugin_major(); plugin->version.minor = plugin_minor(); plugin->version.rev = plugin_rev(); girara_debug("plugin '%s': version %u.%u.%u", path, plugin->version.major, plugin->version.minor, plugin->version.rev); } } } g_dir_close(dir); GIRARA_LIST_FOREACH_END(zathura->plugins.path, char*, iter, plugindir); }
bool cmd_proxy(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); jumanji_t* jumanji = (jumanji_t*) session->global.data; if (jumanji->global.proxies == NULL) { return false; } unsigned int number_of_arguments = girara_list_size(argument_list); if (number_of_arguments < 1) { return false; } char* url = (char*) girara_list_nth(argument_list, 0); char* description = (number_of_arguments > 1) ? (char*) girara_list_nth(argument_list, 1) : NULL; if (url == NULL) { return false; } url = (strstr(url, "://") != NULL) ? g_strdup(url) : g_strconcat("http://", url, NULL); /* search for existing proxy */ if (girara_list_size(jumanji->global.proxies) > 0) { girara_list_iterator_t* iter = girara_list_iterator(jumanji->global.proxies); do { jumanji_proxy_t* proxy = (jumanji_proxy_t*) girara_list_iterator_data(iter); if (proxy == NULL) { continue; } if (!g_strcmp0(proxy->url, url)) { g_free(proxy->url); g_free(proxy->description); proxy->url = g_strdup(url); proxy->description = description ? g_strdup(description) : NULL; g_free(url); girara_list_iterator_free(iter); return true; } } while (girara_list_iterator_next(iter)); girara_list_iterator_free(iter); } /* create new entry */ jumanji_proxy_t* proxy = malloc(sizeof(jumanji_proxy_t)); if (proxy == NULL) { g_free(url); return false; } proxy->url = url; proxy->description = description != NULL ? g_strdup(description) : NULL; girara_list_append(jumanji->global.proxies, proxy); return true; }