void bus_dbus_impl_dispatch_message_by_rule (BusDBusImpl *dbus, IBusMessage *message, BusConnection *skip_connection) { g_assert (BUS_IS_DBUS_IMPL (dbus)); g_assert (message != NULL); g_assert (BUS_IS_CONNECTION (skip_connection) || skip_connection == NULL); GList *recipients = NULL; GList *link = NULL; static gint32 data_slot = -1; if (G_UNLIKELY (IBUS_OBJECT_DESTROYED (dbus))) { return; } if (data_slot == -1) { dbus_message_allocate_data_slot (&data_slot); } /* If this message has been dispatched by rule, it will be ignored. */ if (dbus_message_get_data (message, data_slot) != NULL) return; dbus_message_set_data (message, data_slot, (gpointer) TRUE, NULL); #if 0 if (g_strcmp0 (ibus_message_get_member (message), "ValueChanged") == 0) { g_debug ("Dispatch ValueChanged"); } #endif for (link = dbus->rules; link != NULL; link = link->next) { GList *list = bus_match_rule_get_recipients (BUS_MATCH_RULE (link->data), message); recipients = g_list_concat (recipients, list); } for (link = recipients; link != NULL; link = link->next) { BusConnection *connection = BUS_CONNECTION (link->data); if (connection != skip_connection) { ibus_connection_send (IBUS_CONNECTION (connection), message); } g_object_unref (connection); } g_list_free (recipients); }
int main() { DBusMessage* msg; dbus_int32_t data_slot = -1; TestData data; TestData* data1; DBusFreeFunction free_data; //_LIT(KOOM, "Out of Memory"); //_LIT(KFreeFail, "Free Function is not called"); //_LIT(KDataFail, "Fail to retrieve data"); msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL); if(!dbus_message_allocate_data_slot(&data_slot)) { std_log(LOG_FILENAME_LINE,"Out of Memory"); create_xml(1); return 1; } data.num = 20; data.str = (char*)malloc(data.num); data_free_flag = FALSE; strcpy(data.str, "CheckDBus"); free_data = Free_Test_Data; if(!dbus_message_set_data(msg, data_slot, (void*)&data, free_data)) { std_log(LOG_FILENAME_LINE,"Out of Memory"); create_xml(1); return 1; } data1 = (TestData*)dbus_message_get_data(msg, data_slot); if(!data1) { std_log(LOG_FILENAME_LINE,"Fail to retrieve data"); create_xml(1); return 1; } std_log(LOG_FILENAME_LINE,"Data :: \n\tInteger value(20) = %d\n\tString value(CheckDBus) = %s", data1->num, data1->str); data.num = 30; data.str = (char*)malloc(data.num); data_free_flag = FALSE; strcpy(data.str, "CheckDBusFree"); free_data = Free_Test_Data; if(!dbus_message_set_data(msg, data_slot, (void*)&data, free_data)) { std_log(LOG_FILENAME_LINE,"Out of Memory"); create_xml(1); return 1; } if(!data_free_flag) { std_log(LOG_FILENAME_LINE,"Free Function is not called"); create_xml(1); return 1; } dbus_message_free_data_slot(&data_slot); std_log(LOG_FILENAME_LINE,"Test Successful"); create_xml(0); return 0; }