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

Side by Side Diff: chromeos/dbus/ibus/ibus_config_client.cc

Issue 11413165: Makes IBusConfigClient initialize asynchronous. (Closed) Base URL: http://git.chromium.org/chromium/src.git@base
Patch Set: Fix initialize logic Created 8 years 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 unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « chromeos/dbus/ibus/ibus_config_client.h ('k') | chromeos/dbus/ibus/ibus_config_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698