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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? manager.c

?? 基于LINUX內核驅動的開發(fā)
?? C
?? 第 1 頁 / 共 3 頁
字號:
	memset(&record, 0, sizeof(sdp_record_t));	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(0, &root_uuid);	sdp_set_browse_groups(&record, root);	sdp_uuid16_create(&svclass_uuid, HANDSFREE_AGW_SVCLASS_ID);	svclass_id = sdp_list_append(0, &svclass_uuid);	sdp_uuid16_create(&ga_svclass_uuid, GENERIC_AUDIO_SVCLASS_ID);	svclass_id = sdp_list_append(svclass_id, &ga_svclass_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile.uuid, HANDSFREE_PROFILE_ID);	profile.version = 0x0105;	pfseq = sdp_list_append(0, &profile);	sdp_set_profile_descs(&record, pfseq);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(0, &l2cap_uuid);	apseq = sdp_list_append(0, proto[0]);	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);	proto[1] = sdp_list_append(0, &rfcomm_uuid);	channel = sdp_data_alloc(SDP_UINT8, &ch);	proto[1] = sdp_list_append(proto[1], channel);	apseq = sdp_list_append(apseq, proto[1]);	sdpfeat = (uint16_t) feat & 0xF;	features = sdp_data_alloc(SDP_UINT16, &sdpfeat);	sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FEATURES, features);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "Hands-Free Audio Gateway", 0, 0);	sdp_attr_add(&record, SDP_ATTR_EXTERNAL_NETWORK, network);	if (sdp_gen_record_pdu(&record, buf) < 0)		ret = -1;	else		ret = 0;	sdp_data_free(channel);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(apseq, 0);	sdp_list_free(pfseq, 0);	sdp_list_free(aproto, 0);	sdp_list_free(root, 0);	sdp_list_free(svclass_id, 0);	sdp_list_free(record.attrlist, (sdp_free_func_t) sdp_data_free);	sdp_list_free(record.pattern, free);	return ret;}uint32_t add_service_record(DBusConnection *conn, sdp_buf_t *buf){	DBusMessage *msg, *reply;	DBusError derr;	dbus_uint32_t rec_id;	msg = dbus_message_new_method_call("org.bluez", "/org/bluez",						"org.bluez.Database",						"AddServiceRecord");	if (!msg) {		error("Can't allocate new method call");		return 0;	}	dbus_message_append_args(msg, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,						&buf->data, buf->data_size,							DBUS_TYPE_INVALID);	dbus_error_init(&derr);	reply = dbus_connection_send_with_reply_and_block(connection,							msg, -1, &derr);	dbus_message_unref(msg);	if (dbus_error_is_set(&derr) ||			dbus_set_error_from_message(&derr, reply)) {		error("Adding service record failed: %s", derr.message);		dbus_error_free(&derr);		return 0;	}	dbus_message_get_args(reply, &derr, DBUS_TYPE_UINT32, &rec_id,							DBUS_TYPE_INVALID);	if (dbus_error_is_set(&derr)) {		error("Invalid arguments to AddServiceRecord reply: %s",								derr.message);		dbus_message_unref(reply);		dbus_error_free(&derr);		return 0;	}	dbus_message_unref(reply);	debug("add_service_record: got record id 0x%x", rec_id);	return rec_id;}int remove_service_record(DBusConnection *conn, uint32_t rec_id){	DBusMessage *msg, *reply;	DBusError derr;	msg = dbus_message_new_method_call("org.bluez", "/org/bluez",						"org.bluez.Database",						"RemoveServiceRecord");	if (!msg) {		error("Can't allocate new method call");		return 0;	}	dbus_message_append_args(msg, DBUS_TYPE_UINT32, &rec_id,							DBUS_TYPE_INVALID);	dbus_error_init(&derr);	reply = dbus_connection_send_with_reply_and_block(connection,							msg, -1, &derr);	dbus_message_unref(msg);	if (dbus_error_is_set(&derr)) {		error("Removing service record 0x%x failed: %s",						rec_id, derr.message);		dbus_error_free(&derr);		return 0;	}	dbus_message_unref(reply);	return 0;}static void auth_cb(DBusPendingCall *call, void *data){	struct device *device = data;	DBusMessage *reply = dbus_pending_call_steal_reply(call);	DBusError err;	const char *uuid;	if (get_hfp_active(device))		uuid = HFP_AG_UUID;	else		uuid = HSP_AG_UUID;	dbus_error_init(&err);	if (dbus_set_error_from_message(&err, reply)) {		error("Access denied: %s", err.message);		if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY)) {			debug("Canceling authorization request");			manager_cancel_authorize(&device->dst, uuid, NULL);		}		dbus_error_free(&err);		headset_set_state(device, HEADSET_STATE_DISCONNECTED);	} else {		char hs_address[18];		headset_set_authorized(device);		ba2str(&device->dst, hs_address);		debug("Accepted headset connection from %s for %s",						hs_address, device->path);	}	dbus_message_unref(reply);}static gboolean ag_io_cb(GIOChannel *chan, GIOCondition cond, void *data){	int srv_sk, cli_sk;	struct sockaddr_rc addr;	socklen_t size;	const char *uuid;	struct device *device;	gboolean hfp_active;	if (cond & G_IO_NVAL)		return FALSE;	if (cond & (G_IO_HUP | G_IO_ERR)) {		error("Hangup or error on rfcomm server socket");		g_io_channel_close(chan);		raise(SIGTERM);		return FALSE;	}	srv_sk = g_io_channel_unix_get_fd(chan);	size = sizeof(struct sockaddr_rc);	cli_sk = accept(srv_sk, (struct sockaddr *) &addr, &size);	if (cli_sk < 0) {		error("accept: %s (%d)", strerror(errno), errno);		return TRUE;	}	if (chan == hs_server) {		hfp_active = FALSE;		uuid = HSP_AG_UUID;	} else {		hfp_active = TRUE;		uuid = HFP_AG_UUID;	}	device = manager_device_connected(&addr.rc_bdaddr, uuid);	if (!device) {		close(cli_sk);		return TRUE;	}	if (headset_get_state(device) > HEADSET_STATE_DISCONNECTED) {		debug("Refusing new connection since one already exists");		close(cli_sk);		return TRUE;	}	set_hfp_active(device, hfp_active);	if (headset_connect_rfcomm(device, cli_sk) < 0) {		error("Allocating new GIOChannel failed!");		close(cli_sk);		return TRUE;	}	if (!manager_authorize(&device->dst, uuid, auth_cb, device, NULL))		goto failed;	headset_set_state(device, HEADSET_STATE_CONNECT_IN_PROGRESS);	return TRUE;failed:	headset_close_rfcomm(device);	return TRUE;}static GIOChannel *server_socket(uint8_t *channel){	int sock, lm;	struct sockaddr_rc addr;	socklen_t sa_len;	GIOChannel *io;	sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);	if (sock < 0) {		error("server socket: %s (%d)", strerror(errno), errno);		return NULL;	}	lm = RFCOMM_LM_SECURE;	if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0) {		error("server setsockopt: %s (%d)", strerror(errno), errno);		close(sock);		return NULL;	}	memset(&addr, 0, sizeof(addr));	addr.rc_family = AF_BLUETOOTH;	bacpy(&addr.rc_bdaddr, BDADDR_ANY);	addr.rc_channel = channel ? *channel : 0;	if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {		error("server bind: %s", strerror(errno), errno);		close(sock);		return NULL;	}	if (listen(sock, 1) < 0) {		error("server listen: %s", strerror(errno), errno);		close(sock);		return NULL;	}	sa_len = sizeof(struct sockaddr_rc);	getsockname(sock, (struct sockaddr *) &addr, &sa_len);	*channel = addr.rc_channel;	io = g_io_channel_unix_new(sock);	if (!io) {		error("Unable to allocate new io channel");		close(sock);		return NULL;	}	return io;}static int headset_server_init(DBusConnection *conn, GKeyFile *config){	uint8_t chan = DEFAULT_HS_AG_CHANNEL;	sdp_buf_t buf;	gboolean no_hfp = FALSE;	GError *err = NULL;	uint32_t features;	if (!(enabled.headset || enabled.gateway))		return 0;	hs_server = server_socket(&chan);	if (!hs_server)		return -1;	if (hsp_ag_record(&buf, chan) < 0) {		error("Unable to allocate new service record");		return -1;	}	hs_record_id = add_service_record(conn, &buf);	free(buf.data);	if (!hs_record_id) {		error("Unable to register HS AG service record");		g_io_channel_unref(hs_server);		hs_server = NULL;		return -1;	}	g_io_add_watch(hs_server, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,				(GIOFunc) ag_io_cb, NULL);	if (config) {		no_hfp = g_key_file_get_boolean(config, "Headset", "DisableHFP",						&err);		if (err) {			debug("audio.conf: %s", err->message);			g_error_free(err);			err = NULL;		}	}	if (no_hfp)		return 0;	chan = DEFAULT_HF_AG_CHANNEL;	hf_server = server_socket(&chan);	if (!hf_server)		return -1;	features = headset_config_init(config);	if (hfp_ag_record(&buf, chan, features) < 0) {		error("Unable to allocate new service record");		return -1;	}	hf_record_id = add_service_record(conn, &buf);	free(buf.data);	if (!hf_record_id) {		error("Unable to register HS AG service record");		g_io_channel_unref(hf_server);		hs_server = NULL;		return -1;	}	g_io_add_watch(hf_server, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,			(GIOFunc) ag_io_cb, NULL);	return 0;}static void server_exit(void){	if (hs_record_id) {		remove_service_record(connection, hs_record_id);		hs_record_id = 0;	}	if (hs_server) {		g_io_channel_unref(hs_server);		hs_server = NULL;	}	if (hf_record_id) {		remove_service_record(connection, hf_record_id);		hf_record_id = 0;	}	if (hf_server) {		g_io_channel_unref(hf_server);		hf_server = NULL;	}}int audio_init(DBusConnection *conn, GKeyFile *config){	char *str;	GError *err = NULL;	connection = dbus_connection_ref(conn);	if (config) {		str = g_key_file_get_string(config, "General", "Enable", &err);		if (err) {			debug("audio.conf: %s", err->message);			g_error_free(err);			err = NULL;		} else {			if (strstr(str, "Headset"))				enabled.headset = TRUE;			if (strstr(str, "Gateway"))				enabled.gateway = TRUE;			if (strstr(str, "Sink"))				enabled.sink = TRUE;			if (strstr(str, "Source"))				enabled.source = TRUE;			if (strstr(str, "Control"))				enabled.control = TRUE;			g_free(str);		}		str = g_key_file_get_string(config, "General", "Disable", &err);		if (err) {			debug("audio.conf: %s", err->message);			g_error_free(err);			err = NULL;		} else {			if (strstr(str, "Headset"))				enabled.headset = FALSE;			if (strstr(str, "Gateway"))				enabled.gateway = FALSE;			if (strstr(str, "Sink"))				enabled.sink = FALSE;			if (strstr(str, "Source"))				enabled.source = FALSE;			if (strstr(str, "Control"))				enabled.control = FALSE;			g_free(str);		}	}	if (!dbus_connection_create_object_path(conn, AUDIO_MANAGER_PATH,						NULL, manager_unregister)) {		error("D-Bus failed to register %s path", AUDIO_MANAGER_PATH);		goto failed;	}	if (enabled.headset) {		if (headset_server_init(conn, config) < 0)			goto failed;	}	if (enabled.source || enabled.sink) {		if (a2dp_init(conn, config) < 0)			goto failed;	}	if (enabled.control && avrcp_init(conn) < 0)		goto failed;	if (!dbus_connection_register_interface(conn, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						manager_methods,						manager_signals, NULL)) {		error("Failed to register %s interface to %s",				AUDIO_MANAGER_INTERFACE, AUDIO_MANAGER_PATH);		goto failed;	}	info("Registered manager path:%s", AUDIO_MANAGER_PATH);	register_stored();	return 0;failed:	audio_exit();	return -1;}void audio_exit(void){	server_exit();	dbus_connection_destroy_object_path(connection, AUDIO_MANAGER_PATH);	dbus_connection_unref(connection);	connection = NULL;}struct device *manager_default_device(void){	return default_dev;}struct device *manager_get_connected_device(void){	GSList *l;	for (l = devices; l != NULL; l = g_slist_next(l)) {		struct device *device = l->data;		if ((device->sink || device->source) &&				avdtp_is_connected(&device->src, &device->dst))			return device;		if (device->headset && headset_is_active(device))			return device;	}	return NULL;}void manager_cancel_authorize(bdaddr_t *dba, const char *uuid,				DBusPendingCall *pending){	DBusMessage *cancel;	char addr[18], *address = addr;	if (pending)		dbus_pending_call_cancel(pending);	cancel = dbus_message_new_method_call("org.bluez", "/org/bluez",						"org.bluez.Database",						"CancelAuthorizationRequest");	if (!cancel) {		error("Unable to allocate new method call");		return;	}	ba2str(dba, addr);	dbus_message_append_args(cancel, DBUS_TYPE_STRING, &address,					DBUS_TYPE_STRING, &uuid,					DBUS_TYPE_INVALID);	send_message_and_unref(connection, cancel);}gboolean manager_authorize(bdaddr_t *dba, const char *uuid,				DBusPendingCallNotifyFunction cb,				void *user_data,				DBusPendingCall **pending){	DBusMessage *auth;	char address[18], *addr_ptr = address;	DBusPendingCall *p;	ba2str(dba, address);	debug("Requesting authorization for device %s, UUID %s",			address, uuid);	auth = dbus_message_new_method_call("org.bluez", "/org/bluez",						"org.bluez.Database",						"RequestAuthorization");	if (!auth) {		error("Unable to allocate RequestAuthorization method call");		return FALSE;	}	dbus_message_append_args(auth, DBUS_TYPE_STRING, &addr_ptr,					DBUS_TYPE_STRING, &uuid,					DBUS_TYPE_INVALID);	if (!dbus_connection_send_with_reply(connection, auth, &p, -1)) {		error("Sending of authorization request failed");		dbus_message_unref(auth);		return FALSE;	}	dbus_pending_call_set_notify(p, cb, user_data, NULL);	if (pending)		*pending = p;	else		dbus_pending_call_unref(p);	dbus_message_unref(auth);	return TRUE;}struct device *manager_find_device(bdaddr_t *bda, const char *interface,					gboolean connected){	GSList *l;	if (!bacmp(bda, BDADDR_ANY) && !interface && !connected)		return default_dev;	for (l = devices; l != NULL; l = l->next) {		struct device *dev = l->data;		if (bacmp(bda, BDADDR_ANY) && bacmp(&dev->dst, bda))			continue;		if (interface && !strcmp(AUDIO_HEADSET_INTERFACE, interface)				&& !dev->headset)			continue;		if (interface && !strcmp(AUDIO_SINK_INTERFACE, interface)				&& !dev->sink)			continue;		if (interface && !strcmp(AUDIO_SOURCE_INTERFACE, interface)				&& !dev->source)			continue;		if (interface && !strcmp(AUDIO_CONTROL_INTERFACE, interface)				&& !dev->control)			continue;		if (connected && !device_is_connected(dev, interface))			continue;		return dev;	}	return NULL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国精品在线| 激情丁香综合五月| 日本二三区不卡| 一区二区三区日韩欧美精品| 色婷婷亚洲综合| 午夜精品一区二区三区三上悠亚| 欧美日韩精品电影| 激情文学综合网| 国产精品无码永久免费888| 99精品偷自拍| 视频一区免费在线观看| 久久老女人爱爱| 97国产一区二区| 日韩极品在线观看| 国产情人综合久久777777| 色综合久久99| 久久99精品久久久久| 中文字幕av一区二区三区高| 91精品办公室少妇高潮对白| 男女男精品视频| 亚洲国产精品传媒在线观看| 欧美日韩免费高清一区色橹橹 | 青青草原综合久久大伊人精品 | 久久久久久免费| 97国产一区二区| 蜜臀国产一区二区三区在线播放| 国产日韩欧美亚洲| 欧美精品一卡二卡| 成人午夜精品一区二区三区| 性感美女久久精品| 国产精品久久久久9999吃药| 欧美精品乱人伦久久久久久| 国产一区二区精品久久99| 亚洲视频一区二区免费在线观看| 欧美日韩国产免费一区二区 | 男人操女人的视频在线观看欧美| 国产精品污www在线观看| 欧美一区二区观看视频| 99久久综合国产精品| 麻豆精品视频在线观看视频| 亚洲免费资源在线播放| 国产视频911| 日韩你懂的电影在线观看| 国产成人丝袜美腿| 秋霞午夜av一区二区三区| 亚洲理论在线观看| 欧美国产综合色视频| 日韩欧美一级二级三级| 欧美性高清videossexo| 成人ar影院免费观看视频| 看国产成人h片视频| 亚洲综合色视频| 国产精品国产三级国产专播品爱网| 欧美大胆一级视频| 欧美日韩在线精品一区二区三区激情 | 午夜欧美视频在线观看| 亚洲色欲色欲www| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 免费人成黄页网站在线一区二区| 亚洲精品自拍动漫在线| 国产欧美一区二区精品久导航 | 亚洲精品伦理在线| 中文字幕不卡的av| 国产欧美精品一区| 久久久久久久久久电影| 欧美r级在线观看| 日韩视频免费观看高清完整版 | 久久视频一区二区| 精品少妇一区二区三区日产乱码| 欧美少妇bbb| 欧美性色综合网| 欧美亚洲图片小说| 色婷婷精品大在线视频| 日本黄色一区二区| 欧美在线高清视频| 欧美色倩网站大全免费| 精品视频一区 二区 三区| 欧美综合亚洲图片综合区| 在线一区二区三区做爰视频网站| 色拍拍在线精品视频8848| 一本色道综合亚洲| 欧美日韩亚洲国产综合| 欧美va亚洲va国产综合| 欧美一级一级性生活免费录像| 欧美一区二区三区电影| 精品三级av在线| 国产欧美日韩中文久久| 欧美激情一区三区| 亚洲柠檬福利资源导航| 亚洲大型综合色站| 麻豆精品视频在线观看免费| 国产精品一区二区果冻传媒| 成人伦理片在线| 在线一区二区三区做爰视频网站| 欧美精品v日韩精品v韩国精品v| 欧美一区二区三区四区五区| 欧美精品一区视频| 国产精品久久久久婷婷| 亚洲国产精品久久久男人的天堂 | 国产一区二区三区电影在线观看| 国产精品亚洲一区二区三区妖精 | a美女胸又www黄视频久久| 色94色欧美sute亚洲线路一久| 欧美日韩国产精品成人| 精品久久国产老人久久综合| 国产精品亲子乱子伦xxxx裸| 亚洲妇女屁股眼交7| 加勒比av一区二区| 色综合久久久久网| 日韩精品一区二区三区三区免费| 欧美国产日产图区| 日韩有码一区二区三区| 国产一区二区成人久久免费影院| 99久久精品国产观看| 日韩视频一区二区在线观看| 亚洲欧美综合色| 免费成人在线网站| 成人app网站| 欧美一区二区三区婷婷月色| 综合欧美一区二区三区| 蜜臂av日日欢夜夜爽一区| 99这里只有精品| 亚洲精品一区在线观看| 一区av在线播放| 国产69精品久久99不卡| 717成人午夜免费福利电影| 中文字幕制服丝袜一区二区三区| 欧美bbbbb| 欧洲一区在线观看| 国产精品久久久久久久久免费樱桃| 免费成人深夜小野草| 国产·精品毛片| 日韩欧美国产综合在线一区二区三区| 国产精品萝li| 国产高清久久久| 91精品福利在线一区二区三区| 亚洲老妇xxxxxx| 99视频在线观看一区三区| 久久综合九色综合久久久精品综合| 亚洲国产综合人成综合网站| 成人av资源在线| 久久久综合视频| 麻豆极品一区二区三区| 欧美日韩亚洲综合一区二区三区| 中文字幕在线播放不卡一区| 久久er99热精品一区二区| 欧美二区乱c少妇| 亚洲国产中文字幕| 91免费观看在线| 国产精品网站在线| 国产一区不卡视频| 欧美不卡一区二区三区| 男女视频一区二区| 欧美一二三区在线观看| 亚洲大片精品永久免费| 91国偷自产一区二区三区成为亚洲经典 | 欧美日韩三级一区二区| 亚洲资源中文字幕| 在线观看不卡视频| 亚洲免费av观看| 色哟哟国产精品免费观看| 国产精品少妇自拍| 成人av网站在线观看免费| 国产欧美日韩麻豆91| 国产成人在线电影| 久久色中文字幕| 懂色av中文字幕一区二区三区| 久久精品一区二区三区不卡| 国产精品一区二区三区四区| 久久精品男人天堂av| 粉嫩13p一区二区三区| 欧美国产精品久久| 91小宝寻花一区二区三区| 亚洲男人的天堂av| 欧美日本一区二区三区四区| 日本在线播放一区二区三区| 日韩欧美你懂的| 国产激情一区二区三区| 中文一区在线播放| 在线亚洲免费视频| 日本欧美在线观看| 日韩精品一区二区三区在线播放| 国产精品一二三| 亚洲天堂成人网| 欧美精品久久久久久久久老牛影院| 免费在线观看一区二区三区| 久久精品免视看| 91在线视频网址| 性久久久久久久久久久久| 久久综合九色综合欧美就去吻| 成人免费av网站| 亚洲第一激情av| 国产亚洲女人久久久久毛片| 色综合久久88色综合天天免费| 天堂在线亚洲视频| 欧美精品一区二区三区高清aⅴ| 不卡视频在线观看| 亚洲国产精品人人做人人爽| 精品国产免费一区二区三区四区| 国产成人精品午夜视频免费|