本文整理汇总了C++中dbus_message_iter_close_container函数的典型用法代码示例。如果您正苦于以下问题:C++ dbus_message_iter_close_container函数的具体用法?C++ dbus_message_iter_close_container怎么用?C++ dbus_message_iter_close_container使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dbus_message_iter_close_container函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: to_dbus_iter_from_dict
static void to_dbus_iter_from_dict(DBusMessageIter* parent_it, const EdbusData& data) {
E_ASSERT(data.is_dict());
EdbusDict dict = data.to_dict();
/* TODO: allow empty containers ??? */
if(dict.size() < 1)
return;
/*
* TODO: check signature size in DBus spec (or use edelib::String here)
*
* Also, this part needs a better code, especially in case when value signature
* is needed. Value can be another dict, struct or array of dicts, struct, variants
* and etc. so I need better singature builder.
*/
char sig[256];
const char* key_sig = from_edbusdata_type_to_dbus_type_string(dict.key_type());
//const char* value_sig = from_edbusdata_type_to_dbus_type_string(dict.value_type());
#if 0
const char* value_sig;
if(dict.value_type() == EDBUS_TYPE_DICT)
value_sig = "a{ss}";
else
value_sig = from_edbusdata_type_to_dbus_type_string(dict.value_type());
#endif
const char* value_sig;
String ss;
if(dict.value_type_is_container()) {
/*
* We already have correct header that represents dict array. Now
* go and recurse into dict value container
*/
EdbusDict::const_iterator first = dict.begin();
build_signature((*first).value, ss);
value_sig = ss.c_str();
} else
value_sig = from_edbusdata_type_to_dbus_type_string(dict.value_type());
/*
* Dicts are serialized as array of dict entries. We first build signature for array
* elements, then iterate over EdbusDict entries and from key/value pairs construct a
* DBus dict entry then append that entry to the array
*
* A signature for dictionary will be 'a{TYPE TYPE}'. dbus_message_iter_open_container() will
* append 'a' to the signature.
*/
snprintf(sig, sizeof(sig), "%c%s%s%c",
DBUS_DICT_ENTRY_BEGIN_CHAR,
key_sig,
value_sig,
DBUS_DICT_ENTRY_END_CHAR);
/* printf("Dict entry signature: %s\n", sig); */
DBusMessageIter sub;
dbus_message_iter_open_container(parent_it, DBUS_TYPE_ARRAY, sig, &sub);
EdbusDict::const_iterator it = dict.begin(), it_end = dict.end();
for(; it != it_end; ++it) {
DBusMessageIter dict_entry_iter;
dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, 0, &dict_entry_iter);
/*
* append key; it is always basic type
* TODO: here should be assertion check
*/
to_dbus_iter_from_basic_type(&dict_entry_iter, (*it).key);
/* append value, can be any type */
to_dbus_iter_from_edbusdata_type(&dict_entry_iter, (*it).value);
dbus_message_iter_close_container(&sub, &dict_entry_iter);
}
dbus_message_iter_close_container(parent_it, &sub);
}
开发者ID:edeproject,项目名称:edelib,代码行数:81,代码来源:EdbusMessage.cpp
示例2: _dbus_asv_close
/**
* Closes an a{sv} after successfully appending all values.
*
* If this function fails, you must abandon iter and whatever
* larger data structure (message, etc.) the a{sv} was embedded in.
*
* @param iter the iterator which is appending to the message or other data structure containing the a{sv}
* @param arr_iter the iterator appending to the array, will be closed
* @returns #TRUE on success, or #FALSE if not enough memory
*/
dbus_bool_t
_dbus_asv_close (DBusMessageIter *iter,
DBusMessageIter *arr_iter)
{
return dbus_message_iter_close_container (iter, arr_iter);
}
开发者ID:TaoheGit,项目名称:hmi_sdl_android,代码行数:16,代码来源:dbus-asv-util.c
示例3: umask
bool CHALManager::Mount(CStorageDevice *volume, CStdString mountpath)
{
CLog::Log(LOGNOTICE, "HAL: Mounting %s (%s) at %s with umask=%u", volume->UDI.c_str(), volume->toString().c_str(), mountpath.c_str(), umask (0));
DBusMessage* msg;
DBusMessageIter args;
DBusError error;
dbus_error_init (&error);
DBusConnection *connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
const char *s;
if (connection)
{
msg = dbus_message_new_method_call("org.freedesktop.Hal", volume->UDI.c_str(), "org.freedesktop.Hal.Device.Volume", "Mount");
dbus_message_iter_init_append(msg, &args);
s = mountpath.c_str();
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &s))
CLog::Log(LOGERROR, "DBus: Failed to append arguments");
s = ""; //FileSystem
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &s))
CLog::Log(LOGERROR, "DBus: Failed to append arguments");
DBusMessageIter sub;
dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &sub);
CStdString temporaryString;
if (volume->FileSystem.Equals("vfat"))
{
int mask = umask (0);
temporaryString.Format("umask=%#o", mask);
s = temporaryString.c_str();
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
temporaryString.Format("uid=%u", getuid());
s = temporaryString.c_str();
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
s = "shortname=mixed";
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
s = "utf8";
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
// 'sync' option will slow down transfer speed significantly for FAT filesystems. We prefer 'flush' instead.
s = "flush";
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
}
else
{
s = "sync";
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s);
}
dbus_message_iter_close_container(&args, &sub);
if (msg == NULL)
CLog::Log(LOGERROR, "DBus: Create Mount Message failed");
else
{
DBusMessage *reply;
reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, &error); //The reply timout might be bad to have as -1
if (dbus_error_is_set(&error))
{
CLog::Log(LOGERROR, "DBus: %s - %s", error.name, error.message);
dbus_error_free(&error);
return false;
}
// Need to create a reader for the Message
dbus_message_unref (reply);
dbus_message_unref(msg);
msg = NULL;
}
volume->Mounted = true;
volume->MountedByXBMC = true;
volume->MountPoint = mountpath;
dbus_connection_unref(connection);
connection = NULL;
return true;
}
else
{
CLog::Log(LOGERROR, "DBus: Failed to connect to Systembus");
dbus_error_free(&error);
return false;
}
}
开发者ID:Ayu222,项目名称:android,代码行数:81,代码来源:HALManager.cpp
示例4: g_dbus_proxy_set_property_basic
gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
const char *name, int type, const void *value,
GDBusResultFunction function, void *user_data,
GDBusDestroyFunction destroy)
{
struct set_property_data *data;
GDBusClient *client;
DBusMessage *msg;
DBusMessageIter iter, variant;
DBusPendingCall *call;
char type_as_str[2];
if (proxy == NULL || name == NULL || value == NULL)
return FALSE;
if (dbus_type_is_basic(type) == FALSE)
return FALSE;
client = proxy->client;
if (client == NULL)
return FALSE;
data = g_try_new0(struct set_property_data, 1);
if (data == NULL)
return FALSE;
data->function = function;
data->user_data = user_data;
data->destroy = destroy;
msg = dbus_message_new_method_call(client->service_name,
proxy->obj_path, DBUS_INTERFACE_PROPERTIES, "Set");
if (msg == NULL) {
g_free(data);
return FALSE;
}
type_as_str[0] = (char) type;
type_as_str[1] = '\0';
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
&proxy->interface);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
type_as_str, &variant);
dbus_message_iter_append_basic(&variant, type, value);
dbus_message_iter_close_container(&iter, &variant);
if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, -1) == FALSE) {
dbus_message_unref(msg);
g_free(data);
return FALSE;
}
dbus_pending_call_set_notify(call, set_property_reply, data, g_free);
dbus_pending_call_unref(call);
dbus_message_unref(msg);
return TRUE;
}
开发者ID:AwxiVYTHUIiMOol,项目名称:bluez,代码行数:64,代码来源:client.c
示例5: PropertiesChangedSignal
/**
* PropertiesChangedSignal() synthetizes and sends the
* org.freedesktop.DBus.Properties.PropertiesChanged signal
*/
static DBusHandlerResult
PropertiesChangedSignal( intf_thread_t *p_intf,
vlc_dictionary_t *p_changed_properties )
{
DBusConnection *p_conn = p_intf->p_sys->p_conn;
DBusMessageIter changed_properties, invalidated_properties, entry, variant;
const char *psz_interface_name = DBUS_MPRIS_PLAYER_INTERFACE;
char **ppsz_properties = NULL;
int i_properties = 0;
SIGNAL_INIT( DBUS_INTERFACE_PROPERTIES,
DBUS_MPRIS_OBJECT_PATH,
"PropertiesChanged" );
OUT_ARGUMENTS;
ADD_STRING( &psz_interface_name );
dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "{sv}",
&changed_properties );
i_properties = vlc_dictionary_keys_count( p_changed_properties );
ppsz_properties = vlc_dictionary_all_keys( p_changed_properties );
for( int i = 0; i < i_properties; i++ )
{
dbus_message_iter_open_container( &changed_properties,
DBUS_TYPE_DICT_ENTRY, NULL,
&entry );
dbus_message_iter_append_basic( &entry, DBUS_TYPE_STRING,
&ppsz_properties[i] );
if( !strcmp( ppsz_properties[i], "Metadata" ) )
{
input_thread_t *p_input;
p_input = playlist_CurrentInput( p_intf->p_sys->p_playlist );
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "a{sv}",
&variant );
if( p_input )
{
input_item_t *p_item = input_GetItem( p_input );
GetInputMeta( p_item, &variant );
vlc_object_release( p_input );
}
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "PlaybackStatus" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "s",
&variant );
MarshalPlaybackStatus( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "LoopStatus" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "s",
&variant );
MarshalLoopStatus( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "Rate" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "d",
&variant );
MarshalRate( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "Shuffle" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "b",
&variant );
MarshalShuffle( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "Volume" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "d",
&variant );
MarshalVolume( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
}
else if( !strcmp( ppsz_properties[i], "CanSeek" ) )
{
dbus_message_iter_open_container( &entry,
DBUS_TYPE_VARIANT, "b",
&variant );
MarshalCanSeek( p_intf, &variant );
dbus_message_iter_close_container( &entry, &variant );
//.........这里部分代码省略.........
开发者ID:eduardovra,项目名称:vlc,代码行数:101,代码来源:dbus_player.c
示例6: showNotify
virtual int showNotify(const char *pcHeader, const char *pcBody)
{
int rc;
# ifdef VBOX_WITH_DBUS
DBusConnection *conn;
DBusMessage* msg = NULL;
conn = dbus_bus_get (DBUS_BUS_SESSON, NULL);
if (conn == NULL)
{
LogRelFlowFunc(("Could not retrieve D-BUS session bus!\n"));
rc = VERR_INVALID_HANDLE;
}
else
{
msg = dbus_message_new_method_call("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications",
"Notify");
if (msg == NULL)
{
LogRel(("Could not create D-BUS message!\n"));
rc = VERR_INVALID_HANDLE;
}
else
rc = VINF_SUCCESS;
}
if (RT_SUCCESS(rc))
{
uint32_t msg_replace_id = 0;
const char *msg_app = "VBoxClient";
const char *msg_icon = "";
const char *msg_summary = pcHeader;
const char *msg_body = pcBody;
int32_t msg_timeout = -1; /* Let the notification server decide */
DBusMessageIter iter;
DBusMessageIter array;
DBusMessageIter dict;
DBusMessageIter value;
DBusMessageIter variant;
DBusMessageIter data;
/* Format: UINT32 org.freedesktop.Notifications.Notify
* (STRING app_name, UINT32 replaces_id, STRING app_icon, STRING summary, STRING body,
* ARRAY actions, DICT hints, INT32 expire_timeout)
*/
dbus_message_iter_init_append(msg,&iter);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_app);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_UINT32,&msg_replace_id);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_icon);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_summary);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_body);
dbus_message_iter_open_container(&iter,DBUS_TYPE_ARRAY,DBUS_TYPE_STRING_AS_STRING,&array);
dbus_message_iter_close_container(&iter,&array);
dbus_message_iter_open_container(&iter,DBUS_TYPE_ARRAY,"{sv}",&array);
dbus_message_iter_close_container(&iter,&array);
dbus_message_iter_append_basic(&iter,DBUS_TYPE_INT32,&msg_timeout);
DBusError err;
dbus_error_init(&err);
DBusMessage *reply;
reply = dbus_connection_send_with_reply_and_block(conn, msg,
30 * 1000 /* 30 seconds timeout */, &err);
if (dbus_error_is_set(&err))
{
LogRel(("D-BUS returned an error while sending the notification: %s", err.message));
}
else if (reply)
{
dbus_connection_flush(conn);
dbus_message_unref(reply);
}
if (dbus_error_is_set(&err))
dbus_error_free(&err);
}
if (msg != NULL)
dbus_message_unref(msg);
# else
/* TODO: Implement me */
rc = VINF_SUCCESS;
# endif /* VBOX_WITH_DBUS */
return rc;
}
开发者ID:MadHacker217,项目名称:VirtualBox-OSE,代码行数:84,代码来源:hostversion.cpp
示例7: VIR_MOCK_WRAP_RET_ARGS
VIR_MOCK_WRAP_RET_ARGS(dbus_connection_send_with_reply_and_block,
DBusMessage *,
DBusConnection *, connection,
DBusMessage *, message,
int, timeout_milliseconds,
DBusError *, error)
{
DBusMessage *reply = NULL;
const char *service = dbus_message_get_destination(message);
const char *member = dbus_message_get_member(message);
size_t i;
size_t nargs = 0;
char **args = NULL;
char *type = NULL;
VIR_MOCK_REAL_INIT(dbus_connection_send_with_reply_and_block);
if (STREQ(service, "org.freedesktop.DBus") &&
STREQ(member, "ListNames")) {
const char *svc1 = "org.foo.bar.wizz";
const char *svc2 = VIR_FIREWALL_FIREWALLD_SERVICE;
DBusMessageIter iter;
DBusMessageIter sub;
reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
"s", &sub);
if (!dbus_message_iter_append_basic(&sub,
DBUS_TYPE_STRING,
&svc1))
goto error;
if (!fwDisabled &&
!dbus_message_iter_append_basic(&sub,
DBUS_TYPE_STRING,
&svc2))
goto error;
dbus_message_iter_close_container(&iter, &sub);
} else if (STREQ(service, VIR_FIREWALL_FIREWALLD_SERVICE) &&
STREQ(member, "passthrough")) {
bool isAdd = false;
bool doError = false;
if (virDBusMessageDecode(message,
"sa&s",
&type,
&nargs,
&args) < 0)
goto error;
for (i = 0; i < nargs; i++) {
/* Fake failure on the command with this IP addr */
if (STREQ(args[i], "-A")) {
isAdd = true;
} else if (isAdd && STREQ(args[i], "192.168.122.255")) {
doError = true;
}
}
if (fwBuf) {
if (STREQ(type, "ipv4"))
virBufferAddLit(fwBuf, IPTABLES_PATH);
else if (STREQ(type, "ipv4"))
virBufferAddLit(fwBuf, IP6TABLES_PATH);
else
virBufferAddLit(fwBuf, EBTABLES_PATH);
}
for (i = 0; i < nargs; i++) {
if (fwBuf) {
virBufferAddLit(fwBuf, " ");
virBufferEscapeShell(fwBuf, args[i]);
}
}
if (fwBuf)
virBufferAddLit(fwBuf, "\n");
if (doError) {
dbus_set_error_const(error,
"org.firewalld.error",
"something bad happened");
} else {
if (nargs == 1 &&
STREQ(type, "ipv4") &&
STREQ(args[0], "-L")) {
if (virDBusCreateReply(&reply,
"s", TEST_FILTER_TABLE_LIST) < 0)
goto error;
} else if (nargs == 3 &&
STREQ(type, "ipv4") &&
STREQ(args[0], "-t") &&
STREQ(args[1], "nat") &&
STREQ(args[2], "-L")) {
if (virDBusCreateReply(&reply,
"s", TEST_NAT_TABLE_LIST) < 0)
goto error;
} else {
if (virDBusCreateReply(&reply,
"s", "success") < 0)
goto error;
}
}
//.........这里部分代码省略.........
开发者ID:Archer-sys,项目名称:libvirt,代码行数:101,代码来源:virfirewalltest.c
示例8: session_ck_open_session
static char *
session_ck_open_session (DBusConnection *connection,
const char *username,
int display)
{
DBusError error;
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusMessageIter iter_array;
dbus_bool_t res;
char *ret;
char *cookie;
dbus_bool_t is_local = FALSE;
dbus_bool_t active = TRUE;
int uid;
char display_str[256];
const char *x11_display = display_str;
const char *session_type = "rdp";
reply = NULL;
message = NULL;
ret = NULL;
g_sprintf(display_str, ":%d", display);
if (g_getuser_info(username, 0, &uid, 0, 0, 0))
goto out;
message =
dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
"org.freedesktop.ConsoleKit.Manager",
"OpenSessionWithParameters");
if (message == NULL) {
goto out;
}
dbus_message_iter_init_append (message, &iter);
if (! dbus_message_iter_open_container (&iter,
DBUS_TYPE_ARRAY,
"(sv)",
&iter_array)) {
goto out;
}
if (!add_param_basic (&iter_array,
"unix-user",
DBUS_TYPE_INT32,
&uid) ||
!add_param_basic (&iter_array,
"x11-display",
DBUS_TYPE_STRING,
&x11_display) ||
!add_param_basic (&iter_array,
"is-local",
DBUS_TYPE_BOOLEAN,
&is_local) ||
!add_param_basic (&iter_array,
"active",
DBUS_TYPE_BOOLEAN,
&active) ||
!add_param_basic (&iter_array,
"session-type",
DBUS_TYPE_STRING,
&session_type)) {
log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,
"Error adding ck session parameter");
goto out;
}
if (! dbus_message_iter_close_container (&iter, &iter_array)) {
goto out;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection,
message,
-1,
&error);
if (reply == NULL) {
if (dbus_error_is_set (&error)) {
log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,
"Unable to open session: %s",
error.message);
dbus_error_free (&error);
goto out;
}
}
dbus_error_init (&error);
if (! dbus_message_get_args (reply,
&error,
DBUS_TYPE_STRING, &cookie,
DBUS_TYPE_INVALID)) {
if (dbus_error_is_set (&error)) {
log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,
"Unable to open session: %s",
error.message);
dbus_error_free (&error);
//.........这里部分代码省略.........
开发者ID:zeha,项目名称:xrdp-suse-fork,代码行数:101,代码来源:session.c
示例9: bus_driver_handle_list_services
static dbus_bool_t
bus_driver_handle_list_services (DBusConnection *connection,
BusTransaction *transaction,
DBusMessage *message,
DBusError *error)
{
DBusMessage *reply;
int len;
char **services;
BusRegistry *registry;
int i;
DBusMessageIter iter;
DBusMessageIter sub;
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
registry = bus_connection_get_registry (connection);
reply = dbus_message_new_method_return (message);
if (reply == NULL)
{
BUS_SET_OOM (error);
return FALSE;
}
if (!bus_registry_list_services (registry, &services, &len))
{
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
dbus_message_iter_init_append (reply, &iter);
if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING,
&sub))
{
dbus_free_string_array (services);
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
{
/* Include the bus driver in the list */
const char *v_STRING = DBUS_SERVICE_DBUS;
if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
&v_STRING))
{
dbus_free_string_array (services);
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
}
i = 0;
while (i < len)
{
if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
&services[i]))
{
dbus_free_string_array (services);
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
++i;
}
if (!dbus_message_iter_close_container (&iter, &sub))
{
dbus_free_string_array (services);
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
dbus_free_string_array (services);
if (!bus_transaction_send_from_driver (transaction, connection, reply))
{
dbus_message_unref (reply);
BUS_SET_OOM (error);
return FALSE;
}
else
{
dbus_message_unref (reply);
return TRUE;
}
}
开发者ID:jameshilliard,项目名称:WECB-BH-GPL,代码行数:93,代码来源:driver.c
示例10: verify_polkit
int verify_polkit(
DBusConnection *c,
DBusMessage *request,
const char *action,
bool interactive,
bool *_challenge,
DBusError *error) {
#ifdef ENABLE_POLKIT
DBusMessage *m = NULL, *reply = NULL;
const char *unix_process = "unix-process", *pid = "pid", *starttime = "start-time", *cancel_id = "";
uint32_t flags = interactive ? 1 : 0;
pid_t pid_raw;
uint32_t pid_u32;
unsigned long long starttime_raw;
uint64_t starttime_u64;
DBusMessageIter iter_msg, iter_struct, iter_array, iter_dict, iter_variant;
int r;
dbus_bool_t authorized = FALSE, challenge = FALSE;
#endif
const char *sender;
unsigned long ul;
assert(c);
assert(request);
sender = dbus_message_get_sender(request);
if (!sender)
return -EINVAL;
ul = dbus_bus_get_unix_user(c, sender, error);
if (ul == (unsigned long) -1)
return -EINVAL;
/* Shortcut things for root, to avoid the PK roundtrip and dependency */
if (ul == 0)
return 1;
#ifdef ENABLE_POLKIT
pid_raw = bus_get_unix_process_id(c, sender, error);
if (pid_raw == 0)
return -EINVAL;
r = get_starttime_of_pid(pid_raw, &starttime_raw);
if (r < 0)
return r;
m = dbus_message_new_method_call(
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (!m)
return -ENOMEM;
dbus_message_iter_init_append(m, &iter_msg);
pid_u32 = (uint32_t) pid_raw;
starttime_u64 = (uint64_t) starttime_raw;
if (!dbus_message_iter_open_container(&iter_msg, DBUS_TYPE_STRUCT, NULL, &iter_struct) ||
!dbus_message_iter_append_basic(&iter_struct, DBUS_TYPE_STRING, &unix_process) ||
!dbus_message_iter_open_container(&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_array) ||
!dbus_message_iter_open_container(&iter_array, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict) ||
!dbus_message_iter_append_basic(&iter_dict, DBUS_TYPE_STRING, &pid) ||
!dbus_message_iter_open_container(&iter_dict, DBUS_TYPE_VARIANT, "u", &iter_variant) ||
!dbus_message_iter_append_basic(&iter_variant, DBUS_TYPE_UINT32, &pid_u32) ||
!dbus_message_iter_close_container(&iter_dict, &iter_variant) ||
!dbus_message_iter_close_container(&iter_array, &iter_dict) ||
!dbus_message_iter_open_container(&iter_array, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict) ||
!dbus_message_iter_append_basic(&iter_dict, DBUS_TYPE_STRING, &starttime) ||
!dbus_message_iter_open_container(&iter_dict, DBUS_TYPE_VARIANT, "t", &iter_variant) ||
!dbus_message_iter_append_basic(&iter_variant, DBUS_TYPE_UINT64, &starttime_u64) ||
!dbus_message_iter_close_container(&iter_dict, &iter_variant) ||
!dbus_message_iter_close_container(&iter_array, &iter_dict) ||
!dbus_message_iter_close_container(&iter_struct, &iter_array) ||
!dbus_message_iter_close_container(&iter_msg, &iter_struct) ||
!dbus_message_iter_append_basic(&iter_msg, DBUS_TYPE_STRING, &action) ||
!dbus_message_iter_open_container(&iter_msg, DBUS_TYPE_ARRAY, "{ss}", &iter_array) ||
!dbus_message_iter_close_container(&iter_msg, &iter_array) ||
!dbus_message_iter_append_basic(&iter_msg, DBUS_TYPE_UINT32, &flags) ||
!dbus_message_iter_append_basic(&iter_msg, DBUS_TYPE_STRING, &cancel_id)) {
r = -ENOMEM;
goto finish;
}
reply = dbus_connection_send_with_reply_and_block(c, m, -1, error);
if (!reply) {
/* Treat no PK available as access denied */
if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN)) {
r = -EACCES;
dbus_error_free(error);
goto finish;
}
r = -EIO;
goto finish;
//.........这里部分代码省略.........
开发者ID:Miss6yka,项目名称:systemd,代码行数:101,代码来源:polkit.c
示例11: ibus_message_iter_close_container
gboolean
ibus_message_iter_close_container (IBusMessageIter *iter,
IBusMessageIter *sub)
{
return dbus_message_iter_close_container (iter, sub);
}
开发者ID:definite,项目名称:ibus,代码行数:6,代码来源:ibusmessage.c
示例12: set_network
static int set_network(struct supplicant_task *task,
const unsigned char *network, int len,
const char *address, const char *security,
const char *passphrase)
{
DBusMessage *message, *reply;
DBusMessageIter array, dict;
DBusError error;
dbus_uint32_t scan_ssid = 1;
_DBG_SUPPLICANT("task %p", task);
if (task->netpath == NULL)
return -EINVAL;
message = dbus_message_new_method_call(SUPPLICANT_NAME, task->netpath,
SUPPLICANT_INTF ".Network", "set");
if (message == NULL)
return -ENOMEM;
dbus_message_set_auto_start(message, FALSE);
dbus_message_iter_init_append(message, &array);
dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
connman_dbus_dict_append_variant(&dict, "scan_ssid",
DBUS_TYPE_UINT32, &scan_ssid);
connman_dbus_dict_append_array(&dict, "ssid",
DBUS_TYPE_BYTE, &network, len);
/* NB: do not set the bssid; this allows wpa_supplicant to roam */
if (g_ascii_strcasecmp(security, "wpa") == 0 ||
g_ascii_strcasecmp(security, "rsn") == 0) {
const char *key_mgmt = "WPA-PSK";
connman_dbus_dict_append_variant(&dict, "key_mgmt",
DBUS_TYPE_STRING, &key_mgmt);
if (passphrase && strlen(passphrase) > 0)
connman_dbus_dict_append_variant(&dict, "psk",
DBUS_TYPE_STRING, &passphrase);
} else if (g_ascii_strcasecmp(security, "wep") == 0) {
const char *key_mgmt = "NONE";
const char *auth_alg = "OPEN";
const char *key_index = "0";
if (task->mac80211 == TRUE)
auth_alg = "OPEN SHARED";
connman_dbus_dict_append_variant(&dict, "auth_alg",
DBUS_TYPE_STRING, &auth_alg);
connman_dbus_dict_append_variant(&dict, "key_mgmt",
DBUS_TYPE_STRING, &key_mgmt);
if (passphrase) {
int size = strlen(passphrase);
if (size == 10 || size == 26) {
unsigned char *key = malloc(13);
char tmp[3];
int i;
memset(tmp, 0, sizeof(tmp));
if (key == NULL)
size = 0;
for (i = 0; i < size / 2; i++) {
memcpy(tmp, passphrase + (i * 2), 2);
key[i] = (unsigned char) strtol(tmp,
NULL, 16);
}
connman_dbus_dict_append_array(&dict,
"wep_key0", DBUS_TYPE_BYTE,
&key, size / 2);
free(key);
} else
connman_dbus_dict_append_variant(&dict,
"wep_key0", DBUS_TYPE_STRING,
&passphrase);
connman_dbus_dict_append_variant(&dict, "wep_tx_keyidx",
DBUS_TYPE_STRING, &key_index);
}
} else {
const char *key_mgmt = "NONE";
connman_dbus_dict_append_variant(&dict, "key_mgmt",
DBUS_TYPE_STRING, &key_mgmt);
}
dbus_message_iter_close_container(&array, &dict);
dbus_error_init(&error);
reply = dbus_connection_send_with_reply_and_block(connection,
message, -1, &error);
if (reply == NULL) {
if (dbus_error_is_set(&error) == TRUE) {
connman_error("%s", error.message);
dbus_error_free(&error);
//.........这里部分代码省略.........
开发者ID:wenhann,项目名称:chromiumos,代码行数:101,代码来源:supplicant.c
示例13: message_handler_cb
static DBusHandlerResult
message_handler_cb (DBusConnection *conn, DBusMessage *message, void *user_data)
{
/*
* Here we handle the requests to our own gnome-keyring DBus interfaces
*/
DBusMessageIter args;
DBusMessage *reply = NULL;
/* GetEnvironment */
if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL &&
dbus_message_is_method_call (message, GNOME_KEYRING_DAEMON_INTERFACE, "GetEnvironment") &&
g_str_equal (dbus_message_get_signature (message), "")) {
const gchar **env;
DBusMessageIter items, entry;
env = gkd_util_get_environment ();
g_return_val_if_fail (env, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
/* Setup the result */
reply = dbus_message_new_method_return (message);
dbus_message_iter_init_append (reply, &args);
if (!dbus_message_iter_open_container (&args, DBUS_TYPE_ARRAY, "{ss}", &items))
g_return_val_if_reached (DBUS_HANDLER_RESULT_NEED_MEMORY);
while (*env) {
gchar **parts;
parts = g_strsplit (*env, "=", 2);
g_return_val_if_fail (parts && parts[0] && parts[1], DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
if (!dbus_message_iter_open_container (&items, DBUS_TYPE_DICT_ENTRY, NULL, &entry) ||
!dbus_message_iter_append_basic (&entry, DBUS_TYPE_STRING, &parts[0]) ||
!dbus_message_iter_append_basic (&entry, DBUS_TYPE_STRING, &parts[1]) ||
!dbus_message_iter_close_container (&items, &entry)) {
g_strfreev (parts);
g_return_val_if_reached (DBUS_HANDLER_RESULT_NEED_MEMORY);
}
g_strfreev (parts);
++env;
}
if (!dbus_message_iter_close_container (&args, &items))
g_return_val_if_reached (DBUS_HANDLER_RESULT_NEED_MEMORY);
/* GetControlDirectory */
} else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL &&
dbus_message_is_method_call (message, GNOME_KEYRING_DAEMON_INTERFACE, "GetControlDirectory") &&
g_str_equal (dbus_message_get_signature (message), "")) {
/* Setup the result */
const gchar *directory = gkd_util_get_master_directory ();
reply = dbus_message_new_method_return (message);
dbus_message_append_args (reply, DBUS_TYPE_STRING, &directory, DBUS_TYPE_INVALID);
/* Unknown call */
} else {
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
/* Send the reply */
if (!dbus_connection_send (conn, reply, NULL))
g_return_val_if_reached (DBUS_HANDLER_RESULT_NEED_MEMORY);
dbus_connection_flush (conn);
return DBUS_HANDLER_RESULT_HANDLED;
}
开发者ID:yuumasato,项目名称:gnome-keyring,代码行数:65,代码来源:gkd-dbus.c
示例14: synce_read
static ssize_t synce_read(void *object, void *buf, size_t count, uint8_t *hi)
{
struct synce_context *context = object;
DBusConnection *conn;
char transport[36], transport_description[24];
const char *session;
DBusMessage *msg;
DBusMessageIter iter, dict;
gboolean authenticate;
DBusPendingCall *call;
if (context->buffer) {
*hi = OBEX_HDR_BODY;
return string_read(context->buffer, buf, count);
}
conn = obex_dbus_get_connection();
if (conn == NULL)
return -EPERM;
msg = dbus_message_new_method_call(SYNCE_BUS_NAME, SYNCE_PATH,
SYNCE_SERVER_INTERFACE, "Connect");
if (!msg)
return -EPERM;
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
append_dict_entry(&dict, "id", DBUS_TYPE_STRING, context->id);
snprintf(transport, sizeof(transport), "%s.obexd",
OPENOBEX_SERVICE);
append_dict_entry(&dict, "transport", DBUS_TYPE_STRING, transport);
snprintf(transport_description, sizeof(transport_description),
"version %s", VERSION);
append_dict_entry(&dict, "transport_description", DBUS_TYPE_STRING,
transport_description);
dbus_message_iter_close_container(&iter, &dict);
authenticate = FALSE;
session = "";
dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &authenticate,
DBUS_TYPE_STRING, &session, DBUS_TYPE_INVALID);
if (!dbus_connection_send_with_reply(conn, msg, &call, -1)) {
error("D-Bus call to %s failed.", SYNCE_SERVER_INTERFACE);
dbus_message_unref(msg);
return -EPERM;
}
dbus_pending_call_set_notify(call, connect_cb, context, NULL);
dbus_pending_call_unref(call);
dbus_message_unref(msg);
return -EAGAIN;
}
开发者ID:Siegfriede,项目名称:obexd-eds,代码行数:62,代码来源:syncevolution.c
示例15: START_TEST
END_TEST
START_TEST(test_cancel_browse_invalid)
{
MafwProxySource *src;
guint32 browse_id;
DBusMessage *replmsg;
DBusMessageIter iter_array, iter_msg;
GError *error = NULL;
/* II. call browse(), wait till it's finished, then try to
* cancel it -> proxy should NOT send anything. */
mockbus_reset();
mock_empty_props(MAFW_DBUS_DESTINATION, MAFW_DBUS_PATH);
mockbus_expect(
mafw_dbus_method(MAFW_SOURCE_METHOD_BROWSE,
MAFW_DBUS_STRING("bigcan"),
MAFW_DBUS_BOOLEAN(FALSE),
MAFW_DBUS_STRING(""),
MAFW_DBUS_STRING(""),
MAFW_DBUS_C_STRVZ("faszom"),
MAFW_DBUS_UINT32(0),
MAFW_DBUS_UINT32(0)));
mockbus_reply(MAFW_DBUS_UINT32(4444));
replmsg = append_browse_res(NULL, &iter_msg, &iter_array, 4444, 0, 0,
"testobject::item0", NULL, "", 0, "");
dbus_message_iter_close_container(&iter_msg, &iter_array);
mockbus_incoming(replmsg);
src = MAFW_PROXY_SOURCE(mafw_proxy_source_new(SOURCE_UUID, "fake",
mafw_registry_get_instance()));
fail_if(mafw_source_cancel_browse(MAFW_SOURCE(src), 10, &error));
fail_if(!error);
g_error_free(error);
browse_id = mafw_source_browse(
MAFW_SOURCE(src),
"bigcan", FALSE, NULL, NULL,
MAFW_SOURCE_LIST("faszom"), 0, 0,
browse_result2_invalid, NULL);
g_main_loop_run(mainloop_test = g_main_loop_new(NULL, FALSE));
fail_if(mafw_source_cancel_browse(MAFW_SOURCE(src), browse_id, NULL));
mockbus_expect(
mafw_dbus_method(MAFW_SOURCE_METHOD_BROWSE,
MAFW_DBUS_STRING("abc"),
MAFW_DBUS_BOOLEAN(FALSE),
MAFW_DBUS_STRING(""),
MAFW_DBUS_STRING(""),
MAFW_DBUS_C_STRVZ("def"),
MAFW_DBUS_UINT32(0),
MAFW_DBUS_UINT32(0)));
mockbus_reply(MAFW_DBUS_UINT32(4444));
browse_id = mafw_source_browse(
MAFW_SOURCE(src),
"abc", FALSE, NULL, NULL,
MAFW_SOURCE_LIST("def"), 0, 0,
browse_result2_invalid, NULL);
error = NULL;
mockbus_expect(
mafw_dbus_method(MAFW_SOURCE_METHOD_CANCEL_BROWSE,
MAFW_DBUS_UINT32(4444)));
mockbus_error(MAFW_SOURCE_ERROR, 2, "testproblem");
fail_if(mafw_source_cancel_browse(MAFW_SOURCE(src), browse_id, &error));
fail_if(!error);
g_error_free(error);
mafw_registry_remove_extension(mafw_registry_get_instance(),
(gpointer)src);
mockbus_finish();
}
开发者ID:community-ssu,项目名称:mafw,代码行数:79,代码来源:test-proxy-source.c
示例16: method_AddService
//.........这里部分代码省略.........
fprintf(stderr, "Message Null\n");
exit(1);
}
// append arguments
dbus_message_iter_init_append(msg, &args);
if (!dbus_message_iter_append_basic
|
请发表评论