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

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

?? dbus-helper.c

?? 基于LINUX內核驅動的開發
?? C
字號:
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  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 <stdlib.h>#include <string.h>#include <glib.h>#include <dbus/dbus.h>#include "logging.h"#include "dbus-helper.h"struct generic_data {	void *user_data;	DBusObjectPathUnregisterFunction unregister_function;	GSList *interfaces;	char *introspect;};struct interface_data {	char *name;	DBusMethodVTable *methods;	DBusSignalVTable *signals;	DBusPropertyVTable *properties;};DBusHandlerResult dbus_connection_send_and_unref(DBusConnection *connection,							DBusMessage *message){	if (message) {		dbus_connection_send(connection, message, NULL);		dbus_message_unref(message);	}	return DBUS_HANDLER_RESULT_HANDLED;}static void print_arguments(GString *gstr, const char *sig, const char *direction){	int i;	for (i = 0; sig[i]; i++) {		char type[32];		int len, struct_level, dict_level;		gboolean complete;		complete = FALSE;		struct_level = dict_level = 0;		memset(type, 0, sizeof(type));		/* Gather enough data to have a single complete type */		for (len = 0; len < (sizeof(type) - 1) && sig[i]; len++, i++) {			switch (sig[i]){			case '(':				struct_level++;				break;			case ')':				struct_level--;				if (struct_level <= 0 && dict_level <= 0)					complete = TRUE;				break;			case '{':				dict_level++;				break;			case '}':				dict_level--;				if (struct_level <= 0 && dict_level <= 0)					complete = TRUE;				break;			case 'a':				break;			default:				if (struct_level <= 0 && dict_level <= 0)					complete = TRUE;				break;			}			type[len] = sig[i];			if (complete)				break;		}		if (direction)			g_string_append_printf(gstr,					"\t\t\t<arg type=\"%s\" direction=\"%s\"/>\n",					type, direction);		else			g_string_append_printf(gstr,					"\t\t\t<arg type=\"%s\"/>\n",					type);	}}static void generate_introspection_xml(DBusConnection *conn,					struct generic_data *data,					const char *path){	GSList *list;	GString *gstr;	char **children;	int i;	g_free(data->introspect);	gstr = g_string_new(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);	g_string_append_printf(gstr, "<node name=\"%s\">\n", path);	for (list = data->interfaces; list; list = list->next) {		struct interface_data *iface = list->data;		DBusMethodVTable *method;		DBusSignalVTable *signal;		DBusPropertyVTable *property;		g_string_append_printf(gstr, "\t<interface name=\"%s\">\n", iface->name);		for (method = iface->methods; method && method->name; method++) {			/* debug("%s: adding method %s.%s",					path, iface->name, method->name); */			if (!strlen(method->signature) && !strlen(method->reply))				g_string_append_printf(gstr, "\t\t<method name=\"%s\"/>\n",							method->name);			else {				g_string_append_printf(gstr, "\t\t<method name=\"%s\">\n",							method->name);				print_arguments(gstr, method->signature, "in");				print_arguments(gstr, method->reply, "out");				g_string_append_printf(gstr, "\t\t</method>\n");			}		}		for (signal = iface->signals; signal && signal->name; signal++) {			/* debug("%s: adding signal %s.%s",					path, iface->name, signal->name); */			if (!strlen(signal->signature))				g_string_append_printf(gstr, "\t\t<signal name=\"%s\"/>\n",							signal->name);			else {				g_string_append_printf(gstr, "\t\t<signal name=\"%s\">\n",							signal->name);				print_arguments(gstr, signal->signature, NULL);				g_string_append_printf(gstr, "\t\t</signal>\n");			}		}		for (property = iface->properties; property && property->name; property++) {			debug("%s: adding property %s.%s",					path, iface->name, property->name);		}		g_string_append_printf(gstr, "\t</interface>\n");	}	if (!dbus_connection_list_registered(conn, path, &children))		goto done;	for (i = 0; children[i]; i++)		g_string_append_printf(gstr, "\t<node name=\"%s\"/>\n", children[i]);	dbus_free_string_array(children);done:	g_string_append_printf(gstr, "</node>\n");	data->introspect = g_string_free(gstr, FALSE);}static DBusHandlerResult introspect(DBusConnection *connection,				DBusMessage *message, struct generic_data *data){	DBusMessage *reply;	if (!dbus_message_has_signature(message, DBUS_TYPE_INVALID_AS_STRING)) {		error("Unexpected signature to introspect call");		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	}	if (!data->introspect)		generate_introspection_xml(connection, data,						dbus_message_get_path(message));	reply = dbus_message_new_method_return(message);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &data->introspect,					DBUS_TYPE_INVALID);	return dbus_connection_send_and_unref(connection, reply);}static void generic_unregister(DBusConnection *connection, void *user_data){	struct generic_data *data = user_data;	if (data->unregister_function)		data->unregister_function(connection, data->user_data);	g_free(data->introspect);	g_free(data);}static struct interface_data *find_interface(GSList *interfaces,						const char *name){	GSList *list;	for (list = interfaces; list; list = list->next) {		struct interface_data *iface = list->data;		if (!strcmp(name, iface->name))			return iface;	}	return NULL;}static DBusHandlerResult generic_message(DBusConnection *connection,					DBusMessage *message, void *user_data){	struct generic_data *data = user_data;	struct interface_data *iface;	DBusMethodVTable *current;	const char *interface;	if (dbus_message_is_method_call(message,					DBUS_INTERFACE_INTROSPECTABLE,					"Introspect"))		return introspect(connection, message, data);	interface = dbus_message_get_interface(message);	iface = find_interface(data->interfaces, interface);	if (!iface)		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	for (current = iface->methods;			current->name && current->message_function; current++) {		if (!dbus_message_is_method_call(message, iface->name,							current->name))			continue;		if (dbus_message_has_signature(message, current->signature)) {			debug("%s: %s.%s()", dbus_message_get_path(message),					iface->name, current->name);			return current->message_function(connection,						message, data->user_data);		}	}	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;}static DBusObjectPathVTable generic_table = {	.unregister_function	= generic_unregister,	.message_function	= generic_message,};static void invalidate_parent_data(DBusConnection *conn, const char *child_path){	struct generic_data *data = NULL;	char *parent_path, *slash;	parent_path = g_strdup(child_path);	slash = strrchr(parent_path, '/');	if (!slash)		goto done;	*slash = '\0';	if (!strlen(parent_path))		goto done;	if (!dbus_connection_get_object_path_data(conn, parent_path,							(void *) &data))		goto done;	if (!data)		goto done;	g_free(data->introspect);	data->introspect = NULL;done:	g_free(parent_path);}dbus_bool_t dbus_connection_create_object_path(DBusConnection *connection,					const char *path, void *user_data,					DBusObjectPathUnregisterFunction function){	struct generic_data *data;	data = g_new0(struct generic_data, 1);	data->user_data = user_data;	data->unregister_function = function;	data->introspect = g_strdup(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<node></node>");	if (!dbus_connection_register_object_path(connection, path,						&generic_table, data)) {		g_free(data->introspect);		g_free(data);		return FALSE;	}	invalidate_parent_data(connection, path);	return TRUE;}dbus_bool_t dbus_connection_destroy_object_path(DBusConnection *connection,							const char *path){	invalidate_parent_data(connection, path);	return dbus_connection_unregister_object_path(connection, path);}dbus_bool_t dbus_connection_get_object_user_data(DBusConnection *connection,							const char *path,							void **data_p){	struct generic_data *data = NULL;	if (!dbus_connection_get_object_path_data(connection, path,						(void *) &data) || !data)		return FALSE;	*data_p = data->user_data;	return TRUE;}dbus_bool_t dbus_connection_register_interface(DBusConnection *connection,					const char *path, const char *name,					DBusMethodVTable *methods,					DBusSignalVTable *signals,					DBusPropertyVTable *properties){	struct generic_data *data = NULL;	struct interface_data *iface;	if (!dbus_connection_get_object_path_data(connection, path,						(void *) &data) || !data)		return FALSE;	if (find_interface(data->interfaces, name))		return FALSE;	iface = g_new0(struct interface_data, 1);	iface->name = g_strdup(name);	iface->methods = methods;	iface->signals = signals;	iface->properties = properties;	data->interfaces = g_slist_append(data->interfaces, iface);	g_free(data->introspect);	data->introspect = NULL;	return TRUE;}dbus_bool_t dbus_connection_unregister_interface(DBusConnection *connection,					const char *path, const char *name){	struct generic_data *data = NULL;	struct interface_data *iface;	if (!dbus_connection_get_object_path_data(connection, path,						(void *) &data) || !data)		return FALSE;	iface = find_interface(data->interfaces, name);	if (!iface)		return FALSE;	data->interfaces = g_slist_remove(data->interfaces, iface);	g_free(iface->name);	g_free(iface);	g_free(data->introspect);	data->introspect = NULL;	return TRUE;}void dbus_message_iter_append_dict_entry(DBusMessageIter *dict,					const char *key, int type, void *val){	DBusMessageIter entry;	DBusMessageIter value;	char *sig;	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry);	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);	switch (type) {	case DBUS_TYPE_STRING:		sig = DBUS_TYPE_STRING_AS_STRING;		break;	case DBUS_TYPE_BYTE:		sig = DBUS_TYPE_BYTE_AS_STRING;		break;	case DBUS_TYPE_INT16:		sig = DBUS_TYPE_INT16_AS_STRING;		break;	case DBUS_TYPE_UINT32:		sig = DBUS_TYPE_UINT32_AS_STRING;		break;	case DBUS_TYPE_BOOLEAN:		sig = DBUS_TYPE_BOOLEAN_AS_STRING;		break;	default:		sig = DBUS_TYPE_VARIANT_AS_STRING;		break;	}	dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, sig, &value);	dbus_message_iter_append_basic(&value, type, val);	dbus_message_iter_close_container(&entry, &value);	dbus_message_iter_close_container(dict, &entry);}dbus_bool_t dbus_connection_emit_signal_valist(DBusConnection *conn,						const char *path,						const char *interface,						const char *name,						int first,						va_list var_args){	struct generic_data *data = NULL;	struct interface_data *iface;	DBusSignalVTable *sig_data;	DBusMessage *signal;	dbus_bool_t ret;	const char *signature, *args = NULL;	if (!dbus_connection_get_object_path_data(conn, path,					(void *) &data) || !data) {		error("dbus_connection_emit_signal: path %s isn't registered",				path);		return FALSE;	}	iface = find_interface(data->interfaces, interface);	if (!iface) {		error("dbus_connection_emit_signal: %s does not implement %s",				path, interface);		return FALSE;	}	for (sig_data = iface->signals; sig_data && sig_data->name; sig_data++) {		if (!strcmp(sig_data->name, name)) {			args = sig_data->signature;			break;		}	}	if (!args) {		error("No signal named %s on interface %s", name, interface);		return FALSE;	}	signal = dbus_message_new_signal(path, interface, name);	if (!signal) {		error("Unable to allocate new %s.%s signal", interface,  name);		return FALSE;	}	ret = dbus_message_append_args_valist(signal, first, var_args);	if (!ret)		goto fail;	signature = dbus_message_get_signature(signal);	if (strcmp(args, signature) != 0) {		error("%s.%s: expected signature'%s' but got '%s'",				interface, name, args, signature);		ret = FALSE;		goto fail;	}	ret = dbus_connection_send(conn, signal, NULL);fail:	dbus_message_unref(signal);	return ret;}dbus_bool_t dbus_connection_emit_signal(DBusConnection *conn, const char *path,					const char *interface, const char *name,					int first, ...){	dbus_bool_t ret;	va_list var_args;	va_start(var_args, first);	ret = dbus_connection_emit_signal_valist(conn, path, interface, name,							first, var_args);	va_end(var_args);	return ret;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女主播在线一区二区| 亚洲特黄一级片| 色婷婷精品久久二区二区蜜臂av| 亚洲午夜久久久久中文字幕久| 日韩精品一区国产麻豆| av网站免费线看精品| 久久黄色级2电影| 玉米视频成人免费看| 久久久久亚洲蜜桃| 欧美精品v国产精品v日韩精品| 国产成人免费9x9x人网站视频| 亚洲国产成人精品视频| 国产精品私房写真福利视频| 欧美成va人片在线观看| 欧洲精品一区二区三区在线观看| 国产一区二区0| 蜜桃一区二区三区在线观看| 亚洲一区免费视频| 亚洲国产激情av| 精品黑人一区二区三区久久| 欧美性大战xxxxx久久久| 不卡在线视频中文字幕| 国产精品自拍毛片| 麻豆国产精品官网| 日韩国产欧美在线观看| 亚洲免费在线播放| 国产精品视频观看| 国产欧美一区视频| 国产人成一区二区三区影院| 日韩欧美国产不卡| 欧美成人精品福利| 日韩亚洲欧美成人一区| 555www色欧美视频| 欧美性色aⅴ视频一区日韩精品| 99天天综合性| 91丨九色porny丨蝌蚪| 成人动漫视频在线| 成人av在线一区二区| www.在线欧美| 91美女片黄在线观看91美女| 成人一区二区三区在线观看 | 亚洲丝袜精品丝袜在线| 中文字幕免费在线观看视频一区| 久久香蕉国产线看观看99| 日韩欧美国产一区二区三区| 精品蜜桃在线看| 久久婷婷久久一区二区三区| 久久久久久久久久久久电影| 久久嫩草精品久久久精品| 久久久综合激的五月天| 日本一区二区成人在线| 国产日韩欧美a| 中文字幕在线一区免费| 亚洲免费观看在线观看| 悠悠色在线精品| 亚洲成人免费在线| 免费人成网站在线观看欧美高清| 麻豆精品一二三| 国产成人在线观看免费网站| 成人高清视频在线| 色视频欧美一区二区三区| 色噜噜夜夜夜综合网| 欧美天堂一区二区三区| 7777精品伊人久久久大香线蕉完整版| 欧美日韩免费观看一区二区三区 | 911精品国产一区二区在线| 制服丝袜亚洲色图| 日韩片之四级片| 久久九九全国免费| 国产精品国产三级国产有无不卡| 一区二区欧美视频| 理论片日本一区| 成人白浆超碰人人人人| 欧美午夜精品一区| 日韩欧美123| 亚洲国产精品精华液ab| 亚洲国产日韩在线一区模特| 精品一区二区在线视频| 99精品视频在线免费观看| 在线播放中文一区| 日韩一区二区电影网| 国产日产欧美一区二区视频| 亚洲自拍偷拍av| 国产精品99久久久久| 欧美性猛交xxxx黑人交| 久久精品综合网| 性做久久久久久久免费看| 国产一区二区三区香蕉| 在线观看日韩精品| 2024国产精品| 亚洲成人av在线电影| 国产精品一区二区免费不卡| 欧美三区在线观看| 国产精品久久久久9999吃药| 日本不卡123| 在线看不卡av| 国产午夜亚洲精品不卡| 亚洲一区二区中文在线| 国产成人无遮挡在线视频| 欧美美女一区二区| 亚洲丝袜精品丝袜在线| 九九国产精品视频| 91国偷自产一区二区使用方法| 久久综合视频网| 日韩和的一区二区| 色悠悠亚洲一区二区| 久久久久高清精品| 蜜臀久久久99精品久久久久久| 色综合av在线| 国产精品成人一区二区艾草| 经典三级一区二区| 欧美一区三区二区| 亚洲国产精品人人做人人爽| a4yy欧美一区二区三区| 久久综合网色—综合色88| 秋霞影院一区二区| 欧美亚洲一区二区在线观看| 中文字幕亚洲视频| 国产精品 欧美精品| 日韩精品一区二区三区在线播放 | 国产99久久久国产精品免费看| 在线综合视频播放| 一个色综合av| 91丨九色丨蝌蚪富婆spa| 中国av一区二区三区| 国产成人一级电影| 欧美激情一区二区在线| 国产福利精品一区二区| 久久综合狠狠综合久久综合88| 青草国产精品久久久久久| 制服丝袜成人动漫| 丝袜a∨在线一区二区三区不卡| 在线免费观看成人短视频| 亚洲欧美另类综合偷拍| 一本到三区不卡视频| 国产精品乱码久久久久久| 成av人片一区二区| 亚洲欧美怡红院| 97aⅴ精品视频一二三区| 成人免费一区二区三区视频| 99久久免费国产| 综合电影一区二区三区 | 精品粉嫩超白一线天av| 久久国产精品区| 久久九九久久九九| 成人免费黄色在线| 亚洲人成小说网站色在线| 色偷偷成人一区二区三区91 | 久久久99精品免费观看不卡| 国产一区二区三区国产| 中文字幕免费不卡| 91国在线观看| 日韩国产欧美一区二区三区| 精品裸体舞一区二区三区| 国产一区亚洲一区| 中文字幕av一区二区三区高| 成人高清视频免费观看| 亚洲精品视频在线观看网站| 欧美日韩一卡二卡三卡| 久久国产精品99精品国产| 国产亚洲一二三区| 91一区二区在线| 日韩av一级电影| 久久久国产午夜精品 | 91网站在线播放| 天天综合天天综合色| 久久综合九色综合久久久精品综合| 国产大片一区二区| 亚洲激情男女视频| 日韩丝袜美女视频| 福利电影一区二区三区| 亚洲自拍欧美精品| 久久午夜老司机| 在线欧美小视频| 精品中文字幕一区二区小辣椒| 中文字幕一区在线观看视频| 7777精品伊人久久久大香线蕉超级流畅| 蜜臀va亚洲va欧美va天堂| 国产精品妹子av| 欧美一区二区啪啪| 99视频精品在线| 精品系列免费在线观看| 亚洲激情欧美激情| 久久亚洲二区三区| 欧美日韩高清一区| 国产馆精品极品| 亚洲国产精品精华液网站| 国产拍揄自揄精品视频麻豆| 欧美日免费三级在线| 波多野结衣欧美| 麻豆视频观看网址久久| 亚洲曰韩产成在线| 欧美激情在线看| 精品日韩一区二区| 欧美日韩五月天| 色婷婷综合久色| 国v精品久久久网| 极品少妇xxxx精品少妇偷拍| 亚洲最新视频在线播放| 久久久久高清精品|