Beispiel #1
0
/* call-seq:
 * c = Xmms::Collection.universe
 *
 * Returns a collection referencing the "All Media" set.
 */
static VALUE
c_coll_universe (VALUE klass)
{
	VALUE obj = rb_obj_alloc (klass);
	RbCollection *coll = NULL;

	Data_Get_Struct (obj, RbCollection, coll);

	coll->real = xmmsv_new_coll (XMMS_COLLECTION_TYPE_UNIVERSE);

	return obj;
}
Beispiel #2
0
static xmmsv_t *
duplicate_coll_value (xmmsv_t *val)
{
	xmmsv_t *dup_val;
	xmmsv_coll_t *new_coll, *orig_coll;

	xmmsv_get_coll (val, &orig_coll);
	assert (orig_coll);

	new_coll = xmmsv_coll_copy (orig_coll);
	dup_val = xmmsv_new_coll (new_coll);

	return dup_val;
}
Beispiel #3
0
/**
 * Recursively add files under a path to the media library.
 *
 * @param medialib the medialib object
 * @param path the directory to scan for files
 * @param error If an error occurs, it will be stored in there.
 *
 * @return an IDLIST collection with the added entries
 */
xmmsv_t *
xmms_medialib_add_recursive (xmms_medialib_t *medialib, const gchar *path,
                             xmms_error_t *error)
{
	xmmsv_t *entries;

	entries = xmmsv_new_coll (XMMS_COLLECTION_TYPE_IDLIST);

	g_return_val_if_fail (medialib, entries);
	g_return_val_if_fail (path, entries);

	process_dir (medialib, entries, path, error);

	return entries;
}
Beispiel #4
0
/**
 * Return a collection with an order-operator added.
 *
 * @param coll  the original collection
 * @param value an ordering string, optionally starting with "-" (for
 *              descending ordering), followed by a string "id", "random"
 *              or a key identifying a  property, such as "artist" or "album".
 *              Or it can be a dict containing the attributes to set.
 * @return coll with order-operators added
 */
