Skip to content

Commit d2c7c33

Browse files
committed
Fix dbus message handling problems
- make sure dbus messages are released after handling - return error to unknown method calls to avoid timeouts
1 parent 791d7df commit d2c7c33

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

OMXControl.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,14 @@ OMXControlResult OMXControl::getEvent()
199199
return KeyConfig::ACTION_BLANK;
200200

201201
CLog::Log(LOGDEBUG, "Popped message member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
202+
OMXControlResult result = handle_event(m);
203+
dbus_message_unref(m);
202204

205+
return result;
206+
}
203207

208+
OMXControlResult OMXControl::handle_event(DBusMessage *m)
209+
{
204210
//----------------------------DBus root interface-----------------------------
205211
//Methods:
206212
if (dbus_message_is_method_call(m, OMXPLAYER_DBUS_INTERFACE_ROOT, "Quit"))
@@ -273,6 +279,7 @@ OMXControlResult OMXControl::getEvent()
273279
{
274280
//Error
275281
CLog::Log(LOGWARNING, "Unhandled dbus property message, member: %s interface: %s type: %d path: %s property: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m), property );
282+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
276283
return KeyConfig::ACTION_BLANK;
277284
}
278285
}
@@ -434,6 +441,7 @@ OMXControlResult OMXControl::getEvent()
434441
{
435442
//Error
436443
CLog::Log(LOGWARNING, "Unhandled dbus property message, member: %s interface: %s type: %d path: %s property: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m), property );
444+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
437445
return KeyConfig::ACTION_BLANK;
438446
}
439447
}
@@ -442,6 +450,7 @@ OMXControlResult OMXControl::getEvent()
442450
{
443451
//Error
444452
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
453+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
445454
return KeyConfig::ACTION_BLANK;
446455
}
447456
}
@@ -468,6 +477,7 @@ OMXControlResult OMXControl::getEvent()
468477
printf("setE1\n");
469478
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
470479
dbus_error_free(&error);
480+
dbus_respond_error(m, DBUS_ERROR_INVALID_ARGS, "Invalid arguments");
471481
return KeyConfig::ACTION_BLANK;
472482
}
473483
//The property name
@@ -477,6 +487,7 @@ OMXControlResult OMXControl::getEvent()
477487
{
478488
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
479489
dbus_error_free(&error);
490+
dbus_respond_error(m, DBUS_ERROR_INVALID_ARGS, "Invalid arguments");
480491
return KeyConfig::ACTION_BLANK;
481492
}
482493
//The value (either double or double in variant)
@@ -501,6 +512,7 @@ OMXControlResult OMXControl::getEvent()
501512
{
502513
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
503514
dbus_error_free(&error);
515+
dbus_respond_error(m, DBUS_ERROR_INVALID_ARGS, "Invalid arguments");
504516
return KeyConfig::ACTION_BLANK;
505517
}
506518
}
@@ -509,6 +521,7 @@ OMXControlResult OMXControl::getEvent()
509521
{
510522
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
511523
dbus_error_free(&error);
524+
dbus_respond_error(m, DBUS_ERROR_INVALID_ARGS, "Invalid arguments");
512525
return KeyConfig::ACTION_BLANK;
513526
}
514527
//Player interface:
@@ -557,6 +570,7 @@ OMXControlResult OMXControl::getEvent()
557570
{
558571
//Error
559572
CLog::Log(LOGWARNING, "Unhandled dbus property message, member: %s interface: %s type: %d path: %s property: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m), property );
573+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
560574
return KeyConfig::ACTION_BLANK;
561575
}
562576
}
@@ -565,6 +579,7 @@ OMXControlResult OMXControl::getEvent()
565579
{
566580
//Error
567581
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
582+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
568583
return KeyConfig::ACTION_BLANK;
569584
}
570585
}
@@ -1111,11 +1126,28 @@ OMXControlResult OMXControl::getEvent()
11111126
//----------------------------------------------------------------------------
11121127
else {
11131128
CLog::Log(LOGWARNING, "Unhandled dbus message, member: %s interface: %s type: %d path: %s", dbus_message_get_member(m), dbus_message_get_interface(m), dbus_message_get_type(m), dbus_message_get_path(m) );
1129+
if (dbus_message_get_type(m) == DBUS_MESSAGE_TYPE_METHOD_CALL)
1130+
dbus_respond_error(m, DBUS_ERROR_UNKNOWN_METHOD, "Unknown method");
11141131
}
11151132

11161133
return KeyConfig::ACTION_BLANK;
11171134
}
11181135

1136+
DBusHandlerResult OMXControl::dbus_respond_error(DBusMessage *m, const char *name, const char *msg)
1137+
{
1138+
DBusMessage *reply;
1139+
1140+
reply = dbus_message_new_error(m, name, msg);
1141+
1142+
if (!reply)
1143+
return DBUS_HANDLER_RESULT_NEED_MEMORY;
1144+
1145+
dbus_connection_send(bus, reply, NULL);
1146+
dbus_message_unref(reply);
1147+
1148+
return DBUS_HANDLER_RESULT_HANDLED;
1149+
}
1150+
11191151
DBusHandlerResult OMXControl::dbus_respond_ok(DBusMessage *m)
11201152
{
11211153
DBusMessage *reply;

OMXControl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class OMXControl
4343
private:
4444
int dbus_connect(std::string& dbus_name);
4545
void dbus_disconnect();
46+
OMXControlResult handle_event(DBusMessage *m);
47+
DBusHandlerResult dbus_respond_error(DBusMessage *m, const char *name, const char *msg);
4648
DBusHandlerResult dbus_respond_ok(DBusMessage *m);
4749
DBusHandlerResult dbus_respond_int64(DBusMessage *m, int64_t i);
4850
DBusHandlerResult dbus_respond_double(DBusMessage *m, double d);

0 commit comments

Comments
 (0)