diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/base.gyp | 1 | ||||
-rw-r--r-- | base/base.gypi | 1 | ||||
-rw-r--r-- | base/data/data_pack_unittest/sample.pak | bin | 80 -> 0 bytes | |||
-rw-r--r-- | base/data_pack.cc | 216 | ||||
-rw-r--r-- | base/data_pack.h | 62 | ||||
-rw-r--r-- | base/data_pack_unittest.cc | 73 |
6 files changed, 0 insertions, 353 deletions
diff --git a/base/base.gyp b/base/base.gyp index 562aedf..075561b 100644 --- a/base/base.gyp +++ b/base/base.gyp @@ -74,7 +74,6 @@ 'crypto/signature_creator_unittest.cc', 'crypto/signature_verifier_unittest.cc', 'crypto/symmetric_key_unittest.cc', - 'data_pack_unittest.cc', 'debug/leak_tracker_unittest.cc', 'debug/stack_trace_unittest.cc', 'debug/trace_event_win_unittest.cc', diff --git a/base/base.gypi b/base/base.gypi index f4f32b0..3eaedfa 100644 --- a/base/base.gypi +++ b/base/base.gypi @@ -605,7 +605,6 @@ 'auto_reset.h', 'base64.cc', 'base64.h', - 'data_pack.cc', 'event_recorder.cc', 'event_recorder.h', 'event_recorder_stubs.cc', diff --git a/base/data/data_pack_unittest/sample.pak b/base/data/data_pack_unittest/sample.pak Binary files differdeleted file mode 100644 index fdbe2b5..0000000 --- a/base/data/data_pack_unittest/sample.pak +++ /dev/null diff --git a/base/data_pack.cc b/base/data_pack.cc deleted file mode 100644 index e01318f..0000000 --- a/base/data_pack.cc +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/data_pack.h" - -#include <errno.h> - -#include "base/file_util.h" -#include "base/logging.h" -#include "base/metrics/histogram.h" -#include "base/ref_counted_memory.h" -#include "base/string_piece.h" - -// For details of the file layout, see -// http://dev.chromium.org/developers/design-documents/linuxresourcesandlocalizedstrings - -namespace { - -// A word is four bytes. -static const size_t kWord = 4; - -static const uint32 kFileFormatVersion = 1; -// Length of file header: version and entry count. -static const size_t kHeaderLength = 2 * sizeof(uint32); - -struct DataPackEntry { - uint32 resource_id; - uint32 file_offset; - uint32 length; - - static int CompareById(const void* void_key, const void* void_entry) { - uint32 key = *reinterpret_cast<const uint32*>(void_key); - const DataPackEntry* entry = - reinterpret_cast<const DataPackEntry*>(void_entry); - if (key < entry->resource_id) { - return -1; - } else if (key > entry->resource_id) { - return 1; - } else { - return 0; - } - } -}; - -COMPILE_ASSERT(sizeof(DataPackEntry) == 12, size_of_header_must_be_twelve); - -// We're crashing when trying to load a pak file on Windows. Add some error -// codes for logging. -// http://crbug.com/58056 -enum LoadErrors { - INIT_FAILED = 1, - BAD_VERSION, - INDEX_TRUNCATED, - ENTRY_NOT_FOUND, - - LOAD_ERRORS_COUNT, -}; - -} // anonymous namespace - -namespace base { - -// In .cc for MemoryMappedFile dtor. -DataPack::DataPack() : resource_count_(0) { -} -DataPack::~DataPack() { -} - -bool DataPack::Load(const FilePath& path) { - mmap_.reset(new file_util::MemoryMappedFile); - if (!mmap_->Initialize(path)) { - DLOG(ERROR) << "Failed to mmap datapack"; - UMA_HISTOGRAM_ENUMERATION("DataPack.Load", INIT_FAILED, - LOAD_ERRORS_COUNT); - return false; - } - - // Parse the header of the file. - // First uint32: version; second: resource count. - const uint32* ptr = reinterpret_cast<const uint32*>(mmap_->data()); - uint32 version = ptr[0]; - if (version != kFileFormatVersion) { - LOG(ERROR) << "Bad data pack version: got " << version << ", expected " - << kFileFormatVersion; - UMA_HISTOGRAM_ENUMERATION("DataPack.Load", BAD_VERSION, - LOAD_ERRORS_COUNT); - mmap_.reset(); - return false; - } - resource_count_ = ptr[1]; - - // Sanity check the file. - // 1) Check we have enough entries. - if (kHeaderLength + resource_count_ * sizeof(DataPackEntry) > - mmap_->length()) { - LOG(ERROR) << "Data pack file corruption: too short for number of " - "entries specified."; - UMA_HISTOGRAM_ENUMERATION("DataPack.Load", INDEX_TRUNCATED, - LOAD_ERRORS_COUNT); - mmap_.reset(); - return false; - } - // 2) Verify the entries are within the appropriate bounds. - for (size_t i = 0; i < resource_count_; ++i) { - const DataPackEntry* entry = reinterpret_cast<const DataPackEntry*>( - mmap_->data() + kHeaderLength + (i * sizeof(DataPackEntry))); - if (entry->file_offset + entry->length > mmap_->length()) { - LOG(ERROR) << "Entry #" << i << " in data pack points off end of file. " - << "Was the file corrupted?"; - UMA_HISTOGRAM_ENUMERATION("DataPack.Load", ENTRY_NOT_FOUND, - LOAD_ERRORS_COUNT); - mmap_.reset(); - return false; - } - } - - return true; -} - -bool DataPack::GetStringPiece(uint32 resource_id, StringPiece* data) const { - // It won't be hard to make this endian-agnostic, but it's not worth - // bothering to do right now. -#if defined(__BYTE_ORDER) - // Linux check - COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, - datapack_assumes_little_endian); -#elif defined(__BIG_ENDIAN__) - // Mac check - #error DataPack assumes little endian -#endif - - DataPackEntry* target = reinterpret_cast<DataPackEntry*>( - bsearch(&resource_id, mmap_->data() + kHeaderLength, resource_count_, - sizeof(DataPackEntry), DataPackEntry::CompareById)); - if (!target) { - return false; - } - - data->set(mmap_->data() + target->file_offset, target->length); - return true; -} - -RefCountedStaticMemory* DataPack::GetStaticMemory(uint32 resource_id) const { - base::StringPiece piece; - if (!GetStringPiece(resource_id, &piece)) - return NULL; - - return new RefCountedStaticMemory( - reinterpret_cast<const unsigned char*>(piece.data()), piece.length()); -} - -// static -bool DataPack::WritePack(const FilePath& path, - const std::map<uint32, StringPiece>& resources) { - FILE* file = file_util::OpenFile(path, "wb"); - if (!file) - return false; - - if (fwrite(&kFileFormatVersion, 1, kWord, file) != kWord) { - LOG(ERROR) << "Failed to write file version"; - file_util::CloseFile(file); - return false; - } - - // Note: the python version of this function explicitly sorted keys, but - // std::map is a sorted associative container, we shouldn't have to do that. - uint32 entry_count = resources.size(); - if (fwrite(&entry_count, 1, kWord, file) != kWord) { - LOG(ERROR) << "Failed to write entry count"; - file_util::CloseFile(file); - return false; - } - - // Each entry is 3 uint32s. - uint32 index_length = entry_count * 3 * kWord; - uint32 data_offset = kHeaderLength + index_length; - for (std::map<uint32, StringPiece>::const_iterator it = resources.begin(); - it != resources.end(); ++it) { - if (fwrite(&it->first, 1, kWord, file) != kWord) { - LOG(ERROR) << "Failed to write id for " << it->first; - file_util::CloseFile(file); - return false; - } - - if (fwrite(&data_offset, 1, kWord, file) != kWord) { - LOG(ERROR) << "Failed to write offset for " << it->first; - file_util::CloseFile(file); - return false; - } - - uint32 len = it->second.length(); - if (fwrite(&len, 1, kWord, file) != kWord) { - LOG(ERROR) << "Failed to write length for " << it->first; - file_util::CloseFile(file); - return false; - } - - data_offset += len; - } - - for (std::map<uint32, StringPiece>::const_iterator it = resources.begin(); - it != resources.end(); ++it) { - if (fwrite(it->second.data(), it->second.length(), 1, file) != 1) { - LOG(ERROR) << "Failed to write data for " << it->first; - file_util::CloseFile(file); - return false; - } - } - - file_util::CloseFile(file); - - return true; -} - -} // namespace base diff --git a/base/data_pack.h b/base/data_pack.h deleted file mode 100644 index 2836715..0000000 --- a/base/data_pack.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// DataPack represents a read-only view onto an on-disk file that contains -// (key, value) pairs of data. It's used to store static resources like -// translation strings and images. - -#ifndef BASE_DATA_PACK_H_ -#define BASE_DATA_PACK_H_ -#pragma once - -#include <map> - -#include "base/basictypes.h" -#include "base/scoped_ptr.h" - -namespace file_util { - class MemoryMappedFile; -} -class FilePath; -class RefCountedStaticMemory; - -namespace base { - -class StringPiece; - -class DataPack { - public: - DataPack(); - ~DataPack(); - - // Load a pack file from |path|, returning false on error. - bool Load(const FilePath& path); - - // Get resource by id |resource_id|, filling in |data|. - // The data is owned by the DataPack object and should not be modified. - // Returns false if the resource id isn't found. - bool GetStringPiece(uint32 resource_id, StringPiece* data) const; - - // Like GetStringPiece(), but returns a reference to memory. This interface - // is used for image data, while the StringPiece interface is usually used - // for localization strings. - RefCountedStaticMemory* GetStaticMemory(uint32 resource_id) const; - - // Writes a pack file containing |resources| to |path|. - static bool WritePack(const FilePath& path, - const std::map<uint32, StringPiece>& resources); - - private: - // The memory-mapped data. - scoped_ptr<file_util::MemoryMappedFile> mmap_; - - // Number of resources in the data. - size_t resource_count_; - - DISALLOW_COPY_AND_ASSIGN(DataPack); -}; - -} // namespace base - -#endif // BASE_DATA_PACK_H_ diff --git a/base/data_pack_unittest.cc b/base/data_pack_unittest.cc deleted file mode 100644 index d089b28..0000000 --- a/base/data_pack_unittest.cc +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/data_pack.h" - -#include "base/file_path.h" -#include "base/file_util.h" -#include "base/path_service.h" -#include "base/scoped_temp_dir.h" -#include "base/string_piece.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(DataPackTest, Load) { - FilePath data_path; - PathService::Get(base::DIR_SOURCE_ROOT, &data_path); - data_path = data_path.Append( - FILE_PATH_LITERAL("base/data/data_pack_unittest/sample.pak")); - - base::DataPack pack; - ASSERT_TRUE(pack.Load(data_path)); - - base::StringPiece data; - ASSERT_TRUE(pack.GetStringPiece(4, &data)); - EXPECT_EQ("this is id 4", data); - ASSERT_TRUE(pack.GetStringPiece(6, &data)); - EXPECT_EQ("this is id 6", data); - - // Try reading zero-length data blobs, just in case. - ASSERT_TRUE(pack.GetStringPiece(1, &data)); - EXPECT_EQ(0U, data.length()); - ASSERT_TRUE(pack.GetStringPiece(10, &data)); - EXPECT_EQ(0U, data.length()); - - // Try looking up an invalid key. - ASSERT_FALSE(pack.GetStringPiece(140, &data)); -} - -TEST(DataPackTest, Write) { - ScopedTempDir dir; - ASSERT_TRUE(dir.CreateUniqueTempDir()); - FilePath file = dir.path().Append(FILE_PATH_LITERAL("data.pak")); - - std::string one("one"); - std::string two("two"); - std::string three("three"); - std::string four("four"); - std::string fifteen("fifteen"); - - std::map<uint32, base::StringPiece> resources; - resources.insert(std::make_pair(1, base::StringPiece(one))); - resources.insert(std::make_pair(2, base::StringPiece(two))); - resources.insert(std::make_pair(15, base::StringPiece(fifteen))); - resources.insert(std::make_pair(3, base::StringPiece(three))); - resources.insert(std::make_pair(4, base::StringPiece(four))); - ASSERT_TRUE(base::DataPack::WritePack(file, resources)); - - // Now try to read the data back in. - base::DataPack pack; - ASSERT_TRUE(pack.Load(file)); - - base::StringPiece data; - ASSERT_TRUE(pack.GetStringPiece(1, &data)); - EXPECT_EQ(one, data); - ASSERT_TRUE(pack.GetStringPiece(2, &data)); - EXPECT_EQ(two, data); - ASSERT_TRUE(pack.GetStringPiece(3, &data)); - EXPECT_EQ(three, data); - ASSERT_TRUE(pack.GetStringPiece(4, &data)); - EXPECT_EQ(four, data); - ASSERT_TRUE(pack.GetStringPiece(15, &data)); - EXPECT_EQ(fifteen, data); -} |