st-bookmarks.c

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

C
702
字号
  return value_array;}/* * Create an underlying stream belonging to HANDLER from the values of * VALUE_ARRAY. */static STStreamBag *st_bookmarks_stream_new (STHandler *handler, GValueArray *value_array){  STStreamBag *stream;  GSList *l;  int i;	        g_return_val_if_fail(ST_IS_HANDLER(handler), NULL);  g_return_val_if_fail(value_array != NULL, NULL);  stream = st_stream_bag_new(handler);  ST_STREAM(stream)->name = g_strdup("");	/* dummy */  l = st_handler_get_fields(handler);  i = 0;  while (l && i < value_array->n_values)    {      STHandlerField *field = l->data;      if (! ST_HANDLER_FIELD_IS_VOLATILE(field))	{	  GValue *value;	  value = g_value_array_get_nth(value_array, i);	  if (G_VALUE_TYPE(value) == st_handler_field_get_type(field))	    st_stream_bag_set_field(stream, field, value);	  i += 1;	}      l = l->next;    }  return stream;}static voidst_bookmarks_stream_free_cb (STBookmarksStream *stream, gpointer data){  if (stream->stream_bag)    g_object_unref(stream->stream_bag);  if (stream->handler_icon)    g_object_unref(stream->handler_icon);  g_free(stream->handler_name);  g_free(stream->name);  g_free(stream->genre);  g_free(stream->description);  st_stream_free((STStream *) stream);}static gbooleanst_bookmarks_stream_tune_in_cb (STBookmarksStream *stream,				gpointer data,				GError **err){  if (stream->stream_bag)    {      if (st_handler_event_is_bound(stream->stream_bag->handler, ST_HANDLER_EVENT_STREAM_TUNE_IN_MULTIPLE))	{	  GSList *streams = NULL;	  gboolean status;	  streams = g_slist_append(streams, stream->stream_bag);	  status = st_stream_bag_tune_in_multiple(streams, err);	  g_slist_free(streams);	  return status;	}      else if (st_handler_event_is_bound(stream->stream_bag->handler, ST_HANDLER_EVENT_STREAM_TUNE_IN))	return st_stream_bag_tune_in(stream->stream_bag, err);      else	{	  g_set_error(err, 0, 0, _("the %s handler has no tune in capability"),		      st_handler_get_label(stream->stream_bag->handler));	  return FALSE;	}    }  else    {      g_set_error(err, 0, 0, _("the %s handler is not available"), stream->handler_name);      return FALSE;    }}static gbooleanst_bookmarks_stream_record_cb (STBookmarksStream *stream,			       gpointer data,			       GError **err){  if (stream->stream_bag)    {      if (st_handler_event_is_bound(stream->stream_bag->handler, ST_HANDLER_EVENT_STREAM_RECORD))	return st_stream_bag_record(stream->stream_bag, err);      else	{	  g_set_error(err, 0, 0, _("the %s handler has no record capability"),		      st_handler_get_label(stream->stream_bag->handler));	  return FALSE;	}    }  else    {      g_set_error(err, 0, 0, _("the %s handler is not available"), stream->handler_name);      return FALSE;    }}static gbooleanst_bookmarks_stream_browse_cb (STBookmarksStream *stream,			       gpointer data,			       GError **err){  if (stream->stream_bag)    {      if (st_handler_event_is_bound(stream->stream_bag->handler, ST_HANDLER_EVENT_STREAM_BROWSE))	return st_stream_bag_browse(stream->stream_bag, err);      else	{	  g_set_error(err, 0, 0, _("the %s handler has no browse capability"),		      st_handler_get_label(stream->stream_bag->handler));	  return FALSE;	}    }  else    {      g_set_error(err, 0, 0, _("the %s handler is not available"), stream->handler_name);      return FALSE;    }}voidst_bookmarks_init (void){  GdkPixbuf *pixbuf;  STStreamStore *bookmarks;  STHandlerField *field;  st_bookmarks_handler = st_handler_new("bookmarks");  st_handler_set_label(st_bookmarks_handler, _("Bookmarks"));  st_handler_set_copyright(st_bookmarks_handler, "Copyright \302\251 2004 Jean-Yves Lefort");  st_handler_set_description(st_bookmarks_handler, _("Favourite Streams"));  st_handler_set_flags(st_bookmarks_handler, ST_HANDLER_NO_CATEGORIES);  pixbuf = st_pixbuf_new_from_file(ST_PNG("bookmarks"));  if (pixbuf)    {      st_handler_set_icon_from_pixbuf(st_bookmarks_handler, pixbuf);      g_object_unref(pixbuf);    }  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_NEW, st_bookmarks_stream_new_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_FIELD_GET, st_bookmarks_stream_field_get_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_FIELD_SET, st_bookmarks_stream_field_set_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_STOCK_FIELD_GET, st_bookmarks_stream_stock_field_get_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_MODIFY, st_bookmarks_stream_modify_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_DELETE, st_bookmarks_stream_delete_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_FREE, st_bookmarks_stream_free_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_TUNE_IN, st_bookmarks_stream_tune_in_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_RECORD, st_bookmarks_stream_record_cb, NULL);  st_handler_bind(st_bookmarks_handler, ST_HANDLER_EVENT_STREAM_BROWSE, st_bookmarks_stream_browse_cb, NULL);  st_handler_add_field(st_bookmarks_handler,		       st_handler_field_new(FIELD_HANDLER_NAME,					    _("STHandler"),					    G_TYPE_STRING,					    0));  st_handler_add_field(st_bookmarks_handler,		       st_handler_field_new(FIELD_STREAM_BAG,					    _("STStreamBag"),					    G_TYPE_VALUE_ARRAY,					    0));  st_handler_add_field(st_bookmarks_handler,		       st_handler_field_new(FIELD_HANDLER_ICON,					    _("Handler icon"),					    GDK_TYPE_PIXBUF,					    ST_HANDLER_FIELD_VISIBLE					    | ST_HANDLER_FIELD_VOLATILE					    | ST_HANDLER_FIELD_NO_DEDICATED_COLUMN));    field = st_handler_field_new(FIELD_HANDLER_LABEL,			       _("Handler"),			       G_TYPE_STRING,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_VOLATILE);  st_handler_field_set_description(field, _("The stream handler"));  st_handler_add_field(st_bookmarks_handler, field);  field = st_handler_field_new(FIELD_NAME,			       _("Name"),			       G_TYPE_STRING,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_EDITABLE);  st_handler_field_set_description(field, _("The stream name"));  st_handler_add_field(st_bookmarks_handler, field);  field = st_handler_field_new(FIELD_GENRE,			       _("Genre"),			       G_TYPE_STRING,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_EDITABLE);  st_handler_field_set_description(field, _("The stream genre"));  st_handler_add_field(st_bookmarks_handler, field);  field = st_handler_field_new(FIELD_DESCRIPTION,			       _("Description"),			       G_TYPE_STRING,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_EDITABLE);  st_handler_field_set_description(field, _("The stream description"));  st_handler_add_field(st_bookmarks_handler, field);  field = st_handler_field_new(FIELD_HOMEPAGE,			       _("Homepage"),			       G_TYPE_STRING,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_START_HIDDEN			       | ST_HANDLER_FIELD_VOLATILE);  st_handler_field_set_description(field, _("The stream homepage URL"));  st_handler_add_field(st_bookmarks_handler, field);  field = st_handler_field_new(FIELD_URI_LIST,			       _("URI list"),			       G_TYPE_VALUE_ARRAY,			       ST_HANDLER_FIELD_VISIBLE			       | ST_HANDLER_FIELD_START_HIDDEN			       | ST_HANDLER_FIELD_VOLATILE);  st_handler_field_set_description(field, _("The stream listen URI list"));  st_handler_add_field(st_bookmarks_handler, field);  st_handlers_add(st_bookmarks_handler);  bookmarks = st_stream_store_new(st_bookmarks_handler);  st_handler_set_streams(st_bookmarks_handler, ST_CATEGORY_BAG_MAIN, bookmarks);  g_object_unref(bookmarks);}static voidst_bookmarks_make_unique_name (STStreamBag *bag, STStreamStore *bookmarks){  MakeUniqueInfo info = { bag };  int i = 0;  g_return_if_fail(ST_IS_STREAM_BAG(bag));  g_return_if_fail(ST_IS_STREAM_STORE(bookmarks));    do    {      g_free(ST_STREAM(bag)->name);      ST_STREAM(bag)->name = g_strdup_printf("%i", i++);      info.taken = FALSE;      st_stream_store_foreach(bookmarks, st_bookmarks_make_unique_name_cb, &info);    }  while (info.taken);}static gbooleanst_bookmarks_make_unique_name_cb (STStreamStore *store,				  STStreamBag *bag,				  gpointer data){  MakeUniqueInfo *info = data;  return info->taken = ! strcmp(ST_STREAM(bag)->name, ST_STREAM(info->bag)->name);}voidst_bookmarks_add (STStreamBag *stream_bag){  STStreamStore *bookmarks;  STStreamBag *bookmark;  bookmarks = st_handler_get_streams(st_bookmarks_handler, ST_CATEGORY_BAG_MAIN);  g_return_if_fail(bookmarks != NULL);  bookmark = st_stream_bag_new(st_bookmarks_handler);  st_bookmarks_make_unique_name(bookmark, bookmarks);  st_bookmarks_stream_set_handler(ST_BOOKMARKS_STREAM(bookmark), stream_bag->handler);  if (st_handler_event_is_bound(stream_bag->handler, ST_HANDLER_EVENT_STREAM_STOCK_FIELD_GET))    {      GValue value = { 0, };            st_stream_bag_get_stock_field(stream_bag, ST_HANDLER_STOCK_FIELD_NAME, &value);      ST_BOOKMARKS_STREAM(bookmark)->name = g_value_dup_string(&value);      g_value_unset(&value);      st_stream_bag_get_stock_field(stream_bag, ST_HANDLER_STOCK_FIELD_GENRE, &value);      ST_BOOKMARKS_STREAM(bookmark)->genre = g_value_dup_string(&value);      g_value_unset(&value);      st_stream_bag_get_stock_field(stream_bag, ST_HANDLER_STOCK_FIELD_DESCRIPTION, &value);      ST_BOOKMARKS_STREAM(bookmark)->description = g_value_dup_string(&value);      g_value_unset(&value);    }  else    {      GString *name = g_string_new(NULL);      GSList *l;      /* we form the name by concatenating every visible string field */      SG_LIST_FOREACH(l, st_handler_get_fields(stream_bag->handler))        {	  STHandlerField *field = l->data;	  if (ST_HANDLER_FIELD_IS_VISIBLE(field) && st_handler_field_get_type(field) == G_TYPE_STRING)	    {	      GValue value = { 0, };	      const char *str;	      st_stream_bag_get_field(stream_bag, field, &value);	      str = g_value_get_string(&value);	      	      if (str && *str)		{		  if (*name->str)		    g_string_append(name, " - ");		  g_string_append(name, str);		}	      g_value_unset(&value);	    }	}            ST_BOOKMARKS_STREAM(bookmark)->name = g_string_free(name, FALSE);    }    ST_BOOKMARKS_STREAM(bookmark)->stream_bag = g_object_ref(stream_bag);  st_stream_store_append(bookmarks, bookmark);  st_stream_store_touch(bookmarks);  g_object_unref(bookmark);  g_object_unref(bookmarks);}

⌨️ 快捷键说明

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