st-handler.c
来自「linux下网络收音机的源码」· C语言 代码 · 共 1,838 行 · 第 1/4 页
C
1,838 行
GParamSpec *pspec){ STHandler *handler = ST_HANDLER(object); switch (prop_id) { case PROP_NAME: handler->priv->name = g_value_dup_string(value); break; case PROP_DUMMY: handler->priv->dummy = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; }}STHandler *st_handler_new_dummy (const char *name){ g_return_val_if_fail(name != NULL, NULL); return g_object_new(ST_TYPE_HANDLER, "name", name, "dummy", TRUE, NULL);}voidst_handler_complete (STHandler *handler){ g_return_if_fail(ST_IS_HANDLER(handler)); if (! handler->priv->stock_categories) { STCategoryBag *category_bag; handler->priv->stock_categories = g_node_new(NULL); category_bag = st_category_bag_new(handler); ST_CATEGORY(category_bag)->name = g_strdup(ST_CATEGORY_BAG_MAIN); g_node_append_data(handler->priv->stock_categories, category_bag); } handler->priv->categories = st_category_store_new(handler->priv->stock_categories);}gbooleanst_handler_validate (STHandler *handler, GError **err){ if (! handler) { g_set_error(err, 0, 0, _("passed handler is NULL")); return FALSE; } if (! ST_IS_HANDLER(handler)) { g_set_error(err, 0, 0, _("passed handler is not a STHandler object")); return FALSE; } if (! handler->priv->label) { g_set_error(err, 0, 0, _("handler label is not set")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_STREAM_NEW)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_STREAM_NEW is not bound")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_STREAM_FIELD_GET)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_STREAM_FIELD_GET is not bound")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_STREAM_FIELD_SET)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_STREAM_FIELD_SET is not bound")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_STREAM_MODIFY)) { GSList *l; SG_LIST_FOREACH(l, handler->priv->fields) { STHandlerField *field = l->data; if (ST_HANDLER_FIELD_IS_EDITABLE(field)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_STREAM_MODIFY is not bound, but field \"%s\" is editable"), st_handler_field_get_label(field)); return FALSE; } } } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_STREAM_FREE)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_STREAM_FREE is not bound")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_CATEGORY_NEW)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_CATEGORY_NEW is not bound")); return FALSE; } if (! st_handler_event_is_bound(handler, ST_HANDLER_EVENT_CATEGORY_FREE)) { g_set_error(err, 0, 0, _("ST_HANDLER_EVENT_CATEGORY_FREE is not bound")); return FALSE; } /* * If handler->priv->stock_categories is NULL, we'll add the main * category in st_handler_complete(). */ if (handler->priv->stock_categories && ! st_handler_get_stock_category(handler, ST_CATEGORY_BAG_MAIN)) { g_set_error(err, 0, 0, _("main category is missing")); return FALSE; } return TRUE;}gbooleanst_handler_reload (STHandler *handler, STCategoryBag *category_bag, GNode **categories, STStreamStore **stream_store, GError **err){ gboolean status; g_return_val_if_fail(ST_IS_HANDLER(handler), FALSE); g_return_val_if_fail(ST_IS_CATEGORY_BAG(category_bag), FALSE); g_return_val_if_fail(categories != NULL, FALSE); g_return_val_if_fail(stream_store != NULL, FALSE); if (st_handler_event_is_bound(handler, ST_HANDLER_EVENT_RELOAD_MULTIPLE)) { GHashTable *stream_lists; status = st_handler_reload_multiple(handler, categories, &stream_lists, err); if (status) { g_hash_table_foreach(stream_lists, st_handler_reload_multiple_cb, handler); g_hash_table_destroy(stream_lists); *stream_store = st_handler_get_streams(handler, ST_CATEGORY(category_bag)->name); } } else { GSList *streams; status = st_handler_reload_single(handler, category_bag, categories, &streams, err); if (status) { *stream_store = st_stream_store_new(handler); st_stream_store_append_list(*stream_store, streams); sg_objects_free(streams); st_stream_store_touch(*stream_store); st_handler_set_streams(handler, ST_CATEGORY(category_bag)->name, *stream_store); } } return status;}static voidst_handler_reload_multiple_cb (gpointer key, gpointer value, gpointer user_data){ const char *category_name = key; GSList *streams = value; STHandler *handler = user_data; STStreamStore *stream_store; stream_store = st_stream_store_new(handler); st_stream_store_append_list(stream_store, streams); st_stream_store_touch(stream_store); st_handler_set_streams(handler, category_name, stream_store); g_object_unref(stream_store);}static gbooleanst_handler_reload_single (STHandler *handler, STCategoryBag *category_bag, GNode **category_bags, GSList **stream_bags, GError **err){ gboolean status; GNode *categories = NULL; GList *streams = NULL; g_return_val_if_fail(ST_IS_HANDLER(handler), FALSE); g_return_val_if_fail(ST_IS_CATEGORY_BAG(category_bag), FALSE); g_return_val_if_fail(category_bags != NULL, FALSE); g_return_val_if_fail(stream_bags != NULL, FALSE); status = st_handler_event_reload(handler, ST_CATEGORY(category_bag), &categories, &streams, err); if (status) { *category_bags = st_handler_categories_to_bags(handler, categories); *stream_bags = st_handler_streams_to_bags(handler, streams); if (categories) g_node_destroy(categories); g_list_free(streams); } else { st_handler_categories_free(handler, categories); st_handler_streams_free(handler, streams); } return status;}static gbooleanst_handler_reload_multiple (STHandler *handler, GNode **category_bags, GHashTable **stream_bag_lists, GError **err){ gboolean status; GNode *categories = NULL; GHashTable *stream_lists = NULL; g_return_val_if_fail(ST_IS_HANDLER(handler), FALSE); g_return_val_if_fail(category_bags != NULL, FALSE); g_return_val_if_fail(stream_bag_lists != NULL, FALSE); status = st_handler_event_reload_multiple(handler, &categories, &stream_lists, err); if (status) { *category_bags = st_handler_categories_to_bags(handler, categories); *stream_bag_lists = st_handler_stream_lists_to_bags(handler, stream_lists); if (categories) g_node_destroy(categories); g_hash_table_destroy(stream_lists); } else { st_handler_categories_free(handler, categories); st_handler_stream_lists_free(handler, stream_lists); } return status;}static GNode *st_handler_categories_to_bags (STHandler *handler, GNode *categories){ GNode *copy; g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); if (categories) { copy = g_node_copy(categories); g_node_traverse(copy, G_PRE_ORDER, G_TRAVERSE_ALL, -1, st_handler_categories_to_bags_cb, handler); } else copy = g_node_new(NULL); return copy;}static gbooleanst_handler_categories_to_bags_cb (GNode *node, gpointer data){ if (node->data) node->data = st_category_bag_new_from_category(data, node->data); return FALSE; /* continue */}static voidst_handler_categories_free (STHandler *handler, GNode *categories){ g_return_if_fail(ST_IS_HANDLER(handler)); if (categories) { g_node_traverse(categories, G_PRE_ORDER, G_TRAVERSE_ALL, -1, st_handler_categories_free_cb, handler); g_node_destroy(categories); }}static gbooleanst_handler_categories_free_cb (GNode *node, gpointer data){ if (node->data) { STHandler *handler = data; st_handler_event_category_free(handler, node->data); } return FALSE; /* continue */}static GSList *st_handler_streams_to_bags (STHandler *handler, GList *streams){ GSList *bags = NULL; GList *l; g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); SG_LIST_FOREACH(l, streams) { STStreamBag *bag; bag = st_stream_bag_new_from_stream(handler, l->data); bags = g_slist_append(bags, bag); } return bags;}static voidst_handler_streams_free (STHandler *handler, GList *streams){ GList *l; g_return_if_fail(ST_IS_HANDLER(handler)); SG_LIST_FOREACH(l, streams) st_handler_event_stream_free(handler, l->data); g_list_free(streams);}static GHashTable *st_handler_stream_lists_to_bags (STHandler *handler, GHashTable *stream_lists){ StreamListsToBagsInfo info; g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); info.handler = handler; info.stream_bag_lists = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) sg_objects_free); if (stream_lists) g_hash_table_foreach(stream_lists, st_handler_stream_lists_to_bags_cb, &info); return info.stream_bag_lists;}static voidst_handler_stream_lists_to_bags_cb (gpointer key, gpointer value, gpointer user_data){ const char *category_name = key; GList *streams = value; GSList *stream_bags; StreamListsToBagsInfo *info = user_data; stream_bags = st_handler_streams_to_bags(info->handler, streams); g_list_free(streams); g_hash_table_insert(info->stream_bag_lists, g_strdup(category_name), stream_bags);}static voidst_handler_stream_lists_free (STHandler *handler, GHashTable *stream_lists){ g_return_if_fail(ST_IS_HANDLER(handler)); if (stream_lists) { g_hash_table_foreach(stream_lists, st_handler_stream_lists_free_cb, handler); g_hash_table_destroy(stream_lists); }}static voidst_handler_stream_lists_free_cb (gpointer key, gpointer value, gpointer user_data){ GList *streams = value; STHandler *handler = user_data; st_handler_streams_free(handler, streams);}STCategoryStore *st_handler_get_categories (STHandler *handler){ g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); g_return_val_if_fail(handler->priv->categories != NULL, NULL); return g_object_ref(handler->priv->categories);}voidst_handler_set_streams (STHandler *handler, const char *category_name, STStreamStore *streams){ g_return_if_fail(ST_IS_HANDLER(handler)); g_return_if_fail(category_name != NULL); g_return_if_fail(ST_IS_STREAM_STORE(streams)); g_mutex_lock(handler->priv->streams_mutex); g_hash_table_insert(handler->priv->streams, g_strdup(category_name), g_object_ref(streams)); g_mutex_unlock(handler->priv->streams_mutex);}STStreamStore *st_handler_get_streams (STHandler *handler, const char *category_name){ STStreamStore *store; g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); g_return_val_if_fail(category_name != NULL, NULL); g_mutex_lock(handler->priv->streams_mutex); store = g_hash_table_lookup(handler->priv->streams, category_name); if (store) g_object_ref(store); g_mutex_unlock(handler->priv->streams_mutex); return store;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?