Commit 762451ad authored by nona@chromium.org's avatar nona@chromium.org

Implement IBusEngineService

With this CL, IBusEngineService can handle MethodCall and Signal emitting.
To avoid CL delta bloat, let me split the CL.
I will send CL for unit tests soon.

BUG=126947
TEST=try bots

Review URL: https://chromiumcodereview.appspot.com/10806006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148038 0039d316-1c4b-4281-b951-d872f2087c98
parent 1dbd3c45
...@@ -41,6 +41,26 @@ const char kCreateEngineMethod[] = "CreateEngine"; ...@@ -41,6 +41,26 @@ const char kCreateEngineMethod[] = "CreateEngine";
namespace engine { namespace engine {
const char kServicePathPrefix[] = "/org/freedesktop/IBus/Engine/"; const char kServicePathPrefix[] = "/org/freedesktop/IBus/Engine/";
const char kServiceInterface[] = "org.freedesktop.IBus.Engine";
const char kFocusInMethod[] = "FocusIn";
const char kFocusOutMethod[] = "FocusOut";
const char kEnableMethod[] = "Enable";
const char kDisableMethod[] = "Disable";
const char kPropertyActivateMethod[] = "PropertyActivate";
const char kPropertyShowMethod[] = "PropertyShow";
const char kPropertyHideMethod[] = "PropertyHide";
const char kSetCapabilityMethod[] = "SetCapability";
const char kResetMethod[] = "Reset";
const char kProcessKeyEventMethod[] = "ProcessKeyEvent";
const char kCandidateClickedMethod[] = "CandidateClicked";
const char kSetSurroundingTextMethod[] = "SetSurroundingText";
const char kRegisterPropertiesSignal[] = "RegisterProperties";
const char kUpdatePreeditSignal[] = "UpdatePreedit";
const char kUpdateAuxiliaryTextSignal[] = "UpdateAuxiliaryText";
const char kUpdateLookupTableSignal[] = "UpdateLookupTable";
const char kUpdatePropertySignal[] = "UpdateProperty";
const char kForwardKeyEventSignal[] = "ForwardKeyEvent";
const char kRequireSurroundingTextSignal[] = "RequireSurroundingText";
} // namespace engine } // namespace engine
} // namespace ibus } // namespace ibus
......
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
#include "chromeos/dbus/ibus/ibus_engine_service.h" #include "chromeos/dbus/ibus/ibus_engine_service.h"
#include <string>
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "chromeos/dbus/ibus/ibus_constants.h"
#include "chromeos/dbus/ibus/ibus_lookup_table.h" #include "chromeos/dbus/ibus/ibus_lookup_table.h"
#include "chromeos/dbus/ibus/ibus_property.h" #include "chromeos/dbus/ibus/ibus_property.h"
#include "chromeos/dbus/ibus/ibus_text.h" #include "chromeos/dbus/ibus/ibus_text.h"
...@@ -25,7 +27,102 @@ class IBusEngineServiceImpl : public IBusEngineService { ...@@ -25,7 +27,102 @@ class IBusEngineServiceImpl : public IBusEngineService {
object_path_(object_path), object_path_(object_path),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
exported_object_ = bus->GetExportedObject(object_path_); exported_object_ = bus->GetExportedObject(object_path_);
// TODO(nona): Export methods here.
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kFocusInMethod,
base::Bind(&IBusEngineServiceImpl::FocusIn,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kFocusOutMethod,
base::Bind(&IBusEngineServiceImpl::FocusOut,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kEnableMethod,
base::Bind(&IBusEngineServiceImpl::Enable,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kDisableMethod,
base::Bind(&IBusEngineServiceImpl::Disable,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kPropertyActivateMethod,
base::Bind(&IBusEngineServiceImpl::PropertyActivate,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kPropertyShowMethod,
base::Bind(&IBusEngineServiceImpl::PropertyShow,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kPropertyHideMethod,
base::Bind(&IBusEngineServiceImpl::PropertyHide,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kSetCapabilityMethod,
base::Bind(&IBusEngineServiceImpl::SetCapability,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kResetMethod,
base::Bind(&IBusEngineServiceImpl::Reset,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kProcessKeyEventMethod,
base::Bind(&IBusEngineServiceImpl::ProcessKeyEvent,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kCandidateClickedMethod,
base::Bind(&IBusEngineServiceImpl::CandidateClicked,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object_->ExportMethod(
ibus::engine::kServiceInterface,
ibus::engine::kSetSurroundingTextMethod,
base::Bind(&IBusEngineServiceImpl::SetSurroundingText,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&IBusEngineServiceImpl::OnMethodExported,
weak_ptr_factory_.GetWeakPtr()));
} }
virtual ~IBusEngineServiceImpl() { virtual ~IBusEngineServiceImpl() {
...@@ -44,8 +141,11 @@ class IBusEngineServiceImpl : public IBusEngineService { ...@@ -44,8 +141,11 @@ class IBusEngineServiceImpl : public IBusEngineService {
// IBusEngineService override. // IBusEngineService override.
virtual void RegisterProperties( virtual void RegisterProperties(
const ibus::IBusPropertyList& property_list) OVERRIDE { const ibus::IBusPropertyList& property_list) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kRegisterPropertiesSignal);
dbus::MessageWriter writer(&signal);
AppendIBusPropertyList(property_list, &writer);
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
...@@ -53,44 +153,296 @@ class IBusEngineServiceImpl : public IBusEngineService { ...@@ -53,44 +153,296 @@ class IBusEngineServiceImpl : public IBusEngineService {
uint32 cursor_pos, uint32 cursor_pos,
bool is_visible, bool is_visible,
IBusEnginePreeditFocusOutMode mode) OVERRIDE { IBusEnginePreeditFocusOutMode mode) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kUpdatePreeditSignal);
dbus::MessageWriter writer(&signal);
AppendIBusText(ibus_text, &writer);
writer.AppendUint32(cursor_pos);
writer.AppendBool(is_visible);
writer.AppendUint32(static_cast<uint32>(mode));
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
virtual void UpdateAuxiliaryText(const ibus::IBusText& ibus_text, virtual void UpdateAuxiliaryText(const ibus::IBusText& ibus_text,
bool is_visible) OVERRIDE { bool is_visible) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kUpdateAuxiliaryTextSignal);
dbus::MessageWriter writer(&signal);
AppendIBusText(ibus_text, &writer);
writer.AppendBool(is_visible);
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
virtual void UpdateLookupTable(const ibus::IBusLookupTable& lookup_table, virtual void UpdateLookupTable(const ibus::IBusLookupTable& lookup_table,
bool is_visible) OVERRIDE { bool is_visible) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kUpdateLookupTableSignal);
dbus::MessageWriter writer(&signal);
AppendIBusLookupTable(lookup_table, &writer);
writer.AppendBool(is_visible);
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
virtual void UpdateProperty(const ibus::IBusProperty& property) OVERRIDE { virtual void UpdateProperty(const ibus::IBusProperty& property) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kUpdatePropertySignal);
dbus::MessageWriter writer(&signal);
AppendIBusProperty(property, &writer);
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
virtual void ForwardKeyEvent(uint32 keyval, uint32 keycode, virtual void ForwardKeyEvent(uint32 keyval, uint32 keycode,
uint32 state) OVERRIDE { uint32 state) OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kForwardKeyEventSignal);
dbus::MessageWriter writer(&signal);
writer.AppendUint32(keyval);
writer.AppendUint32(keycode);
writer.AppendUint32(state);
exported_object_->SendSignal(&signal);
} }
// IBusEngineService override. // IBusEngineService override.
virtual void RequireSurroundingText() OVERRIDE { virtual void RequireSurroundingText() OVERRIDE {
// TODO(nona): Implement this. dbus::Signal signal(ibus::engine::kServiceInterface,
NOTIMPLEMENTED(); ibus::engine::kRequireSurroundingTextSignal);
exported_object_->SendSignal(&signal);
} }
private: private:
// Handles FocusIn method call from ibus-daemon.
void FocusIn(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
DCHECK(engine_handler_.get());
engine_handler_->FocusIn();
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles FocusOut method call from ibus-daemon.
void FocusOut(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
DCHECK(engine_handler_.get());
engine_handler_->FocusOut();
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles Enable method call from ibus-daemon.
void Enable(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
DCHECK(engine_handler_.get());
engine_handler_->Enable();
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles Disable method call from ibus-daemon.
void Disable(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
DCHECK(engine_handler_.get());
engine_handler_->Disable();
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles PropertyActivate method call from ibus-daemon.
void PropertyActivate(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string property_name;
if (!reader.PopString(&property_name)) {
LOG(WARNING) << "PropertyActivate called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 property_state = 0;
if (!reader.PopUint32(&property_state)) {
LOG(WARNING) << "PropertyActivate called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->PropertyActivate(
property_name,
static_cast<IBusEngineHandlerInterface::IBusPropertyState>(
property_state));
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles PropertyShow method call from ibus-daemon.
void PropertyShow(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string property_name;
if (!reader.PopString(&property_name)) {
LOG(WARNING) << "PropertyShow called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->PropertyShow(property_name);
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles PropertyHide method call from ibus-daemon.
void PropertyHide(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string property_name;
if (!reader.PopString(&property_name)) {
LOG(WARNING) << "PropertyHide called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->PropertyHide(property_name);
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles SetCapability method call from ibus-daemon.
void SetCapability(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
uint32 capability = 0;
if (!reader.PopUint32(&capability)) {
LOG(WARNING) << "SetCapability called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->SetCapability(
static_cast<IBusEngineHandlerInterface::IBusCapability>(capability));
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
void Reset(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
DCHECK(engine_handler_.get());
engine_handler_->Reset();
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles ProcessKeyEvent method call from ibus-daemon.
void ProcessKeyEvent(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
uint32 keysym = 0;
if (!reader.PopUint32(&keysym)) {
LOG(WARNING) << "ProcessKeyEvent called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 keycode = 0;
if (!reader.PopUint32(&keycode)) {
LOG(WARNING) << "ProcessKeyEvent called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 state = 0;
if (!reader.PopUint32(&state)) {
LOG(WARNING) << "ProcessKeyEvent called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
bool consume = engine_handler_->ProcessKeyEvent(keysym, keycode, state);
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
dbus::MessageWriter writer(response.get());
writer.AppendBool(consume);
response_sender.Run(response.get());
}
// Handles CandidateClicked method call from ibus-daemon.
void CandidateClicked(dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
uint32 index = 0;
if (!reader.PopUint32(&index)) {
LOG(WARNING) << "CandidateClicked called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 button = 0;
if (!reader.PopUint32(&button)) {
LOG(WARNING) << "CandidateClicked called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 state = 0;
if (!reader.PopUint32(&state)) {
LOG(WARNING) << "CandidateClicked called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->CandidateClicked(
index,
static_cast<IBusEngineHandlerInterface::IBusMouseButton>(button),
state);
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Handles SetSurroundingText method call from ibus-daemon.
void SetSurroundingText(
dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string text;
if (!reader.PopString(&text)) {
LOG(WARNING) << "SetSurroundingText called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 cursor_pos = 0;
if (!reader.PopUint32(&cursor_pos)) {
LOG(WARNING) << "CandidateClicked called with incorrect parameters: "
<< method_call->ToString();
return;
}
uint32 anchor_pos = 0;
if (!reader.PopUint32(&anchor_pos)) {
LOG(WARNING) << "CandidateClicked called with incorrect parameters: "
<< method_call->ToString();
return;
}
DCHECK(engine_handler_.get());
engine_handler_->SetSurroundingText(text, cursor_pos, anchor_pos);
scoped_ptr<dbus::Response> response(
dbus::Response::FromMethodCall(method_call));
response_sender.Run(response.get());
}
// Called when the method call is exported.
void OnMethodExported(const std::string& interface_name,
const std::string& method_name,
bool success) {
LOG_IF(WARNING, !success) << "Failed to export "
<< interface_name << "." << method_name;
}
// D-Bus bus object used for unregistering exported methods in dtor. // D-Bus bus object used for unregistering exported methods in dtor.
dbus::Bus* bus_; dbus::Bus* bus_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment