Blame src/grilo.c

Packit 67b98c
/*
Packit 67b98c
 * Copyright (C) 2010, 2011 Igalia S.L.
Packit 67b98c
 *
Packit 67b98c
 * Contact: Iago Toral Quiroga <itoral@igalia.com>
Packit 67b98c
 *
Packit 67b98c
 * This library is free software; you can redistribute it and/or
Packit 67b98c
 * modify it under the terms of the GNU Lesser General Public License
Packit 67b98c
 * as published by the Free Software Foundation; version 2.1 of
Packit 67b98c
 * the License, or (at your option) any later version.
Packit 67b98c
 *
Packit 67b98c
 * This library is distributed in the hope that it will be useful, but
Packit 67b98c
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67b98c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit 67b98c
 * Lesser General Public License for more details.
Packit 67b98c
 *
Packit 67b98c
 * You should have received a copy of the GNU Lesser General Public
Packit 67b98c
 * License along with this library; if not, write to the Free Software
Packit 67b98c
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
Packit 67b98c
 * 02110-1301 USA
Packit 67b98c
 *
Packit 67b98c
 */
Packit 67b98c
Packit 67b98c
/**
Packit 67b98c
 * SECTION:grilo
Packit 67b98c
 * @short_description: Metadata library supporting several services
Packit 67b98c
 *
Packit 67b98c
 * Grilo is a metadata retrieval library. Given a search or browse operation,
Packit 67b98c
 * the library will retrieve a set of metadata related to the operation from a
Packit 67b98c
 * set of on-line services.
Packit 67b98c
 *
Packit 67b98c
 * The Grilo library should be initialized with grl_init() before it can be used.
Packit 67b98c
 * You should pass pointers to the main argc and argv variables so that Grilo can
Packit 67b98c
 * process its own command line options.
Packit 67b98c
 *
Packit 67b98c
 * After using it, in order to close cleanly all the resources opened either by
Packit 67b98c
 * the core library or the sources, call grl_deinit().
Packit 67b98c
 */
Packit 67b98c
Packit 67b98c
#include "grilo.h"
Packit 67b98c
#include "grl-metadata-key-priv.h"
Packit 67b98c
#include "grl-operation-priv.h"
Packit 67b98c
#include "grl-registry-priv.h"
Packit 67b98c
#include "grl-log-priv.h"
Packit 67b98c
#include "config.h"
Packit 67b98c
Packit 67b98c
#include <glib/gi18n-lib.h>
Packit 67b98c
Packit 67b98c
static gboolean grl_initialized = FALSE;
Packit 67b98c
static const gchar *plugin_path = NULL;
Packit 67b98c
static const gchar *plugin_list = NULL;
Packit 67b98c
Packit 67b98c
static const gchar *
Packit 67b98c
get_default_plugin_dir (void)
Packit 67b98c
{
Packit 67b98c
#ifdef G_OS_WIN32
Packit 67b98c
  static gchar *plugin_dir = NULL;
Packit 67b98c
  gchar *run_directory;
Packit 67b98c
Packit 67b98c
  if (plugin_dir)
Packit 67b98c
    return plugin_dir;
Packit 67b98c
Packit 67b98c
  run_directory = g_win32_get_package_installation_directory_of_module (NULL);
Packit 67b98c
  plugin_dir = g_build_filename (run_directory,
Packit 67b98c
                                 "lib", GRL_NAME,
Packit 67b98c
                                 NULL);
Packit 67b98c
  g_free (run_directory);
Packit 67b98c
  return plugin_dir;
Packit 67b98c
#else
Packit 67b98c
  return GRL_PLUGINS_DIR;
Packit 67b98c
#endif
Packit 67b98c
}
Packit 67b98c
Packit 67b98c
static gboolean
Packit 67b98c
pre_parse_hook_cb (GOptionContext  *context,
Packit 67b98c
                   GOptionGroup    *group,
Packit 67b98c
                   gpointer         data,
Packit 67b98c
                   GError         **error)
Packit 67b98c
{
Packit 67b98c
  /* Initialize i18n */
Packit 67b98c
  bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
Packit 67b98c
  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
Packit 67b98c
Packit 67b98c
  /* Initialize operations */
Packit 67b98c
  grl_operation_init ();
Packit 67b98c
Packit 67b98c
  return TRUE;
Packit 67b98c
}
Packit 67b98c
Packit 67b98c
static gboolean
Packit 67b98c
post_parse_hook_cb (GOptionContext  *context,
Packit 67b98c
                    GOptionGroup    *group,
Packit 67b98c
                    gpointer         data,
Packit 67b98c
                    GError         **error)
Packit 67b98c
{
Packit 67b98c
  GrlRegistry *registry;
Packit 67b98c
  gchar **split_element;
Packit 67b98c
  gchar **split_list;
Packit 67b98c
Packit 67b98c
  /* Initialize GModule */
Packit 67b98c
  if (!g_module_supported ()) {
Packit 67b98c
    GRL_ERROR ("GModule not supported in this system");
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  /* Setup core log domains */
Packit 67b98c
  _grl_log_init_core_domains ();
Packit 67b98c
Packit 67b98c
  /* Register default metadata keys */
Packit 67b98c
  registry = grl_registry_get_default ();
Packit 67b98c
  grl_metadata_key_setup_system_keys (registry);
Packit 67b98c
Packit 67b98c
  /* Set default plugin directories */
Packit 67b98c
  if (!plugin_path) {
Packit 67b98c
    plugin_path = g_getenv (GRL_PLUGIN_PATH_VAR);
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  if (!plugin_path) {
Packit 67b98c
    plugin_path = get_default_plugin_dir ();
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  split_list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0);
Packit 67b98c
  for (split_element = split_list; *split_element; split_element++) {
Packit 67b98c
    grl_registry_add_directory (registry, *split_element);
Packit 67b98c
  }
Packit 67b98c
  g_strfreev (split_list);
Packit 67b98c
Packit 67b98c
  /* Restrict plugins to load */
Packit 67b98c
  if (!plugin_list) {
Packit 67b98c
    plugin_list = g_getenv (GRL_PLUGIN_LIST_VAR);
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  if (plugin_list) {
Packit 67b98c
    split_list = g_strsplit (plugin_list, ":", 0);
Packit 67b98c
    grl_registry_restrict_plugins (registry, split_list);
Packit 67b98c
    g_strfreev (split_list);
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  grl_initialized = TRUE;
Packit 67b98c
Packit 67b98c
  return TRUE;
Packit 67b98c
}
Packit 67b98c
Packit 67b98c
/**
Packit 67b98c
 * grl_init:
Packit 67b98c
 * @argc: (inout) (allow-none): number of input arguments, length of @argv
Packit 67b98c
 * @argv: (inout) (element-type utf8) (array length=argc) (allow-none) (transfer none): list of arguments
Packit 67b98c
 *
Packit 67b98c
 * Initializes the Grilo library
Packit 67b98c
 *
Packit 67b98c
 * Since: 0.1.6
Packit 67b98c
 */
Packit 67b98c
void
Packit 67b98c
grl_init (gint *argc,
Packit 67b98c
          gchar **argv[])
Packit 67b98c
{
Packit 67b98c
  GOptionContext *ctx;
Packit 67b98c
  GOptionGroup *group;
Packit 67b98c
Packit 67b98c
  if (grl_initialized) {
Packit 67b98c
    GRL_DEBUG ("already initialized grl");
Packit 67b98c
    return;
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  /* Check options */
Packit 67b98c
  ctx = g_option_context_new ("- Grilo initialization");
Packit 67b98c
  g_option_context_set_ignore_unknown_options (ctx, TRUE);
Packit 67b98c
  group = grl_init_get_option_group ();
Packit 67b98c
  g_option_context_add_group (ctx, group);
Packit 67b98c
  g_option_context_parse (ctx, argc, argv, NULL);
Packit 67b98c
  g_option_context_free (ctx);
Packit 67b98c
}
Packit 67b98c
Packit 67b98c
/**
Packit 67b98c
 * grl_deinit:
Packit 67b98c
 *
Packit 67b98c
 * Deinitializes the Grilo library.
Packit 67b98c
 *
Packit 67b98c
 * Call this function after finalizing using Grilo, in order to free and clean
Packit 67b98c
 * up all the resources created.
Packit 67b98c
 *
Packit 67b98c
 * Since: 0.2.8
Packit 67b98c
 */
Packit 67b98c
void
Packit 67b98c
grl_deinit (void)
Packit 67b98c
{
Packit 67b98c
  GrlRegistry *registry;
Packit 67b98c
Packit 67b98c
  if (!grl_initialized) {
Packit 67b98c
    GRL_WARNING ("Grilo has not been initialized");
Packit 67b98c
    return;
Packit 67b98c
  }
Packit 67b98c
Packit 67b98c
  registry = grl_registry_get_default ();
Packit 67b98c
  grl_registry_shutdown (registry);
Packit 67b98c
  grl_initialized = FALSE;
Packit 67b98c
}
Packit 67b98c
Packit 67b98c
/**
Packit 67b98c
 * grl_init_get_option_group:
Packit 67b98c
 *
Packit 67b98c
 * Returns a #GOptionGroup with Grilo's argument specifications.
Packit 67b98c
 *
Packit 67b98c
 * This function is useful if you want to integrate Grilo with other
Packit 67b98c
 * libraries that use the GOption commandline parser
Packit 67b98c
 * (see g_option_context_add_group() ).
Packit 67b98c
 *
Packit 67b98c
 * Returns: a pointer to Grilo's option group. Should be dereferenced
Packit 67b98c
 * after use.
Packit 67b98c
 *
Packit 67b98c
 * Since: 0.1.6
Packit 67b98c
 */
Packit 67b98c
GOptionGroup *
Packit 67b98c
grl_init_get_option_group (void)
Packit 67b98c
{
Packit 67b98c
  GOptionGroup *group;
Packit 67b98c
  static const GOptionEntry grl_args[] = {
Packit 67b98c
    { "grl-plugin-path", 0, 0, G_OPTION_ARG_STRING, &plugin_path,
Packit 67b98c
#ifdef G_OS_WIN32
Packit 67b98c
      N_("Semicolon-separated paths containing Grilo plugins"), NULL },
Packit 67b98c
#else
Packit 67b98c
      N_("Colon-separated paths containing Grilo plugins"), NULL },
Packit 67b98c
#endif
Packit 67b98c
    { "grl-plugin-use", 0, 0, G_OPTION_ARG_STRING, &plugin_list,
Packit 67b98c
      N_("Colon-separated list of Grilo plugins to use"), NULL },
Packit 67b98c
    { NULL }
Packit 67b98c
  };
Packit 67b98c
Packit 67b98c
  group = g_option_group_new ("grl",
Packit 67b98c
                              _("Grilo Options"),
Packit 67b98c
                              _("Show Grilo Options"),
Packit 67b98c
                              NULL,
Packit 67b98c
                              NULL);
Packit 67b98c
  g_option_group_add_entries (group, grl_args);
Packit 67b98c
  g_option_group_set_parse_hooks (group, pre_parse_hook_cb, post_parse_hook_cb);
Packit 67b98c
Packit 67b98c
  return group;
Packit 67b98c
}