static void setup_free(void *data) { struct a2dp_setup *setup = data; if (!g_slist_find(setup->endpoint->presets, setup->preset)) preset_free(setup->preset); g_free(setup); }
static gboolean sep_setconf_ind(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, GSList *caps, avdtp_set_configuration_cb cb, void *user_data) { struct a2dp_endpoint *endpoint = user_data; struct a2dp_device *dev; struct a2dp_preset *preset = NULL; DBG(""); dev = find_device_by_session(session); if (!dev) { error("Unable to find device for session %p", session); return FALSE; } for (; caps != NULL; caps = g_slist_next(caps)) { struct avdtp_service_capability *cap = caps->data; struct avdtp_media_codec_capability *codec; if (cap->category == AVDTP_DELAY_REPORTING) return FALSE; if (cap->category != AVDTP_MEDIA_CODEC) continue; codec = (struct avdtp_media_codec_capability *) cap->data; if (codec->media_codec_type != endpoint->codec) return FALSE; preset = g_new0(struct a2dp_preset, 1); preset->len = cap->length - sizeof(*codec); preset->data = g_memdup(codec->data, preset->len); if (check_config(endpoint, preset) < 0) { preset_free(preset); return FALSE; } } if (!preset) return FALSE; setup_add(dev, endpoint, preset, stream); cb(session, stream, NULL); return TRUE; }
static void unregister_endpoint(void *data) { struct a2dp_endpoint *endpoint = data; if (endpoint->sep) avdtp_unregister_sep(endpoint->sep); if (endpoint->caps) preset_free(endpoint->caps); g_slist_free_full(endpoint->presets, preset_free); g_free(endpoint); }
/** * \param filename valid path to file * \param error return location for an error * * Tries to open file pointed by path, then parses it. * * \return Preset which must be freed using preset_free, or NULL on error. **/ Preset *create_preset_from_xml_file(gchar *filename, GError **error) { GError *err = NULL; gchar *contents; if (g_file_get_contents(filename, &contents, NULL, &err) == FALSE) { g_message("Failed to get %s contents: %s", filename, err->message); *error = g_error_copy(err); g_error_free(err); return NULL; } AppData *ad = g_slice_new(AppData); ad->depth = 0; ad->preset = g_slice_new(Preset); ad->preset->name = NULL; ad->preset->params = NULL; ad->preset->genetxs = NULL; ad->id = PARSER_TYPE_NOT_SET; XML_Parser p; p = XML_ParserCreate(NULL); XML_SetUserData(p, (void *) ad); XML_SetElementHandler(p, start, end); XML_SetCharacterDataHandler(p, text_cb); if (XML_Parse(p, contents, strlen(contents), XML_TRUE) != XML_STATUS_OK) { g_set_error(error, 0, 0, "Parse error at line %d:\n%s", (int)XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); preset_free(ad->preset); g_slice_free(AppData, ad); g_free(contents); return NULL; } Preset *preset = ad->preset; preset->params = g_list_reverse(preset->params); preset->genetxs = g_list_reverse(preset->genetxs); XML_ParserFree(p); g_slice_free(AppData, ad); g_free(contents); return preset; }