diff options
author | Max Kellermann <max@musicpd.org> | 2019-06-15 14:26:26 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-06-15 14:26:26 +0200 |
commit | bd6b7aa88e06a69fd8290a7bd809e0f1d507c18a (patch) | |
tree | d6e4e4a8665f50782a97585b6970c6cea9c5ff68 /src/archive | |
parent | fcf641596322d6d51176593fe3df8d16b8f29934 (diff) |
archive/Lookup: move to fs/LookupFile.cxx
This can be used for other purposes as well.
Diffstat (limited to 'src/archive')
-rw-r--r-- | src/archive/ArchiveLookup.cxx | 76 | ||||
-rw-r--r-- | src/archive/ArchiveLookup.hxx | 56 | ||||
-rw-r--r-- | src/archive/meson.build | 1 |
3 files changed, 0 insertions, 133 deletions
diff --git a/src/archive/ArchiveLookup.cxx b/src/archive/ArchiveLookup.cxx deleted file mode 100644 index e9227c913..000000000 --- a/src/archive/ArchiveLookup.cxx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2003-2019 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "ArchiveLookup.hxx" -#include "fs/FileInfo.hxx" -#include "system/Error.hxx" - -gcc_pure -static PathTraitsFS::pointer_type -FindSlash(PathTraitsFS::pointer_type p, size_t i) noexcept -{ - for (; i > 0; --i) - if (p[i] == '/') - return p + i; - - return nullptr; -} - -ArchiveLookupResult -archive_lookup(Path pathname) -{ - PathTraitsFS::string buffer(pathname.c_str()); - size_t idx = buffer.size(); - - PathTraitsFS::pointer_type slash = nullptr; - - while (true) { - try { - //try to stat if its real directory - const FileInfo file_info(Path::FromFS(buffer.c_str())); - - //is something found ins original path (is not an archive) - if (slash == nullptr) - return {}; - - //its a file ? - if (file_info.IsRegular()) { - //so the upper should be file - return {AllocatedPath::FromFS(buffer.c_str()), AllocatedPath::FromFS(slash + 1)}; - } else { - return {}; - } - } catch (const std::system_error &e) { - if (!IsPathNotFound(e)) - throw; - } - - //find one dir up - if (slash != nullptr) - *slash = '/'; - - slash = FindSlash(&buffer.front(), idx - 1); - if (slash == nullptr) - return {}; - - *slash = 0; - idx = slash - buffer.c_str(); - } -} - diff --git a/src/archive/ArchiveLookup.hxx b/src/archive/ArchiveLookup.hxx deleted file mode 100644 index 6166dd3ca..000000000 --- a/src/archive/ArchiveLookup.hxx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2003-2019 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPD_ARCHIVE_LOOKUP_HXX -#define MPD_ARCHIVE_LOOKUP_HXX - -#include "fs/AllocatedPath.hxx" - -struct ArchiveLookupResult { - AllocatedPath archive = nullptr; - AllocatedPath inside = nullptr; - - operator bool() const noexcept { - return !archive.IsNull(); - } -}; - -/** - * - * archive_lookup is used to determine if part of pathname refers to an regular - * file (archive). If so then its also used to split pathname into archive file - * and path used to locate file in archive. - * How it works: - * We do stat of the parent of input pathname as long as we find an regular file - * Normally this should never happen. When routine returns true pathname modified - * and split into archive and inpath. Otherwise nothing happens - * - * For example: - * - * /music/path/Talco.zip/Talco - Combat Circus/12 - A la pachenka.mp3 - * is split into archive: /music/path/Talco.zip - * inarchive pathname: Talco - Combat Circus/12 - A la pachenka.mp3 - * - * Throws on error. - */ -ArchiveLookupResult -archive_lookup(Path pathname); - -#endif - diff --git a/src/archive/meson.build b/src/archive/meson.build index e2f45f8e6..c40b7b272 100644 --- a/src/archive/meson.build +++ b/src/archive/meson.build @@ -18,7 +18,6 @@ endif archive_glue = static_library( 'archive_glue', - 'ArchiveLookup.cxx', 'ArchivePlugin.cxx', '../input/plugins/ArchiveInputPlugin.cxx', include_directories: inc, |