xmmsv_t *
xmmsv_coll_add_order_operator (xmmsv_t *coll, xmmsv_t *value)
{
	value = xmmsv_coll_normalize_order_arguments (value);
	if (value != NULL) {
		xmmsv_t *ordered;

		ordered = xmmsv_new_coll (XMMS_COLLECTION_TYPE_ORDER);
		xmmsv_coll_add_operand (ordered, coll);
		xmmsv_coll_attributes_set (ordered, value);

		xmmsv_unref (value);

		return ordered;
	}

	return xmmsv_ref (coll);
}
Beispiel #5
0
/* Augment the collection with new attributes needed for coll2 */
static xmmsv_t *
augment_coll (xmmsv_t *coll)
{
    xmmsv_t *ret = coll;
    const char *key;

    switch (xmmsv_coll_get_type (coll)) {
    case XMMS_COLLECTION_TYPE_HAS:
    case XMMS_COLLECTION_TYPE_MATCH:
    case XMMS_COLLECTION_TYPE_TOKEN:
    case XMMS_COLLECTION_TYPE_EQUALS:
    case XMMS_COLLECTION_TYPE_NOTEQUAL:
    case XMMS_COLLECTION_TYPE_SMALLER:
    case XMMS_COLLECTION_TYPE_SMALLEREQ:
    case XMMS_COLLECTION_TYPE_GREATER:
    case XMMS_COLLECTION_TYPE_GREATEREQ:
        if (xmmsv_coll_attribute_get_string (coll, "field", &key)
                && strcmp (key, "id") == 0) {
            xmmsv_coll_attribute_set_string (coll, "type", "id");
        } else {
            xmmsv_coll_attribute_set_string (coll, "type", "value");
        }
        break;

    case XMMS_COLLECTION_TYPE_REFERENCE:
        if (xmmsv_coll_attribute_get_string (coll, "reference", &key)
                && strcmp (key, "All Media") == 0) {
            ret = xmmsv_new_coll (XMMS_COLLECTION_TYPE_UNIVERSE);
            xmmsv_unref (coll);
        }
        break;

    default:
        break;
    }

    return ret;
}
Beispiel #6
0
static void
filter_testcase (const gchar *path, xmmsv_t *list)
{
	gchar *content, *filename;
	xmmsv_t *dict, *data, *holder;
	xmmsv_coll_t *coll;

	g_assert (g_file_get_contents (path, &content, NULL, NULL));
	dict = xmmsv_from_json (content);
	if (dict == NULL) {
		g_error ("Could not parse '%s'!\n", path);
		g_assert_not_reached ();
	}
	g_free (content);

	g_assert (xmmsv_dict_has_key (dict, "medialib"));
	g_assert (xmmsv_dict_has_key (dict, "collection"));
	g_assert (xmmsv_dict_has_key (dict, "specification"));
	g_assert (xmmsv_dict_has_key (dict, "expected"));

	g_assert (xmmsv_dict_get (dict, "collection", &data));
	g_assert (xmmsv_is_type (data, XMMSV_TYPE_DICT));

	coll = xmmsv_coll_from_dict (data);
	holder = xmmsv_new_coll (coll);
	xmmsv_coll_unref (coll);

	xmmsv_dict_set (dict, "collection", holder);
	xmmsv_unref (holder);

	filename = g_path_get_basename (path);
	xmmsv_dict_set_string (dict, "name", filename);
	g_free (filename);

	xmmsv_list_append (list, dict);
	xmmsv_unref (dict);
}
Beispiel #7
0
static xmmsv_t *
duplicate_coll_value (xmmsv_t *val)
{
	xmmsv_t *dup_val, *attributes, *operands, *idlist, *copy;

	dup_val = xmmsv_new_coll (xmmsv_coll_get_type (val));

	attributes = xmmsv_coll_attributes_get (val);
	copy = xmmsv_copy (attributes);
	xmmsv_coll_attributes_set (dup_val, copy);
	xmmsv_unref (copy);

	operands = xmmsv_coll_operands_get (val);
	copy = xmmsv_copy (operands);
	xmmsv_coll_operands_set (dup_val, copy);
	xmmsv_unref (copy);

	idlist = xmmsv_coll_idlist_get (val);
	copy = xmmsv_copy (idlist);
	xmmsv_coll_idlist_set (dup_val, copy);
	xmmsv_unref (copy);

	return dup_val;
}
Beispiel #8
0
static bool
_internal_get_from_bb_value_of_type_alloc (xmmsv_t *bb, xmmsv_type_t type,
                                           xmmsv_t **val)
{
	int32_t i;
	uint32_t len;
	char *s;
	xmmsv_coll_t *c;
	unsigned char *d;

	switch (type) {
		case XMMSV_TYPE_ERROR:
			if (!_internal_get_from_bb_error_alloc (bb, &s, &len)) {
				return false;
			}
			*val = xmmsv_new_error (s);
			free (s);
			break;
		case XMMSV_TYPE_INT32:
			if (!_internal_get_from_bb_int32 (bb, &i)) {
				return false;
			}
			*val = xmmsv_new_int (i);
			break;
		case XMMSV_TYPE_STRING:
			if (!_internal_get_from_bb_string_alloc (bb, &s, &len)) {
				return false;
			}
			*val = xmmsv_new_string (s);
			free (s);
			break;
		case XMMSV_TYPE_DICT:
			if (!xmmsc_deserialize_dict (bb, val)) {
				return false;
			}
			break;

		case XMMSV_TYPE_LIST :
			if (!xmmsc_deserialize_list (bb, val)) {
				return false;
			}
			break;

		case XMMSV_TYPE_COLL:
			if (!_internal_get_from_bb_collection_alloc (bb, &c)) {
				return false;
			}
			*val = xmmsv_new_coll (c);
			xmmsv_coll_unref (c);
			break;

		case XMMSV_TYPE_BIN:
			if (!_internal_get_from_bb_bin_alloc (bb, &d, &len)) {
				return false;
			}
			*val = xmmsv_new_bin (d, len);
			free (d);
			break;

		case XMMSV_TYPE_NONE:
			*val = xmmsv_new_none ();
			break;
		default:
			x_internal_error ("Got message of unknown type!");
			return false;
	}

	return true;
}
Beispiel #9
0
xmmsv_t *
xmmsv_coll_new (xmmsv_coll_type_t type)
{
	return xmmsv_new_coll (type);
}
Beispiel #10
0
/**
 * Return a collection referencing the whole media library.
 * The returned structure must be unref'd using #xmmsv_coll_unref
 * after usage.
 *
 * @return a collection containing all media.
 */
xmmsv_t*
xmmsv_coll_universe ()
{
	return xmmsv_new_coll (XMMS_COLLECTION_TYPE_UNIVERSE);
}