/* vim:set ts=2 sw=2 sts=2 et: */
/**
 * \author     Marcus Holland-Moritz (github@mhxnet.de)
 * \copyright  Copyright (c) Marcus Holland-Moritz
 *
 * This file is part of dwarfs.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the “Software”), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * SPDX-License-Identifier: MIT
 */

#include <dwarfs/open_file_options.h>

#include <dwarfs/internal/io_ops_helpers.h>

namespace dwarfs::internal {

std::vector<dwarfs::detail::file_extent_info>
get_file_extents_noexcept(io_ops const& ops, std::any const& handle,
                          open_file_options const& opts) {
  std::vector<dwarfs::detail::file_extent_info> extents;

  if (opts.hollow) {
    std::error_code ec;
    auto const size = ops.size(handle, ec);

    if (!ec) {
      if (size > 0) {
        extents.emplace_back(extent_kind::hole, file_range{0, size});
      }

      return extents;
    }
  }

  std::error_code ec;
  extents = ops.get_extents(handle, ec);

  if (ec) {
    ec.clear();
    extents.clear();
    auto const size = ops.size(handle, ec);

    if (!ec && size > 0) {
      extents.emplace_back(extent_kind::data, file_range{0, size});
    }
  }

  return extents;
}

} // namespace dwarfs::internal
