* fix for bug [52]: Dbus wrapper sometimes does not deliver all messages
authorChristian Linke <christian.linke@bmw.de>
Tue, 7 May 2013 13:11:21 +0000 (15:11 +0200)
committerChristian Linke <christian.linke@bmw.de>
Mon, 3 Jun 2013 07:36:22 +0000 (09:36 +0200)
Signed-off-by: Christian Linke <christian.linke@bmw.de>
AudioManagerDaemon/src/CAmDbusWrapper.cpp
include/shared/CAmDbusWrapper.h

index 89c6122..e3955c9 100644 (file)
@@ -52,6 +52,7 @@ CAmDbusWrapper::CAmDbusWrapper(CAmSocketHandler* socketHandler, DBusBusType type
         pDbusFireCallback(this, &CAmDbusWrapper::dbusFireCallback), //
         pDbusCheckCallback(this, &CAmDbusWrapper::dbusCheckCallback), //
         pDbusTimerCallback(this, &CAmDbusWrapper::dbusTimerCallback), //
+        pDbusPrepareCallback(this,&CAmDbusWrapper::dbusPrepareCallback), //
         mpDbusConnection(0), //
         mDBusError(), //
         mListNodes(), //
@@ -241,7 +242,7 @@ dbus_bool_t CAmDbusWrapper::addWatchDelegate(DBusWatch * watch, void* userData)
     }
 
     logInfo("DBusWrapper::addWatchDelegate entered new watch, fd=", dbus_watch_get_unix_fd(watch), "event flag=", event);
-    am_Error_e error = mpSocketHandler->addFDPoll(dbus_watch_get_unix_fd(watch), event, NULL, &pDbusFireCallback, &pDbusCheckCallback, &pDbusDispatchCallback, watch, handle);
+    am_Error_e error = mpSocketHandler->addFDPoll(dbus_watch_get_unix_fd(watch), event, &pDbusPrepareCallback, &pDbusFireCallback, &pDbusCheckCallback, &pDbusDispatchCallback, watch, handle);
 
     //if everything is alright, add the watch and the handle to our map so we know this relationship
     if (error == E_OK && handle != 0)
@@ -423,6 +424,19 @@ void am::CAmDbusWrapper::dbusFireCallback(const pollfd pollfd, const sh_pollHand
     //logInfo("DBusWrapper::dbusFireCallback was called");
 }
 
+void CAmDbusWrapper::dbusPrepareCallback(const sh_pollHandle_t handle, void* userData)
+{
+    (void) handle;
+    (void) userData;
+    dbus_connection_ref(mpDbusConnection);
+    while (dbus_connection_get_dispatch_status(mpDbusConnection) == DBUS_DISPATCH_DATA_REMAINS)
+    {
+       dbus_connection_dispatch(mpDbusConnection);
+       logInfo("prepare was neccessary!");
+    }
+    dbus_connection_unref(mpDbusConnection);
+}
+
 void CAmDbusWrapper::toggleTimeoutDelegate(DBusTimeout *timeout, void* userData)
 {
     (void) userData;
index 603cc00..35b5e77 100644 (file)
@@ -53,6 +53,9 @@ public:
     static void removeTimeout(DBusTimeout *timeout, void* userData);
     static void toggleTimeout(DBusTimeout *timeout, void* userData);
 
+    void dbusPrepareCallback(const sh_pollHandle_t handle, void* userData);
+    TAmShPollPrepare<CAmDbusWrapper> pDbusPrepareCallback;
+
     bool dbusDispatchCallback(const sh_pollHandle_t handle, void* userData);
     TAmShPollDispatch<CAmDbusWrapper> pDbusDispatchCallback;