// Copyright 2020 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_SAMBA_INTERFACE_H_
#define SMBFS_SAMBA_INTERFACE_H_

#include <libsmbclient.h>
#include <sys/types.h>

#include <memory>
#include <string>

#include <base/memory/weak_ptr.h>

namespace smbfs {

struct SmbCredential;

// Lightweight wrapper to make libsmbclient functions available without having
// to define and retrieve their function pointers in multiple places.
//
// Methods map 1:1 onto libsmbclient functions but unlike libsmbclient provide
// a consistent interface where the return value is 0 on success or errno on
// failure. Methods that natively return other data (ie. OpenFile()) do so via
// pointer-based output parameters.
//
// All methods must be called from the same thread, unless noted.
class SambaInterface {
 public:
  SambaInterface() = default;
  virtual ~SambaInterface() = default;

  SambaInterface(const SambaInterface&) = delete;
  SambaInterface& operator=(const SambaInterface&) = delete;

  // Weak pointer type.
  using WeakPtr = ::base::WeakPtr<SambaInterface>;

  // Gets a weak pointer to this object. Should only be called from, and
  // the resultant pointer dereferenced from, the constructor thread.
  virtual WeakPtr AsWeakPtr() = 0;

  // Sets the password to be used for libsmbclient auth callbacks (if
  // implemented). Can be called from any thread.
  virtual void UpdateCredentials(
      std::unique_ptr<SmbCredential> credentials) = 0;

  // Retrieve stat information for the filesystem that backs |path| into
  // |out_statvfs|.
  // Returns 0 on success and errno on failure.
  virtual int StatVfs(const std::string& path,
                      struct statvfs* out_statvfs) WARN_UNUSED_RESULT = 0;

  // Opens a file at a given |file_path| with |flags| (O_RDONLY, O_WRONLY etc),
  // returning a handle to it in |out_file|, which will be nullptr on failure.
  // |mode| is used when using OpenFile() to create a new file.
  // Returns 0 on success and errno on failure.
  virtual int OpenFile(const std::string& file_path,
                       int flags,
                       mode_t mode,
                       SMBCFILE** out_file) WARN_UNUSED_RESULT = 0;

  // Closes |file|, which is from OpenFile().
  // Returns 0 on success and errno on failure.
  virtual int CloseFile(SMBCFILE* file) WARN_UNUSED_RESULT = 0;

  // Seeks to |offset| in |file| from position |whence|.
  // Returns 0 on success and errno on failure.
  virtual int SeekFile(SMBCFILE* file,
                       off_t offset,
                       int whence) WARN_UNUSED_RESULT = 0;

  // Reads |count| bytes from |file| into |buf|. On success, |out_bytes_read|
  // contains the number of bytes read.
  // Returns 0 on success and errno on failure.
  virtual int ReadFile(SMBCFILE* file,
                       void* buf,
                       size_t count,
                       size_t* out_bytes_read) WARN_UNUSED_RESULT = 0;

  // Writes |count| bytes from |buf| into |file|. On success,
  // |out_bytes_written| contains the number of bytes written. Returns 0 on
  // success and errno on failure.
  virtual int WriteFile(SMBCFILE* file,
                        const void* buf,
                        size_t count,
                        size_t* out_bytes_written) WARN_UNUSED_RESULT = 0;

  // Truncates |file| to |size| bytes.
  // Returns 0 on success and errno on failure.
  virtual int TruncateFile(SMBCFILE* file, off_t size) WARN_UNUSED_RESULT = 0;

  // Retrieves a stat structure for the file or directory at |path| into
  // |out_stat|. Returns 0 on success and errno on failure.
  virtual int Stat(const std::string& path,
                   struct stat* out_stat) WARN_UNUSED_RESULT = 0;

  // Renames |old_path| to |new_path|.
  // Returns 0 on success and errno on failure.
  virtual int Rename(const std::string& old_path,
                     const std::string& new_path) WARN_UNUSED_RESULT = 0;

  // Removes the file at |file_path|. Use RmDir() to remove a directory.
  // Returns 0 on success and errno on failure.
  virtual int UnlinkFile(const std::string& file_path) WARN_UNUSED_RESULT = 0;

  // Creates directory at |dir_path| with mode |mode|.
  // Returns 0 on success and errno on failure.
  virtual int CreateDirectory(const std::string& dir_path,
                              mode_t mode) WARN_UNUSED_RESULT = 0;

  // Opens directory at |dir_path|, returning a handle to it in |out_dir|,
  // which will be nullptr on failure.
  // Returns 0 on success and errno on failure.
  virtual int OpenDirectory(const std::string& dir_path,
                            SMBCFILE** out_dir) WARN_UNUSED_RESULT = 0;

  // Closes |dir|, which is from OpenDirectory().
  // Returns 0 on success and errno on failure.
  virtual int CloseDirectory(SMBCFILE* dir) WARN_UNUSED_RESULT = 0;

  // Seeks |offset| entries into |directory|.
  // Returns 0 on success and errno on failure.
  virtual int SeekDirectory(SMBCFILE* dir, off_t offset) WARN_UNUSED_RESULT = 0;

  // Retrieve the current offset in |dir| into |out_offset|.
  // Returns 0 on success and errno on failure.
  virtual int TellDirectory(SMBCFILE* dir,
                            off_t* out_offset) WARN_UNUSED_RESULT = 0;

  // Reads a directory entry from |dir|, returning metadata into
  // |out_file_info| and an associated stat structure into |out_stat|. Is used
  // in conjunction with SeekDirectory() to set the read offset. If no more
  // directory entries are available it will return 0 and set |out_file_info|
  // to a nullptr and |out_stat| to an empty struct.
  // Returns 0 on success and errno on failure.
  virtual int ReadDirectory(SMBCFILE* dir,
                            const struct libsmb_file_info** out_file_info,
                            struct stat* out_stat) WARN_UNUSED_RESULT = 0;

  // Removes the directory at |dir_path|.
  // Returns 0 on success and errno on failure.
  virtual int RemoveDirectory(const std::string& dir_path)
      WARN_UNUSED_RESULT = 0;
};

}  // namespace smbfs

#endif  // SMBFS_SAMBA_INTERFACE_H_
