| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "app/resource_bundle.h" | |
| 6 | |
| 7 #include "app/data_pack.h" | |
| 8 #include "app/l10n_util.h" | |
| 9 #include "base/lock.h" | |
| 10 #include "base/logging.h" | |
| 11 #include "base/stl_util-inl.h" | |
| 12 #include "base/string16.h" | |
| 13 #include "base/string_piece.h" | |
| 14 #include "gfx/font.h" | |
| 15 | |
| 16 namespace { | |
| 17 | |
| 18 app::DataPack* LoadResourcesDataPak(FilePath resources_pak_path) { | |
| 19 app::DataPack* resources_pak = new app::DataPack; | |
| 20 bool success = resources_pak->Load(resources_pak_path); | |
| 21 if (!success) { | |
| 22 delete resources_pak; | |
| 23 resources_pak = NULL; | |
| 24 } | |
| 25 return resources_pak; | |
| 26 } | |
| 27 | |
| 28 } // namespace | |
| 29 | |
| 30 ResourceBundle::~ResourceBundle() { | |
| 31 FreeImages(); | |
| 32 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
| 33 FreeGdkPixBufs(); | |
| 34 #endif | |
| 35 UnloadLocaleResources(); | |
| 36 STLDeleteContainerPointers(data_packs_.begin(), | |
| 37 data_packs_.end()); | |
| 38 delete resources_data_; | |
| 39 resources_data_ = NULL; | |
| 40 } | |
| 41 | |
| 42 void ResourceBundle::UnloadLocaleResources() { | |
| 43 delete locale_resources_data_; | |
| 44 locale_resources_data_ = NULL; | |
| 45 } | |
| 46 | |
| 47 // static | |
| 48 RefCountedStaticMemory* ResourceBundle::LoadResourceBytes( | |
| 49 DataHandle module, int resource_id) { | |
| 50 DCHECK(module); | |
| 51 return module->GetStaticMemory(resource_id); | |
| 52 } | |
| 53 | |
| 54 base::StringPiece ResourceBundle::GetRawDataResource(int resource_id) const { | |
| 55 DCHECK(resources_data_); | |
| 56 base::StringPiece data; | |
| 57 if (!resources_data_->GetStringPiece(resource_id, &data)) { | |
| 58 if (!locale_resources_data_->GetStringPiece(resource_id, &data)) { | |
| 59 for (size_t i = 0; i < data_packs_.size(); ++i) { | |
| 60 if (data_packs_[i]->GetStringPiece(resource_id, &data)) | |
| 61 return data; | |
| 62 } | |
| 63 | |
| 64 return base::StringPiece(); | |
| 65 } | |
| 66 } | |
| 67 return data; | |
| 68 } | |
| 69 | |
| 70 string16 ResourceBundle::GetLocalizedString(int message_id) { | |
| 71 // If for some reason we were unable to load a resource pak, return an empty | |
| 72 // string (better than crashing). | |
| 73 if (!locale_resources_data_) { | |
| 74 LOG(WARNING) << "locale resources are not loaded"; | |
| 75 return string16(); | |
| 76 } | |
| 77 | |
| 78 base::StringPiece data; | |
| 79 if (!locale_resources_data_->GetStringPiece(message_id, &data)) { | |
| 80 // Fall back on the main data pack (shouldn't be any strings here except in | |
| 81 // unittests). | |
| 82 data = GetRawDataResource(message_id); | |
| 83 if (data.empty()) { | |
| 84 NOTREACHED() << "unable to find resource: " << message_id; | |
| 85 return string16(); | |
| 86 } | |
| 87 } | |
| 88 | |
| 89 // Data pack encodes strings as UTF16. | |
| 90 DCHECK_EQ(data.length() % 2, 0U); | |
| 91 string16 msg(reinterpret_cast<const char16*>(data.data()), | |
| 92 data.length() / 2); | |
| 93 return msg; | |
| 94 } | |
| 95 | |
| 96 void ResourceBundle::LoadCommonResources() { | |
| 97 DCHECK(!resources_data_) << "chrome.pak already loaded"; | |
| 98 FilePath resources_file_path = GetResourcesFilePath(); | |
| 99 CHECK(!resources_file_path.empty()) << "chrome.pak not found"; | |
| 100 resources_data_ = LoadResourcesDataPak(resources_file_path); | |
| 101 CHECK(resources_data_) << "failed to load chrome.pak"; | |
| 102 } | |
| 103 | |
| 104 std::string ResourceBundle::LoadLocaleResources( | |
| 105 const std::string& pref_locale) { | |
| 106 DCHECK(!locale_resources_data_) << "locale.pak already loaded"; | |
| 107 std::string app_locale = l10n_util::GetApplicationLocale(pref_locale); | |
| 108 FilePath locale_file_path = GetLocaleFilePath(app_locale); | |
| 109 if (locale_file_path.empty()) { | |
| 110 // It's possible that there is no locale.pak. | |
| 111 NOTREACHED(); | |
| 112 return std::string(); | |
| 113 } | |
| 114 locale_resources_data_ = LoadResourcesDataPak(locale_file_path); | |
| 115 CHECK(locale_resources_data_) << "failed to load locale.pak"; | |
| 116 return app_locale; | |
| 117 } | |
| OLD | NEW |