19dba64beSDimitry Andric //===-- SBFile.cpp ------------------------------------------*- C++ -*-===// 29dba64beSDimitry Andric // 39dba64beSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49dba64beSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 59dba64beSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69dba64beSDimitry Andric // 79dba64beSDimitry Andric //===----------------------------------------------------------------------===// 89dba64beSDimitry Andric 99dba64beSDimitry Andric #include "lldb/API/SBFile.h" 109dba64beSDimitry Andric #include "SBReproducerPrivate.h" 119dba64beSDimitry Andric #include "lldb/API/SBError.h" 129dba64beSDimitry Andric #include "lldb/Host/File.h" 139dba64beSDimitry Andric 149dba64beSDimitry Andric using namespace lldb; 159dba64beSDimitry Andric using namespace lldb_private; 169dba64beSDimitry Andric 179dba64beSDimitry Andric SBFile::~SBFile() {} 189dba64beSDimitry Andric 199dba64beSDimitry Andric SBFile::SBFile(FileSP file_sp) : m_opaque_sp(file_sp) { 209dba64beSDimitry Andric LLDB_RECORD_DUMMY(void, SBfile, SBFile, (FileSP), file_sp); 219dba64beSDimitry Andric } 229dba64beSDimitry Andric 239dba64beSDimitry Andric SBFile::SBFile() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFile); } 249dba64beSDimitry Andric 259dba64beSDimitry Andric SBFile::SBFile(FILE *file, bool transfer_ownership) { 269dba64beSDimitry Andric LLDB_RECORD_DUMMY(void, SBFile, (FILE *, bool), file, transfer_ownership); 279dba64beSDimitry Andric m_opaque_sp = std::make_shared<NativeFile>(file, transfer_ownership); 289dba64beSDimitry Andric } 299dba64beSDimitry Andric 309dba64beSDimitry Andric SBFile::SBFile(int fd, const char *mode, bool transfer_owndership) { 319dba64beSDimitry Andric LLDB_RECORD_DUMMY(void, SBFile, (int, const char *, bool), fd, mode, 329dba64beSDimitry Andric transfer_owndership); 339dba64beSDimitry Andric auto options = File::GetOptionsFromMode(mode); 349dba64beSDimitry Andric if (!options) { 359dba64beSDimitry Andric llvm::consumeError(options.takeError()); 369dba64beSDimitry Andric return; 379dba64beSDimitry Andric } 389dba64beSDimitry Andric m_opaque_sp = 399dba64beSDimitry Andric std::make_shared<NativeFile>(fd, options.get(), transfer_owndership); 409dba64beSDimitry Andric } 419dba64beSDimitry Andric 429dba64beSDimitry Andric SBError SBFile::Read(uint8_t *buf, size_t num_bytes, size_t *bytes_read) { 439dba64beSDimitry Andric LLDB_RECORD_DUMMY(lldb::SBError, SBFile, Read, (uint8_t *, size_t, size_t *), 449dba64beSDimitry Andric buf, num_bytes, bytes_read); 459dba64beSDimitry Andric SBError error; 469dba64beSDimitry Andric if (!m_opaque_sp) { 479dba64beSDimitry Andric error.SetErrorString("invalid SBFile"); 489dba64beSDimitry Andric *bytes_read = 0; 499dba64beSDimitry Andric } else { 509dba64beSDimitry Andric Status status = m_opaque_sp->Read(buf, num_bytes); 519dba64beSDimitry Andric error.SetError(status); 529dba64beSDimitry Andric *bytes_read = num_bytes; 539dba64beSDimitry Andric } 549dba64beSDimitry Andric return LLDB_RECORD_RESULT(error); 559dba64beSDimitry Andric } 569dba64beSDimitry Andric 579dba64beSDimitry Andric SBError SBFile::Write(const uint8_t *buf, size_t num_bytes, 589dba64beSDimitry Andric size_t *bytes_written) { 599dba64beSDimitry Andric LLDB_RECORD_DUMMY(lldb::SBError, SBFile, Write, 609dba64beSDimitry Andric (const uint8_t *, size_t, size_t *), buf, num_bytes, 619dba64beSDimitry Andric bytes_written); 629dba64beSDimitry Andric SBError error; 639dba64beSDimitry Andric if (!m_opaque_sp) { 649dba64beSDimitry Andric error.SetErrorString("invalid SBFile"); 659dba64beSDimitry Andric *bytes_written = 0; 669dba64beSDimitry Andric } else { 679dba64beSDimitry Andric Status status = m_opaque_sp->Write(buf, num_bytes); 689dba64beSDimitry Andric error.SetError(status); 699dba64beSDimitry Andric *bytes_written = num_bytes; 709dba64beSDimitry Andric } 719dba64beSDimitry Andric return LLDB_RECORD_RESULT(error); 729dba64beSDimitry Andric } 739dba64beSDimitry Andric 749dba64beSDimitry Andric SBError SBFile::Flush() { 759dba64beSDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBFile, Flush); 769dba64beSDimitry Andric SBError error; 779dba64beSDimitry Andric if (!m_opaque_sp) { 789dba64beSDimitry Andric error.SetErrorString("invalid SBFile"); 799dba64beSDimitry Andric } else { 809dba64beSDimitry Andric Status status = m_opaque_sp->Flush(); 819dba64beSDimitry Andric error.SetError(status); 829dba64beSDimitry Andric } 839dba64beSDimitry Andric return LLDB_RECORD_RESULT(error); 849dba64beSDimitry Andric } 859dba64beSDimitry Andric 869dba64beSDimitry Andric bool SBFile::IsValid() const { 879dba64beSDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, IsValid); 889dba64beSDimitry Andric return m_opaque_sp && m_opaque_sp->IsValid(); 899dba64beSDimitry Andric } 909dba64beSDimitry Andric 919dba64beSDimitry Andric SBError SBFile::Close() { 929dba64beSDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBFile, Close); 939dba64beSDimitry Andric SBError error; 949dba64beSDimitry Andric if (m_opaque_sp) { 959dba64beSDimitry Andric Status status = m_opaque_sp->Close(); 969dba64beSDimitry Andric error.SetError(status); 979dba64beSDimitry Andric } 989dba64beSDimitry Andric return LLDB_RECORD_RESULT(error); 999dba64beSDimitry Andric } 1009dba64beSDimitry Andric 1019dba64beSDimitry Andric SBFile::operator bool() const { 1029dba64beSDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, operator bool); 103*480093f4SDimitry Andric return IsValid(); 1049dba64beSDimitry Andric } 1059dba64beSDimitry Andric 1069dba64beSDimitry Andric bool SBFile::operator!() const { 1079dba64beSDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, operator!); 108*480093f4SDimitry Andric return !IsValid(); 1099dba64beSDimitry Andric } 1109dba64beSDimitry Andric 1119dba64beSDimitry Andric FileSP SBFile::GetFile() const { 1129dba64beSDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(FileSP, SBFile, GetFile); 113*480093f4SDimitry Andric return LLDB_RECORD_RESULT(m_opaque_sp); 1149dba64beSDimitry Andric } 1159dba64beSDimitry Andric 1169dba64beSDimitry Andric namespace lldb_private { 1179dba64beSDimitry Andric namespace repro { 1189dba64beSDimitry Andric 1199dba64beSDimitry Andric template <> void RegisterMethods<SBFile>(Registry &R) { 120*480093f4SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBFile, ()); 121*480093f4SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBFile, (FileSP)); 122*480093f4SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBFile, (FILE *, bool)); 123*480093f4SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBFile, (int, const char *, bool)); 1249dba64beSDimitry Andric LLDB_REGISTER_METHOD(lldb::SBError, SBFile, Flush, ()); 1259dba64beSDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBFile, IsValid, ()); 1269dba64beSDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBFile, operator bool,()); 1279dba64beSDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBFile, operator!,()); 1289dba64beSDimitry Andric LLDB_REGISTER_METHOD_CONST(FileSP, SBFile, GetFile, ()); 1299dba64beSDimitry Andric LLDB_REGISTER_METHOD(lldb::SBError, SBFile, Close, ()); 1309dba64beSDimitry Andric } 1319dba64beSDimitry Andric } // namespace repro 1329dba64beSDimitry Andric } // namespace lldb_private 133