| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome_frame/simple_resource_loader.h" | 5 #include "chrome_frame/simple_resource_loader.h" |
| 6 | 6 |
| 7 #include <atlbase.h> | 7 #include <atlbase.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 PolicySettings::GetInstance()->ApplicationLocale(), | 93 PolicySettings::GetInstance()->ApplicationLocale(), |
| 94 &language_tags); | 94 &language_tags); |
| 95 | 95 |
| 96 // Next, try the thread, process, user, system languages. | 96 // Next, try the thread, process, user, system languages. |
| 97 GetPreferredLanguages(&language_tags); | 97 GetPreferredLanguages(&language_tags); |
| 98 | 98 |
| 99 // Finally, fall-back on "en-US" (which may already be present in the vector, | 99 // Finally, fall-back on "en-US" (which may already be present in the vector, |
| 100 // but that's okay since we'll exit with success when the first is tried). | 100 // but that's okay since we'll exit with success when the first is tried). |
| 101 language_tags.push_back(L"en-US"); | 101 language_tags.push_back(L"en-US"); |
| 102 | 102 |
| 103 FilePath locales_path; | 103 base::FilePath locales_path; |
| 104 | 104 |
| 105 DetermineLocalesDirectory(&locales_path); | 105 DetermineLocalesDirectory(&locales_path); |
| 106 if (!LoadLocalePack(language_tags, locales_path, &locale_dll_handle_, | 106 if (!LoadLocalePack(language_tags, locales_path, &locale_dll_handle_, |
| 107 &data_pack_, &language_)) { | 107 &data_pack_, &language_)) { |
| 108 NOTREACHED() << "Failed loading any resource dll (even \"en-US\")."; | 108 NOTREACHED() << "Failed loading any resource dll (even \"en-US\")."; |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 | 111 |
| 112 SimpleResourceLoader::~SimpleResourceLoader() { | 112 SimpleResourceLoader::~SimpleResourceLoader() { |
| 113 delete data_pack_; | 113 delete data_pack_; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 130 PushBackIfAbsent(*scan, language_tags); | 130 PushBackIfAbsent(*scan, language_tags); |
| 131 } | 131 } |
| 132 } | 132 } |
| 133 // Use the base i18n routines (i.e., ICU) as a last, best hope for something | 133 // Use the base i18n routines (i.e., ICU) as a last, best hope for something |
| 134 // meaningful for the user. | 134 // meaningful for the user. |
| 135 PushBackWithFallbackIfAbsent(ASCIIToWide(base::i18n::GetConfiguredLocale()), | 135 PushBackWithFallbackIfAbsent(ASCIIToWide(base::i18n::GetConfiguredLocale()), |
| 136 language_tags); | 136 language_tags); |
| 137 } | 137 } |
| 138 | 138 |
| 139 // static | 139 // static |
| 140 void SimpleResourceLoader::DetermineLocalesDirectory(FilePath* locales_path) { | 140 void SimpleResourceLoader::DetermineLocalesDirectory( |
| 141 base::FilePath* locales_path) { |
| 141 DCHECK(locales_path); | 142 DCHECK(locales_path); |
| 142 | 143 |
| 143 FilePath module_path; | 144 base::FilePath module_path; |
| 144 PathService::Get(base::DIR_MODULE, &module_path); | 145 PathService::Get(base::DIR_MODULE, &module_path); |
| 145 *locales_path = module_path.Append(kLocalesDirName); | 146 *locales_path = module_path.Append(kLocalesDirName); |
| 146 | 147 |
| 147 // We may be residing in the "locales" directory's parent, or we might be | 148 // We may be residing in the "locales" directory's parent, or we might be |
| 148 // in a sibling directory. Move up one and look for Locales again in the | 149 // in a sibling directory. Move up one and look for Locales again in the |
| 149 // latter case. | 150 // latter case. |
| 150 if (!file_util::DirectoryExists(*locales_path)) { | 151 if (!file_util::DirectoryExists(*locales_path)) { |
| 151 *locales_path = module_path.DirName(); | 152 *locales_path = module_path.DirName(); |
| 152 *locales_path = locales_path->Append(kLocalesDirName); | 153 *locales_path = locales_path->Append(kLocalesDirName); |
| 153 } | 154 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 164 // character that isn't in the above set. This will at least weed out | 165 // character that isn't in the above set. This will at least weed out |
| 165 // attempts at "../../EvilBinary". | 166 // attempts at "../../EvilBinary". |
| 166 return language_tag.end() == std::find_if(language_tag.begin(), | 167 return language_tag.end() == std::find_if(language_tag.begin(), |
| 167 language_tag.end(), | 168 language_tag.end(), |
| 168 &IsInvalidTagCharacter); | 169 &IsInvalidTagCharacter); |
| 169 } | 170 } |
| 170 | 171 |
| 171 // static | 172 // static |
| 172 bool SimpleResourceLoader::LoadLocalePack( | 173 bool SimpleResourceLoader::LoadLocalePack( |
| 173 const std::vector<std::wstring>& language_tags, | 174 const std::vector<std::wstring>& language_tags, |
| 174 const FilePath& locales_path, | 175 const base::FilePath& locales_path, |
| 175 HMODULE* dll_handle, | 176 HMODULE* dll_handle, |
| 176 ui::DataPack** data_pack, | 177 ui::DataPack** data_pack, |
| 177 std::wstring* language) { | 178 std::wstring* language) { |
| 178 DCHECK(language); | 179 DCHECK(language); |
| 179 | 180 |
| 180 // The dll should only have resources, not executable code. | 181 // The dll should only have resources, not executable code. |
| 181 const DWORD load_flags = | 182 const DWORD load_flags = |
| 182 (base::win::GetVersion() >= base::win::VERSION_VISTA ? | 183 (base::win::GetVersion() >= base::win::VERSION_VISTA ? |
| 183 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE : | 184 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE : |
| 184 DONT_RESOLVE_DLL_REFERENCES); | 185 DONT_RESOLVE_DLL_REFERENCES); |
| 185 | 186 |
| 186 const std::wstring dll_suffix(L".dll"); | 187 const std::wstring dll_suffix(L".dll"); |
| 187 const std::wstring pack_suffix(L".pak"); | 188 const std::wstring pack_suffix(L".pak"); |
| 188 | 189 |
| 189 bool found_pack = false; | 190 bool found_pack = false; |
| 190 | 191 |
| 191 for (std::vector<std::wstring>::const_iterator scan = language_tags.begin(), | 192 for (std::vector<std::wstring>::const_iterator scan = language_tags.begin(), |
| 192 end = language_tags.end(); | 193 end = language_tags.end(); |
| 193 scan != end; | 194 scan != end; |
| 194 ++scan) { | 195 ++scan) { |
| 195 if (!IsValidLanguageTag(*scan)) { | 196 if (!IsValidLanguageTag(*scan)) { |
| 196 LOG(WARNING) << "Invalid language tag supplied while locating resources:" | 197 LOG(WARNING) << "Invalid language tag supplied while locating resources:" |
| 197 " \"" << *scan << "\""; | 198 " \"" << *scan << "\""; |
| 198 continue; | 199 continue; |
| 199 } | 200 } |
| 200 | 201 |
| 201 // Attempt to load both the resource pack and the dll. We return success | 202 // Attempt to load both the resource pack and the dll. We return success |
| 202 // only we load both. | 203 // only we load both. |
| 203 FilePath resource_pack_path = locales_path.Append(*scan + pack_suffix); | 204 base::FilePath resource_pack_path = |
| 204 FilePath dll_path = locales_path.Append(*scan + dll_suffix); | 205 locales_path.Append(*scan + pack_suffix); |
| 206 base::FilePath dll_path = locales_path.Append(*scan + dll_suffix); |
| 205 | 207 |
| 206 if (file_util::PathExists(resource_pack_path) && | 208 if (file_util::PathExists(resource_pack_path) && |
| 207 file_util::PathExists(dll_path)) { | 209 file_util::PathExists(dll_path)) { |
| 208 scoped_ptr<ui::DataPack> cur_data_pack( | 210 scoped_ptr<ui::DataPack> cur_data_pack( |
| 209 new ui::DataPack(ui::SCALE_FACTOR_100P)); | 211 new ui::DataPack(ui::SCALE_FACTOR_100P)); |
| 210 if (!cur_data_pack->LoadFromPath(resource_pack_path)) | 212 if (!cur_data_pack->LoadFromPath(resource_pack_path)) |
| 211 continue; | 213 continue; |
| 212 | 214 |
| 213 HMODULE locale_dll_handle = LoadLibraryEx(dll_path.value().c_str(), NULL, | 215 HMODULE locale_dll_handle = LoadLibraryEx(dll_path.value().c_str(), NULL, |
| 214 load_flags); | 216 load_flags); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 262 |
| 261 // static | 263 // static |
| 262 std::wstring SimpleResourceLoader::Get(int message_id) { | 264 std::wstring SimpleResourceLoader::Get(int message_id) { |
| 263 SimpleResourceLoader* loader = SimpleResourceLoader::GetInstance(); | 265 SimpleResourceLoader* loader = SimpleResourceLoader::GetInstance(); |
| 264 return loader->GetLocalizedResource(message_id); | 266 return loader->GetLocalizedResource(message_id); |
| 265 } | 267 } |
| 266 | 268 |
| 267 HMODULE SimpleResourceLoader::GetResourceModuleHandle() { | 269 HMODULE SimpleResourceLoader::GetResourceModuleHandle() { |
| 268 return locale_dll_handle_; | 270 return locale_dll_handle_; |
| 269 } | 271 } |
| OLD | NEW |