c.setStart(len);
c.setEnd(len + blob.dataLength);
c.setContentKey(blob.hash);
}
ResumableMD5Digest md5 = ResumableMD5Digest.get();
if (file.hasHashResume() && !file.getHashResume().isEmpty()) {
md5.setState(file.getHashResume(), file.getLength());
md5.update(blob.data);
} else {
BlobStore blobStore = getBlobStore(project);
CloudObject cloudObject = new CloudObject(oldFileData);
try (InputStream is = cloudObject.getInputStream(blobStore)) {
md5.update(is);
}
md5.update(blob.data);
}
ByteString hashResume = md5.getState();
ByteString hash = ByteString.copyFrom(md5.digest());
file.setHash(hash);
// NOTE: hashResume can contain plaintext. Careful around encryption!
file.setHashResume(hashResume);