bluez5: telephony: add user_data space on the AG & Call structures

This is mostly useful to store the spa_hook for the event listener
This commit is contained in:
George Kiagiadakis 2024-07-10 16:55:10 +03:00 committed by Wim Taymans
parent a7f7e65b92
commit 6534b58d3b
2 changed files with 38 additions and 6 deletions

View file

@ -155,6 +155,7 @@ struct agimpl {
char *path;
struct spa_list call_list;
struct spa_hook_list listener_list;
void *user_data;
bool dial_in_progress;
struct callimpl *dial_return;
@ -166,6 +167,7 @@ struct callimpl {
int id;
char *path;
struct spa_hook_list listener_list;
void *user_data;
};
#define ag_emit(ag,m,v,...) spa_hook_list_call(&ag->listener_list, struct spa_bt_telephony_ag_events, m, v, ##__VA_ARGS__)
@ -576,12 +578,14 @@ static DBusHandlerResult ag_handler(DBusConnection *c, DBusMessage *m, void *use
}
struct spa_bt_telephony_ag *
telephony_ag_new(struct spa_bt_telephony *telephony)
telephony_ag_new(struct spa_bt_telephony *telephony, size_t user_data_size)
{
struct impl *impl = SPA_CONTAINER_OF(telephony, struct impl, this);
struct agimpl *agimpl;
agimpl = calloc(1, sizeof(*agimpl));
spa_assert(user_data_size < SIZE_MAX - sizeof(*agimpl));
agimpl = calloc(1, sizeof(*agimpl) + user_data_size);
if (agimpl == NULL)
return NULL;
@ -592,6 +596,9 @@ telephony_ag_new(struct spa_bt_telephony *telephony)
spa_list_append(&impl->ag_list, &agimpl->link);
if (user_data_size > 0)
agimpl->user_data = SPA_PTROFF(agimpl, sizeof(struct agimpl), void);
return &agimpl->this;
}
@ -611,6 +618,12 @@ void telephony_ag_destroy(struct spa_bt_telephony_ag *ag)
free(agimpl);
}
void *telephony_ag_get_user_data(struct spa_bt_telephony_ag *ag)
{
struct agimpl *agimpl = SPA_CONTAINER_OF(ag, struct agimpl, this);
return agimpl->user_data;
}
int telephony_ag_register(struct spa_bt_telephony_ag *ag)
{
struct agimpl *agimpl = SPA_CONTAINER_OF(ag, struct agimpl, this);
@ -706,12 +719,14 @@ void telephony_ag_add_listener(struct spa_bt_telephony_ag *ag,
}
struct spa_bt_telephony_call *
telephony_call_new(struct spa_bt_telephony_ag *ag)
telephony_call_new(struct spa_bt_telephony_ag *ag, size_t user_data_size)
{
struct agimpl *agimpl = SPA_CONTAINER_OF(ag, struct agimpl, this);
struct callimpl *callimpl;
callimpl = calloc(1, sizeof(*callimpl));
spa_assert(user_data_size < SIZE_MAX - sizeof(*callimpl));
callimpl = calloc(1, sizeof(*callimpl) + user_data_size);
if (callimpl == NULL)
return NULL;
@ -721,6 +736,9 @@ telephony_call_new(struct spa_bt_telephony_ag *ag)
spa_list_append(&agimpl->call_list, &callimpl->link);
if (user_data_size > 0)
callimpl->user_data = SPA_PTROFF(callimpl, sizeof(struct callimpl), void);
/* mark this object as the return value of the Dial method */
if (agimpl->dial_in_progress)
agimpl->dial_return = callimpl;
@ -743,6 +761,12 @@ void telephony_call_destroy(struct spa_bt_telephony_call *call)
free(callimpl);
}
void *telephony_call_get_user_data(struct spa_bt_telephony_call *call)
{
struct callimpl *callimpl = SPA_CONTAINER_OF(call, struct callimpl, this);
return callimpl->user_data;
}
static const char * const call_state_to_string[] = {
"active",
"held",