Index: util/file/file_io_win.cc |
diff --git a/util/numeric/in_range_cast.h b/util/file/file_io_win.cc |
similarity index 42% |
copy from util/numeric/in_range_cast.h |
copy to util/file/file_io_win.cc |
index 3dba10afa16016bb7149cd1fa7b4ae14c72cfca2..de13219c0f287c516abea6efeaba8ffaef178c26 100644 |
--- a/util/numeric/in_range_cast.h |
+++ b/util/file/file_io_win.cc |
@@ -12,33 +12,44 @@ |
// See the License for the specific language governing permissions and |
// limitations under the License. |
-#ifndef CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ |
-#define CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ |
+#include "util/file/file_io.h" |
#include "base/logging.h" |
#include "base/numerics/safe_conversions.h" |
namespace crashpad { |
-//! \brief Casts to a different type if it can be done without data loss, |
-//! logging a warning message and returing a default value otherwise. |
-//! |
-//! \param[in] source The value to convert and return. |
-//! \param[in] default_value The default value to return, in the event that \a |
-//! source cannot be represented in the destination type. |
-//! |
-//! \return \a source if it can be represented in the destination type, |
-//! otherwise \a default_value. |
-template <typename Destination, typename Source> |
-Destination InRangeCast(Source source, Destination default_value) { |
- if (base::IsValueInRangeForNumericType<Destination>(source)) { |
- return static_cast<Destination>(source); |
- } |
- |
- LOG(WARNING) << "value " << source << " out of range"; |
- return static_cast<Destination>(default_value); |
+// TODO(scottmg): Handle > DWORD sized writes if necessary. |
+ |
+ssize_t ReadFile(FileHandle file, void* buffer, size_t size) { |
+ DWORD size_dword = base::checked_cast<DWORD>(size); |
+ DWORD total_read = 0; |
+ BOOL success; |
+ do { |
+ DWORD bytes_read; |
+ success = ::ReadFile(file, buffer, size_dword, &bytes_read, nullptr); |
Mark Mentovai
2014/12/17 01:05:24
On the second pass, buffer needs to point beyond i
scottmg
2014/12/17 01:50:27
Oh boy! Hopefully tests would have saved me eventu
|
+ if (!success && GetLastError() != ERROR_MORE_DATA) |
Mark Mentovai
2014/12/17 01:05:24
ReadFile()’s docs say that you’ll get ERROR_MORE_D
scottmg
2014/12/17 01:50:28
Raymond gets upset when Windows programmers poke a
Mark Mentovai
2014/12/17 05:39:16
scottmg wrote:
|
+ return -1; |
+ total_read += bytes_read; |
+ } while (!success); |
+ return total_read; |
} |
-} // namespace crashpad |
+ssize_t WriteFile(FileHandle file, const void* buffer, size_t size) { |
+ // TODO(scottmg): This might need to handle the limit for pipes across a |
+ // network in the future. |
+ DWORD size_dword = base::checked_cast<DWORD>(size); |
+ DWORD bytes_written; |
+ BOOL rv = ::WriteFile(file, buffer, size_dword, &bytes_written, nullptr); |
Mark Mentovai
2014/12/17 01:05:24
WriteFile()’s docs aren’t 100% convincing about sh
scottmg
2014/12/17 01:50:28
SG. The link above is also clear that it cannot su
|
+ if (!rv) |
+ return -1; |
+ return bytes_written; |
Mark Mentovai
2014/12/17 01:05:24
…so let’s make it explicit and [D]CHECK_EQ(bytes_w
scottmg
2014/12/17 01:50:28
Done.
|
+} |
-#endif // CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ |
+bool LoggingCloseFile(FileHandle file) { |
+ BOOL rv = CloseHandle(file); |
+ PLOG_IF(ERROR, !rv) << "CloseHandle"; |
+ return rv; |
+} |
+ |
+} // namespace crashpad |