| Index: minidump/minidump_memory_writer.cc | 
| diff --git a/minidump/minidump_memory_writer.cc b/minidump/minidump_memory_writer.cc | 
| index 30977a9ec0fd26731224b10b057d6f33d2fcae39..434515e99db5ae2a275c308d66a793155069ad73 100644 | 
| --- a/minidump/minidump_memory_writer.cc | 
| +++ b/minidump/minidump_memory_writer.cc | 
| @@ -14,15 +14,76 @@ | 
|  | 
| #include "minidump/minidump_memory_writer.h" | 
|  | 
| +#include "base/auto_reset.h" | 
| #include "base/logging.h" | 
| +#include "snapshot/memory_snapshot.h" | 
| #include "util/file/file_writer.h" | 
| #include "util/numeric/safe_assignment.h" | 
|  | 
| namespace crashpad { | 
| +namespace { | 
| + | 
| +class SnapshotMinidumpMemoryWriter final : public MinidumpMemoryWriter, | 
| +                                           public MemorySnapshot::Delegate { | 
| + public: | 
| +  explicit SnapshotMinidumpMemoryWriter(const MemorySnapshot* memory_snapshot) | 
| +      : MinidumpMemoryWriter(), | 
| +        MemorySnapshot::Delegate(), | 
| +        memory_snapshot_(memory_snapshot), | 
| +        file_writer_(nullptr) { | 
| +  } | 
| + | 
| +  ~SnapshotMinidumpMemoryWriter() override {} | 
| + | 
| +  // MemorySnapshot::Delegate: | 
| + | 
| +  bool MemorySnapshotDelegateRead(void* data, size_t size) override { | 
| +    DCHECK_EQ(state(), kStateWritable); | 
| +    DCHECK_EQ(size, MemoryRangeSize()); | 
| +    return file_writer_->Write(data, size); | 
| +  } | 
| + | 
| + protected: | 
| +  // MinidumpMemoryWriter: | 
| + | 
| +  bool WriteObject(FileWriterInterface* file_writer) override { | 
| +    DCHECK_EQ(state(), kStateWritable); | 
| +    DCHECK(!file_writer_); | 
| + | 
| +    base::AutoReset<FileWriterInterface*> file_writer_reset(&file_writer_, | 
| +                                                            file_writer); | 
| + | 
| +    // This will result in MemorySnapshotDelegateRead() being called. | 
| +    return memory_snapshot_->Read(this); | 
| +  } | 
| + | 
| +  uint64_t MemoryRangeBaseAddress() const override { | 
| +    DCHECK_EQ(state(), kStateFrozen); | 
| +    return memory_snapshot_->Address(); | 
| +  } | 
| + | 
| +  size_t MemoryRangeSize() const override { | 
| +    DCHECK_GE(state(), kStateFrozen); | 
| +    return memory_snapshot_->Size(); | 
| +  } | 
| + | 
| + private: | 
| +  const MemorySnapshot* memory_snapshot_; | 
| +  FileWriterInterface* file_writer_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(SnapshotMinidumpMemoryWriter); | 
| +}; | 
| + | 
| +}  // namespace | 
|  | 
| MinidumpMemoryWriter::~MinidumpMemoryWriter() { | 
| } | 
|  | 
| +scoped_ptr<MinidumpMemoryWriter> MinidumpMemoryWriter::CreateFromSnapshot( | 
| +    const MemorySnapshot* memory_snapshot) { | 
| +  return make_scoped_ptr(new SnapshotMinidumpMemoryWriter(memory_snapshot)); | 
| +} | 
| + | 
| const MINIDUMP_MEMORY_DESCRIPTOR* | 
| MinidumpMemoryWriter::MinidumpMemoryDescriptor() const { | 
| DCHECK_EQ(state(), kStateWritable); | 
| @@ -109,6 +170,17 @@ MinidumpMemoryListWriter::MinidumpMemoryListWriter() | 
| MinidumpMemoryListWriter::~MinidumpMemoryListWriter() { | 
| } | 
|  | 
| +void MinidumpMemoryListWriter::AddFromSnapshot( | 
| +    const std::vector<const MemorySnapshot*>& memory_snapshots) { | 
| +  DCHECK_EQ(state(), kStateMutable); | 
| + | 
| +  for (const MemorySnapshot* memory_snapshot : memory_snapshots) { | 
| +    scoped_ptr<MinidumpMemoryWriter> memory = | 
| +        MinidumpMemoryWriter::CreateFromSnapshot(memory_snapshot); | 
| +    AddMemory(memory.Pass()); | 
| +  } | 
| +} | 
| + | 
| void MinidumpMemoryListWriter::AddMemory( | 
| scoped_ptr<MinidumpMemoryWriter> memory_writer) { | 
| DCHECK_EQ(state(), kStateMutable); | 
|  |