//===-- ConnectionGenericFileWindows.h --------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_Host_windows_ConnectionGenericFileWindows_h_
#define liblldb_Host_windows_ConnectionGenericFileWindows_h_

#include "lldb/Host/windows/windows.h"
#include "lldb/Utility/Connection.h"
#include "lldb/lldb-types.h"

namespace lldb_private {

class Status;

class ConnectionGenericFile : public lldb_private::Connection {
public:
  ConnectionGenericFile();

  ConnectionGenericFile(lldb::file_t file, bool owns_file);

  ~ConnectionGenericFile() override;

  bool IsConnected() const override;

  lldb::ConnectionStatus Connect(llvm::StringRef s, Status *error_ptr) override;

  lldb::ConnectionStatus Disconnect(Status *error_ptr) override;

  size_t Read(void *dst, size_t dst_len, const Timeout<std::micro> &timeout,
              lldb::ConnectionStatus &status, Status *error_ptr) override;

  size_t Write(const void *src, size_t src_len, lldb::ConnectionStatus &status,
               Status *error_ptr) override;

  std::string GetURI() override;

  bool InterruptRead() override;

protected:
  OVERLAPPED m_overlapped;
  HANDLE m_file;
  HANDLE m_event_handles[2];
  bool m_owns_file;
  LARGE_INTEGER m_file_position;

  enum { kBytesAvailableEvent, kInterruptEvent };

private:
  void InitializeEventHandles();
  void IncrementFilePointer(DWORD amount);

  std::string m_uri;

  DISALLOW_COPY_AND_ASSIGN(ConnectionGenericFile);
};
}

#endif
