Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Unified Diff: chrome/browser/drive/drive_api_util.h

Issue 875513006: Files.app: Implement md5 hashing over file streams. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address feedback. Move I/O onto the IO thread. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/drive/drive_api_util.h
diff --git a/chrome/browser/drive/drive_api_util.h b/chrome/browser/drive/drive_api_util.h
index 95771ca266ac150ee548a6af9e007f8fafef2f7f..977d6bbbcabff7d2451e45b450db902394614687 100644
--- a/chrome/browser/drive/drive_api_util.h
+++ b/chrome/browser/drive/drive_api_util.h
@@ -7,6 +7,7 @@
#include <string>
+#include "base/md5.h"
#include "base/memory/scoped_ptr.h"
#include "google_apis/drive/drive_api_error_codes.h"
#include "google_apis/drive/drive_common_callbacks.h"
@@ -26,6 +27,14 @@ class FileResource;
class ResourceEntry;
} // namespace google_apis
+namespace net {
+class IOBuffer;
+} // namespace net
+
+namespace storage {
+class FileStreamReader;
+} // namespace storage
+
namespace drive {
namespace util {
@@ -64,6 +73,43 @@ std::string CanonicalizeResourceId(const std::string& resource_id);
// or an empty string if an error is found.
std::string GetMd5Digest(const base::FilePath& file_path);
+// Computes the (base-16 encoded) MD5 digest of data extracted from a file
+// stream.
+class FileStreamMd5Digester
+ : public base::RefCountedThreadSafe<FileStreamMd5Digester> {
+ public:
+ typedef base::Callback<void(const std::string&)> ResultCallback;
+
+ FileStreamMd5Digester();
+
+ // Computes an MD5 digest of data read from the given |streamReader|. The
+ // work occurs asynchronously, and the resulting hash is returned via the
+ // |callback|. If an error occurs, |callback| is called with an empty string.
+ // Only one stream can be processed at a time by each digester. Do not call
+ // GetMd5Digest before the results of a previous call have been returned.
+ void GetMd5Digest(scoped_ptr<storage::FileStreamReader> stream_reader,
+ const ResultCallback& callback);
+
+ private:
+ // Private for RefCountedThreadSafe.
+ ~FileStreamMd5Digester();
+
+ // Kicks off a read of the next chunk from the stream.
+ void ReadNextChunk();
+ // Handles the incoming chunk of data from a stream read.
+ void OnChunkRead(int result);
+
+ // Maximum chunk size for read operations.
+ static const int kBufferSize_ = 512 * 1024; // 512 kB.
mtomasz 2015/02/02 23:47:08 nit: Yeah, I'd suggest to move it to an anonymous
Ben Kwa 2015/02/03 16:32:19 Done.
+ scoped_ptr<storage::FileStreamReader> reader_;
+ ResultCallback callback_;
+ scoped_refptr<net::IOBuffer> buffer_;
+ base::MD5Context md5_context_;
+
+ friend class base::RefCountedThreadSafe<FileStreamMd5Digester>;
+ DISALLOW_COPY_AND_ASSIGN(FileStreamMd5Digester);
+};
+
// Returns preferred file extension for hosted documents which have given mime
// type.
std::string GetHostedDocumentExtension(const std::string& mime_type);

Powered by Google App Engine
This is Rietveld 408576698