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

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

?? manager.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
	sdp_data = g_new0(struct audio_sdp_data, 1);	if (msg)		sdp_data->msg = dbus_message_ref(msg);	sdp_data->device = device;	sdp_data->cb = cb;	sdp_data->cb_data = user_data;	return get_handles(GENERIC_AUDIO_UUID, sdp_data);}struct device *manager_device_connected(bdaddr_t *bda, const char *uuid){	struct device *device;	const char *path;	gboolean headset = FALSE, created = FALSE;	device = manager_find_device(bda, NULL, FALSE);	if (!device) {		device = create_device(bda);		if (!device)			return NULL;		if (!add_device(device, TRUE)) {			destroy_device(device);			return NULL;		}		created = TRUE;	}	if (!strcmp(uuid, HSP_AG_UUID) || !strcmp(uuid, HFP_AG_UUID)) {		if (device->headset)			return device;		device->headset = headset_init(device, NULL, 0);		if (!device->headset)			return NULL;		headset = TRUE;	} else if (!strcmp(uuid, A2DP_SOURCE_UUID)) {		if (device->sink)			return device;		device->sink = sink_init(device);		if (!device->sink)			return NULL;	} else if (!strcmp(uuid, AVRCP_TARGET_UUID)) {		if (device->control)			return device;		device->control = control_init(device);		if (!device->control)			return NULL;	} else		return NULL;	path = device->path;	if (created) {		dbus_connection_emit_signal(connection, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DeviceCreated",						DBUS_TYPE_STRING, &path,						DBUS_TYPE_INVALID);		resolve_services(NULL, device, NULL, NULL);	}	if (headset)		dbus_connection_emit_signal(connection, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"HeadsetCreated",						DBUS_TYPE_STRING, &path,						DBUS_TYPE_INVALID);	if (headset && !default_hs) {		default_hs = device;		dbus_connection_emit_signal(connection, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultHeadsetChanged",						DBUS_TYPE_STRING, &path,						DBUS_TYPE_INVALID);	}	if (!default_dev) {		default_dev = device;		dbus_connection_emit_signal(connection, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultDeviceChanged",						DBUS_TYPE_STRING, &path,						DBUS_TYPE_INVALID);	}	return device;}gboolean manager_create_device(bdaddr_t *bda, create_dev_cb_t cb,				void *user_data){	struct device *dev;	dev = create_device(bda);	if (!dev)		return FALSE;	resolve_services(NULL, dev, cb, user_data);	return TRUE;}static DBusHandlerResult am_create_device(DBusConnection *conn,						DBusMessage *msg,						void *data){	const char *address, *path;	bdaddr_t bda;	struct device *device;	DBusMessage *reply;	DBusError derr;	dbus_error_init(&derr);	dbus_message_get_args(msg, &derr,				DBUS_TYPE_STRING, &address,				DBUS_TYPE_INVALID);	if (dbus_error_is_set(&derr)) {		error_invalid_arguments(connection, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	str2ba(address, &bda);	device = manager_find_device(&bda, NULL, FALSE);	if (!device) {		device = create_device(&bda);		return resolve_services(msg, device, NULL, NULL);	}	path = device->path;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult am_list_devices(DBusConnection *conn,						DBusMessage *msg,						void *data){	DBusMessageIter iter, array_iter;	DBusMessage *reply;	DBusError derr;	GSList *l;	gboolean hs_only = FALSE;	dbus_error_init(&derr);	if (dbus_message_is_method_call(msg, AUDIO_MANAGER_INTERFACE,					"ListHeadsets"))		hs_only = TRUE;	else		hs_only = FALSE;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_iter_init_append(reply, &iter);	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,				DBUS_TYPE_STRING_AS_STRING, &array_iter);	for (l = devices; l != NULL; l = l->next) {		struct device *device = l->data;		if (hs_only && !device->headset)			continue;		dbus_message_iter_append_basic(&array_iter,						DBUS_TYPE_STRING, &device->path);	}	dbus_message_iter_close_container(&iter, &array_iter);	return send_message_and_unref(connection, reply);}static gint device_path_cmp(gconstpointer a, gconstpointer b){	const struct device *device = a;	const char *path = b;	return strcmp(device->path, path);}static DBusHandlerResult am_remove_device(DBusConnection *conn,						DBusMessage *msg,						void *data){	DBusError derr;	DBusMessage *reply;	GSList *match;	const char *path;	struct device *device;	dbus_error_init(&derr);	if (!dbus_message_get_args(msg, &derr,					DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID)) {		error_invalid_arguments(connection, msg, derr.message);		return DBUS_HANDLER_RESULT_HANDLED;	}	if (dbus_error_is_set(&derr)) {		error_invalid_arguments(connection, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	match = g_slist_find_custom(devices, path, device_path_cmp);	if (!match)		return error_device_does_not_exist(connection, msg);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	device = match->data;	device_remove_stored(device);	remove_device(device);	/* Fallback to a valid default */	if (default_dev == NULL) {		const char *param;		GSList *l;		default_dev = manager_find_device(BDADDR_ANY, NULL, TRUE);		if (!default_dev && devices) {			l = devices;			default_dev = (g_slist_last(l))->data;		}		param = default_dev ? default_dev->path : "";		dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultHeadsetChanged",						DBUS_TYPE_STRING, &param,						DBUS_TYPE_INVALID);		dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultDeviceChanged",						DBUS_TYPE_STRING, &param,						DBUS_TYPE_INVALID);		if (default_dev)			device_store(default_dev, TRUE);	}	dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,					AUDIO_MANAGER_INTERFACE,					"HeadsetRemoved",					DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,					AUDIO_MANAGER_INTERFACE,					"DeviceRemoved",					DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(connection, reply);}static DBusHandlerResult am_find_by_addr(DBusConnection *conn,						DBusMessage *msg,						void *data){	const char *address;	DBusMessage *reply;	DBusError derr;	struct device *device;	bdaddr_t bda;	dbus_error_init(&derr);	dbus_message_get_args(msg, &derr,				DBUS_TYPE_STRING, &address,				DBUS_TYPE_INVALID);	if (dbus_error_is_set(&derr)) {		error_invalid_arguments(connection, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	str2ba(address, &bda);	device = manager_find_device(&bda, NULL, FALSE);	if (!device)		return error_device_does_not_exist(conn, msg);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &device->path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult am_default_device(DBusConnection *conn,						DBusMessage *msg,						void *data){	DBusMessage *reply;	if (!default_dev)		return error_device_does_not_exist(connection, msg);	if (default_dev->headset == NULL &&		dbus_message_is_method_call(msg, AUDIO_MANAGER_INTERFACE,							"DefaultHeadset"))		return error_device_does_not_exist(connection, msg);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &default_dev->path,					DBUS_TYPE_INVALID);	return send_message_and_unref(connection, reply);}static DBusHandlerResult am_change_default_device(DBusConnection *conn,							DBusMessage *msg,							void *data){	DBusError derr;	DBusMessage *reply;	GSList *match;	const char *path;	struct device *device;	dbus_error_init(&derr);	if (!dbus_message_get_args(msg, &derr,					DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID)) {		error_invalid_arguments(connection, msg, derr.message);		return DBUS_HANDLER_RESULT_HANDLED;	}	if (dbus_error_is_set(&derr)) {		error_invalid_arguments(connection, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	match = g_slist_find_custom(devices, path, device_path_cmp);	if (!match)		return error_device_does_not_exist(connection, msg);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	device = match->data;	if (!dbus_message_is_method_call(msg, AUDIO_MANAGER_INTERFACE,		"ChangeDefaultHeadset"))		dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultDeviceChanged",						DBUS_TYPE_STRING, &device->path,						DBUS_TYPE_INVALID);	else if (device->headset)		dbus_connection_emit_signal(conn, AUDIO_MANAGER_PATH,						AUDIO_MANAGER_INTERFACE,						"DefaultHeadsetChanged",						DBUS_TYPE_STRING, &device->path,						DBUS_TYPE_INVALID);	else		return error_device_does_not_exist(connection, msg);	default_dev = device;	device_store(device, TRUE);	return send_message_and_unref(connection, reply);}static DBusMethodVTable manager_methods[] = {	{ "CreateDevice",		am_create_device,		"s",	"s"		},	{ "RemoveDevice",		am_remove_device,		"s",	""		},	{ "ListDevices",		am_list_devices,		"",	"as"		},	{ "DefaultDevice",		am_default_device,		"",	"s"		},	{ "ChangeDefaultDevice",	am_change_default_device,		"s",	""		},	{ "CreateHeadset",		am_create_device,		"s",	"s"		},	{ "RemoveHeadset",		am_remove_device,		"s",	""		},	{ "ListHeadsets",		am_list_devices,		"",	"as"		},	{ "FindDeviceByAddress",	am_find_by_addr,		"s",	"s"		},	{ "DefaultHeadset",		am_default_device,		"",	"s"		},	{ "ChangeDefaultHeadset",	am_change_default_device,		"s",	""		},	{ NULL, NULL, NULL, NULL },};static DBusSignalVTable manager_signals[] = {	{ "DeviceCreated",		"s"	},	{ "DeviceRemoved",		"s"	},	{ "HeadsetCreated",		"s"	},	{ "HeadsetRemoved",		"s"	},	{ "DefaultDeviceChanged",	"s"	},	{ "DefaultHeadsetChanged",	"s"	},	{ NULL, NULL }};static void parse_stored_devices(char *key, char *value, void *data){	bdaddr_t *src = data;	struct device *device;	bdaddr_t dst;	if (!key || !value || strcmp(key, "default") == 0)		return;	str2ba(key, &dst);	device = manager_find_device(&dst, NULL, FALSE);	if (device)		return;	info("Loading device %s (%s)", key, value);	device = create_device(&dst);	if (!device)		return;	/* Change storage to source adapter */	bacpy(&device->store, src);	if (enabled.headset && strstr(value, "headset"))		device->headset = headset_init(device, NULL, 0);	if (enabled.sink && strstr(value, "sink"))		device->sink = sink_init(device);	if (enabled.control && strstr(value, "control"))		device->control = control_init(device);	add_device(device, FALSE);}static void register_devices_stored(const char *adapter){	char filename[PATH_MAX + 1];	struct stat st;	struct device *device;	bdaddr_t default_src;	bdaddr_t dst;	bdaddr_t src;	char *addr;	int dev_id;	create_name(filename, PATH_MAX, STORAGEDIR, adapter, "audio");	str2ba(adapter, &src);	if (stat(filename, &st) < 0)		return;	if (!(st.st_mode & __S_IFREG))		return;	textfile_foreach(filename, parse_stored_devices, &src);	bacpy(&default_src, BDADDR_ANY);	dev_id = hci_get_route(&default_src);	if (dev_id < 0 || hci_devba(dev_id, &default_src) < 0)		return;	if (bacmp(&default_src, &src) != 0)		return;	addr = textfile_get(filename, "default");	if (!addr)		return;	str2ba(addr, &dst);	device = manager_find_device(&dst, NULL, FALSE);	if (device) {		info("Setting %s as default device", addr);		default_dev = device;	}	free(addr);}static void register_stored(void){	char dirname[PATH_MAX + 1];	struct dirent *de;	DIR *dir;	snprintf(dirname, PATH_MAX, "%s", STORAGEDIR);	dir = opendir(dirname);	if (!dir)		return;	while ((de = readdir(dir)) != NULL) {		if (!isdigit(de->d_name[0]))			continue;		/* Device objects */		register_devices_stored(de->d_name);	}	closedir(dir);}static void manager_unregister(DBusConnection *conn, void *data){	info("Unregistered manager path");	if (devices) {		g_slist_foreach(devices, (GFunc) remove_device, NULL);		g_slist_free(devices);		devices = NULL;	}}static int hsp_ag_record(sdp_buf_t *buf, uint8_t ch){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;	uuid_t l2cap_uuid, rfcomm_uuid;	sdp_profile_desc_t profile;	sdp_list_t *aproto, *proto[2];	sdp_record_t record;	sdp_data_t *channel;	int ret;	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, HEADSET_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, HEADSET_PROFILE_ID);	profile.version = 0x0100;	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]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "Headset Audio Gateway", 0, 0);	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;}static int hfp_ag_record(sdp_buf_t *buf, uint8_t ch, uint32_t feat){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;	uuid_t l2cap_uuid, rfcomm_uuid;	sdp_profile_desc_t profile;	sdp_list_t *aproto, *proto[2];	sdp_record_t record;	sdp_data_t *channel, *features;	uint8_t netid = 0x01;	uint16_t sdpfeat;	sdp_data_t *network = sdp_data_alloc(SDP_UINT8, &netid);	int ret;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产丝袜视频| 欧美伦理电影网| 中文子幕无线码一区tr| 国产成人综合在线播放| 中文久久乱码一区二区| 99国产精品国产精品毛片| 一区二区高清在线| 精品视频在线免费看| 香蕉影视欧美成人| 欧美精品一区视频| 91一区一区三区| 亚洲一区日韩精品中文字幕| 这里只有精品视频在线观看| 极品销魂美女一区二区三区| 国产精品国产自产拍在线| 欧美性生活久久| 精品一区二区三区香蕉蜜桃| 中国av一区二区三区| 欧美在线视频全部完| 美女网站色91| 亚洲视频一区二区在线观看| 欧美日韩成人高清| 国产成人精品一区二区三区四区 | 日韩一区二区三区电影| 国产99精品国产| 亚洲成人动漫av| 亚洲图片自拍偷拍| 欧美一级免费观看| 成人免费精品视频| 日本不卡一二三区黄网| 欧美激情在线观看视频免费| 欧美午夜精品免费| 国产精品影视在线| 亚洲国产aⅴ天堂久久| 国产午夜三级一区二区三| 在线欧美日韩国产| 国产成人精品综合在线观看 | 欧美国产97人人爽人人喊| 欧美在线观看一区| 国产精品一区二区视频| 午夜视黄欧洲亚洲| 综合激情成人伊人| 久久久久久久电影| 日韩手机在线导航| 欧美午夜影院一区| 成人精品一区二区三区中文字幕| 日韩精品亚洲一区| 亚洲专区一二三| 国产精品超碰97尤物18| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 一区二区三区四区激情| 久久久综合视频| 日韩欧美国产不卡| 欧美三级日本三级少妇99| 成人黄色软件下载| 国产一区二区三区四区五区美女| 日日夜夜精品免费视频| 亚洲人成在线观看一区二区| 国产午夜三级一区二区三| 日韩欧美的一区二区| 911精品产国品一二三产区| 欧美系列在线观看| 91国产成人在线| 色网综合在线观看| 91麻豆精品秘密| 不卡电影免费在线播放一区| 国产乱码精品一区二区三区av| 蜜桃一区二区三区在线| 婷婷中文字幕综合| 图片区小说区区亚洲影院| 亚洲图片自拍偷拍| 成人精品在线视频观看| 国产一区二区看久久| 国产一区二区三区在线观看精品| 麻豆一区二区在线| 久久爱另类一区二区小说| 蜜桃视频在线观看一区| 蜜桃精品视频在线观看| 久久99精品网久久| 国产一区美女在线| 懂色av一区二区夜夜嗨| 成人app软件下载大全免费| 成人毛片老司机大片| 成人av在线影院| 91欧美一区二区| 在线国产电影不卡| 91精品国产手机| 久久综合九色综合欧美亚洲| 久久免费精品国产久精品久久久久| www欧美成人18+| 国产精品久久毛片av大全日韩| 亚洲人123区| 天使萌一区二区三区免费观看| 蜜桃av一区二区在线观看| 国内外成人在线视频| 国产成人自拍网| 色综合久久久久综合体桃花网| 91福利视频在线| 日韩美女在线视频| 欧美激情综合五月色丁香| 亚洲欧美二区三区| 天天av天天翘天天综合网| 国产在线一区二区综合免费视频| 成人一区二区三区| 在线观看欧美黄色| 欧美mv日韩mv国产网站app| 欧美国产禁国产网站cc| 一区二区视频在线| 美女视频网站黄色亚洲| 成人性视频免费网站| 在线免费精品视频| 久久午夜羞羞影院免费观看| 亚洲麻豆国产自偷在线| 日本视频一区二区三区| 国产91清纯白嫩初高中在线观看 | 色综合久久88色综合天天免费| 欧美喷水一区二区| 国产精品色哟哟| 午夜精品福利视频网站| 成人污污视频在线观看| 91.麻豆视频| 中文字幕在线不卡| 精品一区二区在线播放| 精品福利一区二区三区免费视频| 中文字幕高清一区| 日本不卡一区二区三区高清视频| 成人av电影免费观看| 欧美成人在线直播| 亚洲综合免费观看高清完整版在线 | 91麻豆精品国产无毒不卡在线观看 | 蜜臀精品久久久久久蜜臀| 99国产麻豆精品| 精品精品国产高清a毛片牛牛 | 中文字幕一区免费在线观看| 视频一区免费在线观看| 波多野结衣亚洲| 精品国产乱码久久久久久牛牛| 亚洲影视在线观看| a4yy欧美一区二区三区| 精品sm捆绑视频| 日本欧美久久久久免费播放网| 菠萝蜜视频在线观看一区| 精品国产亚洲在线| 日本成人在线视频网站| 欧美影视一区二区三区| 国产精品对白交换视频| 国产一区日韩二区欧美三区| 日韩三级免费观看| 亚洲成人三级小说| 在线观看日韩高清av| **欧美大码日韩| eeuss国产一区二区三区| 国产婷婷色一区二区三区四区 | 国产精品福利电影一区二区三区四区| 蜜桃久久av一区| 日韩一级二级三级| 午夜精品久久久久久不卡8050| 色狠狠av一区二区三区| 亚洲三级在线看| 一本大道久久a久久精品综合| 国产午夜亚洲精品午夜鲁丝片| 国产麻豆视频一区二区| 精品国产露脸精彩对白| 久久国产人妖系列| 久久一日本道色综合| 免费av成人在线| 日韩视频在线永久播放| 美美哒免费高清在线观看视频一区二区| 欧美日韩精品一区二区在线播放| 亚洲国产精品久久不卡毛片 | 亚洲女与黑人做爰| 在线观看精品一区| 亚洲高清三级视频| 91精品国产福利| 久久精品噜噜噜成人88aⅴ| 日韩精品中文字幕一区| 国产毛片精品国产一区二区三区| 久久久久久久久久久久久久久99| 福利视频网站一区二区三区| 国产精品久线在线观看| 91小视频在线观看| 亚洲国产精品视频| 日韩一级免费一区| 国产69精品久久久久777| 亚洲视频每日更新| 777午夜精品视频在线播放| 美女视频一区二区| 欧美激情一区二区三区不卡 | 国产成人高清视频| 综合分类小说区另类春色亚洲小说欧美| 一本色道亚洲精品aⅴ| 亚洲电影你懂得| 精品91自产拍在线观看一区| 成人福利视频在线| 亚洲国产精品影院| 久久久久久久综合日本| 色哟哟亚洲精品| 麻豆精品在线观看| 国产精品成人在线观看| 欧美日韩中文字幕一区二区|