Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6198)

Unified Diff: chrome_frame/simple_resource_loader.cc

Issue 7763006: Load both language packs and the resource dlls in ChromeFrame and look for localized strings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome_frame/simple_resource_loader.cc
===================================================================
--- chrome_frame/simple_resource_loader.cc (revision 98458)
+++ chrome_frame/simple_resource_loader.cc (working copy)
@@ -18,8 +18,8 @@
#include "base/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/resource_bundle.h"
namespace {
@@ -83,7 +83,8 @@
} // namespace
SimpleResourceLoader::SimpleResourceLoader()
- : locale_dll_handle_(NULL) {
+ : data_pack_(NULL),
+ locale_dll_handle_(NULL) {
// Find and load the resource DLL.
std::vector<std::wstring> language_tags;
@@ -100,19 +101,19 @@
language_tags.push_back(L"en-US");
FilePath locales_path;
- FilePath locale_dll_path;
+ FilePath locale_pack_path;
DetermineLocalesDirectory(&locales_path);
- if (LoadLocaleDll(language_tags, locales_path, &locale_dll_handle_,
- &locale_dll_path)) {
- language_ = locale_dll_path.BaseName().RemoveExtension().value();
+ if (LoadLocalePack(language_tags, locales_path, &locale_dll_handle_,
+ &data_pack_, &locale_pack_path)) {
tony 2011/08/26 21:36:30 Nit: Maybe we should just return the language as a
ananta 2011/08/26 21:50:17 Done.
+ language_ = locale_pack_path.BaseName().RemoveExtension().value();
} else {
NOTREACHED() << "Failed loading any resource dll (even \"en-US\").";
}
}
SimpleResourceLoader::~SimpleResourceLoader() {
- locale_dll_handle_ = NULL;
+ delete data_pack_;
}
// static
@@ -132,7 +133,6 @@
PushBackIfAbsent(*scan, language_tags);
}
}
-
// Use the base i18n routines (i.e., ICU) as a last, best hope for something
// meaningful for the user.
PushBackWithFallbackIfAbsent(ASCIIToWide(base::i18n::GetConfiguredLocale()),
@@ -172,10 +172,11 @@
}
// static
-bool SimpleResourceLoader::LoadLocaleDll(
+bool SimpleResourceLoader::LoadLocalePack(
const std::vector<std::wstring>& language_tags,
const FilePath& locales_path,
HMODULE* dll_handle,
+ ui::DataPack** data_pack,
FilePath* file_path) {
DCHECK(file_path);
@@ -184,9 +185,12 @@
(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");
- bool found_dll = false;
+ 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;
@@ -196,46 +200,54 @@
" \"" << *scan << "\"";
continue;
}
- FilePath look_path = locales_path.Append(*scan + dll_suffix);
- HMODULE locale_dll_handle = LoadLibraryEx(look_path.value().c_str(), NULL,
- load_flags);
- if (NULL != locale_dll_handle) {
- *dll_handle = locale_dll_handle;
- *file_path = look_path;
- found_dll = true;
- break;
+
+ // Attempt to load both the resource pack and the dll. We return success
+ // only we load both.
+ FilePath resource_pack_path = locales_path.Append(*scan + pack_suffix);
+ FilePath dll_path = locales_path.Append(*scan + dll_suffix);
+
+ if (file_util::PathExists(resource_pack_path) &&
+ file_util::PathExists(dll_path)) {
+ *data_pack = ui::ResourceBundle::LoadResourcesDataPak(resource_pack_path);
+ if (!*data_pack) {
+ continue;
+ }
+ HMODULE locale_dll_handle = LoadLibraryEx(dll_path.value().c_str(), NULL,
+ load_flags);
+ if (locale_dll_handle) {
+ *dll_handle = locale_dll_handle;
+ *file_path = dll_path;
+ found_pack = true;
+ break;
+ } else {
+ *data_pack = NULL;
+ }
}
- DPCHECK(ERROR_FILE_NOT_FOUND == GetLastError())
- << "Unable to load generated resources from " << look_path.value();
}
-
- DCHECK(found_dll || file_util::DirectoryExists(locales_path))
+ DCHECK(found_pack || file_util::DirectoryExists(locales_path))
<< "Could not locate locales DLL directory.";
-
- return found_dll;
+ return found_pack;
}
std::wstring SimpleResourceLoader::GetLocalizedResource(int message_id) {
- if (!locale_dll_handle_) {
+ if (!data_pack_) {
DLOG(ERROR) << "locale resources are not loaded";
return std::wstring();
}
DCHECK(IS_INTRESOURCE(message_id));
- const ATLSTRINGRESOURCEIMAGE* image = AtlGetStringResourceImage(
- locale_dll_handle_, message_id);
- if (!image) {
- // Fall back on the current module (shouldn't be any strings here except
- // in unittests).
- image = AtlGetStringResourceImage(_AtlBaseModule.GetModuleInstance(),
- message_id);
- if (!image) {
- NOTREACHED() << "unable to find resource: " << message_id;
- return std::wstring();
- }
+ base::StringPiece data;
+ if (!data_pack_->GetStringPiece(message_id, &data)) {
+ DLOG(ERROR) << "Unable to find string for resource id:" << message_id;
+ return std::wstring();
}
- return std::wstring(image->achString, image->nLength);
+
+ // Data pack encodes strings as UTF16.
+ DCHECK_EQ(data.length() % 2, 0U);
+ string16 msg(reinterpret_cast<const char16*>(data.data()),
+ data.length() / 2);
+ return msg;
}
// static
« chrome_frame/simple_resource_loader.h ('K') | « chrome_frame/simple_resource_loader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698