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