// 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.

#include "smbfs/filesystem.h"

#include <errno.h>

namespace smbfs {

Filesystem::Filesystem() = default;

Filesystem::~Filesystem() = default;

void Filesystem::Lookup(std::unique_ptr<EntryRequest> request,
                        fuse_ino_t parent_inode,
                        const std::string& name) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Forget(fuse_ino_t inode, uint64_t count) {}

void Filesystem::GetAttr(std::unique_ptr<AttrRequest> request,
                         fuse_ino_t inode) {
  request->ReplyError(ENOSYS);
}

void Filesystem::SetAttr(std::unique_ptr<AttrRequest> request,
                         fuse_ino_t inode,
                         base::Optional<uint64_t> file_handle,
                         const struct stat& attr,
                         int to_set) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Open(std::unique_ptr<OpenRequest> request,
                      fuse_ino_t inode,
                      int flags) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Create(std::unique_ptr<CreateRequest> request,
                        fuse_ino_t parent_inode,
                        const std::string& name,
                        mode_t mode,
                        int flags) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Read(std::unique_ptr<BufRequest> request,
                      fuse_ino_t inode,
                      uint64_t file_handle,
                      size_t size,
                      off_t offset) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Write(std::unique_ptr<WriteRequest> request,
                       fuse_ino_t inode,
                       uint64_t file_handle,
                       const char* buf,
                       size_t size,
                       off_t offset) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Release(std::unique_ptr<SimpleRequest> request,
                         fuse_ino_t inode,
                         uint64_t file_handle) {
  request->ReplyError(ENOSYS);
}

void Filesystem::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) {
  request->ReplyError(ENOSYS);
}

void Filesystem::Unlink(std::unique_ptr<SimpleRequest> request,
                        fuse_ino_t parent_inode,
                        const std::string& name) {
  request->ReplyError(ENOSYS);
}

void Filesystem::OpenDir(std::unique_ptr<OpenRequest> request,
                         fuse_ino_t inode,
                         int flags) {
  request->ReplyError(ENOSYS);
}

void Filesystem::ReadDir(std::unique_ptr<DirentryRequest> request,
                         fuse_ino_t inode,
                         uint64_t file_handle,
                         off_t offset) {
  request->ReplyError(ENOSYS);
}

void Filesystem::ReleaseDir(std::unique_ptr<SimpleRequest> request,
                            fuse_ino_t inode,
                            uint64_t file_handle) {
  request->ReplyError(ENOSYS);
}

void Filesystem::MkDir(std::unique_ptr<EntryRequest> request,
                       fuse_ino_t parent_inode,
                       const std::string& name,
                       mode_t mode) {
  request->ReplyError(ENOSYS);
}

void Filesystem::RmDir(std::unique_ptr<SimpleRequest> request,
                       fuse_ino_t parent_inode,
                       const std::string& name) {
  request->ReplyError(ENOSYS);
}

}  // namespace smbfs
