#define WRT_DBUS_NAME "org.tizen.wrt"
#define WRT_DBUS_PATH "/org/tizen/wrt"
-InterProcessCommunication::Message::Message(DBusConnection* connection, DBusMessage* message)
- : connection_(connection), message_(message) {}
+InterProcessCommunication::Message::Message(DBusConnection* connection,
+ DBusMessage* message,
+ InterProcessCommunication* ipc)
+ : connection_(connection), message_(message), ipc_(ipc) {}
const char* InterProcessCommunication::Message::Sender() const {
return dbus_message_get_sender(message_);
}
void InterProcessCommunication::Message::CloseDBusConnection() const {
- if (connection_) {
- dbus_connection_close(connection_);
+ LOG(INFO) << "Listen() will be ended and close dbus connection.";
+ if (ipc_) {
+ ipc_->will_close_ = true;
}
}
}
}
-InterProcessCommunication::~InterProcessCommunication() {
+void InterProcessCommunication::CloseDbus() {
if (connection_) {
+ if (!message_handlers_.empty())
+ dbus_connection_remove_filter(connection_, OnMessage, this);
dbus_connection_close(connection_);
dbus_connection_unref(connection_);
connection_ = nullptr;
}
}
+InterProcessCommunication::~InterProcessCommunication() {
+ CloseDbus();
+}
+
// static
DBusHandlerResult InterProcessCommunication::OnMessage(DBusConnection* connection, DBusMessage* message, void* user_data) {
int type = dbus_message_get_type(message);
}
auto& handler = iterator->second;
- handler(member.c_str(), argument, Message(ipc->connection_, message));
+ handler(member.c_str(), argument, Message(ipc->connection_, message, ipc));
}
return DBUS_HANDLER_RESULT_HANDLED;
}
void InterProcessCommunication::Listen() {
- while (dbus_connection_read_write_dispatch(connection_, -1)) {
- ; // empty loop body
+ while (dbus_connection_read_write_dispatch(connection_, 500)) {
+ if (will_close_)
+ break;
}
+ CloseDbus();
}
DBusMessage* InterProcessCommunication::InternalSendMessage(const char* receiver, const char* type, const char* argument, bool need_reply) {
class Message {
public:
- Message(DBusConnection* connection, DBusMessage* message);
+ Message(DBusConnection* connection,
+ DBusMessage* message,
+ InterProcessCommunication* ipc);
const char* Sender() const;
void CloseDBusConnection() const;
private:
DBusConnection* connection_;
DBusMessage* message_;
+ InterProcessCommunication* ipc_ = nullptr;
};
typedef std::function<void(const char* type, const char* argument, const Message& message)> MessageHandler;
void AddMessageHandler(const char* type, MessageHandler handler);
void SetExitOnDisconnect(bool exit_on_disconnect);
void Listen();
+ void CloseDbus();
bool HasDbusOwner(const char* dbus_name);
bool SendMessage(const char* type, const char* argument);
DBusConnection* connection_;
std::map<const std::string, MessageHandler> message_handlers_;
+ bool will_close_ = false;
};
} // namespace wrt