| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/resource/resource_bundle.h" | 5 #include "ui/base/resource/resource_bundle.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" |
| 8 #include "base/file_util.h" |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/path_service.h" |
| 8 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 9 #include "base/string_piece.h" | 12 #include "base/string_piece.h" |
| 10 #include "base/synchronization/lock.h" | 13 #include "base/synchronization/lock.h" |
| 11 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 12 #include "third_party/skia/include/core/SkBitmap.h" | 15 #include "third_party/skia/include/core/SkBitmap.h" |
| 16 #include "ui/base/l10n/l10n_util.h" |
| 13 #include "ui/base/resource/data_pack.h" | 17 #include "ui/base/resource/data_pack.h" |
| 18 #include "ui/base/ui_base_paths.h" |
| 19 #include "ui/base/ui_base_switches.h" |
| 14 #include "ui/gfx/codec/png_codec.h" | 20 #include "ui/gfx/codec/png_codec.h" |
| 15 #include "ui/gfx/font.h" | 21 #include "ui/gfx/font.h" |
| 16 #include "ui/gfx/image/image.h" | 22 #include "ui/gfx/image/image.h" |
| 17 | 23 |
| 18 namespace ui { | 24 namespace ui { |
| 19 | 25 |
| 20 namespace { | 26 namespace { |
| 21 | 27 |
| 22 // Font sizes relative to base font. | 28 // Font sizes relative to base font. |
| 23 #if defined(OS_CHROMEOS) && defined(CROS_FONTS_USING_BCI) | 29 #if defined(OS_CHROMEOS) && defined(CROS_FONTS_USING_BCI) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 | 72 |
| 67 /* static */ | 73 /* static */ |
| 68 void ResourceBundle::InitSharedInstanceForTest(const FilePath& path) { | 74 void ResourceBundle::InitSharedInstanceForTest(const FilePath& path) { |
| 69 DCHECK(g_shared_instance_ == NULL) << "ResourceBundle initialized twice"; | 75 DCHECK(g_shared_instance_ == NULL) << "ResourceBundle initialized twice"; |
| 70 g_shared_instance_ = new ResourceBundle(); | 76 g_shared_instance_ = new ResourceBundle(); |
| 71 | 77 |
| 72 g_shared_instance_->LoadTestResources(path); | 78 g_shared_instance_->LoadTestResources(path); |
| 73 } | 79 } |
| 74 | 80 |
| 75 /* static */ | 81 /* static */ |
| 82 DataPack* ResourceBundle::LoadResourcesDataPak(const FilePath& path) { |
| 83 DataPack* datapack = new DataPack; |
| 84 bool success = datapack->Load(path); |
| 85 if (!success) { |
| 86 delete datapack; |
| 87 datapack = NULL; |
| 88 } |
| 89 return datapack; |
| 90 } |
| 91 |
| 92 /* static */ |
| 76 std::string ResourceBundle::ReloadSharedInstance( | 93 std::string ResourceBundle::ReloadSharedInstance( |
| 77 const std::string& pref_locale) { | 94 const std::string& pref_locale) { |
| 78 DCHECK(g_shared_instance_ != NULL) << "ResourceBundle not initialized"; | 95 DCHECK(g_shared_instance_ != NULL) << "ResourceBundle not initialized"; |
| 79 | 96 |
| 80 g_shared_instance_->UnloadLocaleResources(); | 97 g_shared_instance_->UnloadLocaleResources(); |
| 81 return g_shared_instance_->LoadLocaleResources(pref_locale); | 98 return g_shared_instance_->LoadLocaleResources(pref_locale); |
| 82 } | 99 } |
| 83 | 100 |
| 84 /* static */ | 101 /* static */ |
| 85 void ResourceBundle::AddDataPackToSharedInstance(const FilePath& path) { | 102 void ResourceBundle::AddDataPackToSharedInstance(const FilePath& path) { |
| 86 DCHECK(g_shared_instance_ != NULL) << "ResourceBundle not initialized"; | 103 DCHECK(g_shared_instance_ != NULL) << "ResourceBundle not initialized"; |
| 87 g_shared_instance_->data_packs_.push_back(new LoadedDataPack(path)); | 104 g_shared_instance_->data_packs_.push_back(new LoadedDataPack(path)); |
| 88 } | 105 } |
| 89 | 106 |
| 90 /* static */ | 107 /* static */ |
| 91 void ResourceBundle::CleanupSharedInstance() { | 108 void ResourceBundle::CleanupSharedInstance() { |
| 92 if (g_shared_instance_) { | 109 if (g_shared_instance_) { |
| 93 delete g_shared_instance_; | 110 delete g_shared_instance_; |
| 94 g_shared_instance_ = NULL; | 111 g_shared_instance_ = NULL; |
| 95 } | 112 } |
| 96 } | 113 } |
| 97 | 114 |
| 98 /* static */ | 115 /* static */ |
| 99 ResourceBundle& ResourceBundle::GetSharedInstance() { | 116 ResourceBundle& ResourceBundle::GetSharedInstance() { |
| 100 // Must call InitSharedInstance before this function. | 117 // Must call InitSharedInstance before this function. |
| 101 CHECK(g_shared_instance_ != NULL); | 118 CHECK(g_shared_instance_ != NULL); |
| 102 return *g_shared_instance_; | 119 return *g_shared_instance_; |
| 103 } | 120 } |
| 104 | 121 |
| 122 #if !defined(OS_MACOSX) |
| 123 /* static */ |
| 124 FilePath ResourceBundle::GetLocaleFilePath(const std::string& app_locale) { |
| 125 FilePath locale_file_path; |
| 126 PathService::Get(ui::DIR_LOCALES, &locale_file_path); |
| 127 if (locale_file_path.empty()) |
| 128 return locale_file_path; |
| 129 if (app_locale.empty()) |
| 130 return FilePath(); |
| 131 locale_file_path = locale_file_path.AppendASCII(app_locale + ".pak"); |
| 132 if (!file_util::PathExists(locale_file_path)) |
| 133 return FilePath(); |
| 134 return locale_file_path; |
| 135 } |
| 136 #endif |
| 137 |
| 138 std::string ResourceBundle::LoadLocaleResources( |
| 139 const std::string& pref_locale) { |
| 140 DCHECK(!locale_resources_data_.get()) << "locale.pak already loaded"; |
| 141 std::string app_locale = l10n_util::GetApplicationLocale(pref_locale); |
| 142 FilePath locale_file_path; |
| 143 CommandLine *command_line = CommandLine::ForCurrentProcess(); |
| 144 if (command_line->HasSwitch(switches::kLocalePak)) { |
| 145 locale_file_path = |
| 146 command_line->GetSwitchValuePath(switches::kLocalePak); |
| 147 } else { |
| 148 locale_file_path = GetLocaleFilePath(app_locale); |
| 149 } |
| 150 if (locale_file_path.empty()) { |
| 151 // It's possible that there is no locale.pak. |
| 152 NOTREACHED(); |
| 153 return std::string(); |
| 154 } |
| 155 locale_resources_data_.reset(LoadResourcesDataPak(locale_file_path)); |
| 156 CHECK(locale_resources_data_.get()) << "failed to load locale.pak"; |
| 157 return app_locale; |
| 158 } |
| 159 |
| 160 void ResourceBundle::UnloadLocaleResources() { |
| 161 locale_resources_data_.reset(); |
| 162 } |
| 163 |
| 164 string16 ResourceBundle::GetLocalizedString(int message_id) { |
| 165 // If for some reason we were unable to load a resource pak, return an empty |
| 166 // string (better than crashing). |
| 167 if (!locale_resources_data_.get()) { |
| 168 LOG(WARNING) << "locale resources are not loaded"; |
| 169 return string16(); |
| 170 } |
| 171 |
| 172 base::StringPiece data; |
| 173 if (!locale_resources_data_->GetStringPiece(message_id, &data)) { |
| 174 // Fall back on the main data pack (shouldn't be any strings here except in |
| 175 // unittests). |
| 176 data = GetRawDataResource(message_id); |
| 177 if (data.empty()) { |
| 178 NOTREACHED() << "unable to find resource: " << message_id; |
| 179 return string16(); |
| 180 } |
| 181 } |
| 182 |
| 183 // Data pack encodes strings as UTF16. |
| 184 DCHECK_EQ(data.length() % 2, 0U); |
| 185 string16 msg(reinterpret_cast<const char16*>(data.data()), |
| 186 data.length() / 2); |
| 187 return msg; |
| 188 } |
| 189 |
| 105 SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) { | 190 SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) { |
| 106 const SkBitmap* bitmap = | 191 const SkBitmap* bitmap = |
| 107 static_cast<const SkBitmap*>(GetImageNamed(resource_id)); | 192 static_cast<const SkBitmap*>(GetImageNamed(resource_id)); |
| 108 return const_cast<SkBitmap*>(bitmap); | 193 return const_cast<SkBitmap*>(bitmap); |
| 109 } | 194 } |
| 110 | 195 |
| 111 gfx::Image& ResourceBundle::GetImageNamed(int resource_id) { | 196 gfx::Image& ResourceBundle::GetImageNamed(int resource_id) { |
| 112 // Check to see if the image is already in the cache. | 197 // Check to see if the image is already in the cache. |
| 113 { | 198 { |
| 114 base::AutoLock lock_scope(*lock_); | 199 base::AutoLock lock_scope(*lock_); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 | 272 |
| 188 void ResourceBundle::ReloadFonts() { | 273 void ResourceBundle::ReloadFonts() { |
| 189 base::AutoLock lock_scope(*lock_); | 274 base::AutoLock lock_scope(*lock_); |
| 190 base_font_.reset(); | 275 base_font_.reset(); |
| 191 LoadFontsIfNecessary(); | 276 LoadFontsIfNecessary(); |
| 192 } | 277 } |
| 193 | 278 |
| 194 ResourceBundle::ResourceBundle() | 279 ResourceBundle::ResourceBundle() |
| 195 : lock_(new base::Lock), | 280 : lock_(new base::Lock), |
| 196 resources_data_(NULL), | 281 resources_data_(NULL), |
| 197 large_icon_resources_data_(NULL), | 282 large_icon_resources_data_(NULL) { |
| 198 locale_resources_data_(NULL) { | |
| 199 } | 283 } |
| 200 | 284 |
| 201 void ResourceBundle::FreeImages() { | 285 void ResourceBundle::FreeImages() { |
| 202 STLDeleteContainerPairSecondPointers(images_.begin(), | 286 STLDeleteContainerPairSecondPointers(images_.begin(), |
| 203 images_.end()); | 287 images_.end()); |
| 204 images_.clear(); | 288 images_.clear(); |
| 205 } | 289 } |
| 206 | 290 |
| 207 void ResourceBundle::LoadFontsIfNecessary() { | 291 void ResourceBundle::LoadFontsIfNecessary() { |
| 208 lock_->AssertAcquired(); | 292 lock_->AssertAcquired(); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 } | 379 } |
| 296 | 380 |
| 297 RefCountedStaticMemory* ResourceBundle::LoadedDataPack::GetStaticMemory( | 381 RefCountedStaticMemory* ResourceBundle::LoadedDataPack::GetStaticMemory( |
| 298 int resource_id) const { | 382 int resource_id) const { |
| 299 if (!data_pack_.get()) | 383 if (!data_pack_.get()) |
| 300 return NULL; | 384 return NULL; |
| 301 return data_pack_->GetStaticMemory(resource_id); | 385 return data_pack_->GetStaticMemory(resource_id); |
| 302 } | 386 } |
| 303 | 387 |
| 304 } // namespace ui | 388 } // namespace ui |
| OLD | NEW |