/**
* @file mce-dbus.h
* Headers for the D-Bus handling code for the Mode Control Entity
*
* Copyright (c) 2004 - 2010 Nokia Corporation and/or its subsidiary(-ies).
* Copyright (c) 2013 - 2023 Jolla Ltd.
* Copyright (c) 2019 Open Mobile Platform LLC.
*
* @author David Weinehall
* @author Simo Piiroinen
*
* mce is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* mce 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with mce. If not, see .
*/
#ifndef MCE_DBUS_H_
# define MCE_DBUS_H_
# include "builtin-gconf.h"
# include
# include
/* ========================================================================= *
* NON-PUBLIC mce dbus method calls
* ========================================================================= */
# ifdef ENABLE_BATTERY_SIMULATION
/** Override current charger state
*
* Available in devel flavor mce only, and only to privileged applications.
*
* @since mce 1.99.0
*
* @param string: current charger state, one of:
* - #MCE_CHARGER_STATE_UNKNOWN
* - #MCE_CHARGER_STATE_ON
* - #MCE_CHARGER_STATE_OFF
*
* @return boolean true if accepted, false / error reply otherwise
*/
# define MCE_CHARGER_STATE_REQ "req_charger_state"
/** Override current charger type
*
* Available in devel flavor mce only, and only to privileged applications.
*
* @since mce 1.102.0
*
* @param string: current charger type, one of:
* - #MCE_CHARGER_TYPE_NONE
* - #MCE_CHARGER_TYPE_USB
* - #MCE_CHARGER_TYPE_DCP
* - #MCE_CHARGER_TYPE_HVDCP
* - #MCE_CHARGER_TYPE_CDP
* - #MCE_CHARGER_TYPE_WIRELESS
* - #MCE_CHARGER_TYPE_OTHER
*
* @return boolean true if accepted, false / error reply otherwise
*/
# define MCE_CHARGER_TYPE_REQ "req_charger_type"
/** Override current battery level
*
* Available in devel flavor mce only, and only to privileged applications.
*
* @since mce 1.99.0
*
* @param int32: battery level percent, or #MCE_BATTERY_LEVEL_UNKNOWN
*
* @return boolean true if accepted, false / error reply otherwise
*/
# define MCE_BATTERY_LEVEL_REQ "req_battery_level"
# endif // ENABLE_BATTERY_SIMULATION
/* ========================================================================= *
* DSME DBUS SERVICE
* ========================================================================= */
/** Well known dbus name of dsme service */
# define DSME_DBUS_SERVICE "com.nokia.dsme"
/* ========================================================================= *
* COMPOSITOR DBUS SERVICE
* ========================================================================= */
/** Well known dbus name of compositor service */
# define COMPOSITOR_SERVICE "org.nemomobile.compositor"
# define COMPOSITOR_PATH "/"
# define COMPOSITOR_IFACE "org.nemomobile.compositor"
/* Enabling/disabling display updates via compositor service */
# define COMPOSITOR_SET_UPDATES_ENABLED "setUpdatesEnabled"
/** Query owner of topmost ui window */
# define COMPOSITOR_GET_TOPMOST_WINDOW_PID "privateTopmostWindowProcessId"
/** Change notification for owner of topmost ui window */
# define COMPOSITOR_TOPMOST_WINDOW_PID_CHANGED "privateTopmostWindowProcessIdChanged"
/** Query setup actions for compositor process */
# define COMPOSITOR_GET_SETUP_ACTIONS "privateGetSetupActions"
/** Actions to be taken before allowing new compositor to draw */
# define COMPOSITOR_ACTION_NONE (0)
# define COMPOSITOR_ACTION_STOP_HWC (1<<0)
# define COMPOSITOR_ACTION_START_HWC (1<<1)
# define COMPOSITOR_ACTION_RESTART_HWC (1<<2)
/* ========================================================================= *
* LIPSTICK DBUS SERVICE
* ========================================================================= */
/** Well known dbus name of systemui service */
# define LIPSTICK_SERVICE "org.nemomobile.lipstick"
# define LIPSTICK_PATH "/"
# define LIPSTICK_IFACE "org.nemomobile.lipstick"
/* ========================================================================= *
* USB_MODED DBUS SERVICE
* ========================================================================= */
/** Well known service name for usb_moded service */
# define USB_MODED_DBUS_SERVICE "com.meego.usb_moded"
/** D-Bus interface name for usb_moded */
# define USB_MODED_DBUS_INTERFACE "com.meego.usb_moded"
/** D-Bus object name for usb_moded */
# define USB_MODED_DBUS_OBJECT "/com/meego/usb_moded"
/** Query current usb mode method call */
# define USB_MODED_QUERY_MODE_REQ "mode_request"
/** Current usb mode changed signal */
# define USB_MODED_MODE_CHANGED_SIG "sig_usb_state_ind"
/* ========================================================================= *
* FINGERPRINT_DAEMON_DBUS_SERVICE (API Version 1)
* ========================================================================= */
# define FINGERPRINT1_DBUS_SERVICE "org.sailfishos.fingerprint1"
# define FINGERPRINT1_DBUS_ROOT_OBJECT "/org/sailfishos/fingerprint1"
# define FINGERPRINT1_DBUS_INTERFACE "org.sailfishos.fingerprint1"
# define FINGERPRINT1_DBUS_REQ_ENROLL "Enroll"
# define FINGERPRINT1_DBUS_REQ_IDENTIFY "Identify"
# define FINGERPRINT1_DBUS_REQ_ABORT "Abort"
# define FINGERPRINT1_DBUS_REQ_GET_ALL "GetAll"
# define FINGERPRINT1_DBUS_REQ_REMOVE "Remove"
# define FINGERPRINT1_DBUS_REQ_VERIFY "Verify"
# define FINGERPRINT1_DBUS_REQ_GET_STATE "GetState"
# define FINGERPRINT1_DBUS_SIG_ADDED "Added"
# define FINGERPRINT1_DBUS_SIG_REMOVED "Removed"
# define FINGERPRINT1_DBUS_SIG_IDENTIFIED "Identified"
# define FINGERPRINT1_DBUS_SIG_ABORTED "Aborted"
# define FINGERPRINT1_DBUS_SIG_FAILED "Failed"
# define FINGERPRINT1_DBUS_SIG_VERIFIED "Verified"
# define FINGERPRINT1_DBUS_SIG_STATE_CHANGED "StateChanged"
# define FINGERPRINT1_DBUS_SIG_ERROR_INFO "ErrorInfo"
# define FINGERPRINT1_DBUS_SIG_ACQUISITION_INFO "AcquisitionInfo"
# define FINGERPRINT1_DBUS_SIG_ENROLL_PROGRESS "EnrollProgressChanged"
/* ========================================================================= *
* D-Bus connection and message handling
* ========================================================================= */
/** Placeholder for any basic dbus data type */
typedef union
{
dbus_int16_t i16;
dbus_int32_t i32;
dbus_int64_t i64;
dbus_uint16_t u16;
dbus_uint32_t u32;
dbus_uint64_t u64;
dbus_bool_t b;
unsigned char o;
const char *s;
double d;
} dbus_any_t;
/** D-Bus message handler data
*
* For use with mce_dbus_handler_register() etc
*/
typedef struct
{
const char *sender;
const char *interface;
const char *name;
const char *rules;
const char *args;
int type;
gboolean (*callback)(DBusMessage *const msg);
bool privileged;
gconstpointer cookie;
} mce_dbus_handler_t;
DBusConnection *dbus_connection_get(void);
DBusMessage *dbus_new_signal(const gchar *const path,
const gchar *const interface,
const gchar *const name);
DBusMessage *dbus_new_method_call(const gchar *const service,
const gchar *const path,
const gchar *const interface,
const gchar *const name);
DBusMessage *dbus_new_method_reply(DBusMessage *const message);
gboolean dbus_send_message(DBusMessage *const msg);
gboolean dbus_send(const gchar *const service, const gchar *const path,
const gchar *const interface, const gchar *const name,
DBusPendingCallNotifyFunction callback,
int first_arg_type, ...);
gboolean dbus_send_ex(const char *service,
const char *path,
const char *interface,
const char *name,
DBusPendingCallNotifyFunction callback,
void *user_data, DBusFreeFunction user_free,
DBusPendingCall **ppc,
int first_arg_type, ...);
gboolean dbus_send_ex2(const char *service,
const char *path,
const char *interface,
const char *name,
DBusPendingCallNotifyFunction callback,
int timeout,
void *user_data, DBusFreeFunction user_free,
DBusPendingCall **ppc,
int first_arg_type, ...);
void mce_dbus_send_config_notification(GConfEntry *entry);
const char *mce_dbus_type_repr(int type);
char *mce_dbus_message_repr(DBusMessage *const msg);
char *mce_dbus_message_iter_repr(DBusMessageIter *iter);
bool mce_dbus_iter_at_end(DBusMessageIter *iter);
bool mce_dbus_iter_req_type(DBusMessageIter *iter, int want);
bool mce_dbus_iter_get_basic(DBusMessageIter *iter, void *pval, int type);
bool mce_dbus_iter_get_object(DBusMessageIter *iter, const char **pval);
bool mce_dbus_iter_get_string(DBusMessageIter *iter, const char **pval);
bool mce_dbus_iter_get_bool(DBusMessageIter *iter, bool *pval);
bool mce_dbus_iter_get_int32(DBusMessageIter *iter, dbus_int32_t *pval);
bool mce_dbus_iter_get_uint32(DBusMessageIter *iter, dbus_uint32_t *val);
bool mce_dbus_iter_get_array(DBusMessageIter *iter, DBusMessageIter *sub);
bool mce_dbus_iter_get_struct(DBusMessageIter *iter, DBusMessageIter *sub);
bool mce_dbus_iter_get_entry(DBusMessageIter *iter, DBusMessageIter *sub);
bool mce_dbus_iter_get_variant(DBusMessageIter *iter, DBusMessageIter *sub);
void mce_dbus_handler_register(mce_dbus_handler_t *self);
void mce_dbus_handler_unregister(mce_dbus_handler_t *self);
void mce_dbus_handler_register_array(mce_dbus_handler_t *array);
void mce_dbus_handler_unregister_array(mce_dbus_handler_t *array);
void mce_dbus_pending_call_blocks_suspend(DBusPendingCall *pc);
/* ========================================================================= *
* D-Bus client tracking
* ========================================================================= */
/** D-Bus peer identity/availability tracking state */
typedef enum
{
/** Freshly created */
PEERSTATE_INITIAL,
/** Pending org.freedesktop.DBus.GetNameOwner */
PEERSTATE_QUERY_OWNER,
/** Pending org.freedesktop.DBus.GetConnectionUnixProcessID */
PEERSTATE_QUERY_PID,
/** Pending org.sailfishos.sailjailed.Identify */
PEERSTATE_IDENTIFY,
/** Owner known and available on D-Bus */
PEERSTATE_RUNNING,
/** Owner possibly known, but no longer available on D-Bus
*
* The peer info is retained briefly so that it is still
* available when for example logging client cleanup actions.
*/
PEERSTATE_STOPPED,
} peerstate_t;
const char *peerstate_repr(peerstate_t state);
/** Opaque object type for holding D-Bus peer details */
typedef struct peerinfo_t peerinfo_t;
const char *peerinfo_name (const peerinfo_t *self);
peerstate_t peerinfo_get_state (const peerinfo_t *self);
pid_t peerinfo_get_owner_pid(const peerinfo_t *self);
uid_t peerinfo_get_owner_uid(const peerinfo_t *self);
gid_t peerinfo_get_owner_gid(const peerinfo_t *self);
const char *peerinfo_get_owner_cmd(const peerinfo_t *self);
/** Callback function type used by dbus name tracking functionality */
typedef void (*peernotify_fn)(const peerinfo_t *peerinfo, gpointer userdata);
void mce_dbus_name_tracker_add(const char *name,
peernotify_fn callback,
gpointer userdata,
GDestroyNotify userfree);
void mce_dbus_name_tracker_remove(const char *name,
peernotify_fn callback,
gpointer userdata);
const char *mce_dbus_get_name_owner_ident(const char *name);
const char *mce_dbus_get_message_sender_ident(DBusMessage *msg);
const char *mce_dbus_nameowner_get(const char *name);
gssize mce_dbus_owner_monitor_add(const gchar *service,
gboolean (*callback)(DBusMessage *const msg),
GSList **monitor_list,
gssize max_num);
gssize mce_dbus_owner_monitor_remove(const gchar *service,
GSList **monitor_list);
void mce_dbus_owner_monitor_remove_all(GSList **monitor_list);
/* ========================================================================= *
* Module init/quit
* ========================================================================= */
gboolean mce_dbus_init(const gboolean systembus);
void mce_dbus_exit(void);
#endif /* MCE_DBUS_H_ */