// Copyright 2019 The Chromium OS 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 SMBFS_FILESYSTEM_H_
#define SMBFS_FILESYSTEM_H_

#include <fuse_lowlevel.h>

#include <memory>
#include <optional>
#include <string>

#include "smbfs/request.h"

namespace smbfs {

// Base class for FUSE filesystems. Functions not overridden will respond to
// requests with the ENOSYS error.
class Filesystem {
 public:
  virtual ~Filesystem();

  virtual void StatFs(std::unique_ptr<StatFsRequest> request, fuse_ino_t inode);
  virtual void Lookup(std::unique_ptr<EntryRequest> request,
                      fuse_ino_t parent_inode,
                      const std::string& name);
  virtual void Forget(fuse_ino_t inode, uint64_t count);
  virtual void GetAttr(std::unique_ptr<AttrRequest> request, fuse_ino_t inode);
  virtual void SetAttr(std::unique_ptr<AttrRequest> request,
                       fuse_ino_t inode,
                       std::optional<uint64_t> file_handle,
                       const struct stat& attr,
                       int to_set);

  // File operations.
  virtual void Open(std::unique_ptr<OpenRequest> request,
                    fuse_ino_t inode,
                    int flags);
  virtual void Create(std::unique_ptr<CreateRequest> request,
                      fuse_ino_t parent_inode,
                      const std::string& name,
                      mode_t mode,
                      int flags);
  virtual void Read(std::unique_ptr<BufRequest> request,
                    fuse_ino_t inode,
                    uint64_t file_handle,
                    size_t size,
                    off_t offset);
  virtual void Write(std::unique_ptr<WriteRequest> request,
                     fuse_ino_t inode,
                     uint64_t file_handle,
                     const char* buf,
                     size_t size,
                     off_t offset);
  virtual void Release(std::unique_ptr<SimpleRequest> request,
                       fuse_ino_t inode,
                       uint64_t file_handle);
  virtual void Rename(std::unique_ptr<SimpleRequest> request,
                      fuse_ino_t old_parent_inode,
                      const std::string& old_name,
                      fuse_ino_t new_parent_inode,
                      const std::string& new_name);
  virtual void Unlink(std::unique_ptr<SimpleRequest> request,
                      fuse_ino_t parent_inode,
                      const std::string& name);

  // Directory operations.
  virtual void OpenDir(std::unique_ptr<OpenRequest> request,
                       fuse_ino_t inode,
                       int flags);
  virtual void ReadDir(std::unique_ptr<DirentryRequest> request,
                       fuse_ino_t inode,
                       uint64_t file_handle,
                       off_t offset);
  virtual void ReleaseDir(std::unique_ptr<SimpleRequest> request,
                          fuse_ino_t inode,
                          uint64_t file_handle);
  virtual void MkDir(std::unique_ptr<EntryRequest> request,
                     fuse_ino_t parent_inode,
                     const std::string& name,
                     mode_t mode);
  virtual void RmDir(std::unique_ptr<SimpleRequest> request,
                     fuse_ino_t parent_inode,
                     const std::string& name);

 protected:
  Filesystem();
  Filesystem(const Filesystem&) = delete;
  Filesystem& operator=(const Filesystem&) = delete;
};

}  // namespace smbfs

#endif  // SMBFS_FILESYSTEM_H_
