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

Unified Diff: chrome/browser/media_galleries/fileapi/picasa/pmp_column_reader.cc

Issue 17101030: Media Galleries API - Picasa: Change PMP Parsing to deal with PlatformFile. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 6 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/media_galleries/fileapi/picasa/pmp_column_reader.cc
diff --git a/chrome/browser/media_galleries/fileapi/picasa/pmp_column_reader.cc b/chrome/browser/media_galleries/fileapi/picasa/pmp_column_reader.cc
index cf799d41539451f9ee3c636c15c1fbd95caef9bc..4343960de2c675464e15f03805e196766fe1c895 100644
--- a/chrome/browser/media_galleries/fileapi/picasa/pmp_column_reader.cc
+++ b/chrome/browser/media_galleries/fileapi/picasa/pmp_column_reader.cc
@@ -7,7 +7,6 @@
#include <cstring>
#include "base/file_util.h"
-#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/threading/thread_restrictions.h"
@@ -15,6 +14,7 @@ namespace picasa {
namespace {
+COMPILE_ASSERT(sizeof(double) == 8, double_must_be_8_bytes_long);
const int64 kPmpMaxFilesize = 50*1024*1024; // Arbitrary maximum of 50 MB.
} // namespace
@@ -22,19 +22,23 @@ const int64 kPmpMaxFilesize = 50*1024*1024; // Arbitrary maximum of 50 MB.
PmpColumnReader::PmpColumnReader()
: length_(0),
field_type_(PMP_TYPE_INVALID),
- rows_(0) {}
+ rows_read_(0) {}
PmpColumnReader::~PmpColumnReader() {}
-bool PmpColumnReader::Init(const base::FilePath& filepath,
- const PmpFieldType expected_type,
- uint32* rows_read) {
+bool PmpColumnReader::ReadFile(const base::PlatformFile& file,
Lei Zhang 2013/06/21 02:15:50 PlatformFiles are just ints/HANDLEs. I think peopl
tommycli 2013/06/21 16:14:23 Done.
+ const PmpFieldType expected_type) {
DCHECK(!data_.get());
base::ThreadRestrictions::AssertIOAllowed();
- if (!file_util::GetFileSize(filepath, &length_))
+ if (file == base::kInvalidPlatformFileValue)
return false;
+ base::PlatformFileInfo info;
+ if (!base::GetPlatformFileInfo(file, &info))
+ return false;
+ length_ = info.size;
+
if (length_ < kPmpHeaderSize || length_ > kPmpMaxFilesize)
return false;
@@ -44,11 +48,12 @@ bool PmpColumnReader::Init(const base::FilePath& filepath,
DCHECK(length_ < kint32max); // ReadFile expects an int.
- bool success = file_util::ReadFile(filepath, data_begin, length_) &&
- ParseData(expected_type, rows_read);
+ bool success = base::ReadPlatformFile(file, 0, data_begin, length_) &&
+ ParseData(expected_type);
+ // If any of the reading or parsing fails, prevent Read* calls.
if (!success)
- rows_ = 0; // If any of the reading or parsing fails, prevent Read* calls.
+ rows_read_ = 0;
return success;
}
@@ -56,7 +61,7 @@ bool PmpColumnReader::Init(const base::FilePath& filepath,
bool PmpColumnReader::ReadString(const uint32 row, std::string* result) const {
DCHECK(data_.get() != NULL);
- if (field_type_ != PMP_TYPE_STRING || row >= rows_)
+ if (field_type_ != PMP_TYPE_STRING || row >= rows_read_)
return false;
DCHECK_LT(row, strings_.size());
@@ -67,7 +72,7 @@ bool PmpColumnReader::ReadString(const uint32 row, std::string* result) const {
bool PmpColumnReader::ReadUInt32(const uint32 row, uint32* result) const {
DCHECK(data_.get() != NULL);
- if (field_type_ != PMP_TYPE_UINT32 || row >= rows_)
+ if (field_type_ != PMP_TYPE_UINT32 || row >= rows_read_)
return false;
*result = reinterpret_cast<uint32*>(data_.get() + kPmpHeaderSize)[row];
@@ -77,7 +82,7 @@ bool PmpColumnReader::ReadUInt32(const uint32 row, uint32* result) const {
bool PmpColumnReader::ReadDouble64(const uint32 row, double* result) const {
DCHECK(data_.get() != NULL);
- if (field_type_ != PMP_TYPE_DOUBLE64 || row >= rows_)
+ if (field_type_ != PMP_TYPE_DOUBLE64 || row >= rows_read_)
return false;
*result = reinterpret_cast<double*>(data_.get() + kPmpHeaderSize)[row];
@@ -87,7 +92,7 @@ bool PmpColumnReader::ReadDouble64(const uint32 row, double* result) const {
bool PmpColumnReader::ReadUInt8(const uint32 row, uint8* result) const {
DCHECK(data_.get() != NULL);
- if (field_type_ != PMP_TYPE_UINT8 || row >= rows_)
+ if (field_type_ != PMP_TYPE_UINT8 || row >= rows_read_)
return false;
*result = reinterpret_cast<uint8*>(data_.get() + kPmpHeaderSize)[row];
@@ -97,15 +102,19 @@ bool PmpColumnReader::ReadUInt8(const uint32 row, uint8* result) const {
bool PmpColumnReader::ReadUInt64(const uint32 row, uint64* result) const {
DCHECK(data_.get() != NULL);
- if (field_type_ != PMP_TYPE_UINT64 || row >= rows_)
+ if (field_type_ != PMP_TYPE_UINT64 || row >= rows_read_)
return false;
*result = reinterpret_cast<uint64*>(data_.get() + kPmpHeaderSize)[row];
return true;
}
-bool PmpColumnReader::ParseData(const PmpFieldType expected_type,
- uint32* rows_read) {
+uint32 PmpColumnReader::rows_read() const {
+ DCHECK(data_.get() != NULL);
+ return rows_read_;
+}
+
+bool PmpColumnReader::ParseData(const PmpFieldType expected_type) {
DCHECK(data_.get() != NULL);
DCHECK_GE(length_, kPmpHeaderSize);
@@ -131,10 +140,10 @@ bool PmpColumnReader::ParseData(const PmpFieldType expected_type,
if (field_type_ != expected_type)
return false;
- rows_ = *(reinterpret_cast<uint32*>(&data_[kPmpRowCountOffset]));
+ rows_read_ = *(reinterpret_cast<uint32*>(&data_[kPmpRowCountOffset]));
// Sanity check against malicious row field.
- if (rows_ > (kPmpMaxFilesize - kPmpHeaderSize))
+ if (rows_read_ > (kPmpMaxFilesize - kPmpHeaderSize))
return false;
DCHECK_GE(length_, kPmpHeaderSize);
@@ -145,24 +154,22 @@ bool PmpColumnReader::ParseData(const PmpFieldType expected_type,
expected_body_length = IndexStrings();
break;
case PMP_TYPE_UINT32:
- expected_body_length = static_cast<int64>(rows_) * sizeof(uint32);
+ expected_body_length = static_cast<int64>(rows_read_) * sizeof(uint32);
break;
case PMP_TYPE_DOUBLE64:
- expected_body_length = static_cast<int64>(rows_) * sizeof(double);
+ expected_body_length = static_cast<int64>(rows_read_) * sizeof(double);
break;
case PMP_TYPE_UINT8:
- expected_body_length = static_cast<int64>(rows_) * sizeof(uint8);
+ expected_body_length = static_cast<int64>(rows_read_) * sizeof(uint8);
break;
case PMP_TYPE_UINT64:
- expected_body_length = static_cast<int64>(rows_) * sizeof(uint64);
+ expected_body_length = static_cast<int64>(rows_read_) * sizeof(uint64);
break;
default:
return false;
break;
}
- if (body_length == expected_body_length && rows_read)
- *rows_read = rows_;
return body_length == expected_body_length;
}
@@ -170,12 +177,12 @@ int64 PmpColumnReader::IndexStrings() {
DCHECK(data_.get() != NULL);
DCHECK_GE(length_, kPmpHeaderSize);
- strings_.reserve(rows_);
+ strings_.reserve(rows_read_);
int64 bytes_parsed = kPmpHeaderSize;
const uint8* data_cursor = data_.get() + kPmpHeaderSize;
- while (strings_.size() < rows_) {
+ while (strings_.size() < rows_read_) {
const uint8* string_end = static_cast<const uint8*>(
memchr(data_cursor, '\0', length_ - bytes_parsed));

Powered by Google App Engine
This is Rietveld 408576698