static void
rhythmdb_property_model_finalize (GObject *object)
{
	RhythmDBPropertyModel *model;

	g_return_if_fail (object != NULL);
	g_return_if_fail (RHYTHMDB_IS_PROPERTY_MODEL (object));

	model = RHYTHMDB_PROPERTY_MODEL (object);

	rb_debug ("finalizing property model %p", model);

	g_return_if_fail (model->priv != NULL);

	g_hash_table_destroy (model->priv->reverse_map);

	g_sequence_foreach (model->priv->properties, (GFunc)_prop_model_entry_cleanup, NULL);
	g_sequence_free (model->priv->properties);

	g_hash_table_destroy (model->priv->entries);

	g_free (model->priv->all);

	g_array_free (model->priv->sort_propids, TRUE);

	G_OBJECT_CLASS (rhythmdb_property_model_parent_class)->finalize (object);
}
static void
rhythmdb_property_model_dispose (GObject *object)
{
	RhythmDBPropertyModel *model;

	g_return_if_fail (object != NULL);
	g_return_if_fail (RHYTHMDB_IS_PROPERTY_MODEL (object));

	model = RHYTHMDB_PROPERTY_MODEL (object);

	rb_debug ("disposing property model %p", model);

	g_return_if_fail (model->priv != NULL);

	if (model->priv->syncing_id != 0) {
		g_source_remove (model->priv->syncing_id);
		model->priv->syncing_id = 0;
	}

	if (model->priv->query_model != NULL) {
		g_object_unref (model->priv->query_model);
		model->priv->query_model = NULL;
	}

	G_OBJECT_CLASS (rhythmdb_property_model_parent_class)->dispose (object);
}
static void
rhythmdb_property_model_set_property (GObject *object,
				      guint prop_id,
				      const GValue *value,
				      GParamSpec *pspec)
{
	RhythmDBPropertyModel *model = RHYTHMDB_PROPERTY_MODEL (object);

	switch (prop_id) {
	case PROP_RHYTHMDB:
		model->priv->db = g_value_get_object (value);
		break;
	case PROP_PROP:
		model->priv->propid = g_value_get_int (value);
		switch (model->priv->propid) {
		case RHYTHMDB_PROP_GENRE:
			append_sort_property (model, RHYTHMDB_PROP_GENRE);
			break;
		case RHYTHMDB_PROP_ARTIST:
			append_sort_property (model, RHYTHMDB_PROP_ARTIST_SORTNAME);
			append_sort_property (model, RHYTHMDB_PROP_ARTIST);
			break;
		case RHYTHMDB_PROP_ALBUM:
			append_sort_property (model, RHYTHMDB_PROP_ALBUM_SORTNAME);
			append_sort_property (model, RHYTHMDB_PROP_ALBUM);
			break;
		case RHYTHMDB_PROP_SUBTITLE:
			append_sort_property (model, RHYTHMDB_PROP_ALBUM);
			append_sort_property (model, RHYTHMDB_PROP_SUBTITLE);
			break;
		case RHYTHMDB_PROP_TITLE:
		case RHYTHMDB_PROP_LOCATION:
			append_sort_property (model, RHYTHMDB_PROP_TITLE);
			break;
		default:
			g_assert_not_reached ();
			break;
		}
		break;
	case PROP_QUERY_MODEL:
		rhythmdb_property_model_set_query_model_internal (model, g_value_get_object (value));
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
		break;
	}
}
static void
rhythmdb_property_model_get_property (GObject *object,
				      guint prop_id,
				      GValue *value,
				      GParamSpec *pspec)
{
	RhythmDBPropertyModel *model = RHYTHMDB_PROPERTY_MODEL (object);

	switch (prop_id) {
	case PROP_RHYTHMDB:
		g_value_set_object (value, model->priv->db);
		break;
	case PROP_PROP:
		g_value_set_int (value, model->priv->propid);
		break;
	case PROP_QUERY_MODEL:
		g_value_set_object (value, model->priv->query_model);
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
		break;
	}
}