OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/dbus/ibus/ibus_config_client.h" | 5 #include "chromeos/dbus/ibus/ibus_config_client.h" |
6 | 6 |
7 #include <vector> | |
8 | |
7 #include "base/bind.h" | 9 #include "base/bind.h" |
8 #include "base/callback.h" | 10 #include "base/callback.h" |
9 #include "chromeos/dbus/ibus/ibus_constants.h" | 11 #include "chromeos/dbus/ibus/ibus_constants.h" |
10 #include "chromeos/dbus/ibus/ibus_component.h" | 12 #include "chromeos/dbus/ibus/ibus_component.h" |
11 #include "dbus/bus.h" | 13 #include "dbus/bus.h" |
12 #include "dbus/message.h" | 14 #include "dbus/message.h" |
13 #include "dbus/object_path.h" | 15 #include "dbus/object_path.h" |
14 #include "dbus/object_proxy.h" | 16 #include "dbus/object_proxy.h" |
15 | 17 |
16 namespace chromeos { | 18 namespace chromeos { |
17 | 19 |
18 namespace { | 20 namespace { |
19 | 21 |
22 // Called when the |signal| is connected. | |
23 void OnSignalConnected(const std::string& interface, | |
24 const std::string& signal, | |
25 bool succeeded) { | |
26 DLOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " | |
satorux1
2012/11/30 05:52:58
LOG_IF. no need to make it a DLOG?
Seigo Nonaka
2012/11/30 07:36:34
Done.
| |
27 << signal << " failed."; | |
28 } | |
29 | |
30 // Called when the GetNameOwner method call is failed. | |
31 void OnGetNameOwnerFail(dbus::ErrorResponse* response) { | |
32 // Do nothing, because method call sometimes fails due to bootstrap timing of | |
33 // ibus-memconf. | |
34 } | |
35 | |
20 // The IBusConfigClient implementation. | 36 // The IBusConfigClient implementation. |
21 class IBusConfigClientImpl : public IBusConfigClient { | 37 class IBusConfigClientImpl : public IBusConfigClient { |
22 public: | 38 public: |
23 explicit IBusConfigClientImpl(dbus::Bus* bus) | 39 explicit IBusConfigClientImpl(dbus::Bus* bus) |
24 : proxy_(bus->GetObjectProxy(ibus::kServiceName, | 40 : proxy_(NULL), |
25 dbus::ObjectPath( | 41 bus_(bus), |
26 ibus::config::kServicePath))), | |
27 weak_ptr_factory_(this) { | 42 weak_ptr_factory_(this) { |
28 } | 43 } |
29 | 44 |
30 virtual ~IBusConfigClientImpl() {} | 45 virtual ~IBusConfigClientImpl() {} |
31 | 46 |
32 // IBusConfigClient override. | 47 // IBusConfigClient override. |
48 virtual void InitializeAsync(const OnIBusConfigReady& on_ready) OVERRIDE { | |
49 // We should check that the ibus-config daemon actually works first, so we | |
50 // can't initialize synchronously. | |
51 dbus::ObjectProxy* dbus_proxy = bus_->GetObjectProxy( | |
52 ibus::kServiceName, | |
53 dbus::ObjectPath(ibus::kDBusObjectPath)); | |
54 | |
55 // Watch NameOwnerChanged signal which is fired when the ibus-config daemon | |
56 // request its name ownership. | |
57 dbus_proxy->ConnectToSignal( | |
58 ibus::kDBusInterface, | |
59 ibus::kNameOwnerChangedSignal, | |
60 base::Bind(&IBusConfigClientImpl::OnNameOwnerChanged, | |
61 weak_ptr_factory_.GetWeakPtr(), | |
62 on_ready), | |
63 base::Bind(&OnSignalConnected)); | |
64 | |
65 dbus::MethodCall method_call(ibus::kDBusInterface, | |
66 ibus::kGetNameOwnerMethod); | |
67 dbus::MessageWriter writer(&method_call); | |
68 writer.AppendString(ibus::config::kServiceName); | |
69 dbus_proxy->CallMethodWithErrorCallback( | |
70 &method_call, | |
71 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
72 base::Bind(&IBusConfigClientImpl::OnGetNameOwner, | |
73 weak_ptr_factory_.GetWeakPtr(), | |
74 on_ready), | |
75 base::Bind(&OnGetNameOwnerFail)); | |
76 } | |
77 | |
78 // IBusConfigClient override. | |
33 virtual void SetStringValue(const std::string& section, | 79 virtual void SetStringValue(const std::string& section, |
34 const std::string& key, | 80 const std::string& key, |
35 const std::string& value, | 81 const std::string& value, |
36 const ErrorCallback& error_callback) OVERRIDE { | 82 const ErrorCallback& error_callback) OVERRIDE { |
83 if (!proxy_) | |
84 return; | |
37 DCHECK(!error_callback.is_null()); | 85 DCHECK(!error_callback.is_null()); |
38 dbus::MethodCall method_call(ibus::config::kServiceInterface, | 86 dbus::MethodCall method_call(ibus::config::kServiceInterface, |
39 ibus::config::kSetValueMethod); | 87 ibus::config::kSetValueMethod); |
40 dbus::MessageWriter writer(&method_call); | 88 dbus::MessageWriter writer(&method_call); |
41 writer.AppendString(section); | 89 writer.AppendString(section); |
42 writer.AppendString(key); | 90 writer.AppendString(key); |
43 dbus::MessageWriter variant_writer(NULL); | 91 dbus::MessageWriter variant_writer(NULL); |
44 writer.OpenVariant("s", &variant_writer); | 92 writer.OpenVariant("s", &variant_writer); |
45 variant_writer.AppendString(value); | 93 variant_writer.AppendString(value); |
46 writer.CloseContainer(&variant_writer); | 94 writer.CloseContainer(&variant_writer); |
47 CallWithDefaultCallback(&method_call, error_callback); | 95 CallWithDefaultCallback(&method_call, error_callback); |
48 } | 96 } |
49 | 97 |
50 // IBusConfigClient override. | 98 // IBusConfigClient override. |
51 virtual void SetIntValue(const std::string& section, | 99 virtual void SetIntValue(const std::string& section, |
52 const std::string& key, | 100 const std::string& key, |
53 int value, | 101 int value, |
54 const ErrorCallback& error_callback) OVERRIDE { | 102 const ErrorCallback& error_callback) OVERRIDE { |
103 if (!proxy_) | |
104 return; | |
55 DCHECK(!error_callback.is_null()); | 105 DCHECK(!error_callback.is_null()); |
56 dbus::MethodCall method_call(ibus::config::kServiceInterface, | 106 dbus::MethodCall method_call(ibus::config::kServiceInterface, |
57 ibus::config::kSetValueMethod); | 107 ibus::config::kSetValueMethod); |
58 dbus::MessageWriter writer(&method_call); | 108 dbus::MessageWriter writer(&method_call); |
59 writer.AppendString(section); | 109 writer.AppendString(section); |
60 writer.AppendString(key); | 110 writer.AppendString(key); |
61 dbus::MessageWriter variant_writer(NULL); | 111 dbus::MessageWriter variant_writer(NULL); |
62 writer.OpenVariant("i", &variant_writer); | 112 writer.OpenVariant("i", &variant_writer); |
63 variant_writer.AppendInt32(value); | 113 variant_writer.AppendInt32(value); |
64 writer.CloseContainer(&variant_writer); | 114 writer.CloseContainer(&variant_writer); |
65 CallWithDefaultCallback(&method_call, error_callback); | 115 CallWithDefaultCallback(&method_call, error_callback); |
66 } | 116 } |
67 | 117 |
68 // IBusConfigClient override. | 118 // IBusConfigClient override. |
69 virtual void SetBoolValue(const std::string& section, | 119 virtual void SetBoolValue(const std::string& section, |
70 const std::string& key, | 120 const std::string& key, |
71 bool value, | 121 bool value, |
72 const ErrorCallback& error_callback) OVERRIDE { | 122 const ErrorCallback& error_callback) OVERRIDE { |
123 if (!proxy_) | |
124 return; | |
73 DCHECK(!error_callback.is_null()); | 125 DCHECK(!error_callback.is_null()); |
74 dbus::MethodCall method_call(ibus::config::kServiceInterface, | 126 dbus::MethodCall method_call(ibus::config::kServiceInterface, |
75 ibus::config::kSetValueMethod); | 127 ibus::config::kSetValueMethod); |
76 dbus::MessageWriter writer(&method_call); | 128 dbus::MessageWriter writer(&method_call); |
77 writer.AppendString(section); | 129 writer.AppendString(section); |
78 writer.AppendString(key); | 130 writer.AppendString(key); |
79 dbus::MessageWriter variant_writer(NULL); | 131 dbus::MessageWriter variant_writer(NULL); |
80 writer.OpenVariant("b", &variant_writer); | 132 writer.OpenVariant("b", &variant_writer); |
81 variant_writer.AppendBool(value); | 133 variant_writer.AppendBool(value); |
82 writer.CloseContainer(&variant_writer); | 134 writer.CloseContainer(&variant_writer); |
83 CallWithDefaultCallback(&method_call, error_callback); | 135 CallWithDefaultCallback(&method_call, error_callback); |
84 } | 136 } |
85 | 137 |
86 // IBusConfigClient override. | 138 // IBusConfigClient override. |
87 virtual void SetStringListValue( | 139 virtual void SetStringListValue( |
88 const std::string& section, | 140 const std::string& section, |
89 const std::string& key, | 141 const std::string& key, |
90 const std::vector<std::string>& value, | 142 const std::vector<std::string>& value, |
91 const ErrorCallback& error_callback) OVERRIDE { | 143 const ErrorCallback& error_callback) OVERRIDE { |
144 if (!proxy_) | |
145 return; | |
92 DCHECK(!error_callback.is_null()); | 146 DCHECK(!error_callback.is_null()); |
93 dbus::MethodCall method_call(ibus::config::kServiceInterface, | 147 dbus::MethodCall method_call(ibus::config::kServiceInterface, |
94 ibus::config::kSetValueMethod); | 148 ibus::config::kSetValueMethod); |
95 dbus::MessageWriter writer(&method_call); | 149 dbus::MessageWriter writer(&method_call); |
96 writer.AppendString(section); | 150 writer.AppendString(section); |
97 writer.AppendString(key); | 151 writer.AppendString(key); |
98 dbus::MessageWriter variant_writer(NULL); | 152 dbus::MessageWriter variant_writer(NULL); |
99 dbus::MessageWriter array_writer(NULL); | 153 dbus::MessageWriter array_writer(NULL); |
100 | 154 |
101 writer.OpenVariant("as", &variant_writer); | 155 writer.OpenVariant("as", &variant_writer); |
102 variant_writer.OpenArray("s", &array_writer); | 156 variant_writer.OpenArray("s", &array_writer); |
103 for (size_t i = 0; i < value.size(); ++i) { | 157 for (size_t i = 0; i < value.size(); ++i) { |
104 array_writer.AppendString(value[i]); | 158 array_writer.AppendString(value[i]); |
105 } | 159 } |
106 variant_writer.CloseContainer(&array_writer); | 160 variant_writer.CloseContainer(&array_writer); |
107 writer.CloseContainer(&variant_writer); | 161 writer.CloseContainer(&variant_writer); |
108 CallWithDefaultCallback(&method_call, error_callback); | 162 CallWithDefaultCallback(&method_call, error_callback); |
109 } | 163 } |
110 | 164 |
111 private: | 165 private: |
112 void CallWithDefaultCallback(dbus::MethodCall* method_call, | 166 void CallWithDefaultCallback(dbus::MethodCall* method_call, |
113 const ErrorCallback& error_callback) { | 167 const ErrorCallback& error_callback) { |
168 if (!proxy_) | |
169 return; | |
114 proxy_->CallMethodWithErrorCallback( | 170 proxy_->CallMethodWithErrorCallback( |
115 method_call, | 171 method_call, |
116 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 172 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
117 base::Bind(&IBusConfigClientImpl::OnSetValue, | 173 base::Bind(&IBusConfigClientImpl::OnSetValue, |
118 weak_ptr_factory_.GetWeakPtr(), | 174 weak_ptr_factory_.GetWeakPtr(), |
119 error_callback), | 175 error_callback), |
120 base::Bind(&IBusConfigClientImpl::OnSetValueFail, | 176 base::Bind(&IBusConfigClientImpl::OnSetValueFail, |
121 weak_ptr_factory_.GetWeakPtr(), | 177 weak_ptr_factory_.GetWeakPtr(), |
122 error_callback)); | 178 error_callback)); |
123 } | 179 } |
124 | 180 |
125 void OnSetValue(const ErrorCallback& error_callback, | 181 void OnSetValue(const ErrorCallback& error_callback, |
126 dbus::Response* response) { | 182 dbus::Response* response) { |
127 if (!response) { | 183 if (!response) { |
128 LOG(ERROR) << "Response is NULL."; | 184 LOG(ERROR) << "Response is NULL."; |
129 error_callback.Run(); | 185 error_callback.Run(); |
130 return; | 186 return; |
131 } | 187 } |
132 } | 188 } |
133 | 189 |
134 void OnSetValueFail(const ErrorCallback& error_callback, | 190 void OnSetValueFail(const ErrorCallback& error_callback, |
135 dbus::ErrorResponse* response) { | 191 dbus::ErrorResponse* response) { |
136 error_callback.Run(); | 192 error_callback.Run(); |
137 } | 193 } |
138 | 194 |
195 void OnNameOwnerChanged(const OnIBusConfigReady& on_ready, | |
196 dbus::Signal* signal) { | |
197 DCHECK(signal); | |
198 std::string name; | |
199 std::string old_owner; | |
200 std::string new_owner; | |
201 | |
202 dbus::MessageReader reader(signal); | |
203 if (!reader.PopString(&name) || | |
204 !reader.PopString(&old_owner) || | |
205 !reader.PopString(&new_owner)) { | |
206 DLOG(ERROR) << "Invalid response of NameOwnerChanged." | |
207 << signal->ToString(); | |
208 return; | |
209 } | |
210 | |
211 if (name != ibus::config::kServiceName) | |
212 return; // Not a signal for ibus-config. | |
213 | |
214 if (!old_owner.empty() || new_owner.empty()) { | |
215 DVLOG(1) << "Unexpected name owner change: name=" << name | |
216 << ", old_owner=" << old_owner << ", new_owner=" << new_owner; | |
217 proxy_ = NULL; | |
218 return; | |
219 } | |
220 | |
221 if (proxy_) | |
222 return; // Already initialized. | |
223 | |
224 proxy_ = bus_->GetObjectProxy(ibus::config::kServiceName, | |
225 dbus::ObjectPath( | |
226 ibus::config::kServicePath)); | |
227 if (!on_ready.is_null()) | |
228 on_ready.Run(); | |
229 } | |
230 | |
231 // Handles response of GetNameOwner. | |
232 void OnGetNameOwner(const OnIBusConfigReady& on_ready, | |
233 dbus::Response* response) { | |
234 if (!response) { | |
235 DLOG(ERROR) << "Response is NULL."; | |
satorux1
2012/11/30 05:52:58
LOG(ERROR) ? For ERRORs, I think we should use LOG
Seigo Nonaka
2012/11/30 07:36:34
Done.
| |
236 return; | |
237 } | |
238 std::string owner; | |
239 dbus::MessageReader reader(response); | |
240 | |
241 if (!reader.PopString(&owner)) { | |
242 DLOG(ERROR) << "Invalid response of GetNameOwner." | |
satorux1
2012/11/30 05:52:58
ditto
Seigo Nonaka
2012/11/30 07:36:34
Done.
| |
243 << response->ToString(); | |
244 return; | |
245 } | |
246 | |
247 // If the owner is empty, ibus-config daemon is not ready. So will | |
248 // initialize object proxy on NameOwnerChanged signal. | |
249 if (owner.empty()) | |
250 return; | |
251 | |
252 proxy_ = bus_->GetObjectProxy(ibus::config::kServiceName, | |
253 dbus::ObjectPath( | |
254 ibus::config::kServicePath)); | |
255 if (!on_ready.is_null()) | |
256 on_ready.Run(); | |
257 } | |
258 | |
139 dbus::ObjectProxy* proxy_; | 259 dbus::ObjectProxy* proxy_; |
260 dbus::Bus* bus_; | |
140 base::WeakPtrFactory<IBusConfigClientImpl> weak_ptr_factory_; | 261 base::WeakPtrFactory<IBusConfigClientImpl> weak_ptr_factory_; |
141 | 262 |
142 DISALLOW_COPY_AND_ASSIGN(IBusConfigClientImpl); | 263 DISALLOW_COPY_AND_ASSIGN(IBusConfigClientImpl); |
143 }; | 264 }; |
144 | 265 |
145 // A stub implementation of IBusConfigClient. | 266 // A stub implementation of IBusConfigClient. |
146 class IBusConfigClientStubImpl : public IBusConfigClient { | 267 class IBusConfigClientStubImpl : public IBusConfigClient { |
147 public: | 268 public: |
148 IBusConfigClientStubImpl() {} | 269 IBusConfigClientStubImpl() {} |
149 virtual ~IBusConfigClientStubImpl() {} | 270 virtual ~IBusConfigClientStubImpl() {} |
271 virtual void InitializeAsync(const OnIBusConfigReady& on_ready) OVERRIDE {} | |
150 virtual void SetStringValue(const std::string& section, | 272 virtual void SetStringValue(const std::string& section, |
151 const std::string& key, | 273 const std::string& key, |
152 const std::string& value, | 274 const std::string& value, |
153 const ErrorCallback& error_callback) OVERRIDE {} | 275 const ErrorCallback& error_callback) OVERRIDE {} |
154 virtual void SetIntValue(const std::string& section, | 276 virtual void SetIntValue(const std::string& section, |
155 const std::string& key, | 277 const std::string& key, |
156 int value, | 278 int value, |
157 const ErrorCallback& error_callback) OVERRIDE {} | 279 const ErrorCallback& error_callback) OVERRIDE {} |
158 virtual void SetBoolValue(const std::string& section, | 280 virtual void SetBoolValue(const std::string& section, |
159 const std::string& key, | 281 const std::string& key, |
(...skipping 22 matching lines...) Expand all Loading... | |
182 IBusConfigClient* IBusConfigClient::Create(DBusClientImplementationType type, | 304 IBusConfigClient* IBusConfigClient::Create(DBusClientImplementationType type, |
183 dbus::Bus* bus) { | 305 dbus::Bus* bus) { |
184 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { | 306 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { |
185 return new IBusConfigClientImpl(bus); | 307 return new IBusConfigClientImpl(bus); |
186 } | 308 } |
187 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 309 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
188 return new IBusConfigClientStubImpl(); | 310 return new IBusConfigClientStubImpl(); |
189 } | 311 } |
190 | 312 |
191 } // namespace chromeos | 313 } // namespace chromeos |
OLD | NEW |