diff options
-rw-r--r-- | CMakeLists.txt | 7 | ||||
-rw-r--r-- | ConfigureChecks.cmake | 8 | ||||
-rw-r--r-- | interfaces/CMakeLists.txt | 83 | ||||
-rw-r--r-- | interfaces/filechooser.xml | 32 | ||||
-rw-r--r-- | interfaces/org.freedesktop.impl.portal.Session.xml | 13 | ||||
-rw-r--r-- | interfaces/org.freedesktop.impl.portal.xml | 220 | ||||
-rw-r--r-- | src/CMakeLists.txt | 11 | ||||
-rw-r--r-- | src/PortalService.cpp | 652 | ||||
-rw-r--r-- | src/PortalService.h | 501 | ||||
-rw-r--r-- | src/PortalServiceDaemon.cpp | 143 | ||||
-rw-r--r-- | src/PortalServiceDaemon.h | 75 | ||||
-rw-r--r-- | src/main.cpp | 29 |
12 files changed, 1705 insertions, 69 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c6cd02..bc6e4da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,12 @@ # This software is licensed under the terms of the GNU GPL v3 license. # ################################################################################ -cmake_minimum_required( VERSION 3.1 ) +##### set project version ######################## + +include( TDEVersion ) +cmake_minimum_required( VERSION ${TDE_CMAKE_MINIMUM_VERSION} ) + +#### general package setup project( xdg-desktop-portal-tde ) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 8a2c606..f2b02eb 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -20,4 +20,10 @@ if( WITH_GCC_VISIBILITY ) tde_setup_gcc_visibility( ) endif( WITH_GCC_VISIBILITY ) -tde_setup_dbus( dbus-1-tqt )
\ No newline at end of file +# check for dbus-1-tqt +pkg_search_module( DBUS_TQT dbus-1-tqt ) +if( NOT DBUS_TQT_FOUND ) + tde_message_fatal( "dbus-1-tqt is required, but was not found on your system" ) +endif( ) + +#tde_setup_dbus( dbus-1-tqt )
\ No newline at end of file diff --git a/interfaces/CMakeLists.txt b/interfaces/CMakeLists.txt index f01262c..6a63ec7 100644 --- a/interfaces/CMakeLists.txt +++ b/interfaces/CMakeLists.txt @@ -9,26 +9,71 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${DBUS_TQT_INCLUDE_DIRS} + /usr/include/dbus-1.0 + /usr/lib/x86_64-linux-gnu/dbus-1.0/include ) link_directories( ${DBUS_TQT_LIBRARY_DIRS} ) -set(filechooser_HDRS filechooserInterface.h filechooserProxy.h introspectableInterface.h) -set(filechooser_SRCS filechooserInterface.cpp filechooserProxy.cpp introspectableInterface.cpp) +set( INTROSPECTIONFILE_PORTAL ${CMAKE_CURRENT_SOURCE_DIR}/org.freedesktop.impl.portal.xml ) +set( INTROSPECTIONFILE_SESSION ${CMAKE_CURRENT_SOURCE_DIR}/org.freedesktop.impl.portal.Session.xml ) +set( DBUSXML2QT3_EXECUTABLE dbusxml2qt3 ) + +set(xdgportal_HDRS accessInterface.h accessProxy.h accountInterface.h accountProxy.h appchooserInterface.h appchooserProxy.h desktopNode.h dynamiclauncherInterface.h dynamiclauncherProxy.h emailInterface.h emailProxy.h filechooserInterface.h filechooserProxy.h inhibitInterface.h inhibitProxy.h lockdownInterface.h lockdownProxy.h notificationInterface.h notificationProxy.h printInterface.h printProxy.h settingsInterface.h settingsProxy.h propertiesInterface.h) +set(xdgportal_SRCS accessInterface.cpp accessProxy.cpp accountInterface.cpp accountProxy.cpp appchooserInterface.cpp appchooserProxy.cpp desktopNode.cpp dynamiclauncherInterface.cpp dynamiclauncherProxy.cpp emailInterface.cpp emailProxy.cpp filechooserInterface.cpp filechooserProxy.cpp inhibitInterface.cpp inhibitProxy.cpp lockdownInterface.cpp lockdownProxy.cpp notificationInterface.cpp notificationProxy.cpp printInterface.cpp printProxy.cpp settingsInterface.cpp settingsProxy.cpp propertiesInterface.cpp) + +set(session_HDRS dbusbaseNode.h introspectableInterface.h sessionInterface.h sessionNode.h sessionProxy.h) +set(session_SRCS dbusbaseNode.cpp introspectableInterface.cpp sessionInterface.cpp sessionNode.cpp sessionProxy.cpp) add_custom_command( - OUTPUT ${filechooser_HDRS} ${filechooser_SRCS} - COMMAND ${DBUSXML2QT3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/filechooser.xml - DEPENDS filechooser.xml + OUTPUT ${xdgportal_HDRS} ${xdgportal_SRCS} ${session_HDRS} ${session_SRCS} + COMMAND ${DBUSXML2QT3_EXECUTABLE} ${INTROSPECTIONFILE_PORTAL} + COMMAND ${DBUSXML2QT3_EXECUTABLE} ${INTROSPECTIONFILE_SESSION} + DEPENDS ${INTROSPECTIONFILE_PORTAL} ${INTROSPECTIONFILE_SESSION} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) -tde_add_library(portalinterfaces STATIC_PIC AUTOMOC - SOURCES ${filechooser_SRCS} - LINK ${DBUS_TQT_LIBRARIES} -) +function( make_moc fileinput ) + add_custom_command( OUTPUT ${fileinput}.moc + COMMAND ${TMOC_EXECUTABLE} ${fileinput}.h -o ${fileinput}.moc + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${fileinput}.h + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property( SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${fileinput}.cpp APPEND + PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${fileinput}.moc ) +endfunction( ) + +make_moc ( accessProxy ) +make_moc ( accountProxy ) +make_moc ( appchooserProxy ) +make_moc ( dynamiclauncherProxy ) +make_moc ( emailProxy ) +make_moc ( filechooserProxy ) +make_moc ( inhibitProxy ) +make_moc ( lockdownProxy ) +make_moc ( notificationProxy ) +make_moc ( printProxy ) +make_moc ( sessionProxy ) +make_moc ( settingsProxy ) +make_moc ( propertiesProxy ) + +#tde_add_library( portalinterfaces STATIC_PIC AUTOMOC +# SOURCES +# LINK ${DBUS_TQT_LIBRARIES} tdecore-shared +#) + +##### tdexdgdesktopportal (shared) ########################### + +tde_add_library( tdexdgdesktopportal SHARED AUTOMOC + SOURCES ${xdgportal_SRCS} ${session_SRCS} + VERSION ${LIBRARY_VERSION} + LINK ${DBUS_TQT_LIBRARIES} tdecore-shared + DESTINATION ${LIB_INSTALL_DIR} + ) + +##### other data configure_file(org.freedesktop.impl.portal.desktop.tde.service.cmake org.freedesktop.impl.portal.desktop.tde.service @ONLY) @@ -39,7 +84,23 @@ configure_file(xdg-desktop-portal-tde.desktop.cmake install(FILES tde.portal DESTINATION ${XDG_PREFIX}/share/xdg-desktop-portal/portals) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.impl.portal.desktop.tde.service - DESTINATION ${DBUS_SESSION_DIRECTORY}) + DESTINATION ${SHARE_INSTALL_PREFIX}/dbus-1/services) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/xdg-desktop-portal-tde.desktop - DESTINATION ${SHARE_INSTALL_PREFIX}/applications)
\ No newline at end of file + DESTINATION ${SHARE_INSTALL_PREFIX}/applications) + +#tde_create_translated_desktop( +# SOURCE xdg-desktop-portal-tde.desktop +# DESTINATION ${AUTOSTART_INSTALL_DIR} +#) + +##### install headers ################################### + +install( + DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DESTINATION ${INCLUDE_INSTALL_DIR}/tdexdgdesktopportal + USE_SOURCE_PERMISSIONS + FILES_MATCHING PATTERN PATTERN "*.h" + PATTERN "CMakeFiles" EXCLUDE +) + diff --git a/interfaces/filechooser.xml b/interfaces/filechooser.xml deleted file mode 100644 index da6bed2..0000000 --- a/interfaces/filechooser.xml +++ /dev/null @@ -1,32 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<node name="/"> - <interface name="org.freedesktop.impl.portal.FileChooser"> - <method name="OpenFile"> - <arg name="handle" type="o" direction="in" /> - <arg name="app_id" type="s" direction="in" /> - <arg name="parent_window" type="s" direction="in" /> - <arg name="title" type="s" direction="in" /> - <arg name="options" type="a{sv}" direction="in" /> - <arg name="response" type="u" direction="out" /> - <arg name="results" type="a{sv}" direction="out" /> - </method> - <method name="SaveFile"> - <arg name="handle" type="o" direction="in" /> - <arg name="app_id" type="s" direction="in" /> - <arg name="parent_window" type="s" direction="in" /> - <arg name="title" type="s" direction="in" /> - <arg name="options" type="a{sv}" direction="in" /> - <arg name="response" type="u" direction="out" /> - <arg name="results" type="a{sv}" direction="out" /> - </method> - <method name="SaveFiles"> - <arg name="handle" type="o" direction="in" /> - <arg name="app_id" type="s" direction="in" /> - <arg name="parent_window" type="s" direction="in" /> - <arg name="title" type="s" direction="in" /> - <arg name="options" type="a{sv}" direction="in" /> - <arg name="response" type="u" direction="out" /> - <arg name="results" type="a{sv}" direction="out" /> - </method> - </interface> -</node>
\ No newline at end of file diff --git a/interfaces/org.freedesktop.impl.portal.Session.xml b/interfaces/org.freedesktop.impl.portal.Session.xml new file mode 100644 index 0000000..89af4c1 --- /dev/null +++ b/interfaces/org.freedesktop.impl.portal.Session.xml @@ -0,0 +1,13 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node name="/org/freedesktop/portal/desktop/session"> + <interface name="org.freedesktop.DBus.Introspectable"> + <method name="Introspect"> + <arg type="s" name="xml_data" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Session"> + <method name="Close" /> + <signal name="Closed" /> + <property type="u" name="version" access="read" /> + </interface> +</node>
\ No newline at end of file diff --git a/interfaces/org.freedesktop.impl.portal.xml b/interfaces/org.freedesktop.impl.portal.xml new file mode 100644 index 0000000..772e861 --- /dev/null +++ b/interfaces/org.freedesktop.impl.portal.xml @@ -0,0 +1,220 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node name="/org/freedesktop/portal/desktop"> + <interface name="org.freedesktop.DBus.Introspectable"> + <method name="Introspect"> + <arg type="s" name="xml_data" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.DBus.Properties"> + <method name="Get"> + <arg type="s" name="interface_name" direction="in" /> + <arg type="s" name="property_name" direction="in" /> + <arg type="v" name="value" direction="out" /> + </method> + <method name="GetAll"> + <arg type="s" name="interface_name" direction="in" /> + <arg type="a{sv}" name="properties" direction="out" /> + </method> + <method name="Set"> + <arg type="s" name="interface_name" direction="in" /> + <arg type="s" name="property_name" direction="in" /> + <arg type="v" name="value" direction="in" /> + </method> + <signal name="PropertiesChanged"> + <arg type="s" name="interface_name" /> + <arg type="a{sv}" name="changed_properties" /> + <arg type="as" name="invalidated_properties" /> + </signal> + </interface> + <interface name="org.freedesktop.impl.portal.AppChooser"> + <method name="ChooseApplication"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="as" name="choices" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + <method name="UpdateChoices"> + <arg type="o" name="handle" direction="in" /> + <arg type="as" name="choices" direction="in" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.DynamicLauncher"> + <method name="PrepareInstall"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="name" direction="in" /> + <arg type="v" name="icon_v" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + <method name="RequestInstallToken"> + <arg type="s" name="app_id" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + </method> + <property type="u" name="SupportedLauncherTypes" + access="read" /> + <property type="u" name="version" access="read" /> + </interface> + <interface name="org.freedesktop.impl.portal.FileChooser"> + <method name="OpenFile"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + <method name="SaveFile"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + <method name="SaveFiles"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Account"> + <method name="GetUserInformation"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="window" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Access"> + <method name="AccessDialog"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="s" name="subtitle" direction="in" /> + <arg type="s" name="body" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Lockdown"> + <property type="b" name="disableprinting" access="readwrite" /> + <property type="b" name="disablesavetodisk" + access="readwrite" /> + <property type="b" name="disableapplicationhandlers" + access="readwrite" /> + <property type="b" name="disablelocation" access="readwrite" /> + <property type="b" name="disablecamera" access="readwrite" /> + <property type="b" name="disablemicrophone" + access="readwrite" /> + <property type="b" name="disablesoundoutput" + access="readwrite" /> + </interface> + <interface name="org.freedesktop.impl.portal.Email"> + <method name="ComposeEmail"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Print"> + <method name="Print"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="h" name="fd" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + <method name="PreparePrint"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="parent_window" direction="in" /> + <arg type="s" name="title" direction="in" /> + <arg type="a{sv}" name="settings" direction="in" /> + <arg type="a{sv}" name="page_setup" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + <arg type="u" name="response" direction="out" /> + <arg type="a{sv}" name="results" direction="out" /> + </method> + </interface> + <interface name="org.freedesktop.impl.portal.Settings"> + <method name="ReadAll"> + <arg type="as" name="namespaces" direction="in" /> + <arg type="a{sa{sv}}" name="value" direction="out" /> + </method> + <method name="Read"> + <arg type="s" name="ns" direction="in" /> + <arg type="s" name="key" direction="in" /> + <arg type="v" name="value" direction="out" /> + </method> + <signal name="SettingChanged"> + <arg type="s" name="ns" /> + <arg type="s" name="key" /> + <arg type="v" name="value" /> + </signal> + <property type="u" name="version" access="read" /> + </interface> + <interface name="org.freedesktop.impl.portal.Inhibit"> + <method name="Inhibit"> + <arg type="o" name="handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="window" direction="in" /> + <arg type="u" name="flags" direction="in" /> + <arg type="a{sv}" name="options" direction="in" /> + </method> + <method name="CreateMonitor"> + <arg type="o" name="handle" direction="in" /> + <arg type="o" name="session_handle" direction="in" /> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="window" direction="in" /> + <arg type="u" name="response" direction="out" /> + </method> + <method name="QueryEndResponse"> + <arg type="o" name="session_handle" direction="in" /> + </method> + <signal name="StateChanged"> + <arg type="o" name="session_handle" /> + <arg type="a{sv}" name="state" /> + </signal> + </interface> + <interface name="org.freedesktop.impl.portal.Notification"> + <method name="AddNotification"> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="id" direction="in" /> + <arg type="a{sv}" name="notification" direction="in" /> + </method> + <method name="RemoveNotification"> + <arg type="s" name="app_id" direction="in" /> + <arg type="s" name="id" direction="in" /> + </method> + <signal name="ActionInvoked"> + <arg type="s" name="app_id" /> + <arg type="s" name="id" /> + <arg type="s" name="action" /> + <arg type="av" name="parameter" /> + </signal> + </interface> + <node name="session" /> +</node>
\ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afcd9fd..ea1cf18 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,18 +24,11 @@ link_directories( tde_add_executable( xdg-desktop-portal-tde AUTOMOC - SOURCES - main.cpp - portal_service.cpp - file_chooser_portal.cpp - + PortalService.cpp PortalServiceDaemon.cpp main.cpp LINK tdecore-shared - tdeio-shared - ${DBUS_TQT_LIBRARIES} - portalinterfaces-static - + tdexdgdesktopportal-shared DESTINATION ${LIBEXEC_INSTALL_DIR} ) diff --git a/src/PortalService.cpp b/src/PortalService.cpp new file mode 100644 index 0000000..47acb67 --- /dev/null +++ b/src/PortalService.cpp @@ -0,0 +1,652 @@ +/******************************************************************************* + XDG desktop portal implementation for TDE + Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com> + + This program or library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + This library 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 this library; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Improvements and feedback are welcome! +*******************************************************************************/ + +// TQt +#include <tqdbusmessage.h> +#include <tqdbusvariant.h> + +// TDE +#include <tdemessagebox.h> +#include <kdebug.h> + +// Portal +#include "PortalService.h" + +#define INTROSPECTABLE_DBUS_SRVC "org.freedesktop.DBus.Introspectable" +#define PORTAL_DBUS_SRVC "org.freedesktop.impl.portal.desktop.tde" +#define PORTAL_DBUS_PATH "/org/freedesktop/portal/desktop" + +#define FREEDESKTOP_DBUS_PROPERTIES_SRVC "org.freedesktop.DBus.Properties" + +#define PORTAL_DBUS_APPCHOOSER_SRVC "org.freedesktop.impl.portal.AppChooser" +#define PORTAL_DBUS_DYNAMICLAUNCHER_SRVC "org.freedesktop.impl.portal.DynamicLauncher" +#define PORTAL_DBUS_FILECHOOSER_SRVC "org.freedesktop.impl.portal.FileChooser" +#define PORTAL_DBUS_ACCOUNT_SRVC "org.freedesktop.impl.portal.Account" +#define PORTAL_DBUS_ACCESS_SRVC "org.freedesktop.impl.portal.Access" +#define PORTAL_DBUS_LOCKDOWN_SRVC "org.freedesktop.impl.portal.Lockdown" +#define PORTAL_DBUS_EMAIL_SRVC "org.freedesktop.impl.portal.Email" +#define PORTAL_DBUS_PRINT_SRVC "org.freedesktop.impl.portal.Print" +#define PORTAL_DBUS_SESTTINGS_SRVC "org.freedesktop.impl.portal.Settings" +#define PORTAL_DBUS_INHIBIT_SRVC "org.freedesktop.impl.portal.Inhibit" +#define PORTAL_DBUS_NOTIFICATION_SRVC "org.freedesktop.impl.portal.Notification" + +#define PORTAL_DBUS_SESSION_SRVC "org.freedesktop.impl.portal.Session" +#define PORTAL_DBUS_SESSION_PATH "/org/freedesktop/portal/desktop/session" + +PropertiesService::PropertiesService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ + +} + +PropertiesService::~PropertiesService(){ +} + +void PropertiesService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +bool PropertiesService::Get(const TQString& interface, const TQString& name, TQT_DBusVariant& value, TQT_DBusError& error) { + // do something + // get interface + // get param name from interface +// value.value = TQT_DBusData::fromUInt64(131719); +// value.signature = value.value.buildDBusSignature(); + return true; +} + +bool PropertiesService::Set(const TQString& interface, const TQString& name, const TQT_DBusVariant& value, TQT_DBusError& error) { + // do something + return true; +} + +bool PropertiesService::GetAll(const TQString& interface, TQMap< TQString, TQT_DBusVariant >& properties, TQT_DBusError& error) { + // do something + return true; +} + +bool PropertiesService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString PropertiesService::objectPath() const { + // do something + return TQString(); +} + + +/* + * Services + */ + +// // // // // // AccessService + +AccessService::AccessService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +AccessService::~AccessService(){ +} + +bool AccessService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString AccessService::objectPath() const { + // do something + return TQString(); +} + +bool AccessService::AccessDialog(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, const TQString& subtitle, + const TQString& body, const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +void AccessService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // AccountService + +AccountService::AccountService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +AccountService::~AccountService(){ +} + +bool AccountService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString AccountService::objectPath() const { + // do something + return TQString(); +} + +bool AccountService::GetUserInformation(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& window, const TQMap<TQString, TQT_DBusVariant>& options, + TQ_UINT32& response, TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +void AccountService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // AppChooserService + +AppChooserService::AppChooserService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +AppChooserService::~AppChooserService(){ +} + +bool AppChooserService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString AppChooserService::objectPath() const { + // do something + return TQString(); +} + +bool AppChooserService::ChooseApplication(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQStringList& choices, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +bool AppChooserService::UpdateChoices(const TQT_DBusObjectPath& handle, + const TQStringList& choices, TQT_DBusError& error) { + // do something + return true; +} + +void AppChooserService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // DynamicLauncherService + +DynamicLauncherService::DynamicLauncherService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +DynamicLauncherService::~DynamicLauncherService(){ +} + +bool DynamicLauncherService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString DynamicLauncherService::objectPath() const { + // do something + return TQString(); +} + +bool DynamicLauncherService::PrepareInstall(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& name, const TQT_DBusVariant& icon_v, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +bool DynamicLauncherService::RequestInstallToken(const TQString& app_id, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, TQT_DBusError& error) { + // do something + return true; +} + +void DynamicLauncherService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // EmailService + +EmailService::EmailService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +EmailService::~EmailService(){ +} + +bool EmailService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString EmailService::objectPath() const { + // do something + return TQString(); +} + +bool EmailService::ComposeEmail(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +void EmailService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // FileChooserService + +FileChooserService::FileChooserService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +FileChooserService::~FileChooserService(){ +} + +bool FileChooserService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString FileChooserService::objectPath() const { + // do something + return TQString(); +} + +bool FileChooserService::OpenFile(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +bool FileChooserService::SaveFile(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +bool FileChooserService::SaveFiles(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +void FileChooserService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // InhibitService + +InhibitService::InhibitService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +InhibitService::~InhibitService(){ +} + +bool InhibitService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString InhibitService::objectPath() const { + // do something + return TQString(); +} + +bool InhibitService::Inhibit(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& window, TQ_UINT32 flags, + const TQMap<TQString, TQT_DBusVariant>& options, TQT_DBusError& error) { + // do something + return true; +} + +bool InhibitService::CreateMonitor(const TQT_DBusObjectPath& handle, + const TQT_DBusObjectPath& session_handle, const TQString& app_id, + const TQString& window, TQ_UINT32& response, TQT_DBusError& error) { + // do something + return true; +} + +bool InhibitService::QueryEndResponse(const TQT_DBusObjectPath& session_handle, TQT_DBusError& error) { + // do something + return true; +} + +void InhibitService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // LockdownService + +LockdownService::LockdownService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +LockdownService::~LockdownService(){ +} + +bool LockdownService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString LockdownService::objectPath() const { + // do something + return TQString(); +} + +void LockdownService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + + +// // // // // // NotificationService + +NotificationService::NotificationService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +NotificationService::~NotificationService(){ +} + +bool NotificationService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString NotificationService::objectPath() const { + // do something + return TQString(); +} + +bool NotificationService::AddNotification(const TQString& app_id, const TQString& id, + const TQMap<TQString, TQT_DBusVariant>& notification, TQT_DBusError& error) { + // do something + return true; +} + +bool NotificationService::RemoveNotification(const TQString& app_id, + const TQString& id, TQT_DBusError& error) { + // do something + return true; +} + +void NotificationService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // PrintService + +PrintService::PrintService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +PrintService::~PrintService(){ +} + +bool PrintService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString PrintService::objectPath() const { + // do something + return TQString(); +} + +bool PrintService::Print(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, const TQT_DBusUnixFd& fd, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +bool PrintService::PreparePrint(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& settings, + const TQMap<TQString, TQT_DBusVariant>& page_setup, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error) { + // do something + return true; +} + +void PrintService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // SettingsService + +SettingsService::SettingsService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +SettingsService::~SettingsService(){ +} + +bool SettingsService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString SettingsService::objectPath() const { + // do something + return TQString(); +} + +bool SettingsService::ReadAll(const TQStringList& namespaces, + TQT_DBusDataMap<TQString>& value, TQT_DBusError& error) { + // do something + return true; +} + +bool SettingsService::Read(const TQString& _namespace, + const TQString& key, TQT_DBusVariant& value, TQT_DBusError& error) { + // do something + return true; +} + +void SettingsService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + + +// // // // // // SessionService + +SessionService::SessionService(TQT_DBusConnection &conn) + : m_connection(&conn) +{ +} + +SessionService::~SessionService(){ +} + +bool SessionService::handleSignalSend(const TQT_DBusMessage& reply) { + // do something + return true; +} + +TQString SessionService::objectPath() const { + // do something + return TQString(); +} + +bool SessionService::Close(TQT_DBusError& error) { + // do something + return true; +} + +void SessionService::handleMethodReply(const TQT_DBusMessage& reply) { + m_connection->send(reply); +} + +// // // // // // RootNodeService + +RootNodeService::RootNodeService(TQT_DBusConnection &connection ) +: DBusBaseNode(), mConnection(connection) +{ + addChildNode(TQString("org")); + registerObject(mConnection,TQString("/")); +} + +RootNodeService::~RootNodeService(){ +} + +TQT_DBusObjectBase* RootNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// // // // // // OrgNodeService + +OrgNodeService::OrgNodeService(TQT_DBusConnection &connection ) +: DBusBaseNode(), mConnection(connection) +{ + addChildNode(TQString("freedesktop")); + registerObject(mConnection,TQString("/org")); +} + +OrgNodeService::~OrgNodeService(){ +} + +TQT_DBusObjectBase* OrgNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// // // // // // FreeDesktopNodeService + +FreeDesktopNodeService::FreeDesktopNodeService(TQT_DBusConnection &connection ) +: DBusBaseNode(), mConnection(connection) +{ + addChildNode(TQString("portal")); + registerObject(mConnection,TQString("/org/freedesktop")); +} + +FreeDesktopNodeService::~FreeDesktopNodeService(){ +} + +TQT_DBusObjectBase* FreeDesktopNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// // // // // // PortalNodeService + +PortalNodeService::PortalNodeService(TQT_DBusConnection &conn) +: DBusBaseNode(), mConnection(conn) +{ + addChildNode(TQString("desktop")); + registerObject(mConnection,TQString("/org/freedesktop/portal")); +} + +PortalNodeService::~PortalNodeService(){ +} + +TQT_DBusObjectBase* PortalNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// // // // // // DesktopNodeService + +DesktopNodeService::DesktopNodeService(TQT_DBusConnection &conn) +: org::freedesktop::portal::desktopNode(), + mConnection(conn) +{ + addChildNode(TQString("session")); + + mInterfaces.insert(INTROSPECTABLE_DBUS_SRVC, this); + mInterfaces.insert(FREEDESKTOP_DBUS_PROPERTIES_SRVC, new PropertiesService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_APPCHOOSER_SRVC, new AppChooserService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_DYNAMICLAUNCHER_SRVC, new DynamicLauncherService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_FILECHOOSER_SRVC, new FileChooserService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_ACCOUNT_SRVC, new AccountService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_ACCESS_SRVC, new AccessService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_LOCKDOWN_SRVC, new LockdownService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_EMAIL_SRVC, new EmailService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_PRINT_SRVC, new PrintService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_SESTTINGS_SRVC, new SettingsService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_INHIBIT_SRVC, new InhibitService(mConnection)); + mInterfaces.insert(PORTAL_DBUS_NOTIFICATION_SRVC, new NotificationService(mConnection)); + // TODO implement Session handling +// mInterfaces.insert(PORTAL_DBUS_SESSION_SRVC, new SessionService(mConnection)); + registerObject(mConnection,TQString(PORTAL_DBUS_PATH)); +} + +DesktopNodeService::~DesktopNodeService(){ +} + +TQT_DBusObjectBase* DesktopNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// // // // // // SessionNodeService + +SessionNodeService::SessionNodeService(TQT_DBusConnection &conn) +: org::freedesktop::portal::desktop::sessionNode(), + mConnection(conn) +{ + mInterfaces.insert(INTROSPECTABLE_DBUS_SRVC, new SessionService(mConnection)); + registerObject(mConnection,TQString(PORTAL_DBUS_SESSION_PATH)); +} + +SessionNodeService::~SessionNodeService(){ +} + +TQT_DBusObjectBase* SessionNodeService::createInterface(const TQString& interfaceName) +{ + return (TQT_DBusObjectBase*) mInterfaces[interfaceName]; +} + +// kate: replace-tabs true; tab-width 4; indent-width 4; diff --git a/src/PortalService.h b/src/PortalService.h new file mode 100644 index 0000000..fb744bb --- /dev/null +++ b/src/PortalService.h @@ -0,0 +1,501 @@ +/******************************************************************************* + XDG desktop portal implementation for TDE + Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com> + + This program or library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + This library 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 this library; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Improvements and feedback are welcome! + *******************************************************************************/ + +#ifndef __PORTAL_SERVICE_H +#define __PORTAL_SERVICE_H + +// TQt +#include <tqdbusconnection.h> +#include <tqdbusobject.h> + +#include <tqmap.h> + +#include <printInterface.h> +#include <settingsInterface.h> +#include <notificationInterface.h> +#include <lockdownInterface.h> +#include <inhibitInterface.h> +#include <filechooserInterface.h> +#include <emailInterface.h> +#include <dynamiclauncherInterface.h> +#include <appchooserInterface.h> +#include <accountInterface.h> +#include <accessInterface.h> +#include <sessionInterface.h> + +#include <propertiesInterface.h> + +#include <desktopNode.h> +#include <dbusbaseNode.h> +#include <sessionNode.h> + +class PropertiesService: public org::freedesktop::DBus::PropertiesInterface +{ +public: + PropertiesService(TQT_DBusConnection&); + virtual ~PropertiesService(); + +protected: + bool handleSignalSend(const TQT_DBusMessage& reply); + TQString objectPath() const; + + bool Get(const TQString& interface, const TQString& name, TQT_DBusVariant& value, TQT_DBusError& error); + bool Set(const TQString& interface, const TQString& name, const TQT_DBusVariant& value, TQT_DBusError& error); + bool GetAll(const TQString& interface, TQMap<TQString, TQT_DBusVariant>& properties, TQT_DBusError& error); + +protected: + // implement sending replies + void handleMethodReply(const TQT_DBusMessage& reply); + +private: + TQT_DBusConnection *m_connection; +}; + +class AccessService: public org::freedesktop::impl::portal::AccessInterface +{ +public: + AccessService(TQT_DBusConnection&); + virtual ~AccessService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool AccessDialog(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, const TQString& subtitle, + const TQString& body, const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class AccountService: public org::freedesktop::impl::portal::AccountInterface +{ +public: + AccountService(TQT_DBusConnection&); + virtual ~AccountService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool GetUserInformation(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& window, const TQMap<TQString, TQT_DBusVariant>& options, + TQ_UINT32& response, TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class AppChooserService: public org::freedesktop::impl::portal::AppChooserInterface +{ +public: + AppChooserService(TQT_DBusConnection&); + virtual ~AppChooserService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool ChooseApplication(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQStringList& choices, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + + virtual bool UpdateChoices(const TQT_DBusObjectPath& handle, + const TQStringList& choices, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class DynamicLauncherService: public org::freedesktop::impl::portal::DynamicLauncherInterface +{ +public: + DynamicLauncherService(TQT_DBusConnection&); + virtual ~DynamicLauncherService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool PrepareInstall(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& name, const TQT_DBusVariant& icon_v, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + + virtual bool RequestInstallToken(const TQString& app_id, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class EmailService: public org::freedesktop::impl::portal::EmailInterface +{ +public: + EmailService(TQT_DBusConnection&); + virtual ~EmailService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool ComposeEmail(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class FileChooserService: public org::freedesktop::impl::portal::FileChooserInterface +{ +public: + FileChooserService(TQT_DBusConnection&); + virtual ~FileChooserService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; +protected: + virtual bool OpenFile(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + + virtual bool SaveFile(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + + virtual bool SaveFiles(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class InhibitService: public org::freedesktop::impl::portal::InhibitInterface +{ +public: + InhibitService(TQT_DBusConnection&); + virtual ~InhibitService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool Inhibit(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& window, TQ_UINT32 flags, + const TQMap<TQString, TQT_DBusVariant>& options, TQT_DBusError& error); + + virtual bool CreateMonitor(const TQT_DBusObjectPath& handle, + const TQT_DBusObjectPath& session_handle, const TQString& app_id, + const TQString& window, TQ_UINT32& response, TQT_DBusError& error); + + virtual bool QueryEndResponse(const TQT_DBusObjectPath& session_handle, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class LockdownService: public org::freedesktop::impl::portal::LockdownInterface +{ +public: + LockdownService(TQT_DBusConnection&); + virtual ~LockdownService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + + // this requires Properties as there are properties handled here + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class NotificationService: public org::freedesktop::impl::portal::NotificationInterface +{ +public: + NotificationService(TQT_DBusConnection&); + virtual ~NotificationService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool AddNotification(const TQString& app_id, const TQString& id, + const TQMap<TQString, TQT_DBusVariant>& notification, TQT_DBusError& error); + + virtual bool RemoveNotification(const TQString& app_id, const TQString& id, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class PrintService: public org::freedesktop::impl::portal::PrintInterface +{ +public: + PrintService(TQT_DBusConnection&); + virtual ~PrintService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + + virtual bool Print(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, const TQT_DBusUnixFd& fd, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + + virtual bool PreparePrint(const TQT_DBusObjectPath& handle, const TQString& app_id, + const TQString& parent_window, const TQString& title, + const TQMap<TQString, TQT_DBusVariant>& settings, + const TQMap<TQString, TQT_DBusVariant>& page_setup, + const TQMap<TQString, TQT_DBusVariant>& options, TQ_UINT32& response, + TQMap<TQString, TQT_DBusVariant>& results, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class SettingsService: public org::freedesktop::impl::portal::SettingsInterface +{ +public: + SettingsService(TQT_DBusConnection&); + virtual ~SettingsService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool ReadAll(const TQStringList& namespaces, TQT_DBusDataMap< + TQString>& value, TQT_DBusError& error); + + virtual bool Read(const TQString& _namespace, const TQString& key, TQT_DBusVariant& value, TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +class SessionService: public org::freedesktop::impl::portal::SessionInterface +{ +public: + SessionService(TQT_DBusConnection&); + virtual ~SessionService(); + +protected: + // implement methods + virtual bool handleSignalSend(const TQT_DBusMessage& reply); + virtual TQString objectPath() const; + +protected: + virtual bool Close(TQT_DBusError& error); + +protected: + // implement sending replies + virtual void handleMethodReply(const TQT_DBusMessage& reply); +private: + TQT_DBusConnection *m_connection; +}; + +/** + * RootNodeService + * Service: - + * Path : / + * Children: org + */ +class RootNodeService: public DBusBaseNode +{ +public: + RootNodeService(TQT_DBusConnection&); + virtual ~RootNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +/** + * OrgNodeService + * Service: - + * Path : /org + * Children: freedesktop + */ +class OrgNodeService: public DBusBaseNode +{ +public: + OrgNodeService(TQT_DBusConnection&); + virtual ~OrgNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +/** + * FreeDesktopNodeService + * Service: - + * Path : /org/freedesktop + * Children: portal + */ +class FreeDesktopNodeService: public DBusBaseNode +{ +public: + FreeDesktopNodeService(TQT_DBusConnection&); + virtual ~FreeDesktopNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +/** + * PortalNodeService + * Service: - + * Path : /org/freedesktop/portal + * Children: desktop + */ +class PortalNodeService: public DBusBaseNode +{ +public: + PortalNodeService(TQT_DBusConnection&); + virtual ~PortalNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +/* + * DesktopNodeService + * Service: org.freedesktop.DBus.Introspectable + * Path : /org/freedesktop/portal/desktop + * Children: session + * Interfaces: + */ +class DesktopNodeService: public org::freedesktop::portal::desktopNode +{ +public: + DesktopNodeService(TQT_DBusConnection&); + virtual ~DesktopNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +/* + * SessionNodeService + * Service: - + * Path : /org/freedesktop/portal/desktop/session + * Children: - + */ +class SessionNodeService: public org::freedesktop::portal::desktop::sessionNode +{ +public: + SessionNodeService(TQT_DBusConnection&); + virtual ~SessionNodeService(); + +protected: + virtual TQT_DBusObjectBase* createInterface(const TQString&); + +private: + TQMap<TQString, TQT_DBusObjectBase*> mInterfaces; + TQT_DBusConnection mConnection; +}; + +#endif // __DESTKOP_PORTAL_H + +// kate: replace-tabs true; tab-width 4; indent-width 4; diff --git a/src/PortalServiceDaemon.cpp b/src/PortalServiceDaemon.cpp new file mode 100644 index 0000000..4328fb8 --- /dev/null +++ b/src/PortalServiceDaemon.cpp @@ -0,0 +1,143 @@ +/* + * PortalServiceDaemon.cpp + * + * Copyright (C) 2021 Emanoil Kotsev <deloptes@gmail.com> + * + * + * This file is part of xdg portal services. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <tqtimer.h> +#include <tqdbusmessage.h> +#include <tqdbuserror.h> + +#include "PortalServiceDaemon.h" + +// path /org/freedesktop/portal/desktop +#define PORTALSERVICE_DBUS_SRVC "org.freedesktop.impl.portal.desktop.tde" + +#define DBUS_CONNECTION_TIMEOUT 4000 +#define DBUS_CONNECTION_RETRY 3 + +PortalServiceDaemon::PortalServiceDaemon() + : KUniqueApplication(), + retryCount(0) +{ + // init session connection to dbus + if (!initDBUS()) { + tqDebug("Failed to initialize the connection to DBus"); + TQTimer::singleShot(DBUS_CONNECTION_TIMEOUT, this, TQ_SLOT(slotReconnect())); + retryCount++; + } +} + +PortalServiceDaemon::~PortalServiceDaemon() +{ + // close D-Bus connection + dbusConnectionClose(); +} + +bool PortalServiceDaemon::initDBUS(){ + mConnection = TQT_DBusConnection::addConnection(TQT_DBusConnection::SessionBus, PORTALSERVICE_DBUS_SRVC); + + if ( !mConnection.isConnected() ) { + tqDebug("Failed to open connection to system message bus: " + + mConnection.lastError().message()); + return false; + } + mConnection.connect(this, TQ_SLOT(slotDbusSignal(const TQT_DBusMessage&))); + + // try to get a specific service name + if (!mConnection.requestName(PORTALSERVICE_DBUS_SRVC, TQT_DBusConnection::NoReplace)) + return false; + + // make sure we get a reply + mConnection.scheduleDispatch(); + + return true; +} + +void PortalServiceDaemon::dbusConnectionClose() { + + if(rootService) + { + delete rootService; + rootService=0; + } + if(orgService) + { + delete orgService; + orgService=0; + } + if(freedesktopService) + { + delete freedesktopService; + freedesktopService=0; + } + if(portalNodeService) + { + delete portalNodeService; + portalNodeService=0; + } + if(desktopNodeService) + { + delete desktopNodeService; + desktopNodeService=0; + } + if(sessionNodeService) + { + delete sessionNodeService; + sessionNodeService=0; + } + + if(mConnection.isConnected()) { + mConnection.disconnect(this, TQ_SLOT(slotDbusSignal(const TQT_DBusMessage&))); + mConnection.closeConnection(PORTALSERVICE_DBUS_SRVC); + } + retryCount=0; +} + +void PortalServiceDaemon::slotReconnect() { + + dbusConnectionClose(); + + if (!initDBUS()) { + if (DBUS_CONNECTION_RETRY > retryCount) { + tqFatal("Failed to initialize the connection to DBus"); + } + TQTimer::singleShot(DBUS_CONNECTION_TIMEOUT, this, TQ_SLOT(slotReconnect())); + retryCount++; + } +} + +void PortalServiceDaemon::slotDbusSignal(const TQT_DBusMessage& message) { + TQString serviceName = message[0].toString(); + if ( message.interface() == TQString("org.freedesktop.DBus") && + message.member() == TQString("NameAcquired") && + serviceName == PORTALSERVICE_DBUS_SRVC ) + { + tqDebug("TDEPortalService unique DBus name acquired: " + serviceName); + rootService = new RootNodeService(mConnection); + orgService = new OrgNodeService(mConnection); + freedesktopService = new FreeDesktopNodeService(mConnection); + portalNodeService = new PortalNodeService(mConnection); + desktopNodeService = new DesktopNodeService(mConnection); + //TODO: session needs clarification - perhaps it is registered here, via some app + tqDebug("TDEPortalService service setup done."); + } +} + +#include "PortalServiceDaemon.moc" diff --git a/src/PortalServiceDaemon.h b/src/PortalServiceDaemon.h new file mode 100644 index 0000000..473e39c --- /dev/null +++ b/src/PortalServiceDaemon.h @@ -0,0 +1,75 @@ +/* + * PortalServiceDaemon.h + * + * Copyright (C) 2021 Emanoil Kotsev <deloptes@gmail.com> + * + * + * This file is part of kdbusPortalService. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef SRC_DAEMON_PORTALSERVICEDAEMON_H_ +#define SRC_DAEMON_PORTALSERVICEDAEMON_H_ + +#include <kuniqueapplication.h> +#include <tqdbusconnection.h> +#include <tqdbusmessage.h> + +#include "PortalService.h" + +class PortalServiceDaemon : public KUniqueApplication +{ + TQ_OBJECT + +public: + PortalServiceDaemon(); + virtual ~PortalServiceDaemon(); + +private: + /*! + * This function initialise the connection to the D-Bus daemon. + * \return boolean with the result of the operation + * \retval true if successful initialised D-Bus connection + * \retval false if unsuccessful + */ + bool initDBUS(); + //! to close the connection to D-Bus + void dbusConnectionClose(); + +private: + RootNodeService *rootService; + OrgNodeService *orgService; + FreeDesktopNodeService *freedesktopService; + PortalNodeService *portalNodeService; + DesktopNodeService *desktopNodeService; + SessionNodeService *sessionNodeService; + + TQT_DBusConnection mConnection; + int retryCount; + +private slots: + /*! + * This function does a reconnect to D-Bus. + * \return void + */ + void slotReconnect(); + /*! + * This function is to process D-Bus signals. + * \return void + */ + void slotDbusSignal(const TQT_DBusMessage&); +}; + +#endif /* SRC_DAEMON_PORTALSERVICEDAEMON_H_ */ diff --git a/src/main.cpp b/src/main.cpp index 278d754..cd3c2fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ #include <tdelocale.h> // Portal -#include "portal_service.h" +#include "PortalServiceDaemon.h" static const char description[] = I18N_NOOP("TDE XDG desktop portal"); @@ -41,25 +41,24 @@ int main(int argc, char **argv) description, TDEAboutData::License_LGPL, I18N_NOOP("Copyright © 2024 Mavridis Philippe")); - TDECmdLineArgs::init(argc, argv, &about); - TDECmdLineArgs::addCmdLineOptions(options); - KUniqueApplication::addCmdLineOptions(); + TDECmdLineArgs::init( argc, argv, &about ); +// no special cmdline options are needed +// if needed uncomment and implement +// TDECmdLineArgs::addCmdLineOptions( options ); +// KUniqueApplication::addCmdLineOptions(); if (!KUniqueApplication::start()) + { + tqDebug(i18n("TDEPortalService is already running.\n").local8Bit()); return 0; + } - KUniqueApplication app; - - TQT_DBusConnection connection = TQT_DBusConnection::sessionBus(); - if (!connection.isConnected()) - tqFatal("Failed to connect to session bus!"); - - if (!connection.requestName("org.freedesktop.impl.portal.desktop.tde")) - tqFatal("Failed to register XDG portal service!"); - - TDEPortalService portal(connection); + PortalServiceDaemon app; +// not sure if we need session management for this +// if not needed uncomment +// app.disableSessionManagement(); return app.exec(); } -// kate: replace-tabs true; tab-width 4; indent-width 4;
\ No newline at end of file +// kate: replace-tabs true; tab-width 4; indent-width 4; |