static struct directory *
directory_load_subdir(FILE *fp, struct directory *parent, const char *name,
		      GString *buffer, GError **error_r)
{
	struct directory *directory;
	const char *line;
	bool success;

	if (directory_get_child(parent, name) != NULL) {
		g_set_error(error_r, directory_quark(), 0,
			    "Duplicate subdirectory '%s'", name);
		return NULL;
	}

	if (directory_is_root(parent)) {
		directory = directory_new(name, parent);
	} else {
		char *path = g_strconcat(directory_get_path(parent), "/",
					 name, NULL);
		directory = directory_new(path, parent);
		g_free(path);
	}

	line = read_text_line(fp, buffer);
	if (line == NULL) {
		g_set_error(error_r, directory_quark(), 0,
			    "Unexpected end of file");
		directory_free(directory);
		return NULL;
	}

	if (g_str_has_prefix(line, DIRECTORY_MTIME)) {
		directory->mtime =
			g_ascii_strtoull(line + sizeof(DIRECTORY_MTIME) - 1,
					 NULL, 10);

		line = read_text_line(fp, buffer);
		if (line == NULL) {
			g_set_error(error_r, directory_quark(), 0,
				    "Unexpected end of file");
			directory_free(directory);
			return NULL;
		}
	}

	if (!g_str_has_prefix(line, DIRECTORY_BEGIN)) {
		g_set_error(error_r, directory_quark(), 0,
			    "Malformed line: %s", line);
		directory_free(directory);
		return NULL;
	}

	success = directory_load(fp, directory, buffer, error_r);
	if (!success) {
		directory_free(directory);
		return NULL;
	}

	return directory;
}
static void
simple_db_close(struct db *_db)
{
	struct simple_db *db = (struct simple_db *)_db;

	assert(db->root != NULL);

	directory_free(db->root);
}
/**
 * Recursively free a directory and all its contents.
 */
static void
delete_directory(struct directory *directory)
{
	assert(directory->parent != NULL);

	clear_directory(directory);

	dirvec_delete(&directory->parent->children, directory);
	directory_free(directory);
}
Beispiel #4
0
void
directory_delete(struct directory *directory)
{
	assert(holding_db_lock());
	assert(directory != NULL);
	assert(directory->parent != NULL);

	list_del(&directory->siblings);
	directory_free(directory);
}
Beispiel #5
0
static
void dynamic_destroy(void)
{
  wchain_free();

  songlist_free(songlist);
  directory_free(directory);
  playlist_free(playlist);
  visualizer_free(visualizer);
}
void
directory_free(struct directory *directory)
{
	for (unsigned i = 0; i < directory->songs.nr; ++i)
		song_free(directory->songs.base[i]);

	for (unsigned i = 0; i < directory->children.nr; ++i)
		directory_free(directory->children.base[i]);

	dirvec_destroy(&directory->children);
	songvec_destroy(&directory->songs);
	g_free(directory);
	/* this resets last dir returned */
	/*directory_get_path(NULL); */
}
Beispiel #7
0
void
directory_free(struct directory *directory)
{
	playlist_vector_deinit(&directory->playlists);

	struct song *song, *ns;
	directory_for_each_song_safe(song, ns, directory)
		song_free(song);

	struct directory *child, *n;
	directory_for_each_child_safe(child, n, directory)
		directory_free(child);

	g_free(directory);
	/* this resets last dir returned */
	/*directory_get_path(NULL); */
}
void
directory_prune_empty(struct directory *directory)
{
	int i;
	struct dirvec *dv = &directory->children;

	for (i = dv->nr; --i >= 0; ) {
		struct directory *child = dv->base[i];

		directory_prune_empty(child);

		if (directory_is_empty(child)) {
			dirvec_delete(dv, child);
			directory_free(child);
		}
	}
	if (!dv->nr)
		dirvec_destroy(dv);
}
static bool
simple_db_open(struct db *_db, G_GNUC_UNUSED GError **error_r)
{
	struct simple_db *db = (struct simple_db *)_db;

	db->root = directory_new("", NULL);
	db->mtime = 0;

	GError *error = NULL;
	if (!simple_db_load(db, &error)) {
		directory_free(db->root);

		g_warning("Failed to load database: %s", error->message);
		g_error_free(error);

		if (!simple_db_check(db, error_r))
			return false;

		db->root = directory_new("", NULL);
	}

	return true;
}