// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIB_VFS_CPP_INTERNAL_DIRENT_FILLER_H_
#define LIB_VFS_CPP_INTERNAL_DIRENT_FILLER_H_

#include <stdint.h>
#include <zircon/types.h>

#include <string>

namespace vfs {
namespace internal {

// Helper class used to fill direntries during calls to Readdir.
class DirentFiller {
 public:
  DirentFiller(const DirentFiller&) = delete;
  DirentFiller& operator=(const DirentFiller&) = delete;

  DirentFiller(void* ptr, uint64_t len);

  // Attempts to add the name to the end of the dirent buffer
  // which is returned by readdir.
  // Will not write anything incase of error.
  zx_status_t Next(const std::string& name, uint8_t type, uint64_t ino);

  // Attempts to add the name to the end of the dirent buffer
  // which is returned by readdir.
  // Will not write anything incase of error.
  zx_status_t Next(const char* name, size_t name_len, uint8_t type, uint64_t ino);

  uint64_t GetBytesFilled() const { return pos_; }

 private:
  char* ptr_;
  uint64_t pos_;
  const uint64_t len_;
};

}  // namespace internal
}  // namespace vfs

#endif  // LIB_VFS_CPP_INTERNAL_DIRENT_FILLER_H_
