Index: minidump/minidump_crashpad_module_writer.cc |
diff --git a/minidump/minidump_crashpad_module_writer.cc b/minidump/minidump_crashpad_module_writer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3cd40afcb975b2b99bf6be32e0f10e7bef1a1f38 |
--- /dev/null |
+++ b/minidump/minidump_crashpad_module_writer.cc |
@@ -0,0 +1,161 @@ |
+// Copyright 2014 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 "minidump/minidump_crashpad_module_writer.h" |
+ |
+#include "base/logging.h" |
+#include "minidump/minidump_simple_string_dictionary_writer.h" |
+#include "util/file/file_writer.h" |
+#include "util/numeric/safe_assignment.h" |
+ |
+namespace crashpad { |
+ |
+MinidumpCrashpadModuleWriter::MinidumpCrashpadModuleWriter() |
+ : MinidumpWritable(), crashpad_module_(), simple_annotations_() { |
+ crashpad_module_.version = MinidumpCrashpadModule::kVersion; |
+} |
+ |
+MinidumpCrashpadModuleWriter::~MinidumpCrashpadModuleWriter() { |
+} |
+ |
+void MinidumpCrashpadModuleWriter::SetSimpleAnnotations( |
+ MinidumpSimpleStringDictionaryWriter* simple_annotations) { |
+ DCHECK_EQ(state(), kStateMutable); |
+ |
+ simple_annotations_ = simple_annotations; |
+} |
+ |
+bool MinidumpCrashpadModuleWriter::Freeze() { |
+ DCHECK_EQ(state(), kStateMutable); |
+ |
+ if (!MinidumpWritable::Freeze()) { |
+ return false; |
+ } |
+ |
+ if (simple_annotations_) { |
+ simple_annotations_->RegisterLocationDescriptor( |
+ &crashpad_module_.simple_annotations); |
+ } |
+ |
+ return true; |
+} |
+ |
+size_t MinidumpCrashpadModuleWriter::SizeOfObject() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ |
+ return sizeof(crashpad_module_); |
+} |
+ |
+std::vector<internal::MinidumpWritable*> |
+MinidumpCrashpadModuleWriter::Children() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ |
+ std::vector<MinidumpWritable*> children; |
+ if (simple_annotations_) { |
+ children.push_back(simple_annotations_); |
+ } |
+ |
+ return children; |
+} |
+ |
+bool MinidumpCrashpadModuleWriter::WriteObject( |
+ FileWriterInterface* file_writer) { |
+ DCHECK_EQ(state(), kStateWritable); |
+ |
+ return file_writer->Write(&crashpad_module_, sizeof(crashpad_module_)); |
+} |
+ |
+MinidumpCrashpadModuleListWriter::MinidumpCrashpadModuleListWriter() |
+ : MinidumpWritable(), |
+ crashpad_module_list_base_(), |
+ crashpad_modules_(), |
+ crashpad_module_location_descriptors_() { |
+} |
+ |
+MinidumpCrashpadModuleListWriter::~MinidumpCrashpadModuleListWriter() { |
+} |
+ |
+void MinidumpCrashpadModuleListWriter::AddCrashpadModule( |
+ MinidumpCrashpadModuleWriter* crashpad_module) { |
+ DCHECK_EQ(state(), kStateMutable); |
+ |
+ crashpad_modules_.push_back(crashpad_module); |
+} |
+ |
+bool MinidumpCrashpadModuleListWriter::Freeze() { |
+ DCHECK_EQ(state(), kStateMutable); |
+ DCHECK(crashpad_module_location_descriptors_.empty()); |
+ |
+ if (!MinidumpWritable::Freeze()) { |
+ return false; |
+ } |
+ |
+ size_t crashpad_module_count = crashpad_modules_.size(); |
+ if (!AssignIfInRange(&crashpad_module_list_base_.count, |
+ crashpad_module_count)) { |
+ LOG(ERROR) << "crashpad_module_count " << crashpad_module_count |
+ << " out of range"; |
+ return false; |
+ } |
+ |
+ crashpad_module_location_descriptors_.resize(crashpad_module_count); |
+ for (size_t index = 0; index < crashpad_module_count; ++index) { |
+ crashpad_modules_[index]->RegisterLocationDescriptor( |
+ &crashpad_module_location_descriptors_[index]); |
+ } |
+ |
+ return true; |
+} |
+ |
+size_t MinidumpCrashpadModuleListWriter::SizeOfObject() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ |
+ return sizeof(crashpad_module_list_base_) + |
+ crashpad_modules_.size() * sizeof(MINIDUMP_LOCATION_DESCRIPTOR); |
+} |
+ |
+std::vector<internal::MinidumpWritable*> |
+MinidumpCrashpadModuleListWriter::Children() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ |
+ std::vector<MinidumpWritable*> children; |
+ for (MinidumpCrashpadModuleWriter* crashpad_module : crashpad_modules_) { |
+ children.push_back(crashpad_module); |
+ } |
+ |
+ return children; |
+} |
+ |
+bool MinidumpCrashpadModuleListWriter::WriteObject( |
+ FileWriterInterface* file_writer) { |
+ DCHECK_EQ(state(), kStateWritable); |
+ DCHECK_EQ(crashpad_modules_.size(), |
+ crashpad_module_location_descriptors_.size()); |
+ |
+ WritableIoVec iov; |
+ iov.iov_base = &crashpad_module_list_base_; |
+ iov.iov_len = sizeof(crashpad_module_list_base_); |
+ std::vector<WritableIoVec> iovecs(1, iov); |
+ |
+ if (!crashpad_module_location_descriptors_.empty()) { |
+ iov.iov_base = &crashpad_module_location_descriptors_[0]; |
+ iov.iov_len = crashpad_module_location_descriptors_.size() * |
+ sizeof(MINIDUMP_LOCATION_DESCRIPTOR); |
+ iovecs.push_back(iov); |
+ } |
+ |
+ return file_writer->WriteIoVec(&iovecs); |
+} |
+ |
+} // namespace crashpad |