亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? manager.c

?? 基于LINUX內(nèi)核驅(qū)動的開發(fā)
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  Copyright (C) 2006-2007  Nokia Corporation *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> * * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <errno.h>#include <unistd.h>#include <stdint.h>#include <sys/stat.h>#include <dirent.h>#include <ctype.h>#include <signal.h>#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>#include <bluetooth/rfcomm.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include <glib.h>#include <dbus/dbus.h>#include "dbus-helper.h"#include "dbus.h"#include "logging.h"#include "textfile.h"#include "ipc.h"#include "device.h"#include "error.h"#include "avdtp.h"#include "a2dp.h"#include "headset.h"#include "gateway.h"#include "sink.h"#include "control.h"#include "manager.h"typedef enum {	HEADSET	= 1 << 0,	GATEWAY	= 1 << 1,	SINK	= 1 << 2,	SOURCE	= 1 << 3,	CONTROL	= 1 << 4,	TARGET	= 1 << 5,	INVALID	= 1 << 6} audio_service_type;typedef enum {		GENERIC_AUDIO = 0,		ADVANCED_AUDIO,		AV_REMOTE,		GET_RECORDS} audio_sdp_state_t;struct audio_sdp_data {	struct device *device;	DBusMessage *msg;	/* Method call or NULL */	GSList *handles;	/* uint32_t * */	GSList *records;	/* sdp_record_t * */	audio_sdp_state_t state;	create_dev_cb_t cb;	void *cb_data;};static DBusConnection *connection = NULL;static struct device *default_hs = NULL;static struct device *default_dev = NULL;static GSList *devices = NULL;static uint32_t hs_record_id = 0;static uint32_t hf_record_id = 0;static GIOChannel *hs_server = NULL;static GIOChannel *hf_server = NULL;static struct enabled_interfaces enabled = {	.headset	= TRUE,	.gateway	= FALSE,	.sink		= TRUE,	.source		= FALSE,	.control	= TRUE,};static void get_next_record(struct audio_sdp_data *data);static DBusHandlerResult get_handles(const char *uuid,					struct audio_sdp_data *data);static struct device *create_device(bdaddr_t *bda){	static int device_id = 0;	char path[128];	snprintf(path, sizeof(path) - 1,			"%s/device%d", AUDIO_MANAGER_PATH, device_id++);	return device_register(connection, path, bda);}static void destroy_device(struct device *device){	dbus_connection_destroy_object_path(connection, device->path);}static void remove_device(struct device *device){	if (device == default_dev) {		debug("Removing default device");		default_dev = NULL;	}	if (device == default_hs) {		debug("Removing default headset");		default_hs = NULL;	}	devices = g_slist_remove(devices, device);	destroy_device(device);}static gboolean add_device(struct device *device, gboolean send_signals){	if (!send_signals)		goto add;	dbus_connection_emit_signal(connection, AUDIO_MANAGER_PATH,					AUDIO_MANAGER_INTERFACE,					"DeviceCreated",					DBUS_TYPE_STRING, &device->path,					DBUS_TYPE_INVALID);	if (device->headset)		dbus_connection_emit_signal(connection,				AUDIO_MANAGER_PATH,				AUDIO_MANAGER_INTERFACE,				"HeadsetCreated",				DBUS_TYPE_STRING, &device->path,				DBUS_TYPE_INVALID);add:	if (default_dev == NULL && g_slist_length(devices) == 0) {		debug("Selecting default device");		default_dev = device;	}	if (!default_hs && device->headset && !devices)		default_hs = device;	devices = g_slist_append(devices, device);	return TRUE;}static uint16_t get_service_uuid(const sdp_record_t *record){	sdp_list_t *classes;	uuid_t uuid;	uint16_t uuid16 = 0;	if (sdp_get_service_classes(record, &classes) < 0) {		error("Unable to get service classes from record");		return 0;	}	memcpy(&uuid, classes->data, sizeof(uuid));	if (!sdp_uuid128_to_uuid(&uuid)) {		error("Not a 16 bit UUID");		sdp_list_free(classes, free);		return 0;	}	if (uuid.type == SDP_UUID32) {		if (uuid.value.uuid32 > 0xFFFF) {			error("Not a 16 bit UUID");			goto done;		}		uuid16 = (uint16_t) uuid.value.uuid32;	} else		uuid16 = uuid.value.uuid16;done:	sdp_list_free(classes, free);	return uuid16;}gboolean server_is_enabled(uint16_t svc){	gboolean ret;	switch (svc) {	case HEADSET_SVCLASS_ID:		ret = (hs_server != NULL);		break;	case HANDSFREE_SVCLASS_ID:		ret = (hf_server != NULL);		break;	case AUDIO_SINK_SVCLASS_ID:		return enabled.sink;	case AV_REMOTE_TARGET_SVCLASS_ID:	case AV_REMOTE_SVCLASS_ID:		return enabled.control;	default:		ret = FALSE;		break;	}	return ret;}static void handle_record(sdp_record_t *record, struct device *device){	gboolean is_default;	uint16_t uuid16;	uuid16 = get_service_uuid(record);	if (!server_is_enabled(uuid16))		return;	switch (uuid16) {	case HEADSET_SVCLASS_ID:		debug("Found Headset record");		if (device->headset)			headset_update(device, record, uuid16);		else			device->headset = headset_init(device,							record, uuid16);		break;	case HEADSET_AGW_SVCLASS_ID:		debug("Found Headset AG record");		break;	case HANDSFREE_SVCLASS_ID:		debug("Found Hansfree record");		if (device->headset)			headset_update(device, record, uuid16);		else			device->headset = headset_init(device,							record, uuid16);		break;	case HANDSFREE_AGW_SVCLASS_ID:		debug("Found Handsfree AG record");		break;	case AUDIO_SINK_SVCLASS_ID:		debug("Found Audio Sink");		if (device->sink == NULL)			device->sink = sink_init(device);		break;	case AUDIO_SOURCE_SVCLASS_ID:		debug("Found Audio Source");		break;	case AV_REMOTE_SVCLASS_ID:		debug("Found AV Remote");		if (device->control == NULL)			device->control = control_init(device);		if (device->sink && sink_is_active(device))			avrcp_connect(device);		break;	case AV_REMOTE_TARGET_SVCLASS_ID:		debug("Found AV Target");		if (device->control == NULL)			device->control = control_init(device);		if (device->sink && sink_is_active(device))			avrcp_connect(device);		break;	default:		debug("Unrecognized UUID: 0x%04X", uuid16);		break;	}	is_default = (default_dev == device) ? TRUE : FALSE;	device_store(device, is_default);}static void finish_sdp(struct audio_sdp_data *data, gboolean success){	const char *addr;	DBusMessage *reply = NULL;	DBusError derr;	debug("Audio service discovery completed with %s",			success ? "success" : "failure");	device_finish_sdp_transaction(data->device);	if (!success)		goto done;	if (!data->msg)		goto update;	dbus_error_init(&derr);	dbus_message_get_args(data->msg, &derr,				DBUS_TYPE_STRING, &addr,				DBUS_TYPE_INVALID);	if (dbus_error_is_set(&derr)) {		error("Unable to get message args");		success = FALSE;		error_failed(connection, data->msg, derr.message);		dbus_error_free(&derr);		goto done;	}	/* Return error if no audio related service records were found */	if (!data->records) {		debug("No audio audio related service records were found");		success = FALSE;		error_not_supported(connection, data->msg);		goto done;	}	reply = dbus_message_new_method_return(data->msg);	if (!reply) {		success = FALSE;		error_failed(connection, data->msg, "Out of memory");		goto done;	}update:	g_slist_foreach(data->records, (GFunc) handle_record, data->device);	if (!g_slist_find(devices, data->device))		add_device(data->device, TRUE);	if (reply) {		dbus_message_append_args(reply, DBUS_TYPE_STRING,					&data->device->path,					DBUS_TYPE_INVALID);		send_message_and_unref(connection, reply);	}done:	if (success) {		if (data->cb)			data->cb(data->device, data->cb_data);	} else {		if (data->cb)			data->cb(NULL, data->cb_data);		if (!g_slist_find(devices, data->device))			destroy_device(data->device);	}	if (data->msg)		dbus_message_unref(data->msg);	g_slist_foreach(data->handles, (GFunc) g_free, NULL);	g_slist_free(data->handles);	g_slist_foreach(data->records, (GFunc) sdp_record_free, NULL);	g_slist_free(data->records);	g_free(data);}static void get_record_reply(DBusPendingCall *call,				struct audio_sdp_data *data){	DBusMessage *reply;	DBusError derr;	uint8_t *array;	int array_len, record_len;	sdp_record_t *record;	reply = dbus_pending_call_steal_reply(call);	dbus_error_init(&derr);	if (dbus_set_error_from_message(&derr, reply)) {		/* FIXME : forward error message as is */		error("GetRemoteServiceRecord failed: %s", derr.message);		if (dbus_error_has_name(&derr,					"org.bluez.Error.ConnectionAttemptFailed"))			error_connection_attempt_failed(connection, data->msg,				EHOSTDOWN);		else			error_failed(connection, data->msg, derr.message);		dbus_error_free(&derr);		goto failed;	}	if (!dbus_message_get_args(reply, NULL,				DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &array, &array_len,				DBUS_TYPE_INVALID)) {		error_failed(connection, data->msg,				"Unable to get args from GetRecordReply");		goto failed;	}	record = sdp_extract_pdu(array, &record_len);	if (!record) {		error("Unable to extract service record from reply");		goto done;	}	if (record_len != array_len)		debug("warning: array len (%d) != record len (%d)",				array_len, record_len);	data->records = g_slist_append(data->records, record);done:	dbus_message_unref(reply);	if (data->handles)		get_next_record(data);	else		finish_sdp(data, TRUE);	return;failed:	if (reply)		dbus_message_unref(reply);	finish_sdp(data, FALSE);}static void get_next_record(struct audio_sdp_data *data){	DBusMessage *msg;	DBusPendingCall *pending;	char address[18], *ptr = address;	dbus_uint32_t *handle;	msg = dbus_message_new_method_call("org.bluez",						data->device->adapter_path,						"org.bluez.Adapter",						"GetRemoteServiceRecord");	if (!msg) {		error("Unable to allocate new method call");		error_out_of_memory(connection, data->msg);		finish_sdp(data, FALSE);		return;	}	handle = data->handles->data;	data->handles = g_slist_remove(data->handles, data->handles->data);	ba2str(&data->device->dst, address);	dbus_message_append_args(msg, DBUS_TYPE_STRING, &ptr,					DBUS_TYPE_UINT32, handle,					DBUS_TYPE_INVALID);	g_free(handle);	if (!dbus_connection_send_with_reply(connection, msg, &pending, -1)) {		error("Sending GetRemoteServiceRecord failed");		error_connection_attempt_failed(connection, data->msg, EIO);		finish_sdp(data, FALSE);		return;	}	dbus_pending_call_set_notify(pending,			(DBusPendingCallNotifyFunction) get_record_reply,			data, NULL);	dbus_pending_call_unref(pending);	dbus_message_unref(msg);}static GSList *find_handle(GSList *handles, dbus_uint32_t handle){	while (handles) {		if (*(dbus_uint32_t *) handles->data == handle)			return handles;		handles = handles->next;	}	return NULL;}static void get_handles_reply(DBusPendingCall *call,				struct audio_sdp_data *data){	DBusMessage *reply;	DBusError derr;	dbus_uint32_t *array = NULL;	int array_len, i;	reply = dbus_pending_call_steal_reply(call);	dbus_error_init(&derr);	if (dbus_set_error_from_message(&derr, reply)) {		/* FIXME : forward error message as is */		error("GetRemoteServiceHandles failed: %s", derr.message);		if (dbus_error_has_name(&derr,					"org.bluez.Error.ConnectionAttemptFailed"))			error_connection_attempt_failed(connection, data->msg,							EHOSTDOWN);		else			error_failed(connection, data->msg, derr.message);		dbus_error_free(&derr);		goto failed;	}	if (!dbus_message_get_args(reply, NULL,				DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32,				&array, &array_len,				DBUS_TYPE_INVALID)) {		error_failed(connection, data->msg,				"Unable to get args from reply");		goto failed;	}	for (i = 0; i < array_len; i++) {		if (!find_handle(data->handles, array[i])) {			dbus_uint32_t *handle = g_new(dbus_uint32_t, 1);			*handle = array[i];			data->handles = g_slist_append(data->handles, handle);		}	}	data->state++;	switch (data->state) {	case ADVANCED_AUDIO:		get_handles(ADVANCED_AUDIO_UUID, data);		break;	case AV_REMOTE:		get_handles(AVRCP_REMOTE_UUID, data);		break;	default:		if (data->handles)			get_next_record(data);		else			finish_sdp(data, TRUE);	}	dbus_message_unref(reply);	return;failed:	dbus_message_unref(reply);	finish_sdp(data, FALSE);}static DBusHandlerResult get_handles(const char *uuid,					struct audio_sdp_data *data){	DBusPendingCall *pending;	char address[18];	const char *ptr = address;	DBusMessage *msg;	msg = dbus_message_new_method_call("org.bluez",						data->device->adapter_path,						"org.bluez.Adapter",						"GetRemoteServiceHandles");	if (!msg) {		error_failed(connection, data->msg,				"Could not create a new dbus message");		goto failed;	}	ba2str(&data->device->dst, address);	dbus_message_append_args(msg, DBUS_TYPE_STRING, &ptr,					DBUS_TYPE_STRING, &uuid,					DBUS_TYPE_INVALID);	if (!dbus_connection_send_with_reply(connection, msg, &pending, -1)) {		error_failed(connection, data->msg,				"Sending GetRemoteServiceHandles failed");		goto failed;	}	dbus_pending_call_set_notify(pending,			(DBusPendingCallNotifyFunction) get_handles_reply,			data, NULL);	dbus_pending_call_unref(pending);	dbus_message_unref(msg);	return DBUS_HANDLER_RESULT_HANDLED;failed:	if (msg)		dbus_message_unref(msg);	finish_sdp(data, FALSE);	return DBUS_HANDLER_RESULT_HANDLED;}static DBusHandlerResult resolve_services(DBusMessage *msg,						struct device *device,						create_dev_cb_t cb,						void *user_data){	struct audio_sdp_data *sdp_data;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
伦理电影国产精品| 国产精品免费视频观看| 亚洲一区二区三区美女| 色欧美日韩亚洲| 亚洲精品久久嫩草网站秘色| 色婷婷综合视频在线观看| 亚洲一二三四久久| 欧美一区二区视频在线观看2020 | 欧美日韩国产高清一区二区| 欧美视频三区在线播放| 国产精品卡一卡二卡三| 色婷婷国产精品综合在线观看| 一区二区三区日韩在线观看| 欧美亚洲国产一卡| 久久精品国产精品亚洲红杏| 国产欧美视频一区二区| 91亚洲永久精品| 亚洲一区二区欧美日韩| 欧美不卡一区二区| 成人毛片在线观看| 亚洲国产欧美在线人成| 欧美不卡一二三| 99久精品国产| 天天av天天翘天天综合网色鬼国产 | 亚洲h动漫在线| 日韩一区二区麻豆国产| 成人网在线免费视频| 亚洲精品一区二区三区四区高清| 高清国产午夜精品久久久久久| 国产精品国产三级国产a | 欧美日韩免费在线视频| 久久精品国产秦先生| 国产精品的网站| 欧美另类z0zxhd电影| 国产精品12区| 亚洲高清免费视频| 欧美国产日产图区| 91精品国产欧美日韩| 99久久99精品久久久久久| 久久国产精品露脸对白| 亚洲最新视频在线观看| xvideos.蜜桃一区二区| 欧美日韩在线亚洲一区蜜芽| 东方aⅴ免费观看久久av| 亚瑟在线精品视频| 欧美在线视频日韩| 欧美一级搡bbbb搡bbbb| 99riav一区二区三区| 久久国产三级精品| 亚洲福中文字幕伊人影院| 风间由美性色一区二区三区| 日韩一区二区三区电影在线观看| 成年人网站91| 激情六月婷婷久久| 午夜视频一区二区三区| 亚洲欧洲成人精品av97| 国产亲近乱来精品视频| 欧美一区二区三区在| 欧美日韩免费观看一区二区三区 | 国产精品资源在线看| 天堂资源在线中文精品| 亚洲女性喷水在线观看一区| 国产三级一区二区| 欧美精品一区二| 欧美成人精品3d动漫h| 欧美一区二区久久| 日韩午夜中文字幕| 69堂成人精品免费视频| 欧美日本一区二区三区四区| 欧美性生活影院| 欧美综合在线视频| 色综合久久久久综合| zzijzzij亚洲日本少妇熟睡| 国产福利一区在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 国产成人8x视频一区二区| 日本亚洲免费观看| 免费日本视频一区| 奇米一区二区三区| 日本在线播放一区二区三区| 日本亚洲三级在线| 黄网站免费久久| 国产一区二区三区四| 国产一区二区三区四区在线观看| 奇米一区二区三区av| 久久成人18免费观看| 国产精品一线二线三线精华| 韩国精品主播一区二区在线观看 | 久久这里只有精品视频网| 日韩欧美123| 久久久久久毛片| 中文字幕中文字幕一区| 亚洲色欲色欲www| 午夜日韩在线观看| 亚洲精品亚洲人成人网在线播放| 欧美二区三区的天堂| 欧美成人vps| 国产欧美一区二区三区网站| 中文字幕中文字幕一区二区 | www激情久久| 国产日韩欧美不卡在线| 亚洲视频免费看| 视频一区二区国产| 激情欧美日韩一区二区| 99精品视频在线观看免费| 欧美日韩高清一区| 精品国产一区二区亚洲人成毛片 | 亚洲免费在线看| 天天综合色天天综合| 国产精品一线二线三线精华| 色偷偷一区二区三区| 日韩欧美色综合网站| 1024国产精品| 蜜臀91精品一区二区三区 | 色偷偷久久人人79超碰人人澡| 欧美日本国产一区| 欧美午夜一区二区三区免费大片| 欧美日韩精品一区二区三区蜜桃 | 亚洲欧美一区二区不卡| 亚洲精品一二三区| 看片的网站亚洲| 91天堂素人约啪| 日韩精品一区二区在线| 国产精品第一页第二页第三页| 婷婷夜色潮精品综合在线| 粉嫩13p一区二区三区| 91精品啪在线观看国产60岁| 国产欧美日韩另类一区| 日韩av电影天堂| 99久久伊人网影院| 日韩三级在线观看| 亚洲综合色视频| 成人精品视频一区二区三区尤物| 欧美精品在线一区二区| 亚洲特黄一级片| 国产精品白丝jk黑袜喷水| 欧美日韩三级一区| 亚洲私人影院在线观看| 国产一区二区三区电影在线观看| 欧美三级乱人伦电影| 一区在线观看免费| 免费人成在线不卡| 99re视频精品| 欧美人妖巨大在线| 一区免费观看视频| 国产成+人+日韩+欧美+亚洲| 欧美高清一级片在线| 亚洲乱码国产乱码精品精的特点 | 亚洲精品国产一区二区三区四区在线| 久久97超碰国产精品超碰| 欧美精三区欧美精三区| 一片黄亚洲嫩模| 色999日韩国产欧美一区二区| 欧美精品一区二区三区高清aⅴ | 精品一区二区久久| 欧美一区二区在线播放| 亚洲不卡在线观看| 欧美网站一区二区| 亚洲午夜在线观看视频在线| 91免费国产视频网站| 中文字幕亚洲视频| 成人ar影院免费观看视频| 国产精品午夜免费| 成人在线一区二区三区| 欧美国产精品一区二区| 国产成人啪免费观看软件| 久久综合九色欧美综合狠狠| 久久99蜜桃精品| 亚洲精品一区二区在线观看| 另类的小说在线视频另类成人小视频在线 | 92精品国产成人观看免费| 亚洲欧洲国产专区| 一本久久a久久精品亚洲| 亚洲欧美成aⅴ人在线观看| 亚洲韩国一区二区三区| 精品福利在线导航| 欧美日韩国产另类不卡| 久久久精品黄色| 成人国产精品免费网站| 欧美激情在线免费观看| 99久久久精品| 一区二区在线电影| 欧美日韩在线三区| 麻豆精品一区二区综合av| 久久免费看少妇高潮| 成人激情免费电影网址| 综合久久国产九一剧情麻豆| 欧美色中文字幕| 蜜乳av一区二区三区| 精品国产伦一区二区三区免费| 国产精品99久| 亚洲天堂成人在线观看| 欧美日韩国产另类一区| 狠狠狠色丁香婷婷综合久久五月| 久久久99久久| 日本道在线观看一区二区| 免费在线观看精品| 中文字幕欧美日本乱码一线二线 | av在线综合网| 午夜精品福利一区二区蜜股av |