#ifndef EDBUS_SERVICE_H #define EDBUS_SERVICE_H 1 /** * @defgroup EDBus_Service Service * * @{ */ #define EDBUS_METHOD_FLAG_DEPRECATED 1 #define EDBUS_METHOD_FLAG_NOREPLY (1 << 1) #define EDBUS_SIGNAL_FLAG_DEPRECATED 1 typedef struct _EDBus_Arg_Info { const char *signature; const char *name; } EDBus_Arg_Info; /** * @brief Used to insert complete types to signature of methods or signals. * * Example: EDBUS_ARGS({"s", "interface"}, {"s", "property"}) * The signature will be "ss" and each string will have a tag name on * introspect XML with the respective name. */ #define EDBUS_ARGS(args...) (const EDBus_Arg_Info[]){ args, { NULL, NULL } } typedef struct _EDBus_Service_Interface EDBus_Service_Interface; typedef EDBus_Message * (*EDBus_Method_Cb)(const EDBus_Service_Interface *iface, const EDBus_Message *message); typedef Eina_Bool (*EDBus_Property_Get_Cb)(EDBus_Service_Interface *iface, const char *propname, EDBus_Message_Iter *iter, EDBus_Message **error); typedef EDBus_Message *(*EDBus_Property_Set_Cb)(EDBus_Service_Interface *iface, const char *propname, EDBus_Message *input_msg); typedef struct _EDBus_Method { const char *member; const EDBus_Arg_Info *in; const EDBus_Arg_Info *out; EDBus_Method_Cb cb; unsigned int flags; } EDBus_Method; typedef struct _EDBus_Signal { const char *name; const EDBus_Arg_Info *args; unsigned int flags; } EDBus_Signal; typedef struct _EDBus_Property { const char *name; const char *type; unsigned int flags; EDBus_Property_Set_Cb set_func; EDBus_Property_Get_Cb get_func; } EDBus_Property; typedef struct _EDBus_Service_Interface_Desc { const char *interface; const EDBus_Method *methods; const EDBus_Signal *signals; const EDBus_Property *properties; const EDBus_Property_Set_Cb default_set; const EDBus_Property_Get_Cb default_get; } EDBus_Service_Interface_Desc; /** * @brief Register an interface in the given path and connection. * * @param conn where the interface should listen * @param path object path * @param iface interface * @param methods array of the methods that should be registered in this * interface, the last item of array should be filled with NULL * @param signals array of signal that this interface send, the last item * of array should be filled with NULL * * @note methods and signals must be static variables * * @return Interface */ EAPI EDBus_Service_Interface *edbus_service_interface_register(EDBus_Connection *conn, const char *path, const EDBus_Service_Interface_Desc *desc); /** * @brief Unregister a interface. * If this is the last interface of the object path, the object path will be * removed too. */ EAPI void edbus_service_interface_unregister(EDBus_Service_Interface *iface); /** * @brief Unregister all interfaces of the object path that this interface belongs * and the object path. */ EAPI void edbus_service_object_unregister(EDBus_Service_Interface *iface); EAPI EDBus_Connection *edbus_service_connection_get(const EDBus_Service_Interface *iface); EAPI const char *edbus_service_object_path_get(const EDBus_Service_Interface *iface); /** * @brief Emit a signal handler of the interface with non-complex types. * Each signal handler have a internal id, the first signal handler of * interface is = 0 the second = 1 and go on. * * @param iface interface of the signal * @param signal_id id of signal * @param ... values that will be send on signal */ EAPI Eina_Bool edbus_service_signal_emit(EDBus_Service_Interface *iface, unsigned int signal_id, ...) EINA_ARG_NONNULL(1); /** * @brief Create signal message. * Each signal handler have a internal id, the first signal handler of * interface is = 0 the second = 1 and go on. * This function is used when the signal has complex types. * * @param iface interface of the signal * @param signal_id id of signal */ EAPI EDBus_Message *edbus_service_signal_new(EDBus_Service_Interface *iface, unsigned int signal_id) EINA_ARG_NONNULL(1); /** * @brief Send a signal message. */ EAPI Eina_Bool edbus_service_signal_send(EDBus_Service_Interface *iface, EDBus_Message *signal_msg) EINA_ARG_NONNULL(1, 2); /** * @brief Store data at object path, this data can be obtained from all interfaces * of the same object. * * @param iface interface that belong to the object path where data will * be stored * @param key to identify data * @param data */ EAPI void edbus_service_object_data_set(EDBus_Service_Interface *iface, const char *key, const void *data); /** * @brief Get data stored in object path. * * @param iface interface that belongs to the object path where data are stored * @param key that identify data * * @return pointer to data if found otherwise NULL */ EAPI void *edbus_service_object_data_get(const EDBus_Service_Interface *iface, const char *key); /** * @brief Del data stored in object path. * * @param iface interface that belongs to the object path where data are stored * @param key that identify data * * @return pointer to data if found otherwise NULL */ EAPI void *edbus_service_object_data_del(EDBus_Service_Interface *iface, const char *key); /** * @} */ #endif