Path: new class "Path" wraps filesystem path strings

This commit is contained in:
Max Kellermann
2013-01-17 00:56:57 +01:00
parent 8901514506
commit e5039c478a
21 changed files with 380 additions and 238 deletions

View File

@@ -156,67 +156,54 @@ map_to_relative_path(const char *path_utf8)
: path_utf8;
}
char *
Path
map_uri_fs(const char *uri)
{
char *uri_fs, *path_fs;
assert(uri != NULL);
assert(*uri != '/');
if (music_dir_fs == NULL)
return NULL;
return Path::Null();
uri_fs = utf8_to_fs_charset(uri);
if (uri_fs == NULL)
return NULL;
const Path uri_fs = Path::FromUTF8(uri);
if (uri_fs.IsNull())
return Path::Null();
path_fs = g_build_filename(music_dir_fs, uri_fs, NULL);
g_free(uri_fs);
return path_fs;
return Path::Build(music_dir_fs, uri_fs);
}
char *
Path
map_directory_fs(const Directory *directory)
{
assert(music_dir_utf8 != NULL);
assert(music_dir_fs != NULL);
if (directory->IsRoot())
return g_strdup(music_dir_fs);
return Path::FromFS(music_dir_fs);
return map_uri_fs(directory->GetPath());
}
char *
Path
map_directory_child_fs(const Directory *directory, const char *name)
{
assert(music_dir_utf8 != NULL);
assert(music_dir_fs != NULL);
char *name_fs, *parent_fs, *path;
/* check for invalid or unauthorized base names */
if (*name == 0 || strchr(name, '/') != NULL ||
strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
return NULL;
return Path::Null();
parent_fs = map_directory_fs(directory);
if (parent_fs == NULL)
return NULL;
const Path parent_fs = map_directory_fs(directory);
if (parent_fs.IsNull())
return Path::Null();
name_fs = utf8_to_fs_charset(name);
if (name_fs == NULL) {
g_free(parent_fs);
return NULL;
}
const Path name_fs = Path::FromUTF8(name);
if (name_fs.IsNull())
return Path::Null();
path = g_build_filename(parent_fs, name_fs, NULL);
g_free(parent_fs);
g_free(name_fs);
return path;
return Path::Build(parent_fs, name_fs);
}
/**
@@ -224,19 +211,17 @@ map_directory_child_fs(const Directory *directory, const char *name)
* not have a real parent directory, only the dummy object
* #detached_root.
*/
static char *
static Path
map_detached_song_fs(const char *uri_utf8)
{
char *uri_fs = utf8_to_fs_charset(uri_utf8);
if (uri_fs == NULL)
return NULL;
Path uri_fs = Path::FromUTF8(uri_utf8);
if (uri_fs.IsNull())
return Path::Null();
char *path = g_build_filename(music_dir_fs, uri_fs, NULL);
g_free(uri_fs);
return path;
return Path::Build(music_dir_fs, uri_fs);
}
char *
Path
map_song_fs(const struct song *song)
{
assert(song_is_file(song));
@@ -246,7 +231,7 @@ map_song_fs(const struct song *song)
? map_detached_song_fs(song->uri)
: map_directory_child_fs(song->parent, song->uri);
else
return utf8_to_fs_charset(song->uri);
return Path::FromUTF8(song->uri);
}
char *
@@ -273,22 +258,17 @@ map_spl_path(void)
return playlist_dir_fs;
}
char *
Path
map_spl_utf8_to_fs(const char *name)
{
char *filename_utf8, *filename_fs, *path;
if (playlist_dir_fs == NULL)
return NULL;
return Path::Null();
filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL);
filename_fs = utf8_to_fs_charset(filename_utf8);
char *filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL);
const Path filename_fs = Path::FromUTF8(filename_utf8);
g_free(filename_utf8);
if (filename_fs == NULL)
return NULL;
if (filename_fs.IsNull())
return Path::Null();
path = g_build_filename(playlist_dir_fs, filename_fs, NULL);
g_free(filename_fs);
return path;
return Path::Build(playlist_dir_fs, filename_fs);
}