/*
 * Copyright (c) 2002, 2003, 2004 Jean-Yves Lefort
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include <string.h>
#include <glib/gi18n.h>
#include "sg-util.h"
#include "st-plugin.h"
#include "st-dialog-api.h"
#include "st-handler.h"
#include "st-handlers.h"
#include "st-bookmarks.h"
#include "st-preselections.h"

/*** variable declarations ***************************************************/

GSList *st_handlers_list = NULL;
GSList *st_handlers_full_list = NULL;

/*** API implementation ******************************************************/

/**
 * st_handlers_add:
 * @handler: a handler to add.
 *
 * Adds @handler to streamtuner. The reference count of @handler will
 * not be incremented.
 **/
void
st_handlers_add (STHandler *handler)
{
  GError *err = NULL;

  if (st_handler_validate(handler, &err))
    {
      st_handler_complete(handler);

      st_handlers_list = g_slist_append(st_handlers_list, handler);
      st_handlers_full_list = g_slist_append(st_handlers_full_list, handler);
    }
  else
    {
      if (st_plugin_current)
	st_error_dialog(_("A plugin error has occurred"),
			_("In %s, handler %s is malformed and cannot be registered (%s).\n"
			  "\n"
			  "You should report this problem to the plugin maintainer."),
			st_plugin_get_filename(st_plugin_current),
			st_handler_get_name(handler),
			err->message);
      else
	st_error_dialog(_("A handler error has occurred"),
			_("Handler %s is malformed and cannot be registered (%s).\n"
			  "\n"
			  "You should report this problem to the streamtuner maintainer."),
			st_handler_get_name(handler), err->message);

      g_error_free(err);
    }
}

/*** private implementation **************************************************/

void
st_handlers_load_static (void)
{
  st_bookmarks_init();
  st_preselections_init();
}

STHandler *
st_handlers_find_by_name (const char *name)
{
  GSList *l;

  g_return_val_if_fail(name != NULL, NULL);

  SG_LIST_FOREACH(l, st_handlers_list)
    if (! strcmp(st_handler_get_name(l->data), name))
      return l->data;

  return NULL;
}

void
st_handlers_reorder (GSList *ordered_list)
{
  GSList *l;

  SG_LIST_FOREACH(l, st_handlers_list)
    if (! g_slist_find(ordered_list, l->data))
      ordered_list = g_slist_append(ordered_list, l->data);

  g_slist_free(st_handlers_full_list);
  st_handlers_full_list = ordered_list;

  g_slist_free(st_handlers_list);
  st_handlers_list = NULL;

  SG_LIST_FOREACH(l, st_handlers_full_list)
    if (! st_handler_is_dummy(l->data))
      st_handlers_list = g_slist_append(st_handlers_list, l->data);
}
