diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index b43161a..a3c294b 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
avdtp_unref(s->session);
g_slist_free_full(s->cb, g_free);
g_slist_free_full(s->caps, g_free);
+ g_free(s->err);
g_free(s);
}
g_free(cb);
}
+static void setup_error_set(struct a2dp_setup *setup, struct avdtp_error *err)
+{
+ if (!err) {
+ g_free(setup->err);
+ setup->err = NULL;
+ } else {
+ if (!setup->err)
+ setup->err = g_new0(struct avdtp_error, 1);
+ memcpy(setup->err, err, sizeof(struct avdtp_error));
+ }
+}
+
+static void setup_error_init(struct a2dp_setup *setup, uint8_t type, int id)
+{
+ struct avdtp_error err;
+
+ avdtp_error_init(&err, type, id);
+ setup_error_set(setup, &err);
+}
+
static void finalize_setup_errno(struct a2dp_setup *s, int err,
GSourceFunc cb1, ...)
{
GSourceFunc finalize;
va_list args;
- struct avdtp_error avdtp_err;
- if (err < 0) {
- avdtp_error_init(&avdtp_err, AVDTP_ERRNO, -err);
- s->err = &avdtp_err;
- }
+ if (err < 0)
+ setup_error_init(s, AVDTP_ERRNO, -err);
va_start(args, cb1);
finalize = cb1;
finalize_config(setup);
- if (setup->err) {
- g_free(setup->err);
- setup->err = NULL;
- }
+ setup_error_set(setup, NULL);
setup_unref(setup);
static void endpoint_setconf_cb(struct a2dp_setup *setup, gboolean ret)
{
- if (ret == FALSE) {
- setup->err = g_new(struct avdtp_error, 1);
- avdtp_error_init(setup->err, AVDTP_MEDIA_CODEC,
+ if (ret == FALSE)
+ setup_error_init(setup, AVDTP_MEDIA_CODEC,
AVDTP_UNSUPPORTED_CONFIGURATION);
- }
auto_config(setup);
setup_unref(setup);
if (cap->category == AVDTP_DELAY_REPORTING &&
!a2dp_sep->delay_reporting) {
- setup->err = g_new(struct avdtp_error, 1);
- avdtp_error_init(setup->err, AVDTP_DELAY_REPORTING,
+ setup_error_init(setup, AVDTP_DELAY_REPORTING,
AVDTP_UNSUPPORTED_CONFIGURATION);
goto done;
}
codec = (struct avdtp_media_codec_capability *) cap->data;
if (codec->media_codec_type != a2dp_sep->codec) {
- setup->err = g_new(struct avdtp_error, 1);
- avdtp_error_init(setup->err, AVDTP_MEDIA_CODEC,
+ setup_error_init(setup, AVDTP_MEDIA_CODEC,
AVDTP_UNSUPPORTED_CONFIGURATION);
goto done;
}
return TRUE;
}
- setup_unref(setup);
- setup->err = g_new(struct avdtp_error, 1);
- avdtp_error_init(setup->err, AVDTP_MEDIA_CODEC,
+ setup_error_init(setup, AVDTP_MEDIA_CODEC,
AVDTP_UNSUPPORTED_CONFIGURATION);
+ setup_unref(setup);
break;
}
/* Set error to -EAGAIN so the likes of policy plugin can
* reattempt to connect.
*/
- avdtp_error_init(setup->err, AVDTP_ERRNO, -EAGAIN);
+ setup_error_init(setup, AVDTP_ERRNO, -EAGAIN);
}
}
if (err) {
if (setup) {
setup_ref(setup);
- setup->err = err;
+ setup_error_set(setup, err);
invalidate_remote_cache(setup, err);
finalize_config(setup);
- setup->err = NULL;
+ setup_error_set(setup, NULL);
setup_unref(setup);
}
if (err) {
setup->stream = NULL;
- setup->err = err;
+ setup_error_set(setup, err);
if (setup->start)
finalize_resume(setup);
} else if (setup->chan)
if (err) {
setup->stream = NULL;
- setup->err = err;
+ setup_error_set(setup, err);
}
finalize_resume(setup);
if (err) {
setup->stream = NULL;
- setup->err = err;
+ setup_error_set(setup, err);
}
finalize_suspend(setup);
if (err) {
setup->stream = NULL;
- setup->err = err;
+ setup_error_set(setup, err);
finalize_config(setup);
return;
}
if (err) {
setup->stream = NULL;
- setup->err = err;
+ setup_error_set(setup, err);
}
finalize_config(setup);
setup->seps = seps;
if (err)
- setup->err = err;
+ setup_error_set(setup, err);
if (!err) {
g_slist_foreach(seps, foreach_register_remote_sep, setup->chan);