Chromium Code Reviews| Index: chrome/browser/drive/drive_api_util.cc |
| diff --git a/chrome/browser/drive/drive_api_util.cc b/chrome/browser/drive/drive_api_util.cc |
| index 064f4a2d8740af5dc150982e12f84a2570fe56ca..622430b042392eab136e54c790b26e876b13f618 100644 |
| --- a/chrome/browser/drive/drive_api_util.cc |
| +++ b/chrome/browser/drive/drive_api_util.cc |
| @@ -16,6 +16,9 @@ |
| #include "base/values.h" |
| #include "google_apis/drive/drive_api_parser.h" |
| #include "net/base/escape.h" |
| +#include "net/base/io_buffer.h" |
| +#include "net/base/net_errors.h" |
| +#include "storage/browser/blob/file_stream_reader.h" |
| #include "third_party/re2/re2/re2.h" |
| #include "url/gurl.h" |
| @@ -163,6 +166,54 @@ std::string GetMd5Digest(const base::FilePath& file_path) { |
| return MD5DigestToBase16(digest); |
| } |
| +FileStreamMd5Digester::FileStreamMd5Digester() |
| + : buffer_(new net::IOBuffer(kBufferSize_)), weak_ptr_factory_(this) { |
| +} |
| + |
| +FileStreamMd5Digester::~FileStreamMd5Digester() { |
| +} |
| + |
| +void FileStreamMd5Digester::GetMd5Digest( |
| + scoped_ptr<storage::FileStreamReader> streamReader, |
| + const base::Callback<void(const std::string&)>& callback) { |
| + reader_ = streamReader.Pass(); |
| + callback_ = callback; |
| + base::MD5Init(&md5Context_); |
| + |
| + // Start the read/hash. |
| + readNextChunk(); |
| +} |
| + |
| +void FileStreamMd5Digester::readNextChunk() { |
| + int result = reader_->Read(buffer_.get(), kBufferSize_, |
|
mtomasz
2015/01/31 04:53:12
IIRC reader may have to be called on IO thread onl
mtomasz
2015/01/31 04:53:12
nit: const int
Ben Kwa
2015/02/02 22:22:11
Hm, you're right; I misread the FileStreamReader::
Ben Kwa
2015/02/02 22:22:11
Done.
|
| + base::Bind(&FileStreamMd5Digester::OnChunkRead, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + if (result != net::ERR_IO_PENDING) { |
| + OnChunkRead(result); |
| + } |
| +} |
| + |
| +void FileStreamMd5Digester::OnChunkRead(int result) { |
| + if (result < 0) { |
| + // Error - just return empty string |
|
mtomasz
2015/01/31 04:53:12
nit: period at the end of comments.
Ben Kwa
2015/02/02 22:22:11
Done.
|
| + callback_.Run(""); |
| + return; |
| + } else if (result == 0) { |
| + // EOF |
| + base::MD5Digest digest; |
| + base::MD5Final(&digest, &md5Context_); |
| + std::string result = MD5DigestToBase16(digest); |
| + callback_.Run(result); |
| + return; |
| + } |
| + |
| + // Read data and digest it. |
| + base::MD5Update(&md5Context_, base::StringPiece(buffer_->data(), result)); |
| + |
| + // Kick off the next read. |
| + readNextChunk(); |
| +} |
| + |
| std::string GetHostedDocumentExtension(const std::string& mime_type) { |
| for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) { |
| if (mime_type == kHostedDocumentKinds[i].mime_type) |