From fcf68752e687123a171b1144f78f8eba1625a204 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Sun, 9 Aug 2009 08:37:33 +0300 Subject: dbus: Three entangled changes: * Make the dbus object constructors take a pa_dbusiface_core pointer as an argument. Remove the path_prefix argument. * Expose the core object path as a constant in protocol-dbus.h. * Move the core interface name constant from iface-core.h to protocol-dbus.h. --- src/modules/dbus/iface-card.c | 15 ++++--- src/modules/dbus/iface-card.h | 6 ++- src/modules/dbus/iface-client.c | 7 +-- src/modules/dbus/iface-client.h | 4 +- src/modules/dbus/iface-core.c | 92 +++++++++++++++++++-------------------- src/modules/dbus/iface-core.h | 2 - src/modules/dbus/iface-device.c | 13 +++--- src/modules/dbus/iface-device.h | 6 ++- src/modules/dbus/iface-memstats.c | 6 +-- src/modules/dbus/iface-memstats.h | 5 ++- src/modules/dbus/iface-module.c | 7 +-- src/modules/dbus/iface-module.h | 4 +- src/modules/dbus/iface-sample.c | 7 +-- src/modules/dbus/iface-sample.h | 4 +- src/modules/dbus/iface-stream.c | 13 +++--- src/modules/dbus/iface-stream.h | 6 ++- src/pulsecore/protocol-dbus.h | 7 ++- 17 files changed, 113 insertions(+), 91 deletions(-) (limited to 'src') diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c index db6aa26f..e203c395 100644 --- a/src/modules/dbus/iface-card.c +++ b/src/modules/dbus/iface-card.c @@ -24,25 +24,30 @@ #endif #include +#include #include "iface-card.h" #define OBJECT_NAME "card" struct pa_dbusiface_card { + pa_dbusiface_core *core; + pa_card *card; char *path; }; -pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix) { - pa_dbusiface_card *c; +pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) { + pa_dbusiface_card *c = NULL; + + pa_assert(core); pa_assert(card); - pa_assert(path_prefix); - c = pa_xnew(pa_dbusiface_card, 1); + c = pa_xnew0(pa_dbusiface_card, 1); + c->core = core; c->card = card; - c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, card->index); + c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index); return c; } diff --git a/src/modules/dbus/iface-card.h b/src/modules/dbus/iface-card.h index 54db610c..57ad4e31 100644 --- a/src/modules/dbus/iface-card.h +++ b/src/modules/dbus/iface-card.h @@ -30,9 +30,13 @@ #include +#include "iface-core.h" + +#define PA_DBUSIFACE_CARD_INTERFACE PA_DBUS_CORE_INTERFACE ".Card" + typedef struct pa_dbusiface_card pa_dbusiface_card; -pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix); +pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card); void pa_dbusiface_card_free(pa_dbusiface_card *c); const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c); diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c index cfa36d0c..d9c8653f 100644 --- a/src/modules/dbus/iface-client.c +++ b/src/modules/dbus/iface-client.c @@ -24,6 +24,7 @@ #endif #include +#include #include "iface-client.h" @@ -34,15 +35,15 @@ struct pa_dbusiface_client { char *path; }; -pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix) { +pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client) { pa_dbusiface_client *c; + pa_assert(core); pa_assert(client); - pa_assert(path_prefix); c = pa_xnew(pa_dbusiface_client, 1); c->client = client; - c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, client->index); + c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, client->index); return c; } diff --git a/src/modules/dbus/iface-client.h b/src/modules/dbus/iface-client.h index 62cca7f8..ff906256 100644 --- a/src/modules/dbus/iface-client.h +++ b/src/modules/dbus/iface-client.h @@ -30,9 +30,11 @@ #include +#include "iface-core.h" + typedef struct pa_dbusiface_client pa_dbusiface_client; -pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix); +pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client); void pa_dbusiface_client_free(pa_dbusiface_client *c); const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c); diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c index ad729f93..e40cb979 100644 --- a/src/modules/dbus/iface-core.c +++ b/src/modules/dbus/iface-core.c @@ -48,12 +48,8 @@ #include "iface-core.h" -#define OBJECT_PATH "/org/pulseaudio/core1" - #define INTERFACE_REVISION 0 - - static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata); static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata); @@ -314,7 +310,7 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = { }; static pa_dbus_interface_info core_interface_info = { - .name = PA_DBUSIFACE_CORE_INTERFACE, + .name = PA_DBUS_CORE_INTERFACE, .method_handlers = method_handlers, .n_method_handlers = METHOD_HANDLER_MAX, .property_handlers = property_handlers, @@ -1388,7 +1384,7 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u sample->volume_is_set = FALSE; } - dbus_sample = pa_dbusiface_sample_new(sample, OBJECT_PATH); + dbus_sample = pa_dbusiface_sample_new(c, sample); pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), dbus_sample); object_path = pa_dbusiface_sample_get_path(dbus_sample); @@ -1510,7 +1506,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use goto finish; } - dbus_module = pa_dbusiface_module_new(module, OBJECT_PATH); + dbus_module = pa_dbusiface_module_new(c, module); pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(module->index), dbus_module); object_path = pa_dbusiface_module_get_path(dbus_module); @@ -1614,7 +1610,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 if (new_fallback_sink && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) { object_path = pa_dbusiface_device_get_path(device); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); dbus_message_unref(signal); @@ -1628,7 +1624,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 if (new_fallback_source && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) { object_path = pa_dbusiface_device_get_path(device); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); dbus_message_unref(signal); @@ -1640,13 +1636,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_CARD: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(idx)))) { - card = pa_dbusiface_card_new(pa_idxset_get_by_index(core->cards, idx), OBJECT_PATH); + card = pa_dbusiface_card_new(c, pa_idxset_get_by_index(core->cards, idx)); pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card); } object_path = pa_dbusiface_card_get_path(card); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1654,7 +1650,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_card_get_path(card); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_card_free(card); @@ -1666,14 +1662,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 pa_sink *sink = pa_idxset_get_by_index(core->sinks, idx); if (!(device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) { - device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH); + device = pa_dbusiface_device_new_sink(c, sink); pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device); pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device); } object_path = pa_dbusiface_device_get_path(device); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1685,7 +1681,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 * the D-Bus sink object wasn't created yet. Now that the * object is created, let's send the fallback sink change * signal. */ - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1698,7 +1694,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_device_get_path(device); pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path)); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_device_free(device); @@ -1710,14 +1706,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 pa_source *source = pa_idxset_get_by_index(core->sources, idx); if (!(device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) { - device = pa_dbusiface_device_new_source(source, OBJECT_PATH); + device = pa_dbusiface_device_new_source(c, source); pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device); pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device); } object_path = pa_dbusiface_device_get_path(device); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1729,7 +1725,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 * point the D-Bus source object wasn't created yet. Now * that the object is created, let's send the fallback * source change signal. */ - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1742,7 +1738,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_device_get_path(device); pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path)); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_device_free(device); @@ -1752,13 +1748,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(stream = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(idx)))) { - stream = pa_dbusiface_stream_new_playback(pa_idxset_get_by_index(core->sink_inputs, idx), OBJECT_PATH); + stream = pa_dbusiface_stream_new_playback(c, pa_idxset_get_by_index(core->sink_inputs, idx)); pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream); } object_path = pa_dbusiface_stream_get_path(stream); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1766,7 +1762,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_stream_get_path(stream); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_stream_free(stream); @@ -1776,13 +1772,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(stream = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(idx)))) { - stream = pa_dbusiface_stream_new_record(pa_idxset_get_by_index(core->source_outputs, idx), OBJECT_PATH); + stream = pa_dbusiface_stream_new_record(c, pa_idxset_get_by_index(core->source_outputs, idx)); pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream); } object_path = pa_dbusiface_stream_get_path(stream); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1790,7 +1786,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_stream_get_path(stream); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_stream_free(stream); @@ -1800,13 +1796,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) { - sample = pa_dbusiface_sample_new(pa_idxset_get_by_index(core->scache, idx), OBJECT_PATH); + sample = pa_dbusiface_sample_new(c, pa_idxset_get_by_index(core->scache, idx)); pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample); } object_path = pa_dbusiface_sample_get_path(sample); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1814,7 +1810,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_sample_get_path(sample); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_sample_free(sample); @@ -1824,13 +1820,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_MODULE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) { - module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx), OBJECT_PATH); + module = pa_dbusiface_module_new(c, pa_idxset_get_by_index(core->modules, idx)); pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module); } object_path = pa_dbusiface_module_get_path(module); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1838,7 +1834,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_module_get_path(module); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_module_free(module); @@ -1848,13 +1844,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 case PA_SUBSCRIPTION_EVENT_CLIENT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { if (!(client = pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(idx)))) { - client = pa_dbusiface_client_new(pa_idxset_get_by_index(core->clients, idx), OBJECT_PATH); + client = pa_dbusiface_client_new(c, pa_idxset_get_by_index(core->clients, idx)); pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client); } object_path = pa_dbusiface_client_get_path(client); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { @@ -1862,7 +1858,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3 object_path = pa_dbusiface_client_get_path(client); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); pa_dbusiface_client_free(client); @@ -1884,7 +1880,7 @@ static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data pa_assert(c); pa_assert(ext_name); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1901,7 +1897,7 @@ static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_da pa_assert(c); pa_assert(ext_name); - pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name))); + pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name))); pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID)); pa_dbus_protocol_send_signal(c->dbus_protocol, signal); @@ -1943,39 +1939,39 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) { c->fallback_source = pa_namereg_get_default_source(core); c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, PA_HOOK_NORMAL, extension_registered_cb, c); c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, PA_HOOK_NORMAL, extension_unregistered_cb, c); - c->memstats = pa_dbusiface_memstats_new(core, OBJECT_PATH); + c->memstats = pa_dbusiface_memstats_new(c, core); for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx)) - pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(card, OBJECT_PATH)); + pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(c, card)); for (sink = pa_idxset_first(core->sinks, &idx); sink; sink = pa_idxset_next(core->sinks, &idx)) { - device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH); + device = pa_dbusiface_device_new_sink(c, sink); pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device); pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device); } for (source = pa_idxset_first(core->sources, &idx); source; source = pa_idxset_next(core->sources, &idx)) { - device = pa_dbusiface_device_new_source(source, OBJECT_PATH); + device = pa_dbusiface_device_new_source(c, source); pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device); pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device); } for (sink_input = pa_idxset_first(core->sink_inputs, &idx); sink_input; sink_input = pa_idxset_next(core->sink_inputs, &idx)) - pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(sink_input, OBJECT_PATH)); + pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(c, sink_input)); for (source_output = pa_idxset_first(core->source_outputs, &idx); source_output; source_output = pa_idxset_next(core->source_outputs, &idx)) - pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(source_output, OBJECT_PATH)); + pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(c, source_output)); for (sample = pa_idxset_first(core->scache, &idx); sample; sample = pa_idxset_next(core->scache, &idx)) - pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(sample, OBJECT_PATH)); + pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(c, sample)); for (module = pa_idxset_first(core->modules, &idx); module; module = pa_idxset_next(core->modules, &idx)) - pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(module, OBJECT_PATH)); + pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(c, module)); for (client = pa_idxset_first(core->clients, &idx); client; client = pa_idxset_next(core->clients, &idx)) - pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(client, OBJECT_PATH)); + pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client)); - pa_dbus_protocol_add_interface(c->dbus_protocol, OBJECT_PATH, &core_interface_info, c); + pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c); return c; } @@ -2031,7 +2027,7 @@ static void free_client_cb(void *p, void *userdata) { void pa_dbusiface_core_free(pa_dbusiface_core *c) { pa_assert(c); - pa_dbus_protocol_remove_interface(c->dbus_protocol, OBJECT_PATH, core_interface_info.name); + pa_dbus_protocol_remove_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, core_interface_info.name); pa_subscription_free(c->subscription); pa_hashmap_free(c->cards, free_card_cb, NULL); diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h index 6c5191b9..964a37bd 100644 --- a/src/modules/dbus/iface-core.h +++ b/src/modules/dbus/iface-core.h @@ -30,8 +30,6 @@ #include -#define PA_DBUSIFACE_CORE_INTERFACE "org.PulseAudio.Core1" - typedef struct pa_dbusiface_core pa_dbusiface_core; pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core); diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c index 3b3795eb..1a64f43c 100644 --- a/src/modules/dbus/iface-device.c +++ b/src/modules/dbus/iface-device.c @@ -24,6 +24,7 @@ #endif #include +#include #include "iface-device.h" @@ -44,30 +45,30 @@ struct pa_dbusiface_device { char *path; }; -pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix) { +pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink) { pa_dbusiface_device *d; + pa_assert(core); pa_assert(sink); - pa_assert(path_prefix); d = pa_xnew(pa_dbusiface_device, 1); d->sink = pa_sink_ref(sink); d->type = DEVICE_TYPE_SINK; - d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SINK_OBJECT_NAME, sink->index); + d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index); return d; } -pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix) { +pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source) { pa_dbusiface_device *d; + pa_assert(core); pa_assert(source); - pa_assert(path_prefix); d = pa_xnew(pa_dbusiface_device, 1); d->source = pa_source_ref(source); d->type = DEVICE_TYPE_SOURCE; - d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SOURCE_OBJECT_NAME, source->index); + d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SOURCE_OBJECT_NAME, source->index); return d; } diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device.h index 81ad1d84..1e9af83a 100644 --- a/src/modules/dbus/iface-device.h +++ b/src/modules/dbus/iface-device.h @@ -32,10 +32,12 @@ #include #include +#include "iface-core.h" + typedef struct pa_dbusiface_device pa_dbusiface_device; -pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix); -pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix); +pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink); +pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source); void pa_dbusiface_device_free(pa_dbusiface_device *d); const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d); diff --git a/src/modules/dbus/iface-memstats.c b/src/modules/dbus/iface-memstats.c index d3412a25..73a84be8 100644 --- a/src/modules/dbus/iface-memstats.c +++ b/src/modules/dbus/iface-memstats.c @@ -195,15 +195,15 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat dbus_message_unref(reply); } -pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix) { +pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core) { pa_dbusiface_memstats *m; + pa_assert(dbus_core); pa_assert(core); - pa_assert(path_prefix); m = pa_xnew(pa_dbusiface_memstats, 1); m->core = pa_core_ref(core); - m->path = pa_sprintf_malloc("%s/%s", path_prefix, OBJECT_NAME); + m->path = pa_sprintf_malloc("%s/%s", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME); m->dbus_protocol = pa_dbus_protocol_get(core); pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &memstats_interface_info, m) >= 0); diff --git a/src/modules/dbus/iface-memstats.h b/src/modules/dbus/iface-memstats.h index d7773ee0..0820e8fe 100644 --- a/src/modules/dbus/iface-memstats.h +++ b/src/modules/dbus/iface-memstats.h @@ -29,14 +29,15 @@ */ #include +#include #include "iface-core.h" -#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUSIFACE_CORE_INTERFACE ".Memstats" +#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUS_CORE_INTERFACE ".Memstats" typedef struct pa_dbusiface_memstats pa_dbusiface_memstats; -pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix); +pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core); void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m); const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m); diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c index 1c95f9e6..788d104b 100644 --- a/src/modules/dbus/iface-module.c +++ b/src/modules/dbus/iface-module.c @@ -24,6 +24,7 @@ #endif #include +#include #include "iface-module.h" @@ -34,15 +35,15 @@ struct pa_dbusiface_module { char *path; }; -pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix) { +pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module) { pa_dbusiface_module *m; + pa_assert(core); pa_assert(module); - pa_assert(path_prefix); m = pa_xnew(pa_dbusiface_module, 1); m->module = module; - m->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, module->index); + m->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, module->index); return m; } diff --git a/src/modules/dbus/iface-module.h b/src/modules/dbus/iface-module.h index 7f683e6a..c4f29210 100644 --- a/src/modules/dbus/iface-module.h +++ b/src/modules/dbus/iface-module.h @@ -30,9 +30,11 @@ #include +#include "iface-core.h" + typedef struct pa_dbusiface_module pa_dbusiface_module; -pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix); +pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module); void pa_dbusiface_module_free(pa_dbusiface_module *m); const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m); diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c index b4a308a2..44cfb031 100644 --- a/src/modules/dbus/iface-sample.c +++ b/src/modules/dbus/iface-sample.c @@ -24,6 +24,7 @@ #endif #include +#include #include "iface-sample.h" @@ -34,15 +35,15 @@ struct pa_dbusiface_sample { char *path; }; -pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix) { +pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample) { pa_dbusiface_sample *s; + pa_assert(core); pa_assert(sample); - pa_assert(path_prefix); s = pa_xnew(pa_dbusiface_sample, 1); s->sample = sample; - s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, sample->index); + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, sample->index); return s; } diff --git a/src/modules/dbus/iface-sample.h b/src/modules/dbus/iface-sample.h index 1b85404e..1b82648d 100644 --- a/src/modules/dbus/iface-sample.h +++ b/src/modules/dbus/iface-sample.h @@ -30,9 +30,11 @@ #include +#include "iface-core.h" + typedef struct pa_dbusiface_sample pa_dbusiface_sample; -pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix); +pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample); void pa_dbusiface_sample_free(pa_dbusiface_sample *c); const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *c); diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c index 1d9ffee6..b5a17894 100644 --- a/src/modules/dbus/iface-stream.c +++ b/src/modules/dbus/iface-stream.c @@ -24,6 +24,7 @@ #endif #include +#include #include "iface-stream.h" @@ -44,30 +45,30 @@ struct pa_dbusiface_stream { char *path; }; -pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix) { +pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input) { pa_dbusiface_stream *s; + pa_assert(core); pa_assert(sink_input); - pa_assert(path_prefix); s = pa_xnew(pa_dbusiface_stream, 1); s->sink_input = pa_sink_input_ref(sink_input); s->type = STREAM_TYPE_PLAYBACK; - s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, PLAYBACK_OBJECT_NAME, sink_input->index); + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, PLAYBACK_OBJECT_NAME, sink_input->index); return s; } -pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix) { +pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output) { pa_dbusiface_stream *s; + pa_assert(core); pa_assert(source_output); - pa_assert(path_prefix); s = pa_xnew(pa_dbusiface_stream, 1); s->source_output = pa_source_output_ref(source_output); s->type = STREAM_TYPE_RECORD; - s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, RECORD_OBJECT_NAME, source_output->index); + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, RECORD_OBJECT_NAME, source_output->index); return s; } diff --git a/src/modules/dbus/iface-stream.h b/src/modules/dbus/iface-stream.h index cc2f3d61..b1b1854b 100644 --- a/src/modules/dbus/iface-stream.h +++ b/src/modules/dbus/iface-stream.h @@ -31,10 +31,12 @@ #include #include +#include "iface-core.h" + typedef struct pa_dbusiface_stream pa_dbusiface_stream; -pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix); -pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix); +pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input); +pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output); void pa_dbusiface_stream_free(pa_dbusiface_stream *s); const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s); diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h index f2b1b50b..c6b630a1 100644 --- a/src/pulsecore/protocol-dbus.h +++ b/src/pulsecore/protocol-dbus.h @@ -32,8 +32,11 @@ #define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME -#define PA_DBUS_ERROR_NO_SUCH_PROPERTY "org.PulseAudio.Core1.NoSuchPropertyError" -#define PA_DBUS_ERROR_NOT_FOUND "org.PulseAudio.Core1.NotFoundError" +#define PA_DBUS_CORE_INTERFACE "org.PulseAudio.Core1" +#define PA_DBUS_CORE_OBJECT_PATH "/org/pulseaudio/core1" + +#define PA_DBUS_ERROR_NO_SUCH_PROPERTY PA_DBUS_CORE_INTERFACE ".NoSuchPropertyError" +#define PA_DBUS_ERROR_NOT_FOUND PA_DBUS_CORE_INTERFACE ".NotFoundError" /* Returns the default address of the server type in the escaped form. For * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the -- cgit