// 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_IMPL_H_
#define SMBFS_SAMBA_INTERFACE_IMPL_H_

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

#include <memory>
#include <string>

#include <base/memory/weak_ptr.h>
#include <base/synchronization/lock.h>
#include <gtest/gtest_prod.h>

#include "smbfs/samba_interface.h"
#include "smbfs/smb_credential.h"

namespace smbfs {

class SambaInterfaceImpl : public SambaInterface {
 public:
  SambaInterfaceImpl(std::unique_ptr<SmbCredential> credentials,
                     bool allow_ntlm);
  ~SambaInterfaceImpl() override;

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

  // SambaInterface overrides.
  WeakPtr AsWeakPtr() override;

  void UpdateCredentials(std::unique_ptr<SmbCredential> credentials) override;

  int StatVfs(const std::string& path, struct statvfs* out_statvfs) override;

  int OpenFile(const std::string& file_path,
               int flags,
               mode_t mode,
               SMBCFILE** out_file) override;
  int CloseFile(SMBCFILE* file) override;
  int SeekFile(SMBCFILE* file, off_t offset, int whence) override;
  int ReadFile(SMBCFILE* file,
               void* buf,
               size_t count,
               size_t* out_bytes_read) override;
  int WriteFile(SMBCFILE* file,
                const void* buf,
                size_t count,
                size_t* out_bytes_written) override;
  int TruncateFile(SMBCFILE* file, off_t size) override;
  int Stat(const std::string& path, struct stat* out_stat) override;
  int SetUtimes(const std::string& path,
                const struct timespec& atime,
                const struct timespec& mtime) override;
  int Rename(const std::string& old_path, const std::string& new_path) override;
  int UnlinkFile(const std::string& file_path) override;

  int CreateDirectory(const std::string& dir_path, mode_t mode) override;
  int OpenDirectory(const std::string& dir_path, SMBCFILE** out_dir) override;
  int CloseDirectory(SMBCFILE* dir) override;
  int SeekDirectory(SMBCFILE* dir, off_t offset) override;
  int TellDirectory(SMBCFILE* dir, off_t* out_offset) override;
  int ReadDirectory(SMBCFILE* dir,
                    const struct libsmb_file_info** out_file_info,
                    struct stat* out_stat) override;
  int RemoveDirectory(const std::string& dir_path) override;

 protected:
  // Protected constructor for unit test subclasses.
  SambaInterfaceImpl();

 private:
  FRIEND_TEST(SambaInterfaceImplTest, MakeStatModeBitsFromDOSAttributes);
  FRIEND_TEST(SambaInterfaceImplTest, UpdateCredentials);

  // Callback function for obtaining authentication credentials. Set by calling
  // smbc_setFunctionAuthDataWithContext() and called from libsmbclient.
  static void GetUserAuth(SMBCCTX* context,
                          const char* server,
                          const char* share,
                          char* workgroup,
                          int workgroup_len,
                          char* username,
                          int username_len,
                          char* password,
                          int password_len);

  // Constructs mode (type and permission) bits for stat from DOS attributes.
  mode_t MakeStatModeBitsFromDOSAttributes(uint16_t attrs) const;

  mutable base::Lock lock_;
  std::unique_ptr<SmbCredential> credentials_;

  SMBCCTX* context_ = nullptr;

  smbc_close_fn smbc_close_ctx_ = nullptr;
  smbc_closedir_fn smbc_closedir_ctx_ = nullptr;
  smbc_ftruncate_fn smbc_ftruncate_ctx_ = nullptr;
  smbc_lseek_fn smbc_lseek_ctx_ = nullptr;
  smbc_lseekdir_fn smbc_lseekdir_ctx_ = nullptr;
  smbc_mkdir_fn smbc_mkdir_ctx_ = nullptr;
  smbc_open_fn smbc_open_ctx_ = nullptr;
  smbc_opendir_fn smbc_opendir_ctx_ = nullptr;
  smbc_read_fn smbc_read_ctx_ = nullptr;
  // TODO(crbug.com/1054711): This should be swapped out for
  // smbc_readdirplus2_fn when Samba is updated to 4.12.
  smbc_readdirplus_fn smbc_readdirplus_ctx_ = nullptr;
  smbc_rename_fn smbc_rename_ctx_ = nullptr;
  smbc_rmdir_fn smbc_rmdir_ctx_ = nullptr;
  smbc_stat_fn smbc_stat_ctx_ = nullptr;
  smbc_statvfs_fn smbc_statvfs_ctx_ = nullptr;
  smbc_telldir_fn smbc_telldir_ctx_ = nullptr;
  smbc_unlink_fn smbc_unlink_ctx_ = nullptr;
  smbc_utimes_fn smbc_utimes_ctx_ = nullptr;
  smbc_write_fn smbc_write_ctx_ = nullptr;

  // Should be the last member.
  base::WeakPtrFactory<SambaInterfaceImpl> weak_factory_{this};
};

}  // namespace smbfs

#endif  // SMBFS_SAMBA_INTERFACE_IMPL_H_
