Skip to content

Commit 68c8a34

Browse files
committed
fix(config): user_config should not fall back to shared data
Closes #271
1 parent a8ead41 commit 68c8a34

File tree

6 files changed

+60
-19
lines changed

6 files changed

+60
-19
lines changed

src/rime/config/config_component.cc

+19-4
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,30 @@ void Config::SetItem(an<ConfigItem> item) {
143143
set_modified();
144144
}
145145

146-
const ResourceType ConfigComponentBase::kConfigResourceType = {
146+
const ResourceType ConfigResourceProvider::kDefaultResourceType = {
147147
"config",
148148
"",
149149
".yaml",
150150
};
151151

152-
ConfigComponentBase::ConfigComponentBase(const ResourceType& resource_type)
153-
: resource_resolver_(
154-
Service::instance().CreateResourceResolver(resource_type)) {
152+
ResourceResolver* ConfigResourceProvider::CreateResourceResolver(
153+
const ResourceType& resource_type) {
154+
return Service::instance().CreateResourceResolver(resource_type);
155+
}
156+
157+
const ResourceType UserConfigResourceProvider::kDefaultResourceType = {
158+
"user_config",
159+
"",
160+
".yaml",
161+
};
162+
163+
ResourceResolver* UserConfigResourceProvider::CreateResourceResolver(
164+
const ResourceType& resource_type) {
165+
return Service::instance().CreateUserSpecificResourceResolver(resource_type);
166+
}
167+
168+
ConfigComponentBase::ConfigComponentBase(ResourceResolver* resource_resolver)
169+
: resource_resolver_(resource_resolver) {
155170
}
156171

157172
ConfigComponentBase::~ConfigComponentBase() {

src/rime/config/config_component.h

+22-7
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,22 @@ class ConfigCompiler;
6868
class ConfigCompilerPlugin;
6969
struct ConfigResource;
7070

71+
struct ConfigResourceProvider {
72+
RIME_API static const ResourceType kDefaultResourceType;
73+
RIME_API static ResourceResolver*
74+
CreateResourceResolver(const ResourceType& resource_type);
75+
};
76+
77+
struct UserConfigResourceProvider {
78+
RIME_API static const ResourceType kDefaultResourceType;
79+
RIME_API static ResourceResolver*
80+
CreateResourceResolver(const ResourceType& resource_type);
81+
};
82+
7183
class ConfigComponentBase : public Config::Component {
7284
public:
73-
RIME_API static const ResourceType kConfigResourceType;
74-
RIME_API ConfigComponentBase(const ResourceType& resource_type);
75-
RIME_API ~ConfigComponentBase();
85+
RIME_API ConfigComponentBase(ResourceResolver* resource_resolver);
86+
RIME_API virtual ~ConfigComponentBase();
7687
RIME_API Config* Create(const string& file_name);
7788

7889
protected:
@@ -84,13 +95,17 @@ class ConfigComponentBase : public Config::Component {
8495
map<string, weak<ConfigData>> cache_;
8596
};
8697

87-
template <class Loader>
98+
template <class Loader, class ResourceProvider = ConfigResourceProvider>
8899
class ConfigComponent : public ConfigComponentBase {
89100
public:
90-
ConfigComponent(const ResourceType& resource_type = kConfigResourceType)
91-
: ConfigComponentBase(resource_type) {}
101+
ConfigComponent(const ResourceType& resource_type =
102+
ResourceProvider::kDefaultResourceType)
103+
: ConfigComponentBase(
104+
ResourceProvider::CreateResourceResolver(resource_type)) {}
92105
ConfigComponent(function<void (Loader* loader)> setup)
93-
: ConfigComponentBase(kConfigResourceType) {
106+
: ConfigComponentBase(
107+
ResourceProvider::CreateResourceResolver(
108+
ResourceProvider::kDefaultResourceType)) {
94109
setup(&loader_);
95110
}
96111
private:

src/rime/core_module.cc

+5-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ static void rime_core_initialize() {
3636
r.Register("config", config_loader);
3737
r.Register("schema", new SchemaComponent(config_loader));
3838

39-
auto user_config = new ConfigComponent<ConfigLoader>(
40-
[](ConfigLoader* loader) {
41-
loader->set_auto_save(true);
42-
});
39+
auto user_config =
40+
new ConfigComponent<ConfigLoader, UserConfigResourceProvider>(
41+
[](ConfigLoader* loader) {
42+
loader->set_auto_save(true);
43+
});
4344
r.Register("user_config", user_config);
4445
}
4546

src/rime/service.cc

+7
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,13 @@ ResourceResolver* Service::CreateResourceResolver(const ResourceType& type) {
176176
return resolver.release();
177177
}
178178

179+
ResourceResolver* Service::CreateUserSpecificResourceResolver(
180+
const ResourceType& type) {
181+
the<ResourceResolver> resolver(new ResourceResolver(type));
182+
resolver->set_root_path(deployer().user_data_dir);
183+
return resolver.release();
184+
}
185+
179186
Service& Service::instance() {
180187
static the<Service> s_instance;
181188
if (!s_instance) {

src/rime/service.h

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class Service {
7676
const string& message_value);
7777

7878
ResourceResolver* CreateResourceResolver(const ResourceType& type);
79+
ResourceResolver* CreateUserSpecificResourceResolver(const ResourceType& type);
7980

8081
Deployer& deployer() { return deployer_; }
8182
bool disabled() { return !started_ || deployer_.IsMaintenanceMode(); }

test/config_test.cc

+6-4
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ class RimeConfigTest : public ::testing::Test {
3030
TEST(RimeConfigComponentTest, RoundTrip) {
3131
// registration
3232
Registry& r = Registry::instance();
33-
r.Register("test_config", new ConfigComponent<ConfigLoader>(
34-
[](ConfigLoader* loader) {
35-
loader->set_auto_save(true);
36-
}));
33+
r.Register(
34+
"test_config",
35+
new ConfigComponent<ConfigLoader, UserConfigResourceProvider>(
36+
[](ConfigLoader* loader) {
37+
loader->set_auto_save(true);
38+
}));
3739
// find component
3840
Config::Component* cc = Config::Require("test_config");
3941
ASSERT_TRUE(cc != NULL);

0 commit comments

Comments
 (0)