diff --git a/.gitignore b/.gitignore index 86b3f9d4504863dddcfb74ded09a0c05e5445703..69fa26ba4179c6642d87a2024a1a912304e2caf2 100644 --- a/.gitignore +++ b/.gitignore @@ -140,3 +140,8 @@ clang-tidy-report.txt sonar-project.properties.save compile_commands.json +# Cmake +*.cmake +CMakeCache.txt +Testing +CMakeFiles \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f02edc630387a62f5431b7f7aebc9e5fa2345bef..0de52232451ec22ce3f535e2b711957cab2474a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.16) project(jami - VERSION 13.7.0 + VERSION 13.8.0 LANGUAGES C CXX) set(PACKAGE_NAME "Jami Daemon") set (CMAKE_CXX_STANDARD 17) @@ -772,10 +772,6 @@ else() target_link_libraries(ut_recorder ut_library) add_test(NAME recorder COMMAND ut_recorder) - add_executable(ut_connectionManager test/unitTest/connectionManager/connectionManager.cpp) - target_link_libraries(ut_connectionManager ut_library) - add_test(NAME connectionManager COMMAND ut_connectionManager) - add_executable(ut_migration test/unitTest/account_archive/migration.cpp) target_link_libraries(ut_migration ut_library) add_test(NAME migration COMMAND ut_migration) diff --git a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml index 70577b9286a997ffb24cce0462b6e712175e2329..c1643d2d843e416c52cee89f392b246f71daf87f 100644 --- a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml +++ b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml @@ -1,5 +1,6 @@ <?xml version="1.0" ?> -<node name="/cx.ring.Ring.ConfigurationManager" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> +<node name="/cx.ring.Ring.ConfigurationManager" + xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> <interface name="cx.ring.Ring.ConfigurationManager"> <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> @@ -74,23 +75,23 @@ </method> <method name="getVolatileAccountDetails" tp:name-for-bindings="getVolatileAccountDetails"> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" tp:type="String_String_Map" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" tp:type="String_String_Map" direction="out"> + <tp:docstring> Account.registrationCoarseStatus ( Coarse status like, UNREGISTERED or TRYING ) Account.registrationStatus ( Error code, like 200 (OK) or 408 (Timeout) ) Account.registrationStatusDescription ( A technical error message (from PJSIP) ) Account.lastSuccessfulRegister ( Timestamp of the last "REGISTERED" event ) Account.presenceStatus ( Published presence status ) Account.presenceNote ( Published presence note (status string) ) - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> <method name="setAccountDetails" tp:name-for-bindings="setAccountDetails"> <tp:docstring> @@ -110,16 +111,16 @@ Set if this account is currently enabled (can be used). It is only a runtime proprety with no impact on the "enabled" state of the account. </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <arg type="b" name="enable" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="enable" direction="in"> + <tp:docstring> <p>Set if enabled.</p> - </tp:docstring> - </arg> + </tp:docstring> + </arg> </method> <method name="setCredentials" tp:name-for-bindings="setCredentials"> @@ -130,875 +131,875 @@ </arg> </method> - <method name="getCredentials" tp:name-for-bindings="getCredentials"> - <arg type="s" name="accountID" direction="in"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="credentialInformation" direction="out"> - </arg> - </method> + <method name="getCredentials" tp:name-for-bindings="getCredentials"> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="credentialInformation" direction="out"> + </arg> + </method> - <method name="addAccount" tp:name-for-bindings="addAccount"> - <tp:docstring> + <method name="addAccount" tp:name-for-bindings="addAccount"> + <tp:docstring> Add a new account. When created, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. - <tp:rationale>If no details are specified, the default parameters are used.</tp:rationale> - <tp:rationale>The core tries to register the account as soon it is created.</tp:rationale> - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> - <tp:docstring> + <tp:rationale>If no details are specified, the default parameters are used.</tp:rationale> + <tp:rationale>The core tries to register the account as soon it is created.</tp:rationale> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> + <tp:docstring> The new account settings - </tp:docstring> - </arg> - <arg type="s" name="createdAccountId" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="createdAccountId" direction="out"> + <tp:docstring> A new account ID - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="exportOnRing" tp:name-for-bindings="exportOnRing"> - <tp:docstring> + <method name="exportOnRing" tp:name-for-bindings="exportOnRing"> + <tp:docstring> Export account on the DHT using the given password and generated PIN (returned through exportOnRingEnded signal). - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="password" direction="in"> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="password" direction="in"> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully. exportOnRingEnded will be trigered on completion. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="exportToFile" tp:name-for-bindings="exportToFile"> - <tp:added version="5.1.0"/> - <tp:docstring> + <method name="exportToFile" tp:name-for-bindings="exportToFile"> + <tp:added version="5.1.0"/> + <tp:docstring> Copy the account archive to the path provided in argument. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="destinationPath" direction="in"> - </arg> - <arg type="s" name="password" direction="in"> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="destinationPath" direction="in"> + </arg> + <arg type="s" name="password" direction="in"> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <signal name="exportOnRingEnded" tp:name-for-bindings="exportOnRingEnded"> - <tp:docstring> + <signal name="exportOnRingEnded" tp:name-for-bindings="exportOnRingEnded"> + <tp:docstring> Notify clients when the exportOnRing operation ended. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="i" name="status"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="i" name="status"> + <tp:docstring> Status code: 0 for success - <ul> - <li>SUCCESS = 0 everything went fine. PIN is set.</li> - <li>WRONG_PASSWORD = 1 wrong password provided.</li> - <li>NETWORK_ERROR = 2 can't publish archive on the network.</li> - </ul> - </tp:docstring> - </arg> - <arg type="s" name="PIN"> - <tp:docstring> + <ul> + <li>SUCCESS = 0 everything went fine. PIN is set.</li> + <li>WRONG_PASSWORD = 1 wrong password provided.</li> + <li>NETWORK_ERROR = 2 can't publish archive on the network.</li> + </ul> + </tp:docstring> + </arg> + <arg type="s" name="PIN"> + <tp:docstring> A PIN to show to the user to import the account from somewhere else. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <method name="revokeDevice" tp:name-for-bindings="revokeDevice"> - <tp:docstring> + <method name="revokeDevice" tp:name-for-bindings="revokeDevice"> + <tp:docstring> Revoke device attached to the given Ring account, and publish the new revocation list. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="password" direction="in"> - </arg> - <arg type="s" name="deviceId" direction="in"> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="password" direction="in"> + </arg> + <arg type="s" name="deviceId" direction="in"> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was performed successfully. - </tp:docstring> - </arg> - </method> - <signal name="deviceRevocationEnded" tp:name-for-bindings="deviceRevocationEnded"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + <signal name="deviceRevocationEnded" tp:name-for-bindings="deviceRevocationEnded"> + <tp:docstring> Notify clients when the revokeDevice operation ended. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="s" name="deviceId"> - </arg> - <arg type="i" name="status"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="s" name="deviceId"> + </arg> + <arg type="i" name="status"> + <tp:docstring> Status code: 0 for success - <ul> - <li>SUCCESS = 0 everything went fine. Device is now revoked.</li> - <li>WRONG_PASSWORD = 1 revocation failed: wrong password.</li> - <li>UNKNOWN_DEVICE = 2 revocation failed: unknown device.</li> - </ul> - </tp:docstring> - </arg> - </signal> - - <signal name="accountProfileReceived" tp:name-for-bindings="accountProfileReceived"> - <tp:docstring> + <ul> + <li>SUCCESS = 0 everything went fine. Device is now revoked.</li> + <li>WRONG_PASSWORD = 1 revocation failed: wrong password.</li> + <li>UNKNOWN_DEVICE = 2 revocation failed: unknown device.</li> + </ul> + </tp:docstring> + </arg> + </signal> + + <signal name="accountProfileReceived" tp:name-for-bindings="accountProfileReceived"> + <tp:docstring> Notify clients when a newly created account's profile is available for storage. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="s" name="displayName"> - </arg> - <arg type="s" name="photo"> - </arg> - </signal> - - <signal name="knownDevicesChanged" tp:name-for-bindings="knownDevicesChanged"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="s" name="displayName"> + </arg> + <arg type="s" name="photo"> + </arg> + </signal> + + <signal name="knownDevicesChanged" tp:name-for-bindings="knownDevicesChanged"> + <tp:docstring> Notify clients when a new device linked to this account is found. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> - <arg type="a{ss}" name="devices" tp:type="String_String_Map"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> + <arg type="a{ss}" name="devices" tp:type="String_String_Map"> + <tp:docstring> A map of device IDs with corresponding labels. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <method name="getKnownRingDevices" tp:name-for-bindings="getKnownRingDevices"> - <tp:docstring> + <method name="getKnownRingDevices" tp:name-for-bindings="getKnownRingDevices"> + <tp:docstring> Gets list of known devices for this account. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="devices" direction="out"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="devices" direction="out"> + <tp:docstring> A map of device IDs with corresponding labels. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="changeAccountPassword" tp:name-for-bindings="changeAccountPassword"> - <tp:docstring> + <method name="changeAccountPassword" tp:name-for-bindings="changeAccountPassword"> + <tp:docstring> Change the account archive password. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="oldPassword" direction="in"> - </arg> - <arg type="s" name="newPassword" direction="in"> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="oldPassword" direction="in"> + </arg> + <arg type="s" name="newPassword" direction="in"> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was successful. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="lookupName" tp:name-for-bindings="lookupName"> - <tp:docstring> + <method name="lookupName" tp:name-for-bindings="lookupName"> + <tp:docstring> Performs name lookup for the specified account (if any) or using the default nameserver. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> The account to use. If empty, use the default nameserver. - </arg> - <arg type="s" name="nameserverUri" direction="in"> + </arg> + <arg type="s" name="nameserverUri" direction="in"> The name server URI to use, considered only if accountID is empty. - </arg> - <arg type="s" name="name" direction="in"> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </arg> + <arg type="s" name="name" direction="in"> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully. registeredNameFound will be trigered on completion. - </tp:docstring> - </arg> - </method> - <method name="lookupAddress" tp:name-for-bindings="lookupAddress"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + <method name="lookupAddress" tp:name-for-bindings="lookupAddress"> + <tp:docstring> Performs address lookup for the specified account (if any) or using the default nameserver. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> The account to use. If empty, use the default nameserver. - </arg> - <arg type="s" name="nameserverUri" direction="in"> + </arg> + <arg type="s" name="nameserverUri" direction="in"> The name server URI to use, considered only if accountID is empty. - </arg> - <arg type="s" name="address" direction="in"> - <tp:docstring> + </arg> + <arg type="s" name="address" direction="in"> + <tp:docstring> Address to lookup for. Must not include spaces. - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully. registeredNameFound will be trigered on completion. False in case of operation initialization error. registeredNameFound won't be called in that case. - </tp:docstring> - </arg> - </method> - <signal name="registeredNameFound" tp:name-for-bindings="registeredNameFound"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + <signal name="registeredNameFound" tp:name-for-bindings="registeredNameFound"> + <tp:docstring> Notify clients when a new registered address-name mapping is known. If status is not success (0), requested field (name or address) is left empty. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="i" name="status"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="i" name="status"> + <tp:docstring> Status code: 0 for success - <ul> - <li>SUCCESS = 0 everything went fine. Name/address pair was found.</li> - <li>INVALID_NAME = 1 provided name is not valid.</li> - <li>NOT_FOUND = 2 everything went fine. Name/address pair was not found.</li> - <li>ERROR = 3 An error happened</li> - </ul> - </tp:docstring> - </arg> - <arg type="s" name="address"> - </arg> - <arg type="s" name="name"> - </arg> - </signal> - - <method name="registerName" tp:name-for-bindings="registerName"> - <tp:docstring> + <ul> + <li>SUCCESS = 0 everything went fine. Name/address pair was found.</li> + <li>INVALID_NAME = 1 provided name is not valid.</li> + <li>NOT_FOUND = 2 everything went fine. Name/address pair was not found.</li> + <li>ERROR = 3 An error happened</li> + </ul> + </tp:docstring> + </arg> + <arg type="s" name="address"> + </arg> + <arg type="s" name="name"> + </arg> + </signal> + + <method name="registerName" tp:name-for-bindings="registerName"> + <tp:docstring> Performs name registration with RingNS protocol for the specified account. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="password" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="password" direction="in"> + <tp:docstring> Ring account main password. - </tp:docstring> - </arg> - <arg type="s" name="name" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="name" direction="in"> + <tp:docstring> Name to register. Must be lower-case ASCII, digits or "-" or "_". - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully. nameRegistrationEnded will be trigered on completion. False in case of operation initialization error. nameRegistrationEnded won't be called in that case. - </tp:docstring> - </arg> - </method> - <signal name="nameRegistrationEnded" tp:name-for-bindings="nameRegistrationEnded"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + <signal name="nameRegistrationEnded" tp:name-for-bindings="nameRegistrationEnded"> + <tp:docstring> Notify clients when the registerName operation ended. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="i" name="status"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="i" name="status"> + <tp:docstring> Status code: 0 for success - <ul> - <li>SUCCESS = 0 everything went fine. Name is now registered.</li> - <li>WRONG_PASSWORD = 1 registration failed: wrong password.</li> - <li>INVALID_NAME = 2 registration failed: invalid name.</li> - <li>ALREADY_TAKEN = 3 registration failed: name is already taken.</li> - <li>NETWORK_ERROR = 4 registration failed: network or server error.</li> - </ul> - </tp:docstring> - </arg> - <arg type="s" name="name"> - <tp:docstring> + <ul> + <li>SUCCESS = 0 everything went fine. Name is now registered.</li> + <li>WRONG_PASSWORD = 1 registration failed: wrong password.</li> + <li>INVALID_NAME = 2 registration failed: invalid name.</li> + <li>ALREADY_TAKEN = 3 registration failed: name is already taken.</li> + <li>NETWORK_ERROR = 4 registration failed: network or server error.</li> + </ul> + </tp:docstring> + </arg> + <arg type="s" name="name"> + <tp:docstring> The name that was attempted to register. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <method name="searchUser" tp:name-for-bindings="searchUser"> - <tp:docstring> + <method name="searchUser" tp:name-for-bindings="searchUser"> + <tp:docstring> Performs name registration with RingNS protocol for the specified account. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="query" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="query" direction="in"> + <tp:docstring> Query to perform in the remote user directory. What properties are searched is server-dependant. - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the operation was initialized successfully and a corresponding signal will be triggered. - </tp:docstring> - </arg> - </method> - <signal name="userSearchEnded" tp:name-for-bindings="userSearchEnded"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + <signal name="userSearchEnded" tp:name-for-bindings="userSearchEnded"> + <tp:docstring> Notify clients when the registerName operation ended. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="i" name="status"> - </arg> - <arg type="s" name="query"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="i" name="status"> + </arg> + <arg type="s" name="query"> + <tp:docstring> The query which is answered by this signal - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> - <arg type="aa{ss}" name="result"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> + <arg type="aa{ss}" name="result"> + <tp:docstring> List of user results - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <method name="setAccountsOrder" tp:name-for-bindings="setAccountsOrder"> - <tp:docstring> + <method name="setAccountsOrder" tp:name-for-bindings="setAccountsOrder"> + <tp:docstring> Update the accounts order. <tp:rationale>When placing a call, the first registered account in the list is used.</tp:rationale> - </tp:docstring> - <arg type="s" name="order" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="order" direction="in"> + <tp:docstring> An ordered list of account IDs, delimited by '/' - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="removeAccount" tp:name-for-bindings="removeAccount"> - <tp:docstring> + <method name="removeAccount" tp:name-for-bindings="removeAccount"> + <tp:docstring> Remove an existing account. When removed, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. - </tp:docstring> - <arg type="s" name="accoundID" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accoundID" direction="in"> + <tp:docstring> The account to remove, identified by its ID - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="getAccountList" tp:name-for-bindings="getAccountList"> - <tp:docstring> + <method name="getAccountList" tp:name-for-bindings="getAccountList"> + <tp:docstring> Get a list of all created accounts, as stored by the core. - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + <tp:docstring> A list of account IDs - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="registerAllAccounts" tp:name-for-bindings="registerAllAccounts"> - <tp:docstring> + <method name="registerAllAccounts" tp:name-for-bindings="registerAllAccounts"> + <tp:docstring> Send account registration (REGISTER) for all accounts, even if they are not enabled. - </tp:docstring> - </method> + </tp:docstring> + </method> - <method name="sendRegister" tp:name-for-bindings="sendRegister"> - <tp:docstring> + <method name="sendRegister" tp:name-for-bindings="sendRegister"> + <tp:docstring> Send account registration (REGISTER) to the registrar. Register the account if enable=true, unregister if enable=false. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <arg type="b" name="enable" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="enable" direction="in"> + <tp:docstring> <p>To register, enable must be true.</p> <p>To un-register, enable must be false.</p> - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="sendTextMessage" tp:name-for-bindings="sendTextMessage"> - <arg type="s" name="accountID" direction="in"/> - <arg type="s" name="to" direction="in"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> - <arg type="a{ss}" name="payloads" direction="in"/> - <arg type="i" name="flag" direction="in"> - <tp:docstring> + <method name="sendTextMessage" tp:name-for-bindings="sendTextMessage"> + <arg type="s" name="accountID" direction="in"/> + <arg type="s" name="to" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> + <arg type="a{ss}" name="payloads" direction="in"/> + <arg type="i" name="flag" direction="in"> + <tp:docstring> The message ID. An ID of 0 means that the message was not sent, likely because one of the parameters was invalid. - </tp:docstring> - </arg> - <arg type="t" name="id" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="t" name="id" direction="out"> + <tp:docstring> The message ID. An ID of 0 means that the message was not sent, likely because one of the parameters was invalid. - </tp:docstring> - </arg> - </method> - - <method name="cancelMessage" tp:name-for-bindings="cancelMessage"> - <arg type="s" name="accountID" direction="in"/> - <arg type="t" name="id" direction="in"/> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="cancelMessage" tp:name-for-bindings="cancelMessage"> + <arg type="s" name="accountID" direction="in"/> + <arg type="t" name="id" direction="in"/> + <arg type="b" name="success" direction="out"> + <tp:docstring> Cancel pending message. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="getLastMessages" tp:name-for-bindings="getLastMessages"> - <arg type="s" name="accountID" direction="in"/> - <arg type="t" name="base_timestamp" direction="in"/> - <arg type="a(sa{ss}t)" name="messages" direction="out"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="messages"/> + <method name="getLastMessages" tp:name-for-bindings="getLastMessages"> + <arg type="s" name="accountID" direction="in"/> + <arg type="t" name="base_timestamp" direction="in"/> + <arg type="a(sa{ss}t)" name="messages" direction="out"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="messages"/> </method> - <method name="getNearbyPeers" tp:name-for-bindings="getNearbyPeers"> - <arg type="s" name="accountID" direction="in"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="result" direction="out" tp:type="String_String_Map"/> - <tp:docstring> + <method name="getNearbyPeers" tp:name-for-bindings="getNearbyPeers"> + <arg type="s" name="accountID" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="result" direction="out" tp:type="String_String_Map"/> + <tp:docstring> Get Discovered Peer Map - </tp:docstring> + </tp:docstring> </method> - <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus"> - <arg type="t" name="id" direction="in"/> - <arg type="i" name="status" direction="out"> - <tp:docstring> + <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus"> + <arg type="t" name="id" direction="in"/> + <arg type="i" name="status" direction="out"> + <tp:docstring> The message status. - <ul> - <li>UNKNOWN = 0 unknown message or message status</li> - <li>SENDING = 1 message is being sent or waiting for peer confirmation.</li> - <li>SENT = 2 message have been received from the other end.</li> - <li>READ = 3 message have been read by the peer.</li> - <li>FAILURE = 4 the message coudn't be delivered.</li> - </ul> - </tp:docstring> - </arg> - </method> - - <signal name="incomingAccountMessage" tp:name-for-bindings="incomingAccountMessage"> - <tp:added version="2.2.0"/> - <tp:docstring> + <ul> + <li>UNKNOWN = 0 unknown message or message status</li> + <li>SENDING = 1 message is being sent or waiting for peer confirmation.</li> + <li>SENT = 2 message have been received from the other end.</li> + <li>READ = 3 message have been read by the peer.</li> + <li>FAILURE = 4 the message coudn't be delivered.</li> + </ul> + </tp:docstring> + </arg> + </method> + + <signal name="incomingAccountMessage" tp:name-for-bindings="incomingAccountMessage"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a new text message has been received at the account level. - </tp:docstring> - <arg type="s" name="accountID"/> - <arg type="s" name="messageID"/> - <arg type="s" name="from"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="MapStringString"/> - <arg type="a{ss}" name="payloads"/> - </signal> - - <signal name="accountMessageStatusChanged" tp:name-for-bindings="accountMessageStatusChanged"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"/> + <arg type="s" name="messageID"/> + <arg type="s" name="from"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="MapStringString"/> + <arg type="a{ss}" name="payloads"/> + </signal> + + <signal name="accountMessageStatusChanged" tp:name-for-bindings="accountMessageStatusChanged"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients that a sent text message status have changed - </tp:docstring> - <arg type="s" name="accountID"/> - <arg type="s" name="conversationId"/> - <arg type="s" name="peer"/> - <arg type="s" name="id"/> - <arg type="i" name="status"> - <tp:docstring>The new status of the message, see getMessageStatus for possible values.</tp:docstring> - </arg> - </signal> - - <signal name="needsHost" tp:name-for-bindings="needsHost"> - <tp:added version="13.7.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"/> + <arg type="s" name="conversationId"/> + <arg type="s" name="peer"/> + <arg type="s" name="id"/> + <arg type="i" name="status"> + <tp:docstring>The new status of the message, see getMessageStatus for possible values.</tp:docstring> + </arg> + </signal> + + <signal name="needsHost" tp:name-for-bindings="needsHost"> + <tp:added version="13.7.0"/> + <tp:docstring> Notify client that a conversation needs a host for calls - </tp:docstring> - <arg type="s" name="accountId"/> - <arg type="s" name="conversationId"/> - </signal> - - <signal name="activeCallsChanged" tp:name-for-bindings="activeCallsChanged"> - <tp:added version="13.7.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId"/> + <arg type="s" name="conversationId"/> + </signal> + + <signal name="activeCallsChanged" tp:name-for-bindings="activeCallsChanged"> + <tp:added version="13.7.0"/> + <tp:docstring> Notify client that a conversation got new active calls - </tp:docstring> - <arg type="s" name="accountId"/> - <arg type="s" name="conversationId"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="VectorMapStringString"/> - <arg type="aa{ss}" name="activeCalls" direction="out"/> - </signal> - - <signal name="profileReceived" tp:name-for-bindings="profileReceived"> - <tp:added version="9.2.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId"/> + <arg type="s" name="conversationId"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="VectorMapStringString"/> + <arg type="aa{ss}" name="activeCalls" direction="out"/> + </signal> + + <signal name="profileReceived" tp:name-for-bindings="profileReceived"> + <tp:added version="9.2.0"/> + <tp:docstring> Notify clients that a vCard has been received - </tp:docstring> - <arg type="s" name="accountID"/> - <arg type="s" name="from"/> - <arg type="s" name="path"/> - </signal> + </tp:docstring> + <arg type="s" name="accountID"/> + <arg type="s" name="from"/> + <arg type="s" name="path"/> + </signal> - <method name="setIsComposing" tp:name-for-bindings="setIsComposing"> - <tp:added version="7.9.0"/> - <tp:docstring> - <p>Sends and update composing indication for a given contact/conversation</p> - </tp:docstring> - <arg type="s" name="accountId" direction="in"> - <tp:docstring> + <method name="setIsComposing" tp:name-for-bindings="setIsComposing"> + <tp:added version="7.9.0"/> + <tp:docstring> + <p>Sends and update composing indication for a given contact/conversation</p> + </tp:docstring> + <arg type="s" name="accountId" direction="in"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <arg type="s" name="conversationUri" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversationUri" direction="in"> + <tp:docstring> A conversation uri (swarm:xxxx or jami:xxxx) - </tp:docstring> - </arg> - <arg type="b" name="isComposing" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="isComposing" direction="in"> + <tp:docstring> True is the user is composing a message, false otherwise - </tp:docstring> - </arg> - </method> - - <method name="setMessageDisplayed" tp:name-for-bindings="setMessageDisplayed"> - <tp:added version="8.1.0"/> - <tp:docstring> - <p>Informs that a message have been read</p> - </tp:docstring> - <arg type="s" name="accountId" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="setMessageDisplayed" tp:name-for-bindings="setMessageDisplayed"> + <tp:added version="8.1.0"/> + <tp:docstring> + <p>Informs that a message have been read</p> + </tp:docstring> + <arg type="s" name="accountId" direction="in"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <arg type="s" name="conversationUri" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversationUri" direction="in"> + <tp:docstring> A conversation uri (swarm:xxxx or jami:xxxx) - </tp:docstring> - </arg> - <arg type="s" name="messageId" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="messageId" direction="in"> + <tp:docstring> The message ID - </tp:docstring> - </arg> - <arg type="i" name="status" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="i" name="status" direction="in"> + <tp:docstring> The message status, 3 for displayed - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> True if the message status was set, false if account, contact or message is unknown. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <signal name="composingStatusChanged" tp:name-for-bindings="composingStatusChanged"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="composingStatusChanged" tp:name-for-bindings="composingStatusChanged"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients that a message composition status changed - </tp:docstring> - <arg type="s" name="accountId"/> - <arg type="s" name="conversationId"/> - <arg type="s" name="contactId"/> - <arg type="i" name="status"> - <tp:docstring>The new status of the message, 0 for Idle, 1 for Active</tp:docstring> - </arg> - </signal> - - <method name="setVolume" tp:name-for-bindings="setVolume"> - <tp:docstring> - <p>Sets the volume using a linear scale [0,100].</p> - <tp:rationale>Pulseaudio has its own mechanism to modify application volume. This method is enabled only if the ALSA API is used.</tp:rationale> - </tp:docstring> - <arg type="s" name="device" direction="in"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId"/> + <arg type="s" name="conversationId"/> + <arg type="s" name="contactId"/> + <arg type="i" name="status"> + <tp:docstring>The new status of the message, 0 for Idle, 1 for Active</tp:docstring> + </arg> + </signal> + + <method name="setVolume" tp:name-for-bindings="setVolume"> + <tp:docstring> + <p>Sets the volume using a linear scale [0,100].</p> + <tp:rationale>Pulseaudio has its own mechanism to modify application volume. This method is enabled only if the ALSA API is used.</tp:rationale> + </tp:docstring> + <arg type="s" name="device" direction="in"> + <tp:docstring> The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="d" name="value" direction="in"> + <tp:docstring> The volume value (between 0 and 100) - </tp:docstring> - </arg> - </method> - - <method name="getVolume" tp:name-for-bindings="getVolume"> - <tp:docstring> - <p>Return the volume value of the given device on a linear scale [0,100].</p> - <tp:rationale>Only enabled if the ALSA API is used, Pulseaudio has its own mechanism to modify application volume.</tp:rationale> - </tp:docstring> - <arg type="s" name="device" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="getVolume" tp:name-for-bindings="getVolume"> + <tp:docstring> + <p>Return the volume value of the given device on a linear scale [0,100].</p> + <tp:rationale>Only enabled if the ALSA API is used, Pulseaudio has its own mechanism to modify application volume.</tp:rationale> + </tp:docstring> + <arg type="s" name="device" direction="in"> + <tp:docstring> The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="d" name="value" direction="out"> + <tp:docstring> The volume value (between 0 and 100) - </tp:docstring> - </arg> - </method> - - <signal name="volumeChanged" tp:name-for-bindings="volumeChanged"> - <tp:docstring> - <p>Notify clients of a volume level change.</p> - <p>This signal occurs only if ALSA is enabled since Pulseaudio streams are managed externally. </p> - </tp:docstring> - <arg type="s" name="device"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <signal name="volumeChanged" tp:name-for-bindings="volumeChanged"> + <tp:docstring> + <p>Notify clients of a volume level change.</p> + <p>This signal occurs only if ALSA is enabled since Pulseaudio streams are managed externally. </p> + </tp:docstring> + <arg type="s" name="device"> + <tp:docstring> The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="d" name="value"> + <tp:docstring> The new volume value - </tp:docstring> - </arg> - </signal> - - <!-- For now only expose these two options to clients --> - <method name="muteDtmf" tp:name-for-bindings="muteDtmf"> - <arg type="b" name="mute" direction="in"/> - </method> - <method name="isDtmfMuted" tp:name-for-bindings="isDtmfMuted"> - <arg type="b" name="muted" direction="out"/> - </method> - - <method name="muteCapture" tp:name-for-bindings="muteCapture"> - <arg type="b" name="mute" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + </signal> + + <!-- For now only expose these two options to clients --> + <method name="muteDtmf" tp:name-for-bindings="muteDtmf"> + <arg type="b" name="mute" direction="in"/> + </method> + <method name="isDtmfMuted" tp:name-for-bindings="isDtmfMuted"> + <arg type="b" name="muted" direction="out"/> + </method> + + <method name="muteCapture" tp:name-for-bindings="muteCapture"> + <arg type="b" name="mute" direction="in"> + <tp:docstring> True to mute audio capture, false to unmute. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="isCaptureMuted" tp:name-for-bindings="isCaptureMuted"> - <arg type="b" name="muted" direction="out"> - <tp:docstring> + <method name="isCaptureMuted" tp:name-for-bindings="isCaptureMuted"> + <arg type="b" name="muted" direction="out"> + <tp:docstring> Returns true if audio capture is muted, false otherwise. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="mutePlayback" tp:name-for-bindings="mutePlayback"> - <arg type="b" name="mute" direction="in"> - <tp:docstring> + <method name="mutePlayback" tp:name-for-bindings="mutePlayback"> + <arg type="b" name="mute" direction="in"> + <tp:docstring> True to mute audio playback, false otherwise. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="isPlaybackMuted" tp:name-for-bindings="isPlaybackMuted"> - <arg type="b" name="muted" direction="out"> - <tp:docstring> + <method name="isPlaybackMuted" tp:name-for-bindings="isPlaybackMuted"> + <arg type="b" name="muted" direction="out"> + <tp:docstring> Returns true if audio playback is muted, false otherwise. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="muteRingtone" tp:name-for-bindings="muteRingtone"> - <arg type="b" name="mute" direction="in"> - <tp:docstring> + <method name="muteRingtone" tp:name-for-bindings="muteRingtone"> + <arg type="b" name="mute" direction="in"> + <tp:docstring> True to mute ringtone, false otherwise. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <method name="isRingtoneMuted" tp:name-for-bindings="isRingtoneMuted"> - <arg type="b" name="muted" direction="out"> - <tp:docstring> + <method name="isRingtoneMuted" tp:name-for-bindings="isRingtoneMuted"> + <arg type="b" name="muted" direction="out"> + <tp:docstring> Returns true if ringtone is muted, false otherwise. - </tp:docstring> - </arg> - </method> - - <method name="getAudioManager" tp:name-for-bindings="getAudioManager"> - <arg type="s" name="api" direction="out"> - </arg> - </method> - - <method name="setAudioManager" tp:name-for-bindings="setAudioManager"> - <arg type="s" name="api" direction="in"> - </arg> - <arg type="b" name="successful" direction="out"> - </arg> - </method> - - <method name="getSupportedAudioManagers" tp:name-for-bindings="getSupportedAudioManagers"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="getAudioManager" tp:name-for-bindings="getAudioManager"> + <arg type="s" name="api" direction="out"> + </arg> + </method> + + <method name="setAudioManager" tp:name-for-bindings="setAudioManager"> + <arg type="s" name="api" direction="in"> + </arg> + <arg type="b" name="successful" direction="out"> + </arg> + </method> + + <method name="getSupportedAudioManagers" tp:name-for-bindings="getSupportedAudioManagers"> + <tp:docstring> Returns a list of compiled audio backends. - </tp:docstring> - <arg type="as" name="api" direction="out"> - </arg> - </method> - - <method name="getRecordPath" tp:name-for-bindings="getRecordPath"> - <arg type="s" name="rec" direction="out"> - </arg> - </method> - - <method name="setRecordPath" tp:name-for-bindings="setRecordPath"> - <arg type="s" name="rec" direction="in"> - </arg> - </method> - - <method name="getIsAlwaysRecording" tp:name-for-bindings="getIsAlwaysRecording"> - <arg type="b" name="res" direction="out"> - </arg> - </method> - - <method name="setIsAlwaysRecording" tp:name-for-bindings="setIsAlwaysRecording"> - <arg type="b" name="enabled" direction="in"> - </arg> - </method> - - <method name="getRecordPreview" tp:name-for-bindings="getRecordPreview"> - <arg type="b" name="res" direction="out"> - </arg> - </method> - - <method name="setRecordPreview" tp:name-for-bindings="setRecordPreview"> - <arg type="b" name="enabled" direction="in"> - </arg> - </method> - - <method name="getRecordQuality" tp:name-for-bindings="getRecordQuality"> - <arg type="i" name="res" direction="out"> - </arg> - </method> - - <method name="setRecordQuality" tp:name-for-bindings="setRecordQuality"> - <arg type="i" name="enabled" direction="in"> - </arg> - </method> - - <!-- /////////////////////// --> - - <!-- Codecs-related methods --> - - <method name="getCodecList" tp:name-for-bindings="getCodecList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/> - <arg type="au" name="list" direction="out"> - </arg> - </method> - - <method name="getCodecDetails" tp:name-for-bindings="getCodecDetails"> - <arg type="s" name="accountID" direction="in"></arg> - <arg type="u" name="codecId" direction="in"></arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> - </arg> - </method> - - <method name="setCodecDetails" tp:name-for-bindings="setCodecDetails"> - <arg type="b" name="result" direction="out"></arg> - <arg type="s" name="accountID" direction="in"></arg> - <arg type="u" name="codecId" direction="in"></arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> - </arg> - </method> - - <method name="getActiveCodecList" tp:name-for-bindings="getActiveCodecList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="au" name="list" direction="out"> - </arg> - </method> - - <method name="setActiveCodecList" tp:name-for-bindings="setActiveCodecList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="VectorUInt"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="au" name="list" direction="in"> - </arg> - </method> + </tp:docstring> + <arg type="as" name="api" direction="out"> + </arg> + </method> + + <method name="getRecordPath" tp:name-for-bindings="getRecordPath"> + <arg type="s" name="rec" direction="out"> + </arg> + </method> + + <method name="setRecordPath" tp:name-for-bindings="setRecordPath"> + <arg type="s" name="rec" direction="in"> + </arg> + </method> + + <method name="getIsAlwaysRecording" tp:name-for-bindings="getIsAlwaysRecording"> + <arg type="b" name="res" direction="out"> + </arg> + </method> + + <method name="setIsAlwaysRecording" tp:name-for-bindings="setIsAlwaysRecording"> + <arg type="b" name="enabled" direction="in"> + </arg> + </method> + + <method name="getRecordPreview" tp:name-for-bindings="getRecordPreview"> + <arg type="b" name="res" direction="out"> + </arg> + </method> + + <method name="setRecordPreview" tp:name-for-bindings="setRecordPreview"> + <arg type="b" name="enabled" direction="in"> + </arg> + </method> + + <method name="getRecordQuality" tp:name-for-bindings="getRecordQuality"> + <arg type="i" name="res" direction="out"> + </arg> + </method> + + <method name="setRecordQuality" tp:name-for-bindings="setRecordQuality"> + <arg type="i" name="enabled" direction="in"> + </arg> + </method> + + <!-- /////////////////////// --> + + <!-- Codecs-related methods --> + + <method name="getCodecList" tp:name-for-bindings="getCodecList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/> + <arg type="au" name="list" direction="out"> + </arg> + </method> + + <method name="getCodecDetails" tp:name-for-bindings="getCodecDetails"> + <arg type="s" name="accountID" direction="in"></arg> + <arg type="u" name="codecId" direction="in"></arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> + </arg> + </method> + + <method name="setCodecDetails" tp:name-for-bindings="setCodecDetails"> + <arg type="b" name="result" direction="out"></arg> + <arg type="s" name="accountID" direction="in"></arg> + <arg type="u" name="codecId" direction="in"></arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> + </arg> + </method> + + <method name="getActiveCodecList" tp:name-for-bindings="getActiveCodecList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="au" name="list" direction="out"> + </arg> + </method> + + <method name="setActiveCodecList" tp:name-for-bindings="setActiveCodecList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="VectorUInt"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="au" name="list" direction="in"> + </arg> + </method> <!-- Hardware encoding/decoding signals --> <signal name="hardwareDecodingChanged" tp:name-for-bindings="hardwareDecodingChanged"> - <arg type="b" name="state"> - <tp:docstring> + <arg type="b" name="state"> + <tp:docstring> If hardware decoding is enabled - </tp:docstring> - </arg> - <tp:docstring>Signal triggered when hardware decoding changes.</tp:docstring> + </tp:docstring> + </arg> + <tp:docstring>Signal triggered when hardware decoding changes.</tp:docstring> </signal> <signal name="hardwareEncodingChanged" tp:name-for-bindings="hardwareEncodingChanged"> - <arg type="b" name="state"> - <tp:docstring> + <arg type="b" name="state"> + <tp:docstring> If hardware encoding is enabled - </tp:docstring> - </arg> - <tp:docstring>Signal triggered when hardware encoding changes.</tp:docstring> + </tp:docstring> + </arg> + <tp:docstring>Signal triggered when hardware encoding changes.</tp:docstring> </signal> - <!-- Audio devices methods --> + <!-- Audio devices methods --> - <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> + <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> - <method name="setAudioPlugin" tp:name-for-bindings="setAudioPlugin"> - <arg type="s" name="audioPlugin" direction="in"> - </arg> - </method> + <method name="setAudioPlugin" tp:name-for-bindings="setAudioPlugin"> + <arg type="s" name="audioPlugin" direction="in"> + </arg> + </method> <signal name="audioDeviceEvent" tp:name-for-bindings="audioDeviceEvent"> - <tp:docstring>Signal triggered by changes in the detected audio devices, e.g. a headset being unplugged.</tp:docstring> + <tp:docstring>Signal triggered by changes in the detected audio devices, e.g. a headset being unplugged.</tp:docstring> </signal> - <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="setAudioOutputDevice" tp:name-for-bindings="setAudioOutputDevice"> - <arg type="i" name="index" direction="in"> - </arg> - </method> - - <method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice"> - <arg type="i" name="index" direction="in"> - </arg> - </method> - - <method name="setAudioRingtoneDevice" tp:name-for-bindings="setAudioRingtoneDevice"> - <arg type="i" name="index" direction="in"> - </arg> - </method> - - <method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - - <method name="getCurrentAudioDevicesIndex" tp:name-for-bindings="getCurrentAudioDevicesIndex"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="getAudioInputDeviceIndex" tp:name-for-bindings="getAudioInputDeviceIndex"> - <arg type="s" name="devname" direction="in"> - </arg> - <arg type="i" name="index" direction="out"> - </arg> - </method> - - <method name="getAudioOutputDeviceIndex" tp:name-for-bindings="getAudioOutputDeviceIndex"> - <arg type="s" name="devname" direction="in"> - </arg> - <arg type="i" name="index" direction="out"> - </arg> - </method> - - <method name="getCurrentAudioOutputPlugin" tp:name-for-bindings="getCurrentAudioOutputPlugin"> - <arg type="s" name="plugin" direction="out"> - </arg> - </method> + <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="setAudioOutputDevice" tp:name-for-bindings="setAudioOutputDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="setAudioRingtoneDevice" tp:name-for-bindings="setAudioRingtoneDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + + <method name="getCurrentAudioDevicesIndex" tp:name-for-bindings="getCurrentAudioDevicesIndex"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getAudioInputDeviceIndex" tp:name-for-bindings="getAudioInputDeviceIndex"> + <arg type="s" name="devname" direction="in"> + </arg> + <arg type="i" name="index" direction="out"> + </arg> + </method> + + <method name="getAudioOutputDeviceIndex" tp:name-for-bindings="getAudioOutputDeviceIndex"> + <arg type="s" name="devname" direction="in"> + </arg> + <arg type="i" name="index" direction="out"> + </arg> + </method> + + <method name="getCurrentAudioOutputPlugin" tp:name-for-bindings="getCurrentAudioOutputPlugin"> + <arg type="s" name="plugin" direction="out"> + </arg> + </method> <!-- Audio meter --> <method name="isAudioMeterActive" tp:name-for-bindings="isAudioMeterActive"> @@ -1022,1230 +1023,1256 @@ </method> <signal name="audioMeter" tp:name-for-bindings="audioMeter"> - <tp:docstring>Signal containing volume level.</tp:docstring> - <arg type="s" name="id"> - <tp:docstring>Ring buffer id.</tp:docstring> - </arg> - <arg type="d" name="level"> - <tp:docstring>RMS value for the volume. Conversion to dB can be done with dB=20*log10(level). Level is between 0 and 1.</tp:docstring> - </arg> + <tp:docstring>Signal containing volume level.</tp:docstring> + <arg type="s" name="id"> + <tp:docstring>Ring buffer id.</tp:docstring> + </arg> + <arg type="d" name="level"> + <tp:docstring>RMS value for the volume. Conversion to dB can be done with dB=20*log10(level). Level is between 0 and 1.</tp:docstring> + </arg> </signal> - <!-- General Settings Panel --> + <!-- General Settings Panel --> - <method name="getNoiseSuppressState" tp:name-for-bindings="getNoiseSuppressState"> - <tp:added version="13.5.0"/> - <arg type="s" name="state" direction="out"> - </arg> - </method> + <method name="getNoiseSuppressState" tp:name-for-bindings="getNoiseSuppressState"> + <tp:added version="13.5.0"/> + <arg type="s" name="state" direction="out"> + </arg> + </method> - <method name="setNoiseSuppressState" tp:name-for-bindings="setNoiseSuppressState"> + <method name="setNoiseSuppressState" tp:name-for-bindings="setNoiseSuppressState"> <tp:added version="13.5.0"/> <arg type="s" name="state" direction="in"> </arg> - </method> + </method> - <method name="isAgcEnabled" tp:name-for-bindings="isAgcEnabled"> - <arg type="b" name="enabled" direction="out"> - </arg> - </method> + <method name="isAgcEnabled" tp:name-for-bindings="isAgcEnabled"> + <arg type="b" name="enabled" direction="out"> + </arg> + </method> - <method name="setAgcState" tp:name-for-bindings="setAgcState"> - <arg type="b" name="enabled" direction="in"> - </arg> - </method> + <method name="setAgcState" tp:name-for-bindings="setAgcState"> + <arg type="b" name="enabled" direction="in"> + </arg> + </method> - <!-- General Settings Panel --> + <!-- General Settings Panel --> - <method name="getHistoryLimit" tp:name-for-bindings="getHistoryLimit"> - <arg type="i" name="days" direction="out"> - </arg> - </method> + <method name="getHistoryLimit" tp:name-for-bindings="getHistoryLimit"> + <arg type="i" name="days" direction="out"> + </arg> + </method> - <method name="setHistoryLimit" tp:name-for-bindings="setHistoryLimit"> - <arg type="i" name="days" direction="in"> - </arg> - </method> + <method name="setHistoryLimit" tp:name-for-bindings="setHistoryLimit"> + <arg type="i" name="days" direction="in"> + </arg> + </method> - <method name="getRingingTimeout" tp:name-for-bindings="getRingingTimeout"> - <arg type="i" name="timeout" direction="out"> - </arg> - </method> + <method name="getRingingTimeout" tp:name-for-bindings="getRingingTimeout"> + <arg type="i" name="timeout" direction="out"> + </arg> + </method> - <method name="setRingingTimeout" tp:name-for-bindings="setRingingTimeout"> - <arg type="i" name="timeout" direction="in"> - </arg> - </method> + <method name="setRingingTimeout" tp:name-for-bindings="setRingingTimeout"> + <arg type="i" name="timeout" direction="in"> + </arg> + </method> - <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> - </signal> + <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> + </signal> - <signal name="accountDetailsChanged" tp:name-for-bindings="accountDetailsChanged"> - <arg type="s" name="accountID"> - <tp:docstring> + <signal name="accountDetailsChanged" tp:name-for-bindings="accountDetailsChanged"> + <arg type="s" name="accountID"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> - <arg type="a{ss}" name="details" tp:type="String_String_Map"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> + <arg type="a{ss}" name="details" tp:type="String_String_Map"> + <tp:docstring> New persistent account details - </tp:docstring> - </arg> - </signal> - - <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> - <arg type="s" name="accountID"/> - <arg type="s" name="registrationState"/> - <arg type="i" name="registrationDetail"> - <tp:docstring> + </tp:docstring> + </arg> + </signal> + + <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> + <arg type="s" name="accountID"/> + <arg type="s" name="registrationState"/> + <arg type="i" name="registrationDetail"> + <tp:docstring> The optional account-type specific message code. 0 when not available. - </tp:docstring> - </arg> - <arg type="s" name="registrationDetailStr"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="registrationDetailStr"> + <tp:docstring> The optional account-type specific message string. Empty string when not available. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="volatileAccountDetailsChanged" tp:name-for-bindings="volatileAccountDetailsChanged"> - <arg type="s" name="accountID"> - <tp:docstring> + <signal name="volatileAccountDetailsChanged" tp:name-for-bindings="volatileAccountDetailsChanged"> + <arg type="s" name="accountID"> + <tp:docstring> The account ID - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> - <arg type="a{ss}" name="details" tp:type="String_String_Map"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="MapStringString"/> + <arg type="a{ss}" name="details" tp:type="String_String_Map"> + <tp:docstring> Account.registrationCoarseStatus ( Coarse status like, UNREGISTERED or TRYING ) Account.registrationStatus ( Error code, like 200 (OK) or 408 (Timeout) ) Account.registrationStatusDescription ( A technical error message (from PJSIP) ) Account.lastSuccessfulRegister ( Timestamp of the last "REGISTERED" event ) Account.presenceStatus ( Published presence status ) Account.presenceNote ( Published presence note (status string) ) - </tp:docstring> - </arg> - </signal> - - <signal name="stunStatusFailure" tp:name-for_bindings="stunStatusFailure"> - <arg type="s" name="reason"> - </arg> - </signal> - - <signal name="errorAlert" tp:name-for-bindings="errorAlert"> - <arg type="i" name="code"> - </arg> - </signal> - - <!-- TLS Methods --> - <method name="getSupportedTlsMethod" tp:name-for-bindings="getSupportedTlsMethod"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="getSupportedCiphers" tp:name-for-bindings="getSupportedCiphers"> - <tp:added version="2.0.0"/> - <tp:docstring> - Returns a list of supported encryption ciphers used to encrypt SIP messages. The list depends on the TLS library being used. - Only registered SIP accounts currently support setting custom ciphers. This method returns an empty list if TLS support is disabled in either pjproject or Jami. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - A SIP account id, other account IDs will be rejected. </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - A list of randomly sorted cipher names. The order may or may - not be significant depending on the SSL library being used. - </tp:docstring> - </arg> - </method> - - <method name="validateCertificate" tp:name-for-bindings="validateCertificate"> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certificate" direction="in"> - <tp:docstring> - <p>A certificate ID</p> - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - <p>A key-value list of all certificate validation</p> - The constants used as keys are defined in the "security.h" constants header file - </tp:docstring> - </arg> - </method> - - <method name="validateCertificatePath" tp:name-for-bindings="validateCertificate"> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certificatePath" direction="in"> - <tp:docstring> - <p>A certificate path.</p> - </tp:docstring> - </arg> - <arg type="s" name="privateKeyPath" direction="in"> - <tp:docstring> - <p>An optional path a the private key for the certificate</p> - </tp:docstring> - </arg> - <arg type="s" name="privateKeyPasswd" direction="in"> - <tp:docstring> - <p>An optional private key password</p> - </tp:docstring> - </arg> - <arg type="s" name="caListPath" direction="in"> - <tp:docstring> - <p>An optional path to an assumed valid ca list</p> - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - <p>A key-value list of all certificate validation</p> - The constants used as keys are defined in the "security.h" constants header file - </tp:docstring> - </arg> - </method> - - <method name="getCertificateDetails" tp:name-for-bindings="getCertificateDetails"> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certificate" direction="in"> - <tp:docstring> - <p>A certificate ID</p> - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - <p>A key-value list of all certificate details</p> + </arg> + </signal> + + <signal name="stunStatusFailure" tp:name-for_bindings="stunStatusFailure"> + <arg type="s" name="reason"> + </arg> + </signal> + + <signal name="errorAlert" tp:name-for-bindings="errorAlert"> + <arg type="i" name="code"> + </arg> + </signal> + + <!-- TLS Methods --> + <method name="getSupportedTlsMethod" tp:name-for-bindings="getSupportedTlsMethod"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getSupportedCiphers" tp:name-for-bindings="getSupportedCiphers"> + <tp:added version="2.0.0"/> + <tp:docstring> + Returns a list of supported encryption ciphers used to encrypt SIP messages. The list depends on the TLS library being used. + Only registered SIP accounts currently support setting custom ciphers. This method returns an empty list if TLS support is disabled in either pjproject or Jami. + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> + A SIP account id, other account IDs will be rejected. + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + <tp:docstring> + A list of randomly sorted cipher names. The order may or may + not be significant depending on the SSL library being used. + </tp:docstring> + </arg> + </method> + + <method name="validateCertificate" tp:name-for-bindings="validateCertificate"> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certificate" direction="in"> + <tp:docstring> + <p>A certificate ID</p> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out"> + <tp:docstring> + <p>A key-value list of all certificate validation</p> + The constants used as keys are defined in the "security.h" constants header file + </tp:docstring> + </arg> + </method> + + <method name="validateCertificatePath" tp:name-for-bindings="validateCertificate"> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certificatePath" direction="in"> + <tp:docstring> + <p>A certificate path.</p> + </tp:docstring> + </arg> + <arg type="s" name="privateKeyPath" direction="in"> + <tp:docstring> + <p>An optional path a the private key for the certificate</p> + </tp:docstring> + </arg> + <arg type="s" name="privateKeyPasswd" direction="in"> + <tp:docstring> + <p>An optional private key password</p> + </tp:docstring> + </arg> + <arg type="s" name="caListPath" direction="in"> + <tp:docstring> + <p>An optional path to an assumed valid ca list</p> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out"> + <tp:docstring> + <p>A key-value list of all certificate validation</p> The constants used as keys are defined in the "security.h" constants header file - </tp:docstring> - </arg> - </method> - - <method name="getCertificateDetailsPath" tp:name-for-bindings="getCertificateDetails"> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certificatePath" direction="in"> - <tp:docstring> - <p>A certificate path</p> - </tp:docstring> - </arg> - <arg type="s" name="privateKeyPath" direction="in"> - <tp:docstring> - <p>An optional path a the private key for the certificate</p> - </tp:docstring> - </arg> - <arg type="s" name="privateKeyPasswd" direction="in"> - <tp:docstring> - <p>An optional private key password</p> - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - <p>A key-value list of all certificate details</p> + </tp:docstring> + </arg> + </method> + + <method name="getCertificateDetails" tp:name-for-bindings="getCertificateDetails"> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certificate" direction="in"> + <tp:docstring> + <p>A certificate ID</p> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out"> + <tp:docstring> + <p>A key-value list of all certificate details</p> + The constants used as keys are defined in the "security.h" constants header file + </tp:docstring> + </arg> + </method> + + <method name="getCertificateDetailsPath" tp:name-for-bindings="getCertificateDetails"> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certificatePath" direction="in"> + <tp:docstring> + <p>A certificate path</p> + </tp:docstring> + </arg> + <arg type="s" name="privateKeyPath" direction="in"> + <tp:docstring> + <p>An optional path a the private key for the certificate</p> + </tp:docstring> + </arg> + <arg type="s" name="privateKeyPasswd" direction="in"> + <tp:docstring> + <p>An optional private key password</p> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out"> + <tp:docstring> + <p>A key-value list of all certificate details</p> The constants used as keys are defined in the "security.h" constants header file - </tp:docstring> - </arg> - </method> - - <method name="getPinnedCertificates" tp:name-for-bindings="getPinnedCertificates"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"></arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="certIds" direction="out"> - <tp:docstring> - <p>A list of all known certificate IDs</p> - </tp:docstring> - </arg> - </method> - - <method name="pinCertificate" tp:name-for-bindings="pinCertificate"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="ay" name="certificateRaw" direction="in"> - <tp:docstring> - <p>A raw certificate (PEM or DER encoded) to be pinned.</p> - </tp:docstring> - </arg> - <arg type="b" name="local" direction="in"> - <tp:docstring> - <p>True to save the certificate in the daemon local store.</p> - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="certId" direction="out"> - <tp:docstring> - <p>IDs of the pinned certificate chain (from subject to issuer) or empty string on failure.</p> - </tp:docstring> - </arg> - </method> - - <method name="unpinCertificate" tp:name-for-bindings="unpinCertificate"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certId" direction="in"> - <tp:docstring> - <p>A certificate ID to unpin.</p> - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> - <p>True if a certificate was unpinned.</p> - </tp:docstring> - </arg> - </method> - - <method name="pinCertificatePath" tp:name-for-bindings="pinCertificatePath"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certPath" direction="in"> - <tp:docstring> - <p>A certificate path to be pinned (assumed non-local).</p> - </tp:docstring> - </arg> - </method> - - <method name="unpinCertificatePath" tp:name-for-bindings="unpinCertificatePath"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"></arg> - <arg type="s" name="certPath" direction="in"> - <tp:docstring> - <p>Certificates path.</p> - </tp:docstring> - </arg> - <arg type="u" name="unpinned" direction="out"> - <tp:docstring> - <p>Number of unpinned certificates.</p> - </tp:docstring> - </arg> - </method> - - <method name="pinRemoteCertificate" tp:name-for-bindings="pinRemoteCertificate"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"> - <tp:docstring> - <p>An account ID</p> - </tp:docstring> - </arg> - <arg type="s" name="certId" direction="in"> - <tp:docstring> - <p>A certificate public key ID</p> - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> - <p>True if the search started</p> - </tp:docstring> - </arg> - </method> - - <method name="setCertificateStatus" tp:name-for-bindings="setCertificateStatus"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"> - <tp:docstring> - <p>An account ID</p> - </tp:docstring> - </arg> - <arg type="s" name="certId" direction="in"> - <tp:docstring> - <p>A certificate ID</p> - </tp:docstring> - </arg> - <arg type="s" name="status" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="getPinnedCertificates" tp:name-for-bindings="getPinnedCertificates"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"></arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="certIds" direction="out"> + <tp:docstring> + <p>A list of all known certificate IDs</p> + </tp:docstring> + </arg> + </method> + + <method name="pinCertificate" tp:name-for-bindings="pinCertificate"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="ay" name="certificateRaw" direction="in"> + <tp:docstring> + <p>A raw certificate (PEM or DER encoded) to be pinned.</p> + </tp:docstring> + </arg> + <arg type="b" name="local" direction="in"> + <tp:docstring> + <p>True to save the certificate in the daemon local store.</p> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="certId" direction="out"> + <tp:docstring> + <p>IDs of the pinned certificate chain (from subject to issuer) or empty string on failure.</p> + </tp:docstring> + </arg> + </method> + + <method name="unpinCertificate" tp:name-for-bindings="unpinCertificate"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certId" direction="in"> + <tp:docstring> + <p>A certificate ID to unpin.</p> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> + <p>True if a certificate was unpinned.</p> + </tp:docstring> + </arg> + </method> + + <method name="pinCertificatePath" tp:name-for-bindings="pinCertificatePath"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certPath" direction="in"> + <tp:docstring> + <p>A certificate path to be pinned (assumed non-local).</p> + </tp:docstring> + </arg> + </method> + + <method name="unpinCertificatePath" tp:name-for-bindings="unpinCertificatePath"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"></arg> + <arg type="s" name="certPath" direction="in"> + <tp:docstring> + <p>Certificates path.</p> + </tp:docstring> + </arg> + <arg type="u" name="unpinned" direction="out"> + <tp:docstring> + <p>Number of unpinned certificates.</p> + </tp:docstring> + </arg> + </method> + + <method name="pinRemoteCertificate" tp:name-for-bindings="pinRemoteCertificate"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"> + <tp:docstring> + <p>An account ID</p> + </tp:docstring> + </arg> + <arg type="s" name="certId" direction="in"> + <tp:docstring> + <p>A certificate public key ID</p> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> + <p>True if the search started</p> + </tp:docstring> + </arg> + </method> + + <method name="setCertificateStatus" tp:name-for-bindings="setCertificateStatus"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"> + <tp:docstring> + <p>An account ID</p> + </tp:docstring> + </arg> + <arg type="s" name="certId" direction="in"> + <tp:docstring> + <p>A certificate ID</p> + </tp:docstring> + </arg> + <arg type="s" name="status" direction="in"> + <tp:docstring> The new status of the certificate for the specified account. UNDEFINED : forget any previous certificate state for this account. ALLOWED : consider the certificate as trusted for this account. BANNED : consider the certificate as banned for this account. - </tp:docstring> - </arg> - <arg type="b" name="success" direction="out"> - <tp:docstring> - <p>True if the certificate state was successfully set.</p> - </tp:docstring> - </arg> - </method> - - <method name="getCertificatesByStatus" tp:name-for-bindings="getCertificatesByStatus"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountId" direction="in"> - <tp:docstring> - <p>An account ID</p> - </tp:docstring> - </arg> - <arg type="s" name="status" direction="in"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="b" name="success" direction="out"> + <tp:docstring> + <p>True if the certificate state was successfully set.</p> + </tp:docstring> + </arg> + </method> + + <method name="getCertificatesByStatus" tp:name-for-bindings="getCertificatesByStatus"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountId" direction="in"> + <tp:docstring> + <p>An account ID</p> + </tp:docstring> + </arg> + <arg type="s" name="status" direction="in"> + <tp:docstring> The queried certificate status. ALLOWED : trusted certificate for this account. BANNED : banned certificate for this account. - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + <tp:docstring> A list of certificate ids with the provided status - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <signal name="certificateStateChanged" tp:name-for-bindings="certificateStateChanged"> - <tp:added version="2.2.0"/> - <tp:docstring> + <signal name="certificateStateChanged" tp:name-for-bindings="certificateStateChanged"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a certificate status have changed. - </tp:docstring> - <arg type="s" name="accountId"> - </arg> - <arg type="s" name="certId"> - </arg> - <arg type="s" name="state"> - </arg> - </signal> - - <signal name="certificatePinned" tp:name-for-bindings="certificatePinned"> - <tp:added version="2.2.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId"> + </arg> + <arg type="s" name="certId"> + </arg> + <arg type="s" name="state"> + </arg> + </signal> + + <signal name="certificatePinned" tp:name-for-bindings="certificatePinned"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a certificate have been added to the store. - </tp:docstring> - <arg type="s" name="certId"> - </arg> - </signal> - - <signal name="certificatePathPinned" tp:name-for-bindings="certificatePathPinned"> - <tp:added version="2.2.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="certId"> + </arg> + </signal> + + <signal name="certificatePathPinned" tp:name-for-bindings="certificatePathPinned"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a certificate path have been added to the store. - </tp:docstring> - <arg type="s" name="path"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="path"> + <tp:docstring> Pinned path. - </tp:docstring> - </arg> - <arg type="as" name="certIds"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="as" name="certIds"> + <tp:docstring> A list of certificate ids. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="certificateExpired" tp:name-for-bindings="certificateExpired"> - <tp:added version="2.2.0"/> - <tp:docstring> + <signal name="certificateExpired" tp:name-for-bindings="certificateExpired"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a certificate expired. - </tp:docstring> - <arg type="s" name="certId"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="certId"> + <tp:docstring> A certificate id. - </tp:docstring> - </arg> - </signal> - - <method name="getTrustRequests" tp:name-for-bindings="getTrustRequests"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="requests" direction="out" > - <tp:docstring> + </tp:docstring> + </arg> + </signal> + + <method name="getTrustRequests" tp:name-for-bindings="getTrustRequests"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="requests" direction="out"> + <tp:docstring> A list of contact request details. Details: - from: account ID of sender - received: UNIX timestamp of reception date - payload: attached payload - </tp:docstring> - </arg> - </method> - - <method name="acceptTrustRequest" tp:name-for-bindings="acceptTrustRequest"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="from" direction="in"> - </arg> - <arg type="b" name="success" direction="out" tp:type="Boolean"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="acceptTrustRequest" tp:name-for-bindings="acceptTrustRequest"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="from" direction="in"> + </arg> + <arg type="b" name="success" direction="out" tp:type="Boolean"> + <tp:docstring> True if the operation succeeded. - </tp:docstring> - </arg> - </method> - - <method name="discardTrustRequest" tp:name-for-bindings="discardTrustRequest"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="from" direction="in"> - </arg> - <arg type="b" name="success" direction="out" tp:type="Boolean"> - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="discardTrustRequest" tp:name-for-bindings="discardTrustRequest"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="from" direction="in"> + </arg> + <arg type="b" name="success" direction="out" tp:type="Boolean"> + <tp:docstring> True if the operation succeeded. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <signal name="incomingTrustRequest" tp:name-for-bindings="incomingTrustRequest"> - <tp:added version="2.2.0"/> - <tp:docstring> + <signal name="incomingTrustRequest" tp:name-for-bindings="incomingTrustRequest"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a new contact request has been received. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="s" name="conversationId"> - </arg> - <arg type="s" name="from"> - </arg> - <arg type="ay" name="payload"> - </arg> - <arg type="t" name="receiveTime"> - </arg> - </signal> - - <method name="sendTrustRequest" tp:name-for-bindings="sendTrustRequest"> - <tp:added version="2.2.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="to" direction="in"> - </arg> - <arg type="ay" name="payload" direction="in"> - </arg> - </method> - - <method name="addContact" tp:name-for-bindings="addContact"> - <tp:added version="3.0.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="uri" direction="in"> - </arg> - </method> - - <method name="removeContact" tp:name-for-bindings="removeContact"> - <tp:added version="3.0.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="uri" direction="in"> - </arg> - <arg type="b" name="ban" direction="in" tp:type="Boolean"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="s" name="conversationId"> + </arg> + <arg type="s" name="from"> + </arg> + <arg type="ay" name="payload"> + </arg> + <arg type="t" name="receiveTime"> + </arg> + </signal> + + <method name="sendTrustRequest" tp:name-for-bindings="sendTrustRequest"> + <tp:added version="2.2.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="to" direction="in"> + </arg> + <arg type="ay" name="payload" direction="in"> + </arg> + </method> + + <method name="addContact" tp:name-for-bindings="addContact"> + <tp:added version="3.0.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="uri" direction="in"> + </arg> + </method> + + <method name="removeContact" tp:name-for-bindings="removeContact"> + <tp:added version="3.0.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="uri" direction="in"> + </arg> + <arg type="b" name="ban" direction="in" tp:type="Boolean"> + <tp:docstring> True if the the contact should be banned. If false, the contact is removed from the contact list (banned or not). - </tp:docstring> - </arg> - </method> - - <method name="getContactDetails" tp:name-for-bindings="getContactDetails"> - <tp:added version="3.0.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <arg type="s" name="uri" direction="in"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="contactDetails" direction="out" > - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="getContactDetails" tp:name-for-bindings="getContactDetails"> + <tp:added version="3.0.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="s" name="uri" direction="in"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="contactDetails" direction="out"> + <tp:docstring> The serialized details on given contact of given account. - </tp:docstring> - </arg> - </method> - - <method name="getContacts" tp:name-for-bindings="getContacts"> - <tp:added version="3.0.0"/> - <arg type="s" name="accountID" direction="in"> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="contacts" direction="out" > - <tp:docstring> + </tp:docstring> + </arg> + </method> + + <method name="getContacts" tp:name-for-bindings="getContacts"> + <tp:added version="3.0.0"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="contacts" direction="out"> + <tp:docstring> The list of contact information of given account. - </tp:docstring> - </arg> - </method> + </tp:docstring> + </arg> + </method> - <signal name="contactAdded" tp:name-for-bindings="contactAdded"> - <tp:added version="2.2.0"/> - <tp:docstring> + <signal name="contactAdded" tp:name-for-bindings="contactAdded"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a new contact has been added. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="s" name="uri"> - </arg> - <arg type="b" name="confirmed"> - </arg> - </signal> - - <signal name="contactRemoved" tp:name-for-bindings="contactRemoved"> - <tp:added version="2.2.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="s" name="uri"> + </arg> + <arg type="b" name="confirmed"> + </arg> + </signal> + + <signal name="contactRemoved" tp:name-for-bindings="contactRemoved"> + <tp:added version="2.2.0"/> + <tp:docstring> Notify clients that a new contact has been removed. - </tp:docstring> - <arg type="s" name="accountID"> - </arg> - <arg type="s" name="uri"> - </arg> - <arg type="b" name="banned"> - </arg> - </signal> - - <method name="getAddrFromInterfaceName" tp:name-for-bindings="getAddrFromInterfaceName"> - <arg type="s" name="interface" direction="in"> - </arg> - <arg type="s" name="address" direction="out"> - </arg> - </method> - - <method name="getAllIpInterface" tp:name-for-bindings="getAllIpInterface"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="getAllIpInterfaceByName" tp:name-for-bindings="getAllIpInterfaceByName"> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="sendFile" tp:name-for-bindings="sendFile"> - <tp:added version="10.0.0"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="filePath" direction="in"/> - <arg type="s" name="fileDisplayName" direction="in"/> - <arg type="s" name="replyTo" direction="in"/> - </method> - - <method name="fileTransferInfo" tp:name-for-bindings="fileTransferInfo"> - <tp:added version="10.0.0"/> - <arg type="u" name="dataTransferError" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="to" direction="in"/> - <arg type="s" name="fileId" direction="in"/> - <arg type="s" name="path" direction="out"/> - <arg type="x" name="totalSize" direction="out"/> - <arg type="x" name="bytesProgress" direction="out"/> - </method> - - <method name="downloadFile" tp:name-for-bindings="downloadFile"> - <tp:added version="10.1.0"/> - <arg type="b" name="result" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="interactionId" direction="in"/> - <arg type="s" name="fileId" direction="in"/> - <arg type="s" name="path" direction="in"/> - </method> - - <method name="cancelDataTransfer" tp:name-for-bindings="cancelDataTransfer"> - <tp:added version="10.0.0"/> - <arg type="u" name="dataTransferError" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="to" direction="in"/> - <arg type="s" name="fileId" direction="in"/> - </method> - - <method name="monitor" tp:name-for-bindings="monitor"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + </arg> + <arg type="s" name="uri"> + </arg> + <arg type="b" name="banned"> + </arg> + </signal> + + <method name="getAddrFromInterfaceName" tp:name-for-bindings="getAddrFromInterfaceName"> + <arg type="s" name="interface" direction="in"> + </arg> + <arg type="s" name="address" direction="out"> + </arg> + </method> + + <method name="getAllIpInterface" tp:name-for-bindings="getAllIpInterface"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getAllIpInterfaceByName" tp:name-for-bindings="getAllIpInterfaceByName"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="sendFile" tp:name-for-bindings="sendFile"> + <tp:added version="10.0.0"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="filePath" direction="in"/> + <arg type="s" name="fileDisplayName" direction="in"/> + <arg type="s" name="replyTo" direction="in"/> + </method> + + <method name="fileTransferInfo" tp:name-for-bindings="fileTransferInfo"> + <tp:added version="10.0.0"/> + <arg type="u" name="dataTransferError" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="to" direction="in"/> + <arg type="s" name="fileId" direction="in"/> + <arg type="s" name="path" direction="out"/> + <arg type="x" name="totalSize" direction="out"/> + <arg type="x" name="bytesProgress" direction="out"/> + </method> + + <method name="downloadFile" tp:name-for-bindings="downloadFile"> + <tp:added version="10.1.0"/> + <arg type="b" name="result" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="interactionId" direction="in"/> + <arg type="s" name="fileId" direction="in"/> + <arg type="s" name="path" direction="in"/> + </method> + + <method name="cancelDataTransfer" tp:name-for-bindings="cancelDataTransfer"> + <tp:added version="10.0.0"/> + <arg type="u" name="dataTransferError" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="to" direction="in"/> + <arg type="s" name="fileId" direction="in"/> + </method> + + <method name="monitor" tp:name-for-bindings="monitor"> + <tp:added version="10.0.0"/> + <tp:docstring> Monitor - </tp:docstring> - <arg type="b" name="continuous" direction="in"> - </arg> - </method> - - <method name="startConversation" tp:name-for-bindings="startConversation"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="b" name="continuous" direction="in"> + </arg> + </method> + + <method name="getConnectionList" tp:name-for-bindings="getConnectionList"> + <tp:added version="13.8.0" /> + <tp:docstring> + Get connections list + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString" /> + <arg type="aa{ss}" name="connections" direction="out"> + </arg> + </method> + + + <method name="getChannelList" tp:name-for-bindings="getChannelList"> + <tp:added version="13.8.0" /> + <tp:docstring> + Get channels list + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="connectionId" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString" /> + <arg type="aa{ss}" name="connections" direction="out"> + </arg> + </method> + + + <method name="startConversation" tp:name-for-bindings="startConversation"> + <tp:added version="10.0.0"/> + <tp:docstring> Start a new conversation - </tp:docstring> - <arg type="s" name="conversationId" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - </method> - <method name="acceptConversationRequest" tp:name-for-bindings="acceptConversationRequest"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="conversationId" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + </method> + <method name="acceptConversationRequest" tp:name-for-bindings="acceptConversationRequest"> + <tp:added version="10.0.0"/> + <tp:docstring> Accept a conversation's request - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="declineConversationRequest" tp:name-for-bindings="declineConversationRequest"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="declineConversationRequest" tp:name-for-bindings="declineConversationRequest"> + <tp:added version="10.0.0"/> + <tp:docstring> Decline a conversation's request - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="removeConversation" tp:name-for-bindings="removeConversation"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="removeConversation" tp:name-for-bindings="removeConversation"> + <tp:added version="10.0.0"/> + <tp:docstring> Remove a conversation - </tp:docstring> - <arg type="b" name="success" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="getConversations" tp:name-for-bindings="getConversations"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="b" name="success" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="getConversations" tp:name-for-bindings="getConversations"> + <tp:added version="10.0.0"/> + <tp:docstring> Get the conversation list - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="conversations" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - </method> - - <method name="getActiveCalls" tp:name-for-bindings="getActiveCalls"> - <tp:added version="13.7.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="conversations" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + </method> + + <method name="getActiveCalls" tp:name-for-bindings="getActiveCalls"> + <tp:added version="13.7.0"/> + <tp:docstring> Get the active call list per conversation - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="activeCalls" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="getConversationRequests" tp:name-for-bindings="getConversationRequests"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="activeCalls" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="getConversationRequests" tp:name-for-bindings="getConversationRequests"> + <tp:added version="10.0.0"/> + <tp:docstring> Get the conversation's requests list - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="conversations" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - </method> - - <method name="updateConversationInfos" tp:name-for-bindings="updateConversationInfos"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="conversations" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + </method> + + <method name="updateConversationInfos" tp:name-for-bindings="updateConversationInfos"> + <tp:added version="10.0.0"/> + <tp:docstring> Update conversation's infos (supported keys: title, description, avatar) - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> - <arg type="a{ss}" name="infos" direction="in"/> - </method> - - <method name="conversationInfos" tp:name-for-bindings="conversationInfos"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> + <arg type="a{ss}" name="infos" direction="in"/> + </method> + + <method name="conversationInfos" tp:name-for-bindings="conversationInfos"> + <tp:added version="10.0.0"/> + <tp:docstring> Get conversation's infos (mode, title, description, avatar) - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="infos" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="setConversationPreferences" tp:name-for-bindings="setConversationPreferences"> - <tp:added version="13.5.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="infos" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="setConversationPreferences" tp:name-for-bindings="setConversationPreferences"> + <tp:added version="13.5.0"/> + <tp:docstring> Update conversation's preferences (synced across devices) such as color, notifications, etc. - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> - <arg type="a{ss}" name="prefs" direction="in"/> - </method> - - <method name="getConversationPreferences" tp:name-for-bindings="getConversationPreferences"> - <tp:added version="13.5.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> + <arg type="a{ss}" name="prefs" direction="in"/> + </method> + + <method name="getConversationPreferences" tp:name-for-bindings="getConversationPreferences"> + <tp:added version="13.5.0"/> + <tp:docstring> Get conversation's preferences - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="prefs" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="addConversationMember" tp:name-for-bindings="addConversationMember"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="prefs" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="addConversationMember" tp:name-for-bindings="addConversationMember"> + <tp:added version="10.0.0"/> + <tp:docstring> Add a member to a conversation - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="contactUri" direction="in"/> - </method> - - <method name="removeConversationMember" tp:name-for-bindings="removeConversationMember"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="contactUri" direction="in"/> + </method> + + <method name="removeConversationMember" tp:name-for-bindings="removeConversationMember"> + <tp:added version="10.0.0"/> + <tp:docstring> Remove a member from a conversation - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="contactUri" direction="in"/> - </method> - - <method name="getConversationMembers" tp:name-for-bindings="getConversationMembers"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="contactUri" direction="in"/> + </method> + + <method name="getConversationMembers" tp:name-for-bindings="getConversationMembers"> + <tp:added version="10.0.0"/> + <tp:docstring> Get members of a conversation - </tp:docstring> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="members" direction="out"/> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - </method> - - <method name="sendMessage" tp:name-for-bindings="sendMessage"> - <tp:added version="13.6.0"/> - <tp:docstring> + </tp:docstring> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="members" direction="out"/> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + </method> + + <method name="sendMessage" tp:name-for-bindings="sendMessage"> + <tp:added version="13.6.0"/> + <tp:docstring> Add a message to a conversation. Flag: 0 = reply (if commitId is not empty), else single message 1 = edit message - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="message" direction="in"/> - <arg type="s" name="commitId" direction="in"/> - <arg type="i" name="flag" direction="in"/> - </method> - - <method name="loadConversationMessages" tp:name-for-bindings="loadConversationMessages"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="message" direction="in"/> + <arg type="s" name="commitId" direction="in"/> + <arg type="i" name="flag" direction="in"/> + </method> + + <method name="loadConversationMessages" tp:name-for-bindings="loadConversationMessages"> + <tp:added version="10.0.0"/> + <tp:docstring> Load messages from a conversation - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="fromMessage" direction="in"/> - <arg type="u" name="n" direction="in"/> - <arg type="u" name="id" direction="out"/> - </method> - - <method name="loadConversationUntil" tp:name-for-bindings="loadConversationUntil"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="fromMessage" direction="in"/> + <arg type="u" name="n" direction="in"/> + <arg type="u" name="id" direction="out"/> + </method> + + <method name="loadConversationUntil" tp:name-for-bindings="loadConversationUntil"> + <tp:added version="10.0.0"/> + <tp:docstring> Load messages from a conversation - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="fromMessage" direction="in"/> - <arg type="s" name="to" direction="in"/> - <arg type="u" name="id" direction="out"/> - </method> - - <method name="countInteractions" tp:name-for-bindings="countInteractions"> - <tp:added version="10.0.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="fromMessage" direction="in"/> + <arg type="s" name="to" direction="in"/> + <arg type="u" name="id" direction="out"/> + </method> + + <method name="countInteractions" tp:name-for-bindings="countInteractions"> + <tp:added version="10.0.0"/> + <tp:docstring> Get how many messages there is since an interaction ("" for initial commit) - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="toId" direction="in"/> - <arg type="s" name="fromId" direction="in"/> - <arg type="s" name="authorUri" direction="in"/> - <arg type="u" name="count" direction="out"/> - </method> - - <method name="searchConversation" tp:name-for-bindings="searchConversation"> - <tp:added version="13.4.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="toId" direction="in"/> + <arg type="s" name="fromId" direction="in"/> + <arg type="s" name="authorUri" direction="in"/> + <arg type="u" name="count" direction="out"/> + </method> + + <method name="searchConversation" tp:name-for-bindings="searchConversation"> + <tp:added version="13.4.0"/> + <tp:docstring> Get how many messages there is since an interaction ("" for initial commit) - </tp:docstring> - <arg type="s" name="accountId" direction="in"/> - <arg type="s" name="conversationId" direction="in"/> - <arg type="s" name="author" direction="in"/> - <arg type="s" name="lastId" direction="in"/> - <arg type="s" name="regexSearch" direction="in"/> - <arg type="s" name="type" direction="in"/> - <arg type="x" name="after" direction="in"/> - <arg type="x" name="before" direction="in"/> - <arg type="u" name="maxResult" direction="in"/> - <arg type="i" name="flag" direction="in"/> - <arg type="u" name="searchId" direction="out"/> - </method> - - <signal name="mediaParametersChanged" tp:name-for-bindings="mediaParametersChanged"> - <tp:added version="2.3.0"/> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId" direction="in"/> + <arg type="s" name="conversationId" direction="in"/> + <arg type="s" name="author" direction="in"/> + <arg type="s" name="lastId" direction="in"/> + <arg type="s" name="regexSearch" direction="in"/> + <arg type="s" name="type" direction="in"/> + <arg type="x" name="after" direction="in"/> + <arg type="x" name="before" direction="in"/> + <arg type="u" name="maxResult" direction="in"/> + <arg type="i" name="flag" direction="in"/> + <arg type="u" name="searchId" direction="out"/> + </method> + + <signal name="mediaParametersChanged" tp:name-for-bindings="mediaParametersChanged"> + <tp:added version="2.3.0"/> + <tp:docstring> Notify clients that a media parameter changed. - </tp:docstring> - <arg type="s" name="accountID"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> An account id. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <method name="connectivityChanged" tp:name-for-bindings="connectivityChanged"> - <tp:added version="2.3.0"/> - <tp:docstring> + <method name="connectivityChanged" tp:name-for-bindings="connectivityChanged"> + <tp:added version="2.3.0"/> + <tp:docstring> This notifies the daemon that the network connectivity has changed, eg: - interface has disconnected from the network - interface connected to a different network - connected interface has changed (wifi to eth) - </tp:docstring> - </method> + </tp:docstring> + </method> - <signal name="migrationEnded" tp:name-for-bindings="migrationEnded"> - <tp:added version="3.0.0"/> - <tp:docstring> + <signal name="migrationEnded" tp:name-for-bindings="migrationEnded"> + <tp:added version="3.0.0"/> + <tp:docstring> Notify clients when migration is ended. - </tp:docstring> - <arg type="s" name="accountID"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> An account id. - </tp:docstring> - </arg> - <arg type="s" name="result"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="result"> + <tp:docstring> The result of the migration. SUCCESS : account migrated. INVALID : account migration failed. - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="dataTransferEvent" tp:name-for-bindings="dataTransferEvent"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="dataTransferEvent" tp:name-for-bindings="dataTransferEvent"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a data transfer state change. - </tp:docstring> - <arg type="s" name="accountId"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="accountId"> + <tp:docstring> An account id. - </tp:docstring> - </arg> - <arg type="s" name="conversationId"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversationId"> + <tp:docstring> Conversation id (empty for non swarm) - </tp:docstring> - </arg> - <arg type="s" name="interactionId"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="interactionId"> + <tp:docstring> Interaction id (empty for non swarm) - </tp:docstring> - </arg> - <arg type="s" name="fileId"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="fileId"> + <tp:docstring> File transfer unique id. - </tp:docstring> - </arg> - <arg type="i" name="code"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="i" name="code"> + <tp:docstring> A libjami::DataTransferEventCode code - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationLoaded" tp:name-for-bindings="conversationLoaded"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="conversationLoaded" tp:name-for-bindings="conversationLoaded"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a conversation is loaded - </tp:docstring> - <arg type="u" name="id"> - <tp:docstring> + </tp:docstring> + <arg type="u" name="id"> + <tp:docstring> Id of the related loadConversationMessages's request - </tp:docstring> - </arg> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> - <arg type="aa{ss}" name="messages"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> + <arg type="aa{ss}" name="messages"> + <tp:docstring> Messages of the conversation - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="messagesFound" tp:name-for-bindings="messagesFound"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="messagesFound" tp:name-for-bindings="messagesFound"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when messages matching a regex are found - </tp:docstring> - <arg type="u" name="id"> - <tp:docstring> + </tp:docstring> + <arg type="u" name="id"> + <tp:docstring> Id of the related loadConversationMessages's request - </tp:docstring> - </arg> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> - <arg type="aa{ss}" name="messages"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out3" value="VectorMapStringString"/> + <arg type="aa{ss}" name="messages"> + <tp:docstring> Messages of the conversation - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="messageReceived" tp:name-for-bindings="messageReceived"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="messageReceived" tp:name-for-bindings="messageReceived"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a conversation receives a new message - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> - <arg type="a{ss}" name="message"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> + <arg type="a{ss}" name="message"> + <tp:docstring> The new message - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationProfileUpdated" tp:name-for-bindings="conversationProfileUpdated"> - <tp:added version="13.4.0"/> - <tp:docstring> + <signal name="conversationProfileUpdated" tp:name-for-bindings="conversationProfileUpdated"> + <tp:added version="13.4.0"/> + <tp:docstring> Notify clients when a conversation got its profile changed. - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> - <arg type="a{ss}" name="profile"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> + <arg type="a{ss}" name="profile"> + <tp:docstring> The new profile - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationRequestReceived" tp:name-for-bindings="conversationRequestReceived"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="conversationRequestReceived" tp:name-for-bindings="conversationRequestReceived"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a new conversation request is received - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> - <arg type="a{ss}" name="metadatas"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> + <arg type="a{ss}" name="metadatas"> + <tp:docstring> Informations of the request - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationRequestDeclined" tp:name-for-bindings="conversationRequestDeclined"> - <tp:added version="10.1.0"/> - <tp:docstring> + <signal name="conversationRequestDeclined" tp:name-for-bindings="conversationRequestDeclined"> + <tp:added version="10.1.0"/> + <tp:docstring> Notify clients when a new conversation request is declined - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationReady" tp:name-for-bindings="conversationReady"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="conversationReady" tp:name-for-bindings="conversationReady"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a conversation is cloned and ready - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationRemoved" tp:name-for-bindings="conversationRemoved"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="conversationRemoved" tp:name-for-bindings="conversationRemoved"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a conversation is removed - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationMemberEvent" tp:name-for-bindings="conversationMemberEvent"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="conversationMemberEvent" tp:name-for-bindings="conversationMemberEvent"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when a member is invited/added/removed/banned - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <arg type="s" name="member_uri"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="member_uri"> + <tp:docstring> The URI of the member added - </tp:docstring> - </arg> - <arg type="i" name="event"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="i" name="event"> + <tp:docstring> event: 0 = add, 1 = joins, 2 = leave, 3 = banned - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="onConversationError" tp:name-for-bindings="onConversationError"> - <tp:added version="10.0.0"/> - <tp:docstring> + <signal name="onConversationError" tp:name-for-bindings="onConversationError"> + <tp:added version="10.0.0"/> + <tp:docstring> Notify clients when an error occurs in a conversation - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <arg type="u" name="code"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="u" name="code"> + <tp:docstring> TODO - </tp:docstring> - </arg> - <arg type="s" name="what"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="what"> + <tp:docstring> The error's description - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="conversationPreferencesUpdated" tp:name-for-bindings="conversationPreferencesUpdated"> - <tp:added version="13.5.0"/> - <tp:docstring> + <signal name="conversationPreferencesUpdated" tp:name-for-bindings="conversationPreferencesUpdated"> + <tp:added version="13.5.0"/> + <tp:docstring> Notify clients when preferences for a conversation are updated - </tp:docstring> - <arg type="s" name="account_id"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="account_id"> + <tp:docstring> Account id related - </tp:docstring> - </arg> - <arg type="s" name="conversation_id"> - <tp:docstring> + </tp:docstring> + </arg> + <arg type="s" name="conversation_id"> + <tp:docstring> Conversation id - </tp:docstring> - </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> - <arg type="a{ss}" name="preferences"> - <tp:docstring> + </tp:docstring> + </arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="MapStringString"/> + <arg type="a{ss}" name="preferences"> + <tp:docstring> New preferences - </tp:docstring> - </arg> - </signal> + </tp:docstring> + </arg> + </signal> - <signal name="debugMessageReceived" tp:name-for-bindings="debugMessageReceived"> - <tp:added version="5.2.0"/> - <tp:docstring> + <signal name="debugMessageReceived" tp:name-for-bindings="debugMessageReceived"> + <tp:added version="5.2.0"/> + <tp:docstring> Notify clients when debug is outputted. - </tp:docstring> - <arg type="s" name="message"> - <tp:docstring> + </tp:docstring> + <arg type="s" name="message"> + <tp:docstring> The formatted message to be output. - </tp:docstring> - </arg> - </signal> - - <method name="setDefaultModerator" tp:name-for-bindings="setDefaultModerator"> - <tp:added version="9.9.0"/> - <arg type="s" name="accountID" direction="in"/> - <arg type="s" name="peerURI" direction="in"/> - <arg type="b" name="state" direction="in"/> - </method> - - <method name="getDefaultModerators" tp:name-for-bindings="getDefaultModerators"> - <tp:added version="9.9.0"/> - <arg type="s" name="accountID" direction="in"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - </arg> - </method> - - <method name="enableLocalModerators" tp:name-for-bindings="enableLocalModerators"> - <tp:added version="9.9.0"/> - <arg type="s" name="accountID" direction="in"/> - <arg type="b" name="isModEnabled" direction="in"/> - </method> - <method name="isLocalModeratorsEnabled" tp:name-for-bindings="isLocalModeratorsEnabled"> - <tp:added version="9.9.0"/> - <arg type="s" name="accountID" direction="in"/> - <arg type="b" name="isModEnabled" direction="out"/> - </method> - - <method name="setAllModerators" tp:name-for-bindings="setAllModerators"> - <tp:added version="9.10.0"/> - <arg type="s" name="accountID" direction="in"/> - <arg type="b" name="allModerators" direction="in"/> - </method> - <method name="isAllModerators" tp:name-for-bindings="isAllModerators"> - <tp:added version="9.10.0"/> - <arg type="s" name="accountID" direction="in"/> - <arg type="b" name="allModerators" direction="out"/> - </method> + </tp:docstring> + </arg> + </signal> + + <method name="setDefaultModerator" tp:name-for-bindings="setDefaultModerator"> + <tp:added version="9.9.0"/> + <arg type="s" name="accountID" direction="in"/> + <arg type="s" name="peerURI" direction="in"/> + <arg type="b" name="state" direction="in"/> + </method> + + <method name="getDefaultModerators" tp:name-for-bindings="getDefaultModerators"> + <tp:added version="9.9.0"/> + <arg type="s" name="accountID" direction="in"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="enableLocalModerators" tp:name-for-bindings="enableLocalModerators"> + <tp:added version="9.9.0"/> + <arg type="s" name="accountID" direction="in"/> + <arg type="b" name="isModEnabled" direction="in"/> + </method> + <method name="isLocalModeratorsEnabled" tp:name-for-bindings="isLocalModeratorsEnabled"> + <tp:added version="9.9.0"/> + <arg type="s" name="accountID" direction="in"/> + <arg type="b" name="isModEnabled" direction="out"/> + </method> + + <method name="setAllModerators" tp:name-for-bindings="setAllModerators"> + <tp:added version="9.10.0"/> + <arg type="s" name="accountID" direction="in"/> + <arg type="b" name="allModerators" direction="in"/> + </method> + <method name="isAllModerators" tp:name-for-bindings="isAllModerators"> + <tp:added version="9.10.0"/> + <arg type="s" name="accountID" direction="in"/> + <arg type="b" name="allModerators" direction="out"/> + </method> <signal name="messageSend" tp:name-for-bindings="messageSend"> - <arg type="s" name="message"> - <tp:docstring> + <arg type="s" name="message"> + <tp:docstring> Message from daemon - </tp:docstring> - </arg> - <tp:docstring>Signal triggered when a log is done in the daemon.</tp:docstring> + </tp:docstring> + </arg> + <tp:docstring>Signal triggered when a log is done in the daemon.</tp:docstring> </signal> - </interface> + </interface> </node> diff --git a/bin/dbus/dbusconfigurationmanager.hpp b/bin/dbus/dbusconfigurationmanager.hpp index 48157d4b3fc62158b2aaf4dacb0f13dcaff57977..8fddb461bfe834857a7e38674312fc7b75929c06 100644 --- a/bin/dbus/dbusconfigurationmanager.hpp +++ b/bin/dbus/dbusconfigurationmanager.hpp @@ -699,6 +699,20 @@ public: return libjami::getContactDetails(accountId, uri); } + auto + getConnectionList(const std::string& accountId, const std::string& conversationId) + -> decltype(libjami::getConnectionList(accountId, conversationId)) + { + return libjami::getConnectionList(accountId,conversationId); + } + + auto + getChannelList(const std::string& accountId, const std::string& connectionId) + -> decltype(libjami::getChannelList(accountId, connectionId)) + { + return libjami::getChannelList(accountId,connectionId); + } + auto getContacts(const std::string& accountId) -> decltype(libjami::getContacts(accountId)) diff --git a/bin/jni/configurationmanager.i b/bin/jni/configurationmanager.i index baedce8537a1e1e6a9290e186bec561ea0734e0b..fd2b7dd805a864a59d12c81367ac382dce794b70 100644 --- a/bin/jni/configurationmanager.i +++ b/bin/jni/configurationmanager.i @@ -90,6 +90,8 @@ void setAccountDetails(const std::string& accountID, const std::map<std::string, void setAccountActive(const std::string& accountID, bool active); std::map<std::string, std::string> getAccountTemplate(const std::string& accountType); void monitor(bool continuous); +std::vector<std::map<std::string, std::string>> getConnectionList(const std::string& accountId, const std::string& conversationId); +std::vector<std::map<std::string, std::string>> getChannelList(const std::string& accountId, const std::string& connectionId); std::string addAccount(const std::map<std::string, std::string>& details); void removeAccount(const std::string& accountID); std::vector<std::string> getAccountList(); diff --git a/bin/nodejs/configurationmanager.i b/bin/nodejs/configurationmanager.i index 678d90a0b513d8deeeee810457e8b7d4d6f31926..44eee9119fb21bbfd447109635742fed6d35c52e 100644 --- a/bin/nodejs/configurationmanager.i +++ b/bin/nodejs/configurationmanager.i @@ -85,6 +85,8 @@ void setAccountDetails(const std::string& accountID, const std::map<std::string, void setAccountActive(const std::string& accountID, bool active); std::map<std::string, std::string> getAccountTemplate(const std::string& accountType); void monitor(bool continuous); +std::vector<std::map<std::string, std::string>> getConnectionList(const std::string& accountId, const std::string& conversationId); +std::vector<std::map<std::string, std::string>> getChannelList(const std::string& accountId, const std::string& connectionId); std::string addAccount(const std::map<std::string, std::string>& details); void removeAccount(const std::string& accountID); std::vector<std::string> getAccountList(); diff --git a/configure.ac b/configure.ac index 330634861f404cc3d08e3d65172e7ed8b5ec3e93..234a704bb51e6046eb2f51346b78ebc1042bca29 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Jami - configure.ac dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) -AC_INIT([Jami Daemon],[13.7.0],[jami@gnu.org],[jami]) +AC_INIT([Jami Daemon],[13.8.0],[jami@gnu.org],[jami]) dnl Clear the implicit flags that default to '-g -O2', otherwise they dnl take precedence over the values we set via the diff --git a/meson.build b/meson.build index 57a9a8b661b87927afcc19a9bd620371a735c82a..856286c3e7d31bad99f499b2dc0715fd2f6b9993 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('jami-daemon', ['c', 'cpp'], - version: '13.7.0', + version: '13.8.0', license: 'GPL3+', default_options: ['cpp_std=gnu++17', 'buildtype=debugoptimized'], meson_version:'>= 0.56' diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp index d657479a615f346e7e24a91598cd4f4502fa6b64..3db4b7bde5a9df79a2ff66951dc67b5f112b9a55 100644 --- a/src/client/configurationmanager.cpp +++ b/src/client/configurationmanager.cpp @@ -97,7 +97,8 @@ validateCertificate(const std::string& accountId, const std::string& certificate { try { if (const auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - return TlsValidator {acc->certStore(), acc->certStore().getCertificate(certificate)}.getSerializedChecks(); + return TlsValidator {acc->certStore(), acc->certStore().getCertificate(certificate)} + .getSerializedChecks(); } catch (const std::runtime_error& e) { JAMI_WARN("Certificate loading failed: %s", e.what()); } @@ -113,7 +114,8 @@ validateCertificatePath(const std::string& accountId, { try { if (const auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - return TlsValidator {acc->certStore(), certificate, privateKey, privateKeyPass, caList}.getSerializedChecks(); + return TlsValidator {acc->certStore(), certificate, privateKey, privateKeyPass, caList} + .getSerializedChecks(); } catch (const std::runtime_error& e) { JAMI_WARN("Certificate loading failed: %s", e.what()); return {{Certificate::ChecksNames::EXIST, Certificate::CheckValuesNames::FAILED}}; @@ -126,7 +128,8 @@ getCertificateDetails(const std::string& accountId, const std::string& certifica { try { if (const auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - return TlsValidator {acc->certStore(), acc->certStore().getCertificate(certificate)}.getSerializedDetails(); + return TlsValidator {acc->certStore(), acc->certStore().getCertificate(certificate)} + .getSerializedDetails(); } catch (const std::runtime_error& e) { JAMI_WARN("Certificate loading failed: %s", e.what()); } @@ -456,6 +459,18 @@ monitor(bool continuous) return jami::Manager::instance().monitor(continuous); } +std::vector<std::map<std::string, std::string>> +getConnectionList(const std::string& accountId, const std::string& conversationId) +{ + return jami::Manager::instance().getConnectionList(accountId, conversationId); +} + +std::vector<std::map<std::string, std::string>> +getChannelList(const std::string& accountId, const std::string& connectionId) +{ + return jami::Manager::instance().getChannelList(accountId, connectionId); +} + void removeAccount(const std::string& accountId) { diff --git a/src/jami/configurationmanager_interface.h b/src/jami/configurationmanager_interface.h index cf23a5c2320f42da0dfcc8cbadd2cb36b174b4c3..f38a1e7e116ca297d70e101022c043134b5b78f9 100644 --- a/src/jami/configurationmanager_interface.h +++ b/src/jami/configurationmanager_interface.h @@ -65,6 +65,9 @@ LIBJAMI_PUBLIC std::map<std::string, std::string> getAccountTemplate(const std:: LIBJAMI_PUBLIC std::string addAccount(const std::map<std::string, std::string>& details, const std::string& accountID = {}); LIBJAMI_PUBLIC void monitor(bool continuous); +LIBJAMI_PUBLIC std::vector<std::map<std::string, std::string>> getConnectionList(const std::string& accountId, const std::string& conversationId); +LIBJAMI_PUBLIC std::vector<std::map<std::string, std::string>> getChannelList(const std::string& accountId, const std::string& connectionId); + LIBJAMI_PUBLIC bool exportOnRing(const std::string& accountID, const std::string& password); LIBJAMI_PUBLIC bool exportToFile(const std::string& accountID, const std::string& destinationPath, diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp index 2baf06bd686e0043f11b551a66a4b66ced1793a4..6fcc4444c2538a4e013c02b3626ba6af43bd614c 100644 --- a/src/jamidht/conversation.cpp +++ b/src/jamidht/conversation.cpp @@ -612,6 +612,7 @@ public: std::shared_ptr<TransferManager> transferManager_ {}; std::string conversationDataPath_ {}; std::string fetchedPath_ {}; + std::mutex fetchedDevicesMtx_ {}; std::set<std::string> fetchedDevices_ {}; // Manage last message displayed and status @@ -861,6 +862,12 @@ Conversation::connectivityChanged() pimpl_->swarmManager_->maintainBuckets(); } +std::vector<jami::DeviceId> +Conversation::getDeviceIdList() const +{ + return pimpl_->swarmManager_->getRoutingTable().getAllNodes(); +} + bool Conversation::hasSwarmChannel(const std::string& deviceId) { @@ -2045,5 +2052,4 @@ Conversation::currentCalls() const std::lock_guard<std::mutex> lk(pimpl_->activeCallsMtx_); return pimpl_->activeCalls_; } - } // namespace jami diff --git a/src/jamidht/conversation.h b/src/jamidht/conversation.h index 953856294d35f87b3191683a17694d6267ec046c..52cbc6bbc851e89af04df5ac35325fd2d3aa1e06 100644 --- a/src/jamidht/conversation.h +++ b/src/jamidht/conversation.h @@ -547,6 +547,11 @@ public: */ void connectivityChanged(); + /** + * @return getAllNodes() Nodes that are linked to the conversation + */ + std::vector<jami::DeviceId> getDeviceIdList() const; + private: std::shared_ptr<Conversation> shared() { diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index ea0fc7483a984ad629f3ce0001d827a9849e7286..86f68a5adbac86bd6eb28b5872c3ca46eaa24e07 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -3944,6 +3944,36 @@ JamiAccount::monitor() connectionManager_->monitor(); } +std::vector<std::map<std::string, std::string>> +JamiAccount::getConnectionList(const std::string& conversationId) +{ + std::lock_guard<std::mutex> lkCM(connManagerMtx_); + if (conversationId.empty()) { + return connectionManager_->getConnectionList(); + } else if (connectionManager_ && convModule_) { + std::vector<std::map<std::string, std::string>> connectionList; + if (auto conv = convModule_->getConversation(conversationId)) { + for (const auto& deviceId : conv->getDeviceIdList()) { + auto connections = connectionManager_->getConnectionList(deviceId); + connectionList.reserve(connectionList.size() + connections.size()); + std::move(connections.begin(), connections.end(), std::back_inserter(connectionList)); + } + } + return connectionList; + } else { + return {}; + } +} + +std::vector<std::map<std::string, std::string>> +JamiAccount::getChannelList(const std::string& connectionId) +{ + std::lock_guard<std::mutex> lkCM(connManagerMtx_); + if (!connectionManager_) + return {}; + return connectionManager_->getChannelList(connectionId); +} + void JamiAccount::sendFile(const std::string& conversationId, const std::string& path, @@ -3968,31 +3998,35 @@ JamiAccount::sendFile(const std::string& conversationId, value["sha3sum"] = fileutils::sha3File(path); value["type"] = "application/data-transfer+json"; - shared->convModule() - ->sendMessage(conversationId, - std::move(value), - replyTo, - true, - [accId = shared->getAccountID(), conversationId, tid, path]( - const std::string& commitId) { - // Create a symlink to answer to re-ask - auto filelinkPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR - + accId + DIR_SEPARATOR_STR - + "conversation_data" + DIR_SEPARATOR_STR - + conversationId + DIR_SEPARATOR_STR - + commitId + "_" + std::to_string(tid); - auto extension = fileutils::getFileExtension(path); - if (!extension.empty()) - filelinkPath += "." + extension; - if (path != filelinkPath && !fileutils::isSymLink(filelinkPath)) { - if (!fileutils::createFileLink(filelinkPath, path, true)) { - JAMI_WARNING("Cannot create symlink for file transfer {} - {}. Copy file", filelinkPath, path); - if (!fileutils::copy(path, filelinkPath)) { - JAMI_ERROR("Cannot copy file for file transfer {} - {}", filelinkPath, path); - } - } - } - }); + shared->convModule()->sendMessage( + conversationId, + std::move(value), + replyTo, + true, + [accId = shared->getAccountID(), conversationId, tid, path]( + const std::string& commitId) { + // Create a symlink to answer to re-ask + auto filelinkPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + accId + + DIR_SEPARATOR_STR + "conversation_data" + + DIR_SEPARATOR_STR + conversationId + DIR_SEPARATOR_STR + + commitId + "_" + std::to_string(tid); + auto extension = fileutils::getFileExtension(path); + if (!extension.empty()) + filelinkPath += "." + extension; + if (path != filelinkPath && !fileutils::isSymLink(filelinkPath)) { + if (!fileutils::createFileLink(filelinkPath, path, true)) { + JAMI_WARNING( + "Cannot create symlink for file transfer {} - {}. Copy file", + filelinkPath, + path); + if (!fileutils::copy(path, filelinkPath)) { + JAMI_ERROR("Cannot copy file for file transfer {} - {}", + filelinkPath, + path); + } + } + } + }); } }); } diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h index 093315e25636b12c8bb1839e9c6560964e12f6ee..9c74d49bdade4119198f6f2b8c38b5ccc566b81d 100644 --- a/src/jamidht/jamiaccount.h +++ b/src/jamidht/jamiaccount.h @@ -452,6 +452,9 @@ public: const std::pair<std::string, std::string>& message) override; void monitor(); + // conversationId optional + std::vector<std::map<std::string, std::string>> getConnectionList(const std::string& conversationId = ""); + std::vector<std::map<std::string, std::string>> getChannelList(const std::string& connectionId); // File transfer void sendFile(const std::string& conversationId, diff --git a/src/manager.cpp b/src/manager.cpp index fe89df7bc9a73ea6779105b8edc74a267baa3315..670636a7ee612a508f4d66095eb0a7d2f343ac7d 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -958,6 +958,66 @@ Manager::monitor(bool continuous) Logger::setMonitorLog(continuous); } +std::vector<std::map<std::string, std::string>> +Manager::getConnectionList(const std::string& accountId, const std::string& conversationId) +{ + std::vector<std::map<std::string, std::string>> connectionsList; + + if (accountId.empty()) { + for (const auto& account : getAllAccounts<JamiAccount>()) { + if (account->getRegistrationState() == RegistrationState::INITIALIZING) { + const auto& cnl = account->getConnectionList(conversationId); + connectionsList.insert(connectionsList.end(), cnl.begin(), cnl.end()); + } + } + } else { + auto account = getAccount(accountId); + if (account) { + if (auto acc = std::dynamic_pointer_cast<JamiAccount>(account)) { + if (acc->getRegistrationState() == RegistrationState::INITIALIZING) { + const auto& cnl = acc->getConnectionList(conversationId); + connectionsList.insert(connectionsList.end(), cnl.begin(), cnl.end()); + } + } + } + } + + return connectionsList; +} + +std::vector<std::map<std::string, std::string>> +Manager::getChannelList(const std::string& accountId, const std::string& connectionId) +{ + // if account id is empty, return all channels + // else return only for specific accountid + std::vector<std::map<std::string, std::string>> channelsList; + + if (accountId.empty()) { + for (const auto& account : getAllAccounts<JamiAccount>()) { + if (account->getRegistrationState() == RegistrationState::INITIALIZING) { + // add to channelsList all channels for this account + const auto& cnl = account->getChannelList(connectionId); + channelsList.insert(channelsList.end(), cnl.begin(), cnl.end()); + } + } + + } + + else { + // get the jamiaccount for this accountid and return its channels + auto account = getAccount(accountId); + if (account) { + if (auto acc = std::dynamic_pointer_cast<JamiAccount>(account)) { + if (acc->getRegistrationState() == RegistrationState::INITIALIZING){ + const auto& cnl = acc->getChannelList(connectionId); + channelsList.insert(channelsList.end(), cnl.begin(), cnl.end());} + } + } + } + + return channelsList; +} + bool Manager::isCurrentCall(const Call& call) const { diff --git a/src/manager.h b/src/manager.h index 3351aba0c25cc4cc4e157075e0f093d1ec7d60bf..3421fc6b49795e220b41481c3765a4ee64b41bba 100644 --- a/src/manager.h +++ b/src/manager.h @@ -137,6 +137,9 @@ public: void monitor(bool continuous); + std::vector<std::map<std::string, std::string>> getConnectionList(const std::string& accountId, const std::string& conversationId); + std::vector<std::map<std::string, std::string>> getChannelList(const std::string& accountId, const std::string& connectionId); + /** * Accessor to audiodriver. * it's multi-thread and use mutex internally diff --git a/test/meson.build b/test/meson.build index 548175d01009c3edd1ac48257e16f7e3a4be2b19..8b54f58354a4f50ac1d56b522c46a312c67ea9ef 100644 --- a/test/meson.build +++ b/test/meson.build @@ -99,17 +99,6 @@ test('conference', ut_conference, ) -ut_connection_manager = executable('ut_connection_manager', - sources: files('unitTest/connectionManager/connectionManager.cpp'), - include_directories: ut_includedirs, - dependencies: ut_dependencies, - link_with: ut_library -) -test('connection_manager', ut_connection_manager, - workdir: ut_workdir, is_parallel: false, timeout: 1800 -) - - ut_conversation = executable('ut_conversation', sources: files( 'unitTest/conversation/conversationcommon.cpp', diff --git a/test/unitTest/Makefile.am b/test/unitTest/Makefile.am index a0b8b2c0d332ab098a3f8dc0ac91524261b29eb8..e72db780bd02085456ae3367d583cfecf59f5f9f 100644 --- a/test/unitTest/Makefile.am +++ b/test/unitTest/Makefile.am @@ -145,12 +145,6 @@ ut_recorder_SOURCES = call/recorder.cpp common.cpp check_PROGRAMS += ut_conference ut_conference_SOURCES = call/conference.cpp common.cpp -# -# connectionManager -# -check_PROGRAMS += ut_connectionManager -ut_connectionManager_SOURCES = connectionManager/connectionManager.cpp common.cpp - # # fileTransfer # diff --git a/test/unitTest/connectionManager/connectionManager.cpp b/test/unitTest/connectionManager/connectionManager.cpp deleted file mode 100644 index d3b39a45006d54ca1b2466bfa10edc2503c858ef..0000000000000000000000000000000000000000 --- a/test/unitTest/connectionManager/connectionManager.cpp +++ /dev/null @@ -1,1290 +0,0 @@ -/* - * Copyright (C) 2017-2023 Savoir-faire Linux Inc. - * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#include "manager.h" -#include "jamidht/jamiaccount.h" -#include "../../test_runner.h" -#include "jami.h" -#include "account_const.h" -#include "common.h" - -#include <dhtnet/connectionmanager.h> -#include <dhtnet/multiplexed_socket.h> - -#include <cppunit/TestAssert.h> -#include <cppunit/TestFixture.h> -#include <cppunit/extensions/HelperMacros.h> - -#include <condition_variable> - -using namespace libjami::Account; -using namespace std::literals::chrono_literals; - -namespace jami { -namespace test { - -class ConnectionManagerTest : public CppUnit::TestFixture -{ -public: - ConnectionManagerTest() - { - // Init daemon - libjami::init(libjami::InitFlag(libjami::LIBJAMI_FLAG_DEBUG | libjami::LIBJAMI_FLAG_CONSOLE_LOG)); - if (not Manager::instance().initialized) - CPPUNIT_ASSERT(libjami::start("jami-sample.yml")); - } - ~ConnectionManagerTest() { libjami::fini(); } - static std::string name() { return "ConnectionManager"; } - void setUp(); - void tearDown(); - - std::string aliceId; - std::string bobId; - -private: - void testConnectDevice(); - void testAcceptConnection(); - void testMultipleChannels(); - void testMultipleChannelsOneDeclined(); - void testMultipleChannelsSameName(); - void testDeclineConnection(); - void testSendReceiveData(); - void testAcceptsICERequest(); - void testDeclineICERequest(); - void testChannelRcvShutdown(); - void testChannelSenderShutdown(); - void testCloseConnectionWith(); - void testShutdownCallbacks(); - void testFloodSocket(); - void testDestroyWhileSending(); - void testIsConnecting(); - void testCanSendBeacon(); - void testCannotSendBeacon(); - void testConnectivityChangeTriggerBeacon(); - void testOnNoBeaconTriggersShutdown(); - void testShutdownWhileNegotiating(); - - CPPUNIT_TEST_SUITE(ConnectionManagerTest); - CPPUNIT_TEST(testConnectDevice); - CPPUNIT_TEST(testAcceptConnection); - CPPUNIT_TEST(testMultipleChannels); - CPPUNIT_TEST(testMultipleChannelsOneDeclined); - CPPUNIT_TEST(testMultipleChannelsSameName); - CPPUNIT_TEST(testDeclineConnection); - CPPUNIT_TEST(testSendReceiveData); - CPPUNIT_TEST(testAcceptsICERequest); - CPPUNIT_TEST(testDeclineICERequest); - CPPUNIT_TEST(testChannelRcvShutdown); - CPPUNIT_TEST(testChannelSenderShutdown); - CPPUNIT_TEST(testCloseConnectionWith); - CPPUNIT_TEST(testShutdownCallbacks); - CPPUNIT_TEST(testFloodSocket); - CPPUNIT_TEST(testDestroyWhileSending); - CPPUNIT_TEST(testIsConnecting); - CPPUNIT_TEST(testCanSendBeacon); - CPPUNIT_TEST(testCannotSendBeacon); - CPPUNIT_TEST(testConnectivityChangeTriggerBeacon); - CPPUNIT_TEST(testOnNoBeaconTriggersShutdown); - CPPUNIT_TEST(testShutdownWhileNegotiating); - CPPUNIT_TEST_SUITE_END(); -}; - -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConnectionManagerTest, ConnectionManagerTest::name()); - -void -ConnectionManagerTest::setUp() -{ - auto actors = load_actors_and_wait_for_announcement("actors/alice-bob.yml"); - aliceId = actors["alice"]; - bobId = actors["bob"]; - - // Pin certificate from one to another certstore (because we do not perform any DHT operation in this test) - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - bobAccount->certStore().pinCertificate(aliceAccount->identity().second); - aliceAccount->certStore().pinCertificate(bobAccount->identity().second); -} - -void -ConnectionManagerTest::tearDown() -{ - wait_for_removal_of({aliceId, bobId}); -} - -void -ConnectionManagerTest::testConnectDevice() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv, cvReceive; - bool successfullyConnected = false; - bool successfullyReceive = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive, &cvReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "git://*"; - cvReceive.notify_one(); - return true; - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cvReceive.wait_for(lk, 60s, [&] { return successfullyReceive; })); - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; })); -} - -void -ConnectionManagerTest::testAcceptConnection() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "git://*"; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string& name, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket && (name == "git://*"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return successfullyReceive && successfullyConnected && receiverConnected; - })); -} - -void -ConnectionManagerTest::testMultipleChannels() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyConnected2 = false; - int receiverConnected = 0; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string&, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) - receiverConnected += 1; - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected2 = true; - } - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return successfullyConnected && successfullyConnected2 && receiverConnected == 2; - })); - CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1); -} - -void -ConnectionManagerTest::testMultipleChannelsOneDeclined() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyNotConnected = false; - bool successfullyConnected2 = false; - int receiverConnected = 0; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name) { - if (name == "git://*") - return false; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string&, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) - receiverConnected += 1; - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (!socket) - successfullyNotConnected = true; - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) - successfullyConnected2 = true; - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return successfullyNotConnected && successfullyConnected2 && receiverConnected == 1; - })); - CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1); -} - -void -ConnectionManagerTest::testMultipleChannelsSameName() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyConnected2 = false; - int receiverConnected = 0; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string&, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) - receiverConnected += 1; - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - - // We can open two sockets with the same name, it will be two different channel - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected2 = true; - } - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return successfullyConnected && successfullyConnected2 && receiverConnected == 2; - })); -} - -void -ConnectionManagerTest::testSendReceiveData() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - std::atomic_int events(0); - bool successfullyConnected = false, successfullyConnected2 = false, successfullyReceive = false, - receiverConnected = false; - const uint8_t buf_other[] = {0x64, 0x65, 0x66, 0x67}; - const uint8_t buf_test[] = {0x68, 0x69, 0x70, 0x71}; - bool dataOk = false, dataOk2 = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string&) { - successfullyReceive = true; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && (name == "test" || name == "other")) { - receiverConnected = true; - std::error_code ec; - auto res = socket->waitForData(std::chrono::milliseconds(5000), ec); - if (res == 4) { - uint8_t buf[4]; - socket->read(&buf[0], 4, ec); - if (name == "test") - dataOk = std::equal(std::begin(buf), std::end(buf), std::begin(buf_test)); - else - dataOk2 = std::equal(std::begin(buf), std::end(buf), std::begin(buf_other)); - events++; - cv.notify_one(); - } - } - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "test", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - std::error_code ec; - socket->write(&buf_test[0], 4, ec); - } - events++; - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "other", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected2 = true; - std::error_code ec; - socket->write(&buf_other[0], 4, ec); - } - events++; - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return events == 4 && successfullyReceive && successfullyConnected && successfullyConnected2 - && dataOk && dataOk2; - })); -} - -void -ConnectionManagerTest::testDeclineConnection() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string&) { - successfullyReceive = true; - return false; - }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string&, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) - receiverConnected = true; - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - cv.wait_for(lk, 30s); - CPPUNIT_ASSERT(successfullyReceive); - CPPUNIT_ASSERT(!successfullyConnected); - CPPUNIT_ASSERT(!receiverConnected); -} - -void -ConnectionManagerTest::testAcceptsICERequest() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onICERequest([&](const DeviceId&) { - successfullyReceive = true; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string& name, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket && (name == "git://*"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { - return successfullyReceive && successfullyConnected && receiverConnected; - })); -} - -void -ConnectionManagerTest::testDeclineICERequest() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onICERequest([&](const DeviceId&) { - successfullyReceive = true; - return false; - }); - - bobAccount->connectionManager().onConnectionReady( - [&receiverConnected](const DeviceId&, - const std::string& name, - std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket && (name == "git://*"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - - cv.wait_for(lk, 30s); - CPPUNIT_ASSERT(successfullyReceive); - CPPUNIT_ASSERT(!receiverConnected); - CPPUNIT_ASSERT(!successfullyConnected); -} - -void -ConnectionManagerTest::testChannelRcvShutdown() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool shutdownReceived = false; - - std::shared_ptr<dhtnet::ChannelSocket> bobSock; - - bobAccount->connectionManager().onChannelRequest( - [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId& did, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && name == "git://*" && did != bobDeviceId) { - bobSock = socket; - cv.notify_one(); - } - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - socket->onShutdown([&] { - shutdownReceived = true; - cv.notify_one(); - }); - successfullyConnected = true; - cv.notify_one(); - } - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return bobSock && successfullyConnected; })); - bobSock->shutdown(); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return shutdownReceived; })); -} - -void -ConnectionManagerTest::testChannelSenderShutdown() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable rcv, scv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - bool shutdownReceived = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "git://*"; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) { - socket->onShutdown([&] { - shutdownReceived = true; - scv.notify_one(); - }); - } - receiverConnected = socket && (name == "git://*"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - rcv.notify_one(); - socket->shutdown(); - } - }); - - rcv.wait_for(lk, 30s); - scv.wait_for(lk, 30s); - CPPUNIT_ASSERT(shutdownReceived); - CPPUNIT_ASSERT(successfullyReceive); - CPPUNIT_ASSERT(successfullyConnected); - CPPUNIT_ASSERT(receiverConnected); -} - -void -ConnectionManagerTest::testCloseConnectionWith() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - auto bobUri = bobAccount->getUsername(); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable rcv, scv; - std::atomic_int events(0); - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "git://*"; - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket) { - socket->onShutdown([&] { - events += 1; - scv.notify_one(); - }); - } - receiverConnected = socket && (name == "git://*"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - socket->onShutdown([&] { - events += 1; - scv.notify_one(); - }); - successfullyConnected = true; - rcv.notify_one(); - } - }); - - rcv.wait_for(lk, 30s); - // This should trigger onShutdown - aliceAccount->connectionManager().closeConnectionsWith(bobUri); - CPPUNIT_ASSERT(scv.wait_for(lk, 60s, [&] { - return events == 2 && successfullyReceive && successfullyConnected && receiverConnected; - })); -} - -void -ConnectionManagerTest::testShutdownCallbacks() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - auto aliceUri = aliceAccount->getUsername(); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable rcv, chan2cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive, &chan2cv](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - if (name == "1") { - successfullyReceive = true; - } else { - chan2cv.notify_one(); - // Do not return directly. Let the connection be closed - std::this_thread::sleep_for(10s); - } - return true; - }); - - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket && (name == "1"); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "1", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - rcv.notify_one(); - } - }); - // Connect first channel. This will initiate a mx sock - CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] { - return successfullyReceive && successfullyConnected && receiverConnected; - })); - - // Connect another channel, but close the connection - bool channel2NotConnected = false; - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "2", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - channel2NotConnected = !socket; - rcv.notify_one(); - }); - chan2cv.wait_for(lk, 30s); - - // This should trigger onShutdown for second callback - bobAccount->connectionManager().closeConnectionsWith(aliceUri); - CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] { return channel2NotConnected; })); -} - -void -ConnectionManagerTest::testFloodSocket() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - std::shared_ptr<dhtnet::ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3; - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "1"; - return true; - }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket != nullptr; - if (name == "1") - rcvSock1 = socket; - else if (name == "2") - rcvSock2 = socket; - else if (name == "3") - rcvSock3 = socket; - }); - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "1", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { - return successfullyReceive && successfullyConnected && receiverConnected; - })); - CPPUNIT_ASSERT(receiverConnected); - successfullyConnected = false; - receiverConnected = false; - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "2", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock2 = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; })); - successfullyConnected = false; - receiverConnected = false; - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "3", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock3 = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; })); - std::mutex mtxRcv {}; - std::string alphabet, shouldRcv, rcv1, rcv2, rcv3; - for (int i = 0; i < 100; ++i) - alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM"; - rcvSock1->setOnRecv([&](const uint8_t* buf, size_t len) { - rcv1 += std::string(buf, buf + len); - return len; - }); - rcvSock2->setOnRecv([&](const uint8_t* buf, size_t len) { - rcv2 += std::string(buf, buf + len); - return len; - }); - rcvSock3->setOnRecv([&](const uint8_t* buf, size_t len) { - rcv3 += std::string(buf, buf + len); - return len; - }); - for (uint64_t i = 0; i < alphabet.size(); ++i) { - auto send = std::string(8000, alphabet[i]); - shouldRcv += send; - std::error_code ec; - sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - CPPUNIT_ASSERT(!ec); - } - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { - return shouldRcv == rcv1 && shouldRcv == rcv2 && shouldRcv == rcv3; - })); -} - -void -ConnectionManagerTest::testDestroyWhileSending() -{ - // Same as test before, but destroy the accounts while sending. - // This test if a segfault occurs - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - bool successfullyReceive = false; - bool receiverConnected = false; - std::shared_ptr<dhtnet::ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3; - bobAccount->connectionManager().onChannelRequest( - [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&, - const std::string& name) { - successfullyReceive = name == "1"; - return true; - }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string& name, std::shared_ptr<dhtnet::ChannelSocket> socket) { - receiverConnected = socket != nullptr; - if (name == "1") - rcvSock1 = socket; - else if (name == "2") - rcvSock2 = socket; - else if (name == "3") - rcvSock3 = socket; - }); - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "1", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { - return successfullyReceive && successfullyConnected && receiverConnected; - })); - successfullyConnected = false; - receiverConnected = false; - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "2", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock2 = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; })); - successfullyConnected = false; - receiverConnected = false; - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "3", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - sendSock3 = socket; - successfullyConnected = true; - } - cv.notify_one(); - }); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; })); - std::mutex mtxRcv {}; - std::string alphabet; - for (int i = 0; i < 100; ++i) - alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM"; - rcvSock1->setOnRecv([&](const uint8_t*, size_t len) { return len; }); - rcvSock2->setOnRecv([&](const uint8_t*, size_t len) { return len; }); - rcvSock3->setOnRecv([&](const uint8_t*, size_t len) { return len; }); - for (uint64_t i = 0; i < alphabet.size(); ++i) { - auto send = std::string(8000, alphabet[i]); - std::error_code ec; - sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec); - CPPUNIT_ASSERT(!ec); - } - - // No need to wait, immediately destroy, no segfault must occurs -} - -void -ConnectionManagerTest::testIsConnecting() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false, successfullyReceive = false; - - bobAccount->connectionManager().onChannelRequest( - [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { - successfullyReceive = true; - cv.notify_one(); - std::this_thread::sleep_for(2s); - return true; - }); - - CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip")); - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - successfullyConnected = true; - } - cv.notify_one(); - }); - // connectDevice is full async, so isConnecting will be true after a few ms. - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyReceive; })); - CPPUNIT_ASSERT(aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip")); - CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; })); - std::this_thread::sleep_for( - std::chrono::milliseconds(100)); // Just to wait for the callback to finish - CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip")); -} - -void -ConnectionManagerTest::testCanSendBeacon() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - - std::shared_ptr<dhtnet::MultiplexedSocket> aliceSocket, bobSocket; - bobAccount->connectionManager().onChannelRequest( - [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string&, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && socket->name() == "sip") - bobSocket = socket->underlyingSocket(); - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - aliceSocket = socket->underlyingSocket(); - successfullyConnected = true; - } - cv.notify_one(); - }); - // connectDevice is full async, so isConnecting will be true after a few ms. - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket && successfullyConnected; })); - CPPUNIT_ASSERT(aliceSocket->canSendBeacon()); - - // Because onConnectionReady is true before version is sent, we can wait a bit - // before canSendBeacon is true. - auto start = std::chrono::steady_clock::now(); - auto aliceCanSendBeacon = false; - auto bobCanSendBeacon = false; - do { - aliceCanSendBeacon = aliceSocket->canSendBeacon(); - bobCanSendBeacon = bobSocket->canSendBeacon(); - if (!bobCanSendBeacon || !aliceCanSendBeacon) - std::this_thread::sleep_for(1s); - } while ((not bobCanSendBeacon or not aliceCanSendBeacon) - and std::chrono::steady_clock::now() - start < 5s); - - CPPUNIT_ASSERT(bobCanSendBeacon && aliceCanSendBeacon); -} - -void -ConnectionManagerTest::testCannotSendBeacon() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - - std::shared_ptr<dhtnet::MultiplexedSocket> aliceSocket, bobSocket; - bobAccount->connectionManager().onChannelRequest( - [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string&, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && socket->name() == "sip") - bobSocket = socket->underlyingSocket(); - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - aliceSocket = socket->underlyingSocket(); - successfullyConnected = true; - } - cv.notify_one(); - }); - // connectDevice is full async, so isConnecting will be true after a few ms. - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; })); - - int version = 1412; - bobSocket->setOnVersionCb([&](auto v) { - version = v; - cv.notify_one(); - }); - aliceSocket->setVersion(0); - aliceSocket->sendVersion(); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return version == 0; })); - CPPUNIT_ASSERT(!bobSocket->canSendBeacon()); -} - -void -ConnectionManagerTest::testConnectivityChangeTriggerBeacon() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - - std::shared_ptr<dhtnet::MultiplexedSocket> aliceSocket, bobSocket; - bobAccount->connectionManager().onChannelRequest( - [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string&, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && socket->name() == "sip") - bobSocket = socket->underlyingSocket(); - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - aliceSocket = socket->underlyingSocket(); - successfullyConnected = true; - } - cv.notify_one(); - }); - // connectDevice is full async, so isConnecting will be true after a few ms. - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; })); - - bool hasRequest = false; - bobSocket->setOnBeaconCb([&](auto p) { - if (p) - hasRequest = true; - cv.notify_one(); - }); - aliceAccount->connectionManager().connectivityChanged(); - CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return hasRequest; })); -} - -void -ConnectionManagerTest::testOnNoBeaconTriggersShutdown() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyConnected = false; - - std::shared_ptr<dhtnet::MultiplexedSocket> aliceSocket, bobSocket; - bobAccount->connectionManager().onChannelRequest( - [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; }); - bobAccount->connectionManager().onConnectionReady( - [&](const DeviceId&, const std::string&, std::shared_ptr<dhtnet::ChannelSocket> socket) { - if (socket && socket->name() == "sip") - bobSocket = socket->underlyingSocket(); - cv.notify_one(); - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "sip", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - if (socket) { - aliceSocket = socket->underlyingSocket(); - successfullyConnected = true; - } - cv.notify_one(); - }); - // connectDevice is full async, so isConnecting will be true after a few ms. - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; })); - - bool isClosed = false; - aliceSocket->onShutdown([&] { - isClosed = true; - cv.notify_one(); - }); - bobSocket->answerToBeacon(false); - aliceAccount->connectionManager().connectivityChanged(); - CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return isClosed; })); -} - -void -ConnectionManagerTest::testShutdownWhileNegotiating() -{ - auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); - auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); - auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId())); - - aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; }); - - std::mutex mtx; - std::unique_lock<std::mutex> lk {mtx}; - std::condition_variable cv; - bool successfullyReceive = false; - bool notConnected = false; - - bobAccount->connectionManager().onICERequest([&](const DeviceId&) { - successfullyReceive = true; - cv.notify_one(); - return true; - }); - - aliceAccount->connectionManager().connectDevice(bobDeviceId, - "git://*", - [&](std::shared_ptr<dhtnet::ChannelSocket> socket, - const DeviceId&) { - notConnected = !socket; - cv.notify_one(); - }); - - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyReceive; })); - Manager::instance().setAccountActive(aliceId, false, true); - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return notConnected; })); -} - -} // namespace test -} // namespace jami - -RING_TEST_RUNNER(jami::test::ConnectionManagerTest::name())