1cfca06d7SDimitry Andric //===-- SBFile.cpp --------------------------------------------------------===//
2ead24645SDimitry Andric //
3ead24645SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ead24645SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5ead24645SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ead24645SDimitry Andric //
7ead24645SDimitry Andric //===----------------------------------------------------------------------===//
8ead24645SDimitry Andric
9ead24645SDimitry Andric #include "lldb/API/SBFile.h"
10ead24645SDimitry Andric #include "lldb/API/SBError.h"
11ead24645SDimitry Andric #include "lldb/Host/File.h"
126f8fc217SDimitry Andric #include "lldb/Utility/Instrumentation.h"
13ead24645SDimitry Andric
14ead24645SDimitry Andric using namespace lldb;
15ead24645SDimitry Andric using namespace lldb_private;
16ead24645SDimitry Andric
17cfca06d7SDimitry Andric SBFile::~SBFile() = default;
18ead24645SDimitry Andric
SBFile(FileSP file_sp)19ead24645SDimitry Andric SBFile::SBFile(FileSP file_sp) : m_opaque_sp(file_sp) {
20cfca06d7SDimitry Andric // We have no way to capture the incoming FileSP as the class isn't
21cfca06d7SDimitry Andric // instrumented, so pretend that it's always null.
226f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, file_sp);
23cfca06d7SDimitry Andric }
24cfca06d7SDimitry Andric
SBFile(const SBFile & rhs)25cfca06d7SDimitry Andric SBFile::SBFile(const SBFile &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
266f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
27cfca06d7SDimitry Andric }
28cfca06d7SDimitry Andric
operator =(const SBFile & rhs)29cfca06d7SDimitry Andric SBFile &SBFile ::operator=(const SBFile &rhs) {
306f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
31cfca06d7SDimitry Andric
32cfca06d7SDimitry Andric if (this != &rhs)
33cfca06d7SDimitry Andric m_opaque_sp = rhs.m_opaque_sp;
346f8fc217SDimitry Andric return *this;
35ead24645SDimitry Andric }
36ead24645SDimitry Andric
SBFile()376f8fc217SDimitry Andric SBFile::SBFile() { LLDB_INSTRUMENT_VA(this); }
38ead24645SDimitry Andric
SBFile(FILE * file,bool transfer_ownership)39ead24645SDimitry Andric SBFile::SBFile(FILE *file, bool transfer_ownership) {
406f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, file, transfer_ownership);
41cfca06d7SDimitry Andric
42ead24645SDimitry Andric m_opaque_sp = std::make_shared<NativeFile>(file, transfer_ownership);
43ead24645SDimitry Andric }
44ead24645SDimitry Andric
SBFile(int fd,const char * mode,bool transfer_owndership)45ead24645SDimitry Andric SBFile::SBFile(int fd, const char *mode, bool transfer_owndership) {
466f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, fd, mode, transfer_owndership);
47cfca06d7SDimitry Andric
48ead24645SDimitry Andric auto options = File::GetOptionsFromMode(mode);
49ead24645SDimitry Andric if (!options) {
50ead24645SDimitry Andric llvm::consumeError(options.takeError());
51ead24645SDimitry Andric return;
52ead24645SDimitry Andric }
53ead24645SDimitry Andric m_opaque_sp =
54ead24645SDimitry Andric std::make_shared<NativeFile>(fd, options.get(), transfer_owndership);
55ead24645SDimitry Andric }
56ead24645SDimitry Andric
Read(uint8_t * buf,size_t num_bytes,size_t * bytes_read)57ead24645SDimitry Andric SBError SBFile::Read(uint8_t *buf, size_t num_bytes, size_t *bytes_read) {
586f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, buf, num_bytes, bytes_read);
59cfca06d7SDimitry Andric
60ead24645SDimitry Andric SBError error;
61ead24645SDimitry Andric if (!m_opaque_sp) {
62ead24645SDimitry Andric error.SetErrorString("invalid SBFile");
63ead24645SDimitry Andric *bytes_read = 0;
64ead24645SDimitry Andric } else {
65ead24645SDimitry Andric Status status = m_opaque_sp->Read(buf, num_bytes);
66ead24645SDimitry Andric error.SetError(status);
67ead24645SDimitry Andric *bytes_read = num_bytes;
68ead24645SDimitry Andric }
696f8fc217SDimitry Andric return error;
70ead24645SDimitry Andric }
71ead24645SDimitry Andric
Write(const uint8_t * buf,size_t num_bytes,size_t * bytes_written)72ead24645SDimitry Andric SBError SBFile::Write(const uint8_t *buf, size_t num_bytes,
73ead24645SDimitry Andric size_t *bytes_written) {
746f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, buf, num_bytes, bytes_written);
75cfca06d7SDimitry Andric
76ead24645SDimitry Andric SBError error;
77ead24645SDimitry Andric if (!m_opaque_sp) {
78ead24645SDimitry Andric error.SetErrorString("invalid SBFile");
79ead24645SDimitry Andric *bytes_written = 0;
80ead24645SDimitry Andric } else {
81ead24645SDimitry Andric Status status = m_opaque_sp->Write(buf, num_bytes);
82ead24645SDimitry Andric error.SetError(status);
83ead24645SDimitry Andric *bytes_written = num_bytes;
84ead24645SDimitry Andric }
856f8fc217SDimitry Andric return error;
86ead24645SDimitry Andric }
87ead24645SDimitry Andric
Flush()88ead24645SDimitry Andric SBError SBFile::Flush() {
896f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
90cfca06d7SDimitry Andric
91ead24645SDimitry Andric SBError error;
92ead24645SDimitry Andric if (!m_opaque_sp) {
93ead24645SDimitry Andric error.SetErrorString("invalid SBFile");
94ead24645SDimitry Andric } else {
95ead24645SDimitry Andric Status status = m_opaque_sp->Flush();
96ead24645SDimitry Andric error.SetError(status);
97ead24645SDimitry Andric }
986f8fc217SDimitry Andric return error;
99ead24645SDimitry Andric }
100ead24645SDimitry Andric
IsValid() const101ead24645SDimitry Andric bool SBFile::IsValid() const {
1026f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
103ead24645SDimitry Andric return m_opaque_sp && m_opaque_sp->IsValid();
104ead24645SDimitry Andric }
105ead24645SDimitry Andric
Close()106ead24645SDimitry Andric SBError SBFile::Close() {
1076f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
108ead24645SDimitry Andric SBError error;
109ead24645SDimitry Andric if (m_opaque_sp) {
110ead24645SDimitry Andric Status status = m_opaque_sp->Close();
111ead24645SDimitry Andric error.SetError(status);
112ead24645SDimitry Andric }
1136f8fc217SDimitry Andric return error;
114ead24645SDimitry Andric }
115ead24645SDimitry Andric
operator bool() const116ead24645SDimitry Andric SBFile::operator bool() const {
1176f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
118706b4fc4SDimitry Andric return IsValid();
119ead24645SDimitry Andric }
120ead24645SDimitry Andric
operator !() const121ead24645SDimitry Andric bool SBFile::operator!() const {
1226f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
123706b4fc4SDimitry Andric return !IsValid();
124ead24645SDimitry Andric }
125ead24645SDimitry Andric
GetFile() const126ead24645SDimitry Andric FileSP SBFile::GetFile() const {
1276f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
1286f8fc217SDimitry Andric return m_opaque_sp;
129ead24645SDimitry Andric }
130