summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorsgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-29 04:59:00 +0000
committersgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-29 04:59:00 +0000
commit8670ffb68690e8714fb2999fb5466d2d39d72389 (patch)
tree040d7fff36ccde87d811e1c80fe98e82fe014b8c /base
parent65d7001f983ebef9153be6e6aa87762267ae3ed3 (diff)
downloadchromium_src-8670ffb68690e8714fb2999fb5466d2d39d72389.zip
chromium_src-8670ffb68690e8714fb2999fb5466d2d39d72389.tar.gz
chromium_src-8670ffb68690e8714fb2999fb5466d2d39d72389.tar.bz2
ICU changes
* Add an ICU_UTIL_DATA_IMPL #defines to control whether we're expecting the ICU data as ICU_UTIL_DATA_{SHARED,STATIC,FILE}. * Set defaults on the platforms to match our current practice: Windows => shared, Linux => file, Mac => static. * On Mac, link the separate icui18n, icuuc and icudata libs (matching how we're building there), instead of the common icu lib. * Roll the icu38 revision in DEPS to get the updated SCons build. Review URL: http://codereview.chromium.org/5022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2669 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/icu_util.cc39
1 files changed, 32 insertions, 7 deletions
diff --git a/base/icu_util.cc b/base/icu_util.cc
index 4c96926..17f934d 100644
--- a/base/icu_util.cc
+++ b/base/icu_util.cc
@@ -19,39 +19,60 @@
#include "unicode/putil.h"
#include "unicode/udata.h"
+#define ICU_UTIL_DATA_FILE 0
+#define ICU_UTIL_DATA_SHARED 1
+#define ICU_UTIL_DATA_STATIC 2
+
+#ifndef ICU_UTIL_DATA_IMPL
+
+#if defined(OS_WIN)
+#define ICU_UTIL_DATA_IMPL ICU_UTIL_DATA_SHARED
+#elif defined(OS_MACOSX)
+#define ICU_UTIL_DATA_IMPL ICU_UTIL_DATA_STATIC
+#elif defined(OS_LINUX)
+#define ICU_UTIL_DATA_IMPL ICU_UTIL_DATA_FILE
+#endif
+
+#endif // ICU_UTIL_DATA_IMPL
+
+#if defined(OS_WIN)
+#define ICU_UTIL_DATA_SYMBOL "icudt38_dat"
+#define ICU_UTIL_DATA_SHARED_MODULE_NAME L"icudt38.dll"
+#endif
+
namespace icu_util {
bool Initialize() {
-#if defined(OS_WIN)
+#ifndef NDEBUG
// Assert that we are not called more than once. Even though calling this
// function isn't harmful (ICU can handle it), being called twice probably
// indicates a programming error.
-#ifndef NDEBUG
static bool called_once = false;
DCHECK(!called_once);
called_once = true;
#endif
+#if (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_SHARED)
// We expect to find the ICU data module alongside the current module.
std::wstring data_path;
PathService::Get(base::DIR_MODULE, &data_path);
- file_util::AppendToPath(&data_path, L"icudt38.dll");
+ file_util::AppendToPath(&data_path, ICU_UTIL_DATA_SHARED_MODULE_NAME);
HMODULE module = LoadLibrary(data_path.c_str());
if (!module)
return false;
- FARPROC addr = GetProcAddress(module, "icudt38_dat");
+ FARPROC addr = GetProcAddress(module, ICU_UTIL_DATA_SYMBOL);
if (!addr)
return false;
UErrorCode err = U_ZERO_ERROR;
udata_setCommonData(reinterpret_cast<void*>(addr), &err);
return err == U_ZERO_ERROR;
-#elif defined(OS_MACOSX)
+#elif (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_STATIC)
// Mac bundles the ICU data in.
return true;
-#elif defined(OS_LINUX)
+#elif (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE)
// For now, expect the data file to be alongside the executable.
// This is sufficient while we work on unit tests, but will eventually
// likely live in a data directory.
@@ -59,7 +80,11 @@ bool Initialize() {
bool path_ok = PathService::Get(base::DIR_EXE, &data_path);
DCHECK(path_ok);
u_setDataDirectory(base::SysWideToNativeMB(data_path).c_str());
- return true;
+ // Only look for the packaged data file;
+ // the default behavior is to look for individual files.
+ UErrorCode err = U_ZERO_ERROR;
+ udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
+ return err == U_ZERO_ERROR;
#endif
}