1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
// Copyright (c) 2006-2008 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/common/resource_bundle.h"
#import <Foundation/Foundation.h>
#include "base/base_paths.h"
#include "base/data_pack.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/logging.h"
#include "base/mac_util.h"
#include "base/path_service.h"
#include "base/string_piece.h"
#include "base/string_util.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/gfx/chrome_font.h"
#include "chrome/common/l10n_util.h"
ResourceBundle::~ResourceBundle() {
FreeImages();
delete locale_resources_data_;
locale_resources_data_ = NULL;
delete theme_data_;
theme_data_ = NULL;
delete resources_data_;
resources_data_ = NULL;
}
namespace {
base::DataPack *LoadResourceDataPack(NSString *name) {
base::DataPack *resource_pack = NULL;
NSString *const pakExt = @"pak";
// TODO(thomasvl): THIS SUCKS! We need to remove this gate. It's here
// because of the unittests, but we have no other way to find our resources.
if (!mac_util::AmIBundled()) {
FilePath path;
PathService::Get(base::DIR_EXE, &path);
path = path.AppendASCII("Chromium.app");
path = path.AppendASCII("Contents");
path = path.AppendASCII("Resources");
if ([name isEqual:@"locale"]) {
path = path.AppendASCII("en.lproj");
}
NSString *pakName = [name stringByAppendingPathExtension:pakExt];
path = path.Append([pakName fileSystemRepresentation]);
resource_pack = new base::DataPack;
bool success = resource_pack->Load(path);
DCHECK(success) << "failed to load chrome.pak";
if (!success) {
delete resource_pack;
resource_pack = NULL;
}
return resource_pack;
}
NSString *resource_path = [[NSBundle mainBundle] pathForResource:name
ofType:pakExt];
if (resource_path) {
FilePath resources_pak_path([resource_path fileSystemRepresentation]);
resource_pack = new base::DataPack;
bool success = resource_pack->Load(resources_pak_path);
DCHECK(success) << "failed to load chrome.pak";
if (!success) {
delete resource_pack;
resource_pack = NULL;
}
}
return resource_pack;
}
} // namespace
void ResourceBundle::LoadResources(const std::wstring& pref_locale) {
DLOG_IF(WARNING, pref_locale.size() != 0)
<< "ignoring requested locale in favor of NSBundle's selection";
DCHECK(resources_data_ == NULL) << "resource data already loaded!";
resources_data_ = LoadResourceDataPack(@"chrome");
DCHECK(resources_data_) << "failed to load chrome.pak";
DCHECK(locale_resources_data_ == NULL) << "locale data already loaded!";
locale_resources_data_ = LoadResourceDataPack(@"locale");
DCHECK(locale_resources_data_) << "failed to load locale.pak";
}
void ResourceBundle::LoadThemeResources() {
DCHECK(theme_data_ == NULL) << "theme data already loaded!";
theme_data_ = LoadResourceDataPack(@"theme");
DCHECK(theme_data_) << "failed to load theme.pak";
}
/* static */
bool ResourceBundle::LoadResourceBytes(DataHandle module, int resource_id,
std::vector<unsigned char>* bytes) {
DCHECK(module);
StringPiece data;
if (!module->Get(resource_id, &data))
return false;
bytes->resize(data.length());
memcpy(&(bytes->front()), data.data(), data.length());
return true;
}
StringPiece ResourceBundle::GetRawDataResource(int resource_id) {
DCHECK(resources_data_);
StringPiece data;
if (!resources_data_->Get(resource_id, &data))
return StringPiece();
return data;
}
std::wstring ResourceBundle::GetLocalizedString(int message_id) {
// If for some reason we were unable to load a resource dll, return an empty
// string (better than crashing).
if (!locale_resources_data_) {
LOG(WARNING) << "locale resources are not loaded";
return std::wstring();
}
StringPiece data;
if (!locale_resources_data_->Get(message_id, &data)) {
// Fall back on the main data pack (shouldn't be any strings here except in
// unittests).
data = GetRawDataResource(message_id);
if (data.empty()) {
NOTREACHED() << "unable to find resource: " << message_id;
return std::wstring();
}
}
// Data pack encodes strings as UTF16.
string16 msg(reinterpret_cast<const char16*>(data.data()),
data.length() / 2);
return UTF16ToWide(msg);
}
|