st-bookmarks.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 702 行 · 第 1/2 页

C
702
字号
/* * Copyright (c) 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 <gtk/gtk.h>#include "sg-util.h"#include "sgtk-util.h"#include "st-handler.h"#include "st-handlers.h"#include "st-handler-field.h"#include "st-stream-store.h"#include "st-util.h"#include "st-util-api.h"/*** cpp *********************************************************************/#define ST_BOOKMARKS_STREAM(bag) \  ((STBookmarksStream *) ST_STREAM((bag)))/*** type definitions ********************************************************/typedef struct{  STStream	stream;  char		*handler_name;  STHandler	*handler;  STStreamBag	*stream_bag;  GdkPixbuf	*handler_icon;  char		*name;  char		*genre;  char		*description;} STBookmarksStream;enum {  FIELD_HANDLER_NAME,  FIELD_STREAM_BAG,  FIELD_HANDLER_ICON,  FIELD_HANDLER_LABEL,  FIELD_NAME,  FIELD_GENRE,  FIELD_DESCRIPTION,  FIELD_HOMEPAGE,  FIELD_URI_LIST};typedef struct{  STStreamBag	*bag;  gboolean	taken;} MakeUniqueInfo;/*** variable declarations ***************************************************/STHandler *st_bookmarks_handler = NULL;/*** function declarations ***************************************************/static STBookmarksStream *st_bookmarks_stream_new_cb (gpointer data);static void st_bookmarks_stream_set_handler (STBookmarksStream *stream,					     STHandler *handler);static void st_bookmarks_stream_field_get_cb (STBookmarksStream *stream,					      STHandlerField *field,					      GValue *value,					      gpointer data);static void st_bookmarks_stream_field_set_cb (STBookmarksStream *stream,					      STHandlerField *field,					      const GValue *value,					      gpointer data);static void st_bookmarks_stream_stock_field_get_cb (STBookmarksStream *stream,						    STHandlerStockField stock_field,						    GValue *value,						    gpointer data);static gboolean st_bookmarks_stream_modify_cb (STBookmarksStream *stream,					       GSList *fields,					       GSList *values,					       gpointer data,					       GError **err);static gboolean st_bookmarks_stream_delete_cb (STBookmarksStream *stream,					       gpointer data,					       GError **err);static void st_bookmarks_stream_free_cb (STBookmarksStream *stream,					 gpointer data);static GValueArray *st_bookmarks_value_array_new (STStreamBag *stream_bag);static STStreamBag *st_bookmarks_stream_new (STHandler *handler,					     GValueArray *value_array);static gboolean st_bookmarks_stream_tune_in_cb (STBookmarksStream *stream,						gpointer data,						GError **err);static gboolean st_bookmarks_stream_record_cb (STBookmarksStream *stream,					       gpointer data,					       GError **err);static gboolean st_bookmarks_stream_browse_cb (STBookmarksStream *stream,					       gpointer data,					       GError **err);static void st_bookmarks_make_unique_name (STStreamBag *bag,					   STStreamStore *bookmarks);static gboolean st_bookmarks_make_unique_name_cb (STStreamStore *store,						  STStreamBag *bag,						  gpointer data);/*** implementation **********************************************************/static STBookmarksStream *st_bookmarks_stream_new_cb (gpointer data){  return g_new0(STBookmarksStream, 1);}static voidst_bookmarks_stream_set_handler (STBookmarksStream *stream, STHandler *handler){  g_return_if_fail(stream != NULL);  stream->handler = handler;  if (stream->handler)    {      GdkPixbuf *pixbuf;      pixbuf = st_handler_get_pixbuf(stream->handler);      if (pixbuf)	stream->handler_icon = sgtk_pixbuf_scale(pixbuf, GTK_ICON_SIZE_MENU);    }}static voidst_bookmarks_stream_field_get_cb (STBookmarksStream *stream,				  STHandlerField *field,				  GValue *value,				  gpointer data){  switch (field->id)    {    case FIELD_HANDLER_NAME:      g_value_set_string(value, stream->handler ? st_handler_get_name(stream->handler) : NULL);      break;          case FIELD_STREAM_BAG:      {	GValueArray *value_array;	value_array = st_bookmarks_value_array_new(stream->stream_bag);	g_value_take_boxed(value, value_array);	break;      }    case FIELD_HANDLER_ICON:      g_value_set_object(value, stream->handler_icon);      break;          case FIELD_HANDLER_LABEL:      g_value_set_string(value, stream->handler ? st_handler_get_label(stream->handler) : stream->handler_name);      break;    case FIELD_NAME:      g_value_set_string(value, stream->name);      break;    case FIELD_GENRE:      g_value_set_string(value, stream->genre);      break;    case FIELD_DESCRIPTION:      g_value_set_string(value, stream->description);      break;    case FIELD_HOMEPAGE:      if (stream->stream_bag)	st_stream_bag_get_stock_field_initialized(stream->stream_bag, ST_HANDLER_STOCK_FIELD_HOMEPAGE, value);      break;    case FIELD_URI_LIST:      if (stream->stream_bag)	st_stream_bag_get_stock_field_initialized(stream->stream_bag, ST_HANDLER_STOCK_FIELD_URI_LIST, value);      break;    default:      g_return_if_reached();    }}static voidst_bookmarks_stream_field_set_cb (STBookmarksStream *stream,				  STHandlerField *field,				  const GValue *value,				  gpointer data){  switch (field->id)    {    case FIELD_HANDLER_NAME:      stream->handler_name = g_value_dup_string(value);      st_bookmarks_stream_set_handler(stream, st_handlers_find_by_name(stream->handler_name));      break;    case FIELD_STREAM_BAG:      if (stream->handler)	{	  GValueArray *value_array;	  value_array = g_value_get_boxed(value);	  stream->stream_bag = st_bookmarks_stream_new(stream->handler, value_array);	}      break;    case FIELD_NAME:      g_free(stream->name);		/* field is editable */      stream->name = g_value_dup_string(value);      break;    case FIELD_GENRE:      g_free(stream->genre);		/* field is editable */      stream->genre = g_value_dup_string(value);      break;    case FIELD_DESCRIPTION:      g_free(stream->description);	/* field is editable */      stream->description = g_value_dup_string(value);      break;    default:      g_return_if_reached();    }}static voidst_bookmarks_stream_stock_field_get_cb (STBookmarksStream *stream,					STHandlerStockField stock_field,					GValue *value,					gpointer data){  switch (stock_field)    {    case ST_HANDLER_STOCK_FIELD_NAME:      g_value_set_string(value, stream->name);      break;    case ST_HANDLER_STOCK_FIELD_GENRE:      g_value_set_string(value, stream->genre);      break;    case ST_HANDLER_STOCK_FIELD_DESCRIPTION:      g_value_set_string(value, stream->description);      break;    case ST_HANDLER_STOCK_FIELD_HOMEPAGE:      if (stream->stream_bag)	st_stream_bag_get_stock_field_initialized(stream->stream_bag, ST_HANDLER_STOCK_FIELD_HOMEPAGE, value);      break;    case ST_HANDLER_STOCK_FIELD_URI_LIST:      if (stream->stream_bag)	st_stream_bag_get_stock_field_initialized(stream->stream_bag, ST_HANDLER_STOCK_FIELD_URI_LIST, value);      break;    }}static gbooleanst_bookmarks_stream_modify_cb (STBookmarksStream *stream,			       GSList *fields,			       GSList *values,			       gpointer data,			       GError **err){  GSList *field = fields;  GSList *value = values;  while (field && value)    {      st_bookmarks_stream_field_set_cb(stream, field->data, value->data, NULL);      field = field->next;      value = value->next;    }  return TRUE;}static gbooleanst_bookmarks_stream_delete_cb (STBookmarksStream *stream,			       gpointer data,			       GError **err){  return TRUE;			/* nop */}/* * Create a GValueArray from the values of the underlying stream * STREAM_BAG. */static GValueArray *st_bookmarks_value_array_new (STStreamBag *stream_bag){  GValueArray *value_array;    value_array = g_value_array_new(0);  if (stream_bag)    {      GSList *l;      g_return_val_if_fail(ST_IS_STREAM_BAG(stream_bag), NULL);      SG_LIST_FOREACH(l, st_handler_get_fields(stream_bag->handler))        {	  STHandlerField *field = l->data;	  if (! ST_HANDLER_FIELD_IS_VOLATILE(field))	    {	      GValue value = { 0, };	      st_stream_bag_get_field(stream_bag, field, &value);	      g_value_array_append(value_array, &value);	      g_value_unset(&value);	    }	}    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?