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 + -
显示快捷键?