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