OLD | NEW |
1 // Copyright 2016 The Crashpad Authors. All rights reserved. | 1 // Copyright 2016 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 return writer_->Write(data, size); | 49 return writer_->Write(data, size); |
50 } | 50 } |
51 | 51 |
52 private: | 52 private: |
53 const MemorySnapshot* snapshot_; | 53 const MemorySnapshot* snapshot_; |
54 FileWriterInterface* writer_; | 54 FileWriterInterface* writer_; |
55 | 55 |
56 DISALLOW_COPY_AND_ASSIGN(SnapshotContentsWriter); | 56 DISALLOW_COPY_AND_ASSIGN(SnapshotContentsWriter); |
57 }; | 57 }; |
58 | 58 |
59 class MinidumpUserStreamWriter::BufferContentsWriter final | 59 class MinidumpUserStreamWriter::ExtensionStreamContentsWriter final |
60 : public MinidumpUserStreamWriter::ContentsWriter { | 60 : public MinidumpUserStreamWriter::ContentsWriter, |
| 61 public MinidumpUserExtensionStreamDataSource::Delegate { |
61 public: | 62 public: |
62 BufferContentsWriter(const void* buffer, size_t buffer_size) | 63 explicit ExtensionStreamContentsWriter( |
63 : buffer_(buffer), buffer_size_(buffer_size) {} | 64 std::unique_ptr<MinidumpUserExtensionStreamDataSource> data_source) |
| 65 : data_source_(std::move(data_source)), writer_(nullptr) {} |
64 | 66 |
65 bool WriteContents(FileWriterInterface* writer) override { | 67 bool WriteContents(FileWriterInterface* writer) override { |
66 return writer->Write(buffer_, buffer_size_); | 68 DCHECK(!writer_); |
| 69 |
| 70 writer_ = writer; |
| 71 return data_source_->ReadStreamData(this); |
67 } | 72 } |
68 size_t GetSize() const override { return buffer_size_; } | 73 |
| 74 size_t GetSize() const override { return data_source_->StreamDataSize(); } |
| 75 |
| 76 bool ExtensionStreamDataSourceRead(const void* data, size_t size) override { |
| 77 return writer_->Write(data, size); |
| 78 } |
69 | 79 |
70 private: | 80 private: |
71 const void* buffer_; | 81 std::unique_ptr<MinidumpUserExtensionStreamDataSource> data_source_; |
72 size_t buffer_size_; | 82 FileWriterInterface* writer_; |
73 | 83 |
74 DISALLOW_COPY_AND_ASSIGN(BufferContentsWriter); | 84 DISALLOW_COPY_AND_ASSIGN(ExtensionStreamContentsWriter); |
75 }; | 85 }; |
76 | 86 |
77 MinidumpUserStreamWriter::MinidumpUserStreamWriter() : stream_type_() {} | 87 MinidumpUserStreamWriter::MinidumpUserStreamWriter() : stream_type_() {} |
78 | 88 |
79 MinidumpUserStreamWriter::~MinidumpUserStreamWriter() { | 89 MinidumpUserStreamWriter::~MinidumpUserStreamWriter() { |
80 } | 90 } |
81 | 91 |
82 void MinidumpUserStreamWriter::InitializeFromSnapshot( | 92 void MinidumpUserStreamWriter::InitializeFromSnapshot( |
83 const UserMinidumpStream* stream) { | 93 const UserMinidumpStream* stream) { |
84 DCHECK_EQ(state(), kStateMutable); | 94 DCHECK_EQ(state(), kStateMutable); |
85 DCHECK(!contents_writer_.get()); | 95 DCHECK(!contents_writer_.get()); |
86 | 96 |
87 stream_type_ = static_cast<MinidumpStreamType>(stream->stream_type()); | 97 stream_type_ = static_cast<MinidumpStreamType>(stream->stream_type()); |
88 contents_writer_ = | 98 contents_writer_ = |
89 base::WrapUnique(new SnapshotContentsWriter(stream->memory())); | 99 base::WrapUnique(new SnapshotContentsWriter(stream->memory())); |
90 } | 100 } |
91 | 101 |
92 void MinidumpUserStreamWriter::InitializeFromBuffer( | 102 void MinidumpUserStreamWriter::InitializeFromUserExtensionStream( |
93 MinidumpStreamType stream_type, | 103 std::unique_ptr<MinidumpUserExtensionStreamDataSource> data_source) { |
94 const void* buffer, | |
95 size_t buffer_size) { | |
96 DCHECK_EQ(state(), kStateMutable); | 104 DCHECK_EQ(state(), kStateMutable); |
97 DCHECK(!contents_writer_.get()); | 105 DCHECK(!contents_writer_.get()); |
98 | 106 |
99 stream_type_ = stream_type; | 107 stream_type_ = data_source->stream_type(); |
100 contents_writer_ = | 108 contents_writer_ = base::WrapUnique( |
101 base::WrapUnique(new BufferContentsWriter(buffer, buffer_size)); | 109 new ExtensionStreamContentsWriter(std::move(data_source))); |
102 } | 110 } |
103 | 111 |
104 bool MinidumpUserStreamWriter::Freeze() { | 112 bool MinidumpUserStreamWriter::Freeze() { |
105 DCHECK_EQ(state(), kStateMutable); | 113 DCHECK_EQ(state(), kStateMutable); |
106 DCHECK_NE(stream_type_, 0u); | 114 DCHECK_NE(stream_type_, 0u); |
107 return MinidumpStreamWriter::Freeze(); | 115 return MinidumpStreamWriter::Freeze(); |
108 } | 116 } |
109 | 117 |
110 size_t MinidumpUserStreamWriter::SizeOfObject() { | 118 size_t MinidumpUserStreamWriter::SizeOfObject() { |
111 DCHECK_GE(state(), kStateFrozen); | 119 DCHECK_GE(state(), kStateFrozen); |
(...skipping 11 matching lines...) Expand all Loading... |
123 DCHECK_EQ(state(), kStateWritable); | 131 DCHECK_EQ(state(), kStateWritable); |
124 | 132 |
125 return contents_writer_->WriteContents(file_writer); | 133 return contents_writer_->WriteContents(file_writer); |
126 } | 134 } |
127 | 135 |
128 MinidumpStreamType MinidumpUserStreamWriter::StreamType() const { | 136 MinidumpStreamType MinidumpUserStreamWriter::StreamType() const { |
129 return static_cast<MinidumpStreamType>(stream_type_); | 137 return static_cast<MinidumpStreamType>(stream_type_); |
130 } | 138 } |
131 | 139 |
132 } // namespace crashpad | 140 } // namespace crashpad |
OLD | NEW |