Index: util/file/file_reader.cc |
diff --git a/util/file/file_reader.cc b/util/file/file_reader.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b6fd0173e262b294f4acb67f1cc85781bdbfe7b9 |
--- /dev/null |
+++ b/util/file/file_reader.cc |
@@ -0,0 +1,88 @@ |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#include "util/file/file_reader.h" |
+ |
+#include "base/logging.h" |
+#include "base/numerics/safe_conversions.h" |
+ |
+namespace crashpad { |
+ |
+WeakFileHandleFileReader::WeakFileHandleFileReader(FileHandle file_handle) |
+ : file_handle_(file_handle) { |
+} |
+ |
+WeakFileHandleFileReader::~WeakFileHandleFileReader() { |
+} |
+ |
+ssize_t WeakFileHandleFileReader::Read(void* data, size_t size) { |
+ DCHECK_NE(file_handle_, kInvalidFileHandle); |
+ |
+ // Don’t use LoggingReadFile(), which insists on a full read and only returns |
+ // a bool. This method permits short reads and returns the number of bytes |
+ // read. |
+ base::checked_cast<ssize_t>(size); |
+ ssize_t rv = ReadFile(file_handle_, data, size); |
+ if (rv < 0) { |
+ PLOG(ERROR) << "read"; |
+ return -1; |
+ } |
+ |
+ return rv; |
+} |
+ |
+FileOffset WeakFileHandleFileReader::Seek(FileOffset offset, int whence) { |
+ DCHECK_NE(file_handle_, kInvalidFileHandle); |
+ return LoggingSeekFile(file_handle_, offset, whence); |
+} |
+ |
+FileReader::FileReader() |
+ : file_(), |
+ weak_file_handle_file_reader_(kInvalidFileHandle) { |
+} |
+ |
+FileReader::~FileReader() { |
+} |
+ |
+bool FileReader::Open(const base::FilePath& path, |
+ FileWriteMode write_mode, |
+ FilePermissions permissions) { |
+ CHECK(!file_.is_valid()); |
+ file_.reset(LoggingOpenFileForRead(path)); |
+ if (!file_.is_valid()) { |
+ return false; |
+ } |
+ |
+ weak_file_handle_file_reader_.set_file_handle(file_.get()); |
+ return true; |
+} |
+ |
+void FileReader::Close() { |
+ CHECK(file_.is_valid()); |
+ |
+ weak_file_handle_file_reader_.set_file_handle(kInvalidFileHandle); |
+ file_.reset(); |
+} |
+ |
+ssize_t FileReader::Read(void* data, size_t size) { |
+ DCHECK(file_.is_valid()); |
+ return weak_file_handle_file_reader_.Read(data, size); |
+} |
+ |
+FileOffset FileReader::Seek(FileOffset offset, int whence) { |
+ DCHECK(file_.is_valid()); |
+ return weak_file_handle_file_reader_.Seek(offset, whence); |
+} |
+ |
+} // namespace crashpad |