| 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_engine_factory_service.h" | 5 #include "chromeos/dbus/ibus/ibus_engine_factory_service.h" |
| 6 | 6 |
| 7 #include <map> |
| 8 #include <string> |
| 9 |
| 7 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| 8 #include "chromeos/dbus/ibus/ibus_constants.h" | 11 #include "chromeos/dbus/ibus/ibus_constants.h" |
| 9 #include "dbus/bus.h" | 12 #include "dbus/bus.h" |
| 10 #include "dbus/message.h" | 13 #include "dbus/message.h" |
| 11 #include "dbus/exported_object.h" | 14 #include "dbus/exported_object.h" |
| 12 | 15 |
| 13 namespace chromeos { | 16 namespace chromeos { |
| 14 | 17 |
| 15 class IBusEngineFactoryServiceImpl : public IBusEngineFactoryService { | 18 class IBusEngineFactoryServiceImpl : public IBusEngineFactoryService { |
| 16 public: | 19 public: |
| 17 explicit IBusEngineFactoryServiceImpl(dbus::Bus* bus) | 20 explicit IBusEngineFactoryServiceImpl(dbus::Bus* bus) |
| 18 : bus_(bus), | 21 : bus_(bus), |
| 19 weak_ptr_factory_(this) { | 22 weak_ptr_factory_(this) { |
| 20 | |
| 21 exported_object_ = bus_->GetExportedObject( | 23 exported_object_ = bus_->GetExportedObject( |
| 22 dbus::ObjectPath(ibus::engine_factory::kServicePath)); | 24 dbus::ObjectPath(ibus::engine_factory::kServicePath)); |
| 23 | 25 |
| 24 exported_object_->ExportMethod( | 26 exported_object_->ExportMethod( |
| 25 ibus::engine_factory::kServiceInterface, | 27 ibus::engine_factory::kServiceInterface, |
| 26 ibus::engine_factory::kCreateEngineMethod, | 28 ibus::engine_factory::kCreateEngineMethod, |
| 27 base::Bind(&IBusEngineFactoryServiceImpl::CreateEngine, | 29 base::Bind(&IBusEngineFactoryServiceImpl::CreateEngine, |
| 28 weak_ptr_factory_.GetWeakPtr()), | 30 weak_ptr_factory_.GetWeakPtr()), |
| 29 base::Bind(&IBusEngineFactoryServiceImpl::CreateEngineExported, | 31 base::Bind(&IBusEngineFactoryServiceImpl::CreateEngineExported, |
| 30 weak_ptr_factory_.GetWeakPtr())); | 32 weak_ptr_factory_.GetWeakPtr())); |
| 31 } | 33 } |
| 32 | 34 |
| 33 virtual ~IBusEngineFactoryServiceImpl() { | 35 virtual ~IBusEngineFactoryServiceImpl() { |
| 34 bus_->UnregisterExportedObject(dbus::ObjectPath( | 36 bus_->UnregisterExportedObject(dbus::ObjectPath( |
| 35 ibus::engine_factory::kServicePath)); | 37 ibus::engine_factory::kServicePath)); |
| 36 } | 38 } |
| 37 | 39 |
| 38 // IBusEngineFactoryService override. | 40 // IBusEngineFactoryService override. |
| 39 virtual void SetCreateEngineHandler( | 41 virtual void SetCreateEngineHandler( |
| 42 const std::string& engine_id, |
| 40 const CreateEngineHandler& create_engine_handler) OVERRIDE { | 43 const CreateEngineHandler& create_engine_handler) OVERRIDE { |
| 41 DCHECK(!create_engine_handler.is_null()); | 44 DCHECK(!create_engine_callback_map_[engine_id].is_null()); |
| 42 create_engine_handler_ = create_engine_handler; | 45 create_engine_callback_map_[engine_id] = create_engine_handler; |
| 43 } | 46 } |
| 44 | 47 |
| 45 // IBusEngineFactoryService override. | 48 // IBusEngineFactoryService override. |
| 46 virtual void UnsetCreateEngineHandler() OVERRIDE { | 49 virtual void UnsetCreateEngineHandler( |
| 47 create_engine_handler_.Reset(); | 50 const std::string& engine_id) OVERRIDE { |
| 51 create_engine_callback_map_[engine_id].Reset(); |
| 48 } | 52 } |
| 49 | 53 |
| 50 private: | 54 private: |
| 51 // Called when the ibus-daemon requires new engine instance. | 55 // Called when the ibus-daemon requires new engine instance. |
| 52 void CreateEngine(dbus::MethodCall* method_call, | 56 void CreateEngine(dbus::MethodCall* method_call, |
| 53 dbus::ExportedObject::ResponseSender response_sender) { | 57 dbus::ExportedObject::ResponseSender response_sender) { |
| 54 if (!method_call) { | 58 if (!method_call) { |
| 55 LOG(ERROR) << "method call does not have any arguments."; | 59 LOG(ERROR) << "method call does not have any arguments."; |
| 56 return; | 60 return; |
| 57 } | 61 } |
| 58 dbus::MessageReader reader(method_call); | 62 dbus::MessageReader reader(method_call); |
| 59 std::string engine_name; | 63 std::string engine_name; |
| 60 | 64 |
| 61 if (!reader.PopString(&engine_name)) { | 65 if (!reader.PopString(&engine_name)) { |
| 62 LOG(ERROR) << "Expected argument is string."; | 66 LOG(ERROR) << "Expected argument is string."; |
| 63 return; | 67 return; |
| 64 } | 68 } |
| 65 if(create_engine_handler_.is_null()) { | 69 if (create_engine_callback_map_[engine_name].is_null()) { |
| 66 LOG(WARNING) << "The CreateEngine handler is NULL."; | 70 LOG(WARNING) << "The CreateEngine handler for " << engine_name |
| 71 << " is NULL."; |
| 67 } else { | 72 } else { |
| 68 dbus::Response* response = dbus::Response::FromMethodCall(method_call); | 73 create_engine_callback_map_[engine_name].Run( |
| 69 dbus::MessageWriter writer(response); | 74 base::Bind(&IBusEngineFactoryServiceImpl::CreateEngineSendReply, |
| 70 const dbus::ObjectPath path = create_engine_handler_.Run(engine_name); | 75 weak_ptr_factory_.GetWeakPtr(), |
| 71 writer.AppendObjectPath(path); | 76 dbus::Response::FromMethodCall(method_call), |
| 72 response_sender.Run(response); | 77 response_sender)); |
| 73 } | 78 } |
| 74 } | 79 } |
| 75 | 80 |
| 81 // Sends reply message for CreateEngine method call. |
| 82 void CreateEngineSendReply( |
| 83 dbus::Response* response, |
| 84 const dbus::ExportedObject::ResponseSender response_sender, |
| 85 const dbus::ObjectPath& path) { |
| 86 dbus::MessageWriter writer(response); |
| 87 writer.AppendObjectPath(path); |
| 88 response_sender.Run(response); |
| 89 } |
| 90 |
| 76 // Called when the CreateEngine method is exported. | 91 // Called when the CreateEngine method is exported. |
| 77 void CreateEngineExported(const std::string& interface_name, | 92 void CreateEngineExported(const std::string& interface_name, |
| 78 const std::string& method_name, | 93 const std::string& method_name, |
| 79 bool success) { | 94 bool success) { |
| 80 DCHECK(success) << "Failed to export: " | 95 DCHECK(success) << "Failed to export: " |
| 81 << interface_name << "." << method_name; | 96 << interface_name << "." << method_name; |
| 82 } | 97 } |
| 83 | 98 |
| 84 // CreateEngine method call handler. | 99 // CreateEngine method call handler. |
| 85 CreateEngineHandler create_engine_handler_; | 100 std::map<std::string, CreateEngineHandler> create_engine_callback_map_; |
| 86 | 101 |
| 87 dbus::Bus* bus_; | 102 dbus::Bus* bus_; |
| 88 scoped_refptr<dbus::ExportedObject> exported_object_; | 103 scoped_refptr<dbus::ExportedObject> exported_object_; |
| 89 base::WeakPtrFactory<IBusEngineFactoryServiceImpl> weak_ptr_factory_; | 104 base::WeakPtrFactory<IBusEngineFactoryServiceImpl> weak_ptr_factory_; |
| 90 | 105 |
| 91 DISALLOW_COPY_AND_ASSIGN(IBusEngineFactoryServiceImpl); | 106 DISALLOW_COPY_AND_ASSIGN(IBusEngineFactoryServiceImpl); |
| 92 }; | 107 }; |
| 93 | 108 |
| 94 class IBusEngineFactoryServiceStubImpl : public IBusEngineFactoryService { | 109 class IBusEngineFactoryServiceStubImpl : public IBusEngineFactoryService { |
| 95 public: | 110 public: |
| 96 IBusEngineFactoryServiceStubImpl() {} | 111 IBusEngineFactoryServiceStubImpl() {} |
| 97 virtual ~IBusEngineFactoryServiceStubImpl() {} | 112 virtual ~IBusEngineFactoryServiceStubImpl() {} |
| 98 | 113 |
| 99 // IBusEngineFactoryService overrides. | 114 // IBusEngineFactoryService overrides. |
| 100 virtual void SetCreateEngineHandler( | 115 virtual void SetCreateEngineHandler( |
| 116 const std::string& engine_id, |
| 101 const CreateEngineHandler& create_engine_handler) OVERRIDE {} | 117 const CreateEngineHandler& create_engine_handler) OVERRIDE {} |
| 102 virtual void UnsetCreateEngineHandler() OVERRIDE {} | 118 virtual void UnsetCreateEngineHandler( |
| 119 const std::string& engine_id) OVERRIDE {} |
| 103 | 120 |
| 104 private: | 121 private: |
| 105 DISALLOW_COPY_AND_ASSIGN(IBusEngineFactoryServiceStubImpl); | 122 DISALLOW_COPY_AND_ASSIGN(IBusEngineFactoryServiceStubImpl); |
| 106 }; | 123 }; |
| 107 | 124 |
| 108 IBusEngineFactoryService::IBusEngineFactoryService() { | 125 IBusEngineFactoryService::IBusEngineFactoryService() { |
| 109 } | 126 } |
| 110 | 127 |
| 111 IBusEngineFactoryService::~IBusEngineFactoryService() { | 128 IBusEngineFactoryService::~IBusEngineFactoryService() { |
| 112 } | 129 } |
| 113 | 130 |
| 114 // static | 131 // static |
| 115 IBusEngineFactoryService* IBusEngineFactoryService::Create( | 132 IBusEngineFactoryService* IBusEngineFactoryService::Create( |
| 116 dbus::Bus* bus, | 133 dbus::Bus* bus, |
| 117 DBusClientImplementationType type) { | 134 DBusClientImplementationType type) { |
| 118 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) | 135 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
| 119 return new IBusEngineFactoryServiceImpl(bus); | 136 return new IBusEngineFactoryServiceImpl(bus); |
| 120 else | 137 else |
| 121 return new IBusEngineFactoryServiceStubImpl(); | 138 return new IBusEngineFactoryServiceStubImpl(); |
| 122 } | 139 } |
| 123 | 140 |
| 124 } // namespace chromeos | 141 } // namespace chromeos |
| OLD | NEW |