| Index: chrome_frame/simple_resource_loader.cc
|
| diff --git a/chrome_frame/simple_resource_loader.cc b/chrome_frame/simple_resource_loader.cc
|
| deleted file mode 100644
|
| index 22024f3d50894bb813d402f10be3edd66fe74027..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/simple_resource_loader.cc
|
| +++ /dev/null
|
| @@ -1,272 +0,0 @@
|
| -// Copyright (c) 2012 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 "chrome_frame/simple_resource_loader.h"
|
| -
|
| -#include <atlbase.h>
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/base_paths.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/i18n/rtl.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/path_service.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/win/i18n.h"
|
| -#include "base/win/windows_version.h"
|
| -#include "chrome_frame/policy_settings.h"
|
| -#include "ui/base/resource/data_pack.h"
|
| -
|
| -namespace {
|
| -
|
| -const wchar_t kLocalesDirName[] = L"Locales";
|
| -
|
| -bool IsInvalidTagCharacter(wchar_t tag_character) {
|
| - return !(L'-' == tag_character ||
|
| - IsAsciiDigit(tag_character) ||
|
| - IsAsciiAlpha(tag_character));
|
| -}
|
| -
|
| -// A helper function object that performs a lower-case ASCII comparison between
|
| -// two strings.
|
| -class CompareInsensitiveASCII
|
| - : public std::unary_function<const std::wstring&, bool> {
|
| - public:
|
| - explicit CompareInsensitiveASCII(const std::wstring& value)
|
| - : value_lowered_(WideToASCII(value)) {
|
| - StringToLowerASCII(&value_lowered_);
|
| - }
|
| - bool operator()(const std::wstring& comparand) {
|
| - return LowerCaseEqualsASCII(comparand, value_lowered_.c_str());
|
| - }
|
| -
|
| - private:
|
| - std::string value_lowered_;
|
| -};
|
| -
|
| -// Returns true if the value was added.
|
| -bool PushBackIfAbsent(
|
| - const std::wstring& value,
|
| - std::vector<std::wstring>* collection) {
|
| - if (collection->end() ==
|
| - std::find_if(collection->begin(), collection->end(),
|
| - CompareInsensitiveASCII(value))) {
|
| - collection->push_back(value);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Returns true if the collection is modified.
|
| -bool PushBackWithFallbackIfAbsent(
|
| - const std::wstring& language,
|
| - std::vector<std::wstring>* collection) {
|
| - bool modified = false;
|
| -
|
| - if (!language.empty()) {
|
| - // Try adding the language itself.
|
| - modified = PushBackIfAbsent(language, collection);
|
| -
|
| - // Now try adding its fallback, if it has one.
|
| - std::wstring::size_type dash_pos = language.find(L'-');
|
| - if (0 < dash_pos && language.size() - 1 > dash_pos)
|
| - modified |= PushBackIfAbsent(language.substr(0, dash_pos), collection);
|
| - }
|
| -
|
| - return modified;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -SimpleResourceLoader::SimpleResourceLoader()
|
| - : data_pack_(NULL),
|
| - locale_dll_handle_(NULL) {
|
| - // Find and load the resource DLL.
|
| - std::vector<std::wstring> language_tags;
|
| -
|
| - // First, try the locale dictated by policy and its fallback.
|
| - PushBackWithFallbackIfAbsent(
|
| - PolicySettings::GetInstance()->ApplicationLocale(),
|
| - &language_tags);
|
| -
|
| - // Next, try the thread, process, user, system languages.
|
| - GetPreferredLanguages(&language_tags);
|
| -
|
| - // Finally, fall-back on "en-US" (which may already be present in the vector,
|
| - // but that's okay since we'll exit with success when the first is tried).
|
| - language_tags.push_back(L"en-US");
|
| -
|
| - base::FilePath locales_path;
|
| -
|
| - DetermineLocalesDirectory(&locales_path);
|
| - if (!LoadLocalePack(language_tags, locales_path, &locale_dll_handle_,
|
| - &data_pack_, &language_)) {
|
| - NOTREACHED() << "Failed loading any resource dll (even \"en-US\").";
|
| - }
|
| -}
|
| -
|
| -SimpleResourceLoader::~SimpleResourceLoader() {
|
| - delete data_pack_;
|
| -}
|
| -
|
| -// static
|
| -SimpleResourceLoader* SimpleResourceLoader::GetInstance() {
|
| - return Singleton<SimpleResourceLoader>::get();
|
| -}
|
| -
|
| -// static
|
| -void SimpleResourceLoader::GetPreferredLanguages(
|
| - std::vector<std::wstring>* language_tags) {
|
| - DCHECK(language_tags);
|
| - // The full set of preferred languages and their fallbacks are given priority.
|
| - std::vector<std::wstring> languages;
|
| - if (base::win::i18n::GetThreadPreferredUILanguageList(&languages)) {
|
| - for (std::vector<std::wstring>::const_iterator scan = languages.begin(),
|
| - end = languages.end(); scan != end; ++scan) {
|
| - PushBackIfAbsent(*scan, language_tags);
|
| - }
|
| - }
|
| - // Use the base i18n routines (i.e., ICU) as a last, best hope for something
|
| - // meaningful for the user.
|
| - PushBackWithFallbackIfAbsent(base::ASCIIToWide(
|
| - base::i18n::GetConfiguredLocale()),
|
| - language_tags);
|
| -}
|
| -
|
| -// static
|
| -void SimpleResourceLoader::DetermineLocalesDirectory(
|
| - base::FilePath* locales_path) {
|
| - DCHECK(locales_path);
|
| -
|
| - base::FilePath module_path;
|
| - PathService::Get(base::DIR_MODULE, &module_path);
|
| - *locales_path = module_path.Append(kLocalesDirName);
|
| -
|
| - // We may be residing in the "locales" directory's parent, or we might be
|
| - // in a sibling directory. Move up one and look for Locales again in the
|
| - // latter case.
|
| - if (!base::DirectoryExists(*locales_path)) {
|
| - *locales_path = module_path.DirName();
|
| - *locales_path = locales_path->Append(kLocalesDirName);
|
| - }
|
| -
|
| - // Don't make a second check to see if the dir is in the parent. We'll notice
|
| - // and log that in LoadLocaleDll when we actually try loading DLLs.
|
| -}
|
| -
|
| -// static
|
| -bool SimpleResourceLoader::IsValidLanguageTag(
|
| - const std::wstring& language_tag) {
|
| - // "[a-zA-Z]+(-[a-zA-Z0-9]+)*" is a simplification, but better than nothing.
|
| - // Rather than pick up the weight of a regex processor, just search for a
|
| - // character that isn't in the above set. This will at least weed out
|
| - // attempts at "../../EvilBinary".
|
| - return language_tag.end() == std::find_if(language_tag.begin(),
|
| - language_tag.end(),
|
| - &IsInvalidTagCharacter);
|
| -}
|
| -
|
| -// static
|
| -bool SimpleResourceLoader::LoadLocalePack(
|
| - const std::vector<std::wstring>& language_tags,
|
| - const base::FilePath& locales_path,
|
| - HMODULE* dll_handle,
|
| - ui::DataPack** data_pack,
|
| - std::wstring* language) {
|
| - DCHECK(language);
|
| -
|
| - // The dll should only have resources, not executable code.
|
| - const DWORD load_flags =
|
| - (base::win::GetVersion() >= base::win::VERSION_VISTA ?
|
| - LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE :
|
| - DONT_RESOLVE_DLL_REFERENCES);
|
| -
|
| - const std::wstring dll_suffix(L".dll");
|
| - const std::wstring pack_suffix(L".pak");
|
| -
|
| - bool found_pack = false;
|
| -
|
| - for (std::vector<std::wstring>::const_iterator scan = language_tags.begin(),
|
| - end = language_tags.end();
|
| - scan != end;
|
| - ++scan) {
|
| - if (!IsValidLanguageTag(*scan)) {
|
| - LOG(WARNING) << "Invalid language tag supplied while locating resources:"
|
| - " \"" << *scan << "\"";
|
| - continue;
|
| - }
|
| -
|
| - // Attempt to load both the resource pack and the dll. We return success
|
| - // only we load both.
|
| - base::FilePath resource_pack_path =
|
| - locales_path.Append(*scan + pack_suffix);
|
| - base::FilePath dll_path = locales_path.Append(*scan + dll_suffix);
|
| -
|
| - if (base::PathExists(resource_pack_path) &&
|
| - base::PathExists(dll_path)) {
|
| - scoped_ptr<ui::DataPack> cur_data_pack(
|
| - new ui::DataPack(ui::SCALE_FACTOR_100P));
|
| - if (!cur_data_pack->LoadFromPath(resource_pack_path))
|
| - continue;
|
| -
|
| - HMODULE locale_dll_handle = LoadLibraryEx(dll_path.value().c_str(), NULL,
|
| - load_flags);
|
| - if (locale_dll_handle) {
|
| - *dll_handle = locale_dll_handle;
|
| - *language = dll_path.BaseName().RemoveExtension().value();
|
| - *data_pack = cur_data_pack.release();
|
| - found_pack = true;
|
| - break;
|
| - } else {
|
| - *data_pack = NULL;
|
| - }
|
| - }
|
| - }
|
| - DCHECK(found_pack || base::DirectoryExists(locales_path))
|
| - << "Could not locate locales DLL directory.";
|
| - return found_pack;
|
| -}
|
| -
|
| -std::wstring SimpleResourceLoader::GetLocalizedResource(int message_id) {
|
| - if (!data_pack_) {
|
| - DLOG(ERROR) << "locale resources are not loaded";
|
| - return std::wstring();
|
| - }
|
| -
|
| - DCHECK(IS_INTRESOURCE(message_id));
|
| -
|
| - base::StringPiece data;
|
| - if (!data_pack_->GetStringPiece(message_id, &data)) {
|
| - DLOG(ERROR) << "Unable to find string for resource id:" << message_id;
|
| - return std::wstring();
|
| - }
|
| -
|
| - // Data pack encodes strings as either UTF8 or UTF16.
|
| - base::string16 msg;
|
| - if (data_pack_->GetTextEncodingType() == ui::DataPack::UTF16) {
|
| - msg = base::string16(reinterpret_cast<const base::char16*>(data.data()),
|
| - data.length() / 2);
|
| - } else if (data_pack_->GetTextEncodingType() == ui::DataPack::UTF8) {
|
| - msg = base::UTF8ToUTF16(data);
|
| - }
|
| - return msg;
|
| -}
|
| -
|
| -// static
|
| -std::wstring SimpleResourceLoader::GetLanguage() {
|
| - return SimpleResourceLoader::GetInstance()->language_;
|
| -}
|
| -
|
| -// static
|
| -std::wstring SimpleResourceLoader::Get(int message_id) {
|
| - SimpleResourceLoader* loader = SimpleResourceLoader::GetInstance();
|
| - return loader->GetLocalizedResource(message_id);
|
| -}
|
| -
|
| -HMODULE SimpleResourceLoader::GetResourceModuleHandle() {
|
| - return locale_dll_handle_;
|
| -}
|
|
|