Compare commits

...

349 Commits

Author SHA1 Message Date
ca02cf172a ImportFromDevicePage: allow confirm for all cases
Change-Id: Id4848a5d8f87a5d0321e7b13870bb717341db041
2025-09-10 12:18:51 -04:00
ba44b70f97 3rdparty: bump md4c
This reverts the change that was accidentally made in commit 22be4be864.

Change-Id: Id51fe4b8edafa57c1152872460a2f60ace222826
2025-09-09 09:53:54 -04:00
87e38c2bf5 misc: bump daemon
This fixes an issue where Jami was looking for ringtones in the wrong
directory and was therefore forced to fall back on the default one.

Change-Id: Iba64e839e75b7e6bf4210b6398dd5002dd4adf99
2025-09-08 17:01:56 -04:00
98a300d36f SettingMaterialButton: fix method name conflict
The call to click() in SettingMaterialButton used to send a custom
signal, but now that we are on Qt 6.8, it calls the underlying button's
click method, thus resulting in an infinite loop of clicks (which
eventually gets interrupted by the QML engine with a "Maximum call stack
exceeded" error).

GitLab: #2091
Change-Id: Id56c7f1b9d7cb302c7d3363d3b11dbd01cf938db
2025-09-08 12:58:59 -04:00
5ac31130d0 misc: bump daemon
Change-Id: I882b0e074ec7e1f780d112dcd9c1e543a9f67b40
2025-09-06 08:53:37 -04:00
9c11ec6233 update version name to "Atlas"
Change-Id: Ia399907ddc18a733ae5524a29a1067b0407dbb07
2025-09-06 08:51:49 -04:00
c9ab1a8e24 donations: schedule 2025 campaign
Set donation campaign from 15 September to 15 November

Change-Id: Ifee0ed347ab786fe0d20f1545bfb02563ac09541
2025-09-06 08:51:30 -04:00
76e1bd9eb1 resources: fix stale images
This patch skips disk caching for qrc images, so images
could be updated. Currently welcome background, welcome logo,
and plugin image resources are stored. Need to be investigated
as it should not be intended to store.

Change-Id: I800649278cdb38dc0a0c732d1d5ec0760a844137
2025-09-06 08:31:04 -04:00
ffb20d6767 update welcome images
Change-Id: I47c7045714787123395daaddb8708c8a8b47eb63
2025-09-05 15:48:21 -04:00
87e63724c3 packaging: fix Linux build
GitLab: #2090
Change-Id: I7621264bebb683ed06294d9bee0bf15bddf3f0cd
2025-09-04 16:41:52 -04:00
9fad769040 macOS: bump minimum version to 12
Set the minimum deployment target to macOS 12,
as required for Qt 6.8.

Change-Id: Idb3b551567c39889020663caa1e5735983e3d05e
2025-09-04 09:32:41 -04:00
4106b8c752 snap: fix runtime issues
This commit updates LD_LIBRARY_PATH and the gnome plug in snapcraft.yaml
in order to fix runtime issues that were introduced when switching from
core20 to core22 as the Jami snap's base. It also replaces the
deprecated project variable CRAFT_ARCH_TRIPLET by
CRAFT_ARCH_TRIPLET_BUILD_FOR as recommended in snap's documentation:
https://documentation.ubuntu.com/snapcraft/stable/reference/architectures/

GitLab: #2087
Change-Id: If14efb39979af3bddf5575dc7d0d9fd66c8d3ec2
2025-09-02 13:30:15 -04:00
fd6e733433 misc: bump daemon
Change-Id: I5cae20449c9e33c40870e72dd0d85b95464168d1
2025-09-02 12:58:19 -04:00
ee0a754b6a accountmodel: rename RingNS to Nameserver
Change-Id: Ib7c82c9188adac853933d5642a85068f688cfe80
2025-08-29 11:12:04 -04:00
9278919410 build: detect correct folder in single-arch
On macOS, contrib outputs are placed under
<arch>-apple-darwin<ver> for single-arch builds and
under apple-darwin<ver> for multi-arch builds. Adjust
detection so the client picks the right include path.

Change-Id: Ia9ae2bb7b1f0d6e42cb15364b1921e94f2602836
2025-08-28 14:01:46 -04:00
8c1b79a86c build: pass IGNORE_SYSTEM_LIB flag to client
Change-Id: I7d98d49d0f990b622545cbe7b31700b2d48c0ff2
2025-08-26 09:51:50 -04:00
3e6108f167 build: add option to ignore system libs detection
Change-Id: I5ffa696df4b36cd7a62c13931c1465eeab3dc8a3
2025-08-21 17:15:48 -04:00
22be4be864 build: use cmake instead autotools
Change-Id: I73657d7fb1cd70bb150eefc2e5e60a88d1259caf
2025-08-21 17:15:22 -04:00
bb359f851b homogenize variable name: answer → accept
Follow up to the https://review.jami.net/c/jami-client-qt/+/31410 patch.

Change-Id: I83b8d3d621ebfe8930e70ef0521ef95eb28ac092
2025-08-21 16:56:48 -04:00
36730480aa src/libclient/api/account.h: cleanup
Operation was canceled. → The operation was canceled by the user.
Please verify your connection. → Please verify your connection and try again.

Change-Id: I24222b0dfc143fe6ae975b29fcfda8d706ddde6a
2025-08-21 16:44:28 -04:00
e7d626a421 misc: bump daemon submodule
Change-Id: I8837fe66385a1ae8f520f65924cfb0db80c9e1cb
2025-08-20 16:11:56 -04:00
185869824a src/libclient/api/interaction.h: change call duration format
The application currently shows the call duration as minutes:seconds,
this commit aims to have the following format: 0d 1h 2m 3s.

Change displayed call duration to include days and hours if call is
longer than 60 minutes.

GitLab: #1979
Change-Id: If2759affd5fd1b3ad3687f037f542f4149aeda4d
2025-08-20 14:10:52 -04:00
9858891fea utilsadapter: remove Kazakh (kk) from RTL languages
The language "Kazakh (kk)" we have on Transifex corresponds to the cyrillic script, which is LTR. If we want to include the arabic script of Kazakh, we must request it on Transifex and then add the corresponding code to the QStringList object of RTL languages.

GitLab: #2080
Change-Id: I321e462a1d833ce2dc7466d72cb90adcad3358b8
2025-08-20 14:09:03 -04:00
be7ec378c8 PluginAdapter: Fix missing extension store
Function getValue() of AppSettingsManager expects type Settings::Key,
but was being give a string. PluginStoreListView was placed under
InstallManuallyView, otherwise overlay occurs.

GitLab: #2012
Change-Id: If7f1c1e15e80bdc44728ace85e914092bace263f
2025-08-20 09:54:35 -04:00
cbed58544f INSTALL.md: update document for Qt 6.8.3
Change-Id: Ia3de6bd6608fd0fedefa96d2b405367e6b0e047c
2025-08-19 15:28:35 -04:00
c642c1ddfa JamiStrings.qml, KeyboardShortcutTable.qml systemtray.cpp: answer → accept
Unify with JamiStrings.qml and other clients.

Change-Id: Ieb11c992f0721dba7ff288d82dd4644021627f37
2025-08-18 16:35:13 -04:00
aa8c1edbd4 packaging: remove Ubuntu 20.04 (EOL)
GitLab: #2083
Change-Id: Ic7846ff044312e58b4333afbe80b2d8bf4d38f21
2025-08-18 14:50:31 -04:00
2a28438275 connectioninfolistmodel.cpp: cleanup
Change-Id: Ia3a8e1402c8683b7945d85f7caaff97d12f30fff
2025-08-16 21:13:14 -04:00
92945ad29f JamiStrings: unify
https://review.jami.net/c/jami-client-android/+/30551
https://review.jami.net/c/jami-client-ios/+/31199
https://review.jami.net/c/jami-client-ios/+/31247
https://review.jami.net/c/jami-docs/+/31201

all time → any time

GitLab: #2026

Change-Id: I98dcc928c33d7a30a477dfb96a9bfe141bfc2a40
2025-08-15 18:32:04 -04:00
c22260fb20 libclient: remove unused archive pin
Change-Id: Ia7d01a35d30910583ae79c94dd748c93195ffb59
2025-08-15 16:21:31 -04:00
0163ad7da1 update daemon
Change-Id: I5711f7ce3a2105a821f4d0bdb17794cb208b0cbb
2025-08-15 15:51:46 -04:00
becd7ac144 OpenDHTSettings: add proxy address/list options
- Display whether or not proxy is enabled. When enabled, current proxy
  address is shown
- Radio button selection for proxy address or proxy list url.
  Selectable regardless of enableProxy state
- JamiRadioButton.qml: radio button implemented using non-visual qt
  quick template

Change-Id: Ibf156b07b6a9a1ec535673aceb2b30e397731faf
2025-08-13 14:10:16 -04:00
8b19f733af MessageBarTextArea: fix broken spell check enabling
Enabling/disabling the spell checker is not respected until restarting
Jami. A forced check of Settings.EnableSpellCheck is needed.

GitLab: #2081
Change-Id: I0ab66c14e0b1a69df1caea494434f97e200dc278
2025-08-08 11:29:42 -04:00
25c9f0ef5c snap: use core22 as base
Use core22 (Ubuntu 22.04) instead of core20 (Ubuntu 20.04) as the base
for the snap build. This will allow us to stop building libqt-jami for
Ubuntu 20.04, which has reached its EOL.

The changes made in snapcraft.yaml are based on the following guide:
https://documentation.ubuntu.com/snapcraft/latest/how-to/change-bases/change-from-core20-to-core22/

GitLab: #1944
Change-Id: Ib1af9c28a1ca9d0c3b8e693c5b2e50fb6cbead64
2025-08-06 15:39:15 -04:00
f1895b31b8 Migrate from Qt 6.6.1 to 6.8.3
Qt 6.6 is EOL, certain UI components break when using 6.8.
- Fixed: Improper width issues on popup menus in wizard
- Fixed: Linked devices list missing entirely
- Fixed: Context menus broken: only appear on first trigger
- Fixed: Warnings from enum name clashes

Change-Id: Ia59117aaff6b9f6f72240b2027ce1406f08d5776
2025-08-06 10:41:01 -04:00
13a314bde5 qt: update to 6.8.3
GitLab: #1944
Change-Id: I3a65aba1820c6b4bafaeb43e5a8c61046d9b7807
2025-08-06 09:20:50 -04:00
8c9f6a85a3 cmake: fix libavutil linking
In preparation for the upgrade to Qt 6.8, update CMakeLists.txt to ensure
that the client links against the same version of libavutil as the one
built by the daemon.

GitLab: #1944
Change-Id: I45bbf9f698a869b9028fc0489f2cd518a1f45781
2025-08-05 15:18:10 -04:00
82eb5c59a6 CallButtonDelegate: fix audio devices index not updating
UI was not updating when an audio or video device was selected. The code
was using the currentIndex property, which is not present in
AudioDeviceModel and VideoInputDeviceModel.

They are now treated as a separate case

Change-Id: Ifbbcb99b9044daf7ab789122dad7356698595f86
2025-08-05 14:02:27 -04:00
84a9ba4196 misc: bump daemon submodule
Change-Id: I6296622528575369160a1aa68249229a92cd790f
2025-08-04 15:30:42 -04:00
6dac4d2ee3 packaging: remove Ubuntu 24.10 (EOL)
Change-Id: Id0e69c2c61d3c0d45b31a73768a27f2dfce75a7f
2025-07-30 14:24:27 -04:00
674bf38766 JamiStrings.qml: spell checker dictionary
Change-Id: I37c9b4aceb26ddfe10b62d89fe5a22fc5b291b19
2025-07-28 17:41:33 -04:00
52f3a9bc28 *.desktop and *.metainfo.xml: localize
Follow up to the https://review.jami.net/c/jami-client-qt/+/31007 patch.

Change-Id: I624aecdc9a4608fe4300db0838f57885588b33fe
GitLab: #1955
2025-07-24 17:24:27 -04:00
abce881b50 tests: fix building of previewengine_unittest
This test started failing to build with Qt 6.8.2 and/or GCC 14 in
Guix:

   error: ‘class QHttpServer’ has no member named ‘listen’
      31 |         server->listen(QHostAddress::LocalHost, 8000);

Adjust to use what the Qt documentation suggests, which is to bind the
server to a distinct QTcpServer instance.

Fixes: #1144
Change-Id: I3308acab793b3cdf74458f8196933bca26b41bb1
2025-07-22 15:43:21 -04:00
666b149033 Metainfo: Add latest stable/20250718.0 release details
Change-Id: I8fc881e707c5ef3c6d461e69f19aef92d3c2bae6
2025-07-22 10:34:04 -04:00
eb10ccbd4a misc: bump daemon submodule
Change-Id: I9f9efa528bc929d85bb072e599c2ca30c4c5488d
2025-07-21 14:02:42 -04:00
f513358236 LayoutManager: respect WITH_WEBENGINE flag
This patch updates LayoutManager to use WebEngine only
when WITH_WEBENGINE is set to true.

Change-Id: Idcfc99af9fb4d74c68aac8fc9029cde2bc05b4eb
2025-07-18 14:10:39 -04:00
3c00829afb packaging: use new icon filename
Follow-up to commit 5c772960bc.

Change-Id: Ib5c0b4bc1c5e3f5112bbd49bf323aeb4cc87c75e
2025-07-18 13:30:23 -04:00
84a59889e3 tests/qml: fix undefined references to appWindow
GitLab: #1780
Change-Id: I166f68c7abdf0f21d8d5dcec85e377c27de798a3
2025-07-16 16:17:16 -04:00
6c35561817 Reinstate "cmake: Simplify lookup logic for libjami headers." (again).
This reinstates commit f6c8197cba, which was seemingly reverted by
mistake in 4d2c55348b ("packaging: migrate from Qt 6.2.3 to
6.4.3").

Change-Id: I603e004431be0503be0acdd7ce37fa5aaa4ecd91
2025-07-16 12:58:01 -04:00
6ffdda7b81 tests: Fix WITH_WEBENGINE check.
Use #if, not #ifdef, to test the integer value of WITH_WEBENGINE, not
just whether it's defined.  Otherwise, -DWITH_WEBENGINE=OFF would not
work.

* tests/qml/main.cpp: Replace '#ifdef WITH_WEBENGINE' with '#if
WITH_WEBENGINE'.

Change-Id: Ieda8c46fa696afa1e4118acc7d4fecd4b7f9a171
2025-07-16 12:03:56 -04:00
a51078c900 tests: Avoid takeFirst-caused segfaults on empty arrays.
Replace EXPECT_EQ with ASSERT_EQ where a failure should be
fatal (abort execution).

Relates-to: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1507>.
Change-Id: I4b5e38cdc399c1d1a51f72abab23cce963578541
2025-07-16 11:59:26 -04:00
76a710e2ab Fix running tests when building out of the source tree.
CMake's enable_testing needs to be called from the root of the project
as well for CTest to discover the tests in the build tree.  This is
covered in CMake's manual in section 7.2.17 enable_testing.

Change-Id: I7c9b845c52064ff83e39b483b76137b529c1a9a4
2025-07-16 11:57:28 -04:00
bc324aa8bb build: update guix manifest for build.py
Change-Id: I878ad4b2ae4adee4ebc623e4ab40362fd9e1034a
2025-07-16 11:56:55 -04:00
5c772960bc Adhere to flatpak/flathub requirements
- Developer id must be rDns identifier of developer
- Exported icons should match rDNS of app id
- Release version and dates should be included
- Added light and dark branding colours for Flathub banner
- Contact url removed - does not pass appstream validation

Change-Id: Ic5e2a5abeab4310ea87a34cc81363d1851135bcd
2025-07-16 11:31:12 -04:00
da2acefced packaging: add AlmaLinux 10
GitLab: #2065
Change-Id: I4252e2c128f72b3f6a78204a4134374b44155b80
2025-07-14 16:58:06 -04:00
524c9b0ed4 misc: bump daemon submodule
Change-Id: I98aed9601ef2c5dbaf5430ee4abf4d3ee3741f63
2025-07-14 13:29:10 -04:00
8677349c4a accessibility: fix chatview
Add keyboard and screen-reader navigation for the chat view.

Change-Id: I11a5dc1ee3b0d6303f4598f10008ecc6979bb777
2025-07-11 15:08:43 -04:00
905b2e858e build: Guard against potential unset CMAKE_BUILD_TYPE.
This would fail the build with the error:

  CMake Error at tests/CMakeLists.txt:74 (string):
    string no output variable specified

* tests/CMakeLists.txt [CMAKE_BUILD_TYPE]: Make BUILD_TYPE variable
assignment conditional.

Change-Id: I610fe296ed18bd038b2d23d4acd530f05f9526ce
2025-07-11 17:07:56 +09:00
6fc2e75a33 CMakeLists.txt: use system <md4c, tidy>
Search for libraries in the system first, falling back to bundled
copies in case they aren't found.

Change-Id: I10e154f18c569d87dbdcbee3341316ceed57f13c
GitLab: #1506
2025-07-10 10:59:30 -04:00
c738caa3a4 accessibility: fix the messagebar
Add proper labels to the messagebar and remove the existing
keyboard trap in the showmore menu.

Change-Id: Ib70ca29979dc3909585383d612d1062259df83a8
2025-07-09 11:58:49 -04:00
cb13d4f771 accessibility: fix the tip row
Indicate correctly what tips are on the main page.

Change-Id: I142cde7ab3e553cf981a59090b363694dab08775
2025-07-09 11:58:49 -04:00
436e11a6a4 accessibility: fix buttons
Fix the frameless, conversations and invitations buttons for
accessibility.

GitLab: #2049
Change-Id: I82b6722de53c40a260e706a2517aa7cb37dd99a5
2025-07-09 11:58:46 -04:00
869aef8929 accessibility: fix call action bar
Make the call action bar usable with only a keyboard and a
screen-reader by makint it visible using tab and inplementing
proper labels.

GitLab: #2049
Change-Id: Ifa1f1463f27b30bcfffae228058223729f00e51d
2025-07-08 16:40:31 -04:00
e0f939318e accessibility: fix the account creation wizard
Add support for screen readers and keyboard navigation for the account
creation.

GitLab: #2049
Change-Id: Ie91d7222388a9fb627d5a981ba9e7d8afdebcd55
2025-07-08 15:12:42 -04:00
136dea011f accessibility: fix accountlist
Allow to naviguate with keyboard inside of the accountlist and label
the accounts properly

GitLab: #2049

Change-Id: I53e5e97f344df86d6390ab444a642dcabea61cde
2025-07-08 14:16:36 -04:00
af09269d81 conversationmodel: fix multi-device file transfers
The current logic for handling received messages assumes that files sent
by the user don't need to be downloaded. However, this assumption is
incorrect when the user's account is present on multiple devices.

GitLab: #2069
Change-Id: I4e6a53389d736aec4aa86cd39862b7905b9b09ad
2025-06-26 15:30:20 -04:00
5a5ef4711d *.desktop and *.metainfo.xml: update
https://github.com/flathub/net.jami.Jami/blob/master/files/jami-client-qt_appdata.patch
https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines
https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html
https://specifications.freedesktop.org/desktop-entry-spec/latest/file-naming.html
https://specifications.freedesktop.org/desktop-entry-spec/latest/localized-keys.html
https://www.rfc-editor.org/rfc/bcp/bcp47.txt
https://review.jami.net/c/jami-client-android/+/30260
https://review.jami.net/c/jami-client-qt/+/29902

GitLab: #1955

Change-Id: Ib6a3c9770693cdae0f5d6a6a0ccee624febeabe3
2025-06-17 19:34:51 -04:00
1dd745d446 packaging: remove EOL distributions
GitLab: #2064
Change-Id: I566936c16512e7cc3db085a362fbd30f32bb693f
2025-06-17 13:30:12 -04:00
3dd2d26d86 versioning: add build version to snap packaging
GitLab: #2045
Change-Id: I173342d3b9351644a4bad4f70e033d29f06a6cd8
2025-06-16 16:45:33 -04:00
eb6b6a2b93 versioning: add build version to rpm packaging
GitLab: #2045
Change-Id: I44e1c6862305706bb177b1d8f4b1900f1c0098a5
2025-06-16 16:45:10 -04:00
b15d692a0e spellchecker: fix codec segfault
Fix the segfault happening when a codec is not properly loaded by
only activated spellcheck when a dictionnary has been successfully
loaded, initializing a default codec and adding error handling.

GitLab: #2063

Change-Id: I48339ce6d13120cfbae3c6c7eb6f40e87f16f084
2025-06-13 16:03:38 -04:00
e76bcbd555 versioning: add build version to debian packaging
GitLab: #2045
Change-Id: If0f8e2fef4ed38ae9cd4238bb725158526d24658
2025-06-13 10:21:43 -04:00
b5a979e6b1 versioning: add build version propagation for unix packaging system
The application on linux systems currently has a different build version
built into it than the build version generated on Jenkins which dictates
the filenames for release packages. This commit aims to propagate a
build version defined in the gnu-linux Jenkinsfile down to the
build-package-*.sh scripts.

Changes:
- create build version (timestamp) in Jenkinsfile
- propagate build version to Makefile, then the docker containers that
will execute the build-package-*.sh scripts

GitLab: #2045
Change-Id: Ia7cbb2f707c233741039dc7bfd3e5bd6a96c2270
2025-06-12 13:32:03 -04:00
898444dd3c versioning: add build version as windows build argument
The application currently has a different build version than the one set
in Jenkins. This causes issues in the crash reports on windows where
they contain a different build version than the one defined on Jenkins.
This leads to the names of the build artifacts on dl.jami.net not
matching the crash report's build version.

Changes:
- Add build version as parameter to the build-windows.py script.
- Propagate build version value to the application through the
BUILD_VERSION symbol.
- Deprecate version.h file and VERSION_STRING symbol.

GitLab: #2045
Change-Id: I7986679aaeebf2bcbbd63a781499f5a50e089712
2025-06-12 13:31:59 -04:00
99f246016d cmake : fix output directory for windows builds
The output directory for windows builds currently matches either Release
or Beta. This does not work as Beta is only a build option, not a build
type. Changes :

- Change build output directory to match the cmake build type (Release
or Debug)
- Change Beta output path references to Release

Change-Id: Ib513f177d93e3c9fb529e00aa160443ac2e804b5
2025-06-12 13:31:54 -04:00
e24f3d91e8 spellchecker: fix greek
greek spell correction wasn't working. this is because  modern greek
is in a special encoding : ISO8859-7. The text in Jami is in utf-8.
Therefore this patch detect the encoding and decode/encode informations
in the relevent encoding between the client and the hunspell library.

GitLab: #2062
Change-Id: Ia33f154e3bf4b84f8337f669df81152ddcd25ec6
2025-06-10 10:29:11 -04:00
3a7850b398 theme: add dark mode support in keyboard shortcuts window
GitLab: #1891
Change-Id: I1e0746b00776564cc7ddbe12e4ad5665f037a092
2025-06-10 10:28:22 -04:00
1e1750024b JamiStrings: spellChecker name
Change-Id: Id163c032c7507496254061f2d707debefe7ab1b5
2025-06-06 01:52:10 -04:00
2ba53a2e40 misc: bump daemon
Change-Id: I33da6f7a22d31b8ac5289f53ea7596b7f7925a66
2025-06-05 14:38:22 -04:00
ceec1f95b9 spellcheck: windows and macos
Implement the hunspell spellchecker for Windows and MacOS. It also
changes the base implementation for Linux. The system dictionaries
(if any) are aggregated with those installed from the LibreOffice
repository via Jami's dictionary management interface.

This commit implements a major refactoring of the spellcheck system
to improve UI responsiveness and user experience:

Core Changes:
- Used QAbstractListModel to represent the list of dictionaries
- Added new QML components:
  - DictionaryInstallView.qml
  - ManageDictionariesDialog.qml
  - SpellCheckLanguageComboBox.qml
- Updated property names for clarity
- Fixed a bug in the settings combo box custom component that caused
  out-of-range errors for filtered models

GitLab: #1997
Change-Id: Ibd0879f957f27f4c7c5720762ace553ca84e2bc3
2025-06-03 19:24:16 -04:00
1ac3db4f33 i18n: automatic bump
Change-Id: Iad0d5ca77493f5d1c213249f899152104eefd2e4
2025-06-02 16:47:00 -04:00
93d3d18c7b ci: change apt mirror to http://gpl.savoirfairelinux.net
Change-Id: I88c130e91bb719b7b5479b4d9d5b4b4262ea6bed
2025-05-29 14:35:52 -04:00
d4b7891f48 packaging: fix Qt build on AlmaLinux
Qt 6.6.3 doesn't build on AlmaLinux when using the latest available
version of the clang-devel and llvm-devel packages. Going back to an
earlier version fixes the issue.

GitLab: #2051
Change-Id: Ie78699197a129cc8804d073085e53cae525c9281
2025-05-27 11:20:54 -04:00
d7c294edd0 misc: bump daemon
Change-Id: I5fdc20fdb4db46e82a559798843e8cbddc8cefb4
2025-05-23 15:16:02 -04:00
945cfe176d accessibility: repair broken shortcut
Repair the shortcut for open account list. It was duplicated in 2 views.

GitLab: #2029

Change-Id: I5590c7a36abb6eba290d7944c83fcb13de8269e6
2025-05-23 15:13:57 -04:00
fa3a153896 autoanswer: allow to choose 2nd call behavior (qt)
Add a setting to choose if the user wants 2nd calls to be declined
while already in one auto-answered.

GitLab: #2005
Change-Id: Iccd8c3e128c6d9456861b4a1ccd951de9136b74b
2025-05-23 13:16:31 -04:00
e9106b2bcc packaging: fix build error for snap dockerfile
The Python installation fix in the Dockerfile is obsolete and now causes
the build to fail due to a reference to a directory that no longer
exists.

GitLab: #2019
Change-Id: I5cc9c8c26761e16af41616c02326a8522c00b10d
2025-05-22 13:45:18 -04:00
a967518d45 manageAccountPage: make the buttons visible again
Restore a previous change to set the width of the page to a set amount.

GitLab: #2011
Change-Id: I323844a4c0439de4041503744a12faf3d1e2027c
2025-05-20 10:15:32 -04:00
7ebed53e97 reply to: text spacing
Removed space between "replied to" and "Me"
Changed "Me" to "you"

Gitlab: #1973
Change-Id: Ifcb7b1ff64e0e8c08aeb2e4a89c6e11c36e6a1cd
2025-05-20 08:23:44 -04:00
ca05963c40 packaging: fix linking error on Debian unstable
There is no longer a reason to downgrade GCC now that 14.2.0 is the
default version on Debian unstable, and doing so started causing linking
errors recently due to some system libraries (such as libyaml-cpp.so)
requiring a more recent version of libc than the one used when compiling
with GCC 12.

GitLab: #2018
Change-Id: I19879541c4182886bcd3af5e84f0ba0d237345b6
2025-05-15 17:00:28 -04:00
df98c6c3fd misc: bump daemon
Change-Id: I6a52a9dc5376d3b1fca82047ba1e6c0b0ec97601
2025-05-15 14:58:41 -04:00
05501e33e9 WelcomePage: add possibility to switch languages
Allow switching languages directly when creating an account.

Change-Id: I73bf3e72e4ceb48c95210447335c8191981d3546
2025-05-15 14:41:23 -04:00
91780ae400 packaging: remove obsolete build option
The --enable-gnutls option was added to the bootstrap command on
Debian-based distributions in jami-project commit 46bdda4 in 2017,
because at the time they built GnuTLS without HeartBeat support. This is
no longer true on the more modern versions of Debian and Ubuntu that we
currently support.

GitLab: #1998
Change-Id: I593682e0f8aeb2015a109980840f373b1306670a
2025-05-15 14:28:07 -04:00
4900ca9f1b createAccountPage: update wizard
Add the ability to set a displayname and a profile picture directly
when creating an account.

Change-Id: I346779132111917eec09cabdc281d0f7721e01b0
2025-05-15 11:15:03 -04:00
0f965aae28 control: fix removed packages on debian installer (linuxmint)
The debian installer requires libavcodec60 as a dependency, which is
already included in linuxmint through libavcodec-extra60, creating a
package conflict.
Changes to fix this :
- also accept libavcodec-extra as a dependency as it includes libavcodec

GitLab: #1937
Change-Id: Ia3ab39e6d8bd233414c607ab70fd70af629595b0
2025-05-14 11:30:28 -04:00
f8c29fc4a1 JamiStrings.qml: cleanup
Change-Id: Ic947a31c4c867cf266018373b2624a745c1fc88c
2025-05-13 22:44:50 -04:00
2e1889caf1 Spell checker and tidy-ups
Spellchecking (verb) → Spell checker (noun)
https://en.wikipedia.org/wiki/Spell_checker

Send (to back) → Bring (to front)

Contextual menu: Cut, Copy, Paste

GitLab: #1997
GitLab: #2015

Change-Id: I86bf7e875d5e336c90daed0e89621dbef4aca0b7
2025-05-13 17:00:25 -04:00
8070d1bfc2 i18n: automatic bump
Change-Id: I1bfe0f4d398d10ae8afb0a51dd1fe0553ac00778
2025-05-12 16:42:33 -04:00
4ee1a309a1 cmake: fix hunspell
Consider system hunspell.

Change-Id: I8f78e8c12a7c16937cab83091113b3e474d9f44e
2025-05-12 13:45:20 -04:00
0333016c44 cmake: add missing argument to add_subdirectory
We need the EXCLUDE_FROM_ALL argument to prevent Hunspell's headers from
being installed by Jami's "install" make target.

GitLab: #1997
Change-Id: Ie60c6f4dc8dc8b33fbccb95d667b4b2eafefecb6
2025-05-10 16:12:44 -04:00
32b7525ee3 packaging: add missing submodule
The Hunspell library was added to the project as a git submodule in
commit 2a72da5, but some packaging scripts were not updated accordingly.

GitLab: #1997
Change-Id: I5e6079fc23aeecfba2076067ecf5c4ed1f5a591a
2025-05-09 21:23:13 -04:00
32b941ab96 misc: bump daemon
Change-Id: I6f53893b30c2cff8761f6d0ab4a92b85f7f873fb
2025-05-09 17:00:32 -04:00
e4932abd39 spellcheck: fix default language value
The default value was set to "None" in appsettingsmanager.h but the rest
of the code assumes that the default is "NONE" (see commit 2a72da5).

GitLab: #1997
Change-Id: Ifeac3399b1b48bad0863a1b7da9228df43f73b76
2025-05-09 16:46:22 -04:00
718d1d266d mainapplicationwindow: raise when called
Add a setting to allow the app to be raised to foreground when called.
Some special setups like virtual machines can prevent this behaviour.

GitLab: #2004
Change-Id: I0f6ea442f6abe88109e81933b731f81d10bd6c8f
2025-05-09 16:13:39 -04:00
8d55f352b4 settings: allow devs to modify default settings
Delete the default settings in the settings file so that only user
defined ones are stored locally.

Previously, we stored every value in the settings file. This created a problem where we could not modify a default value as we had no way of knowing if it was user defined or not.

This patch allow us to know that if a value was in the file, it's that it was different from the default.

GitLab: #2000
Change-Id: I7d5154b258c2ca97a1976dc006a70db0d5fe0b31
2025-05-09 15:37:06 -04:00
2a72da564e spellcheck: for linux system dicts
Implement a first version of the spellcheck for linux that use the
systemwide installed dictionaries.

GitLab: #1997

Change-Id: I7158e6c61061e7d0a7fe651069247227bbe399a4
2025-05-09 15:05:19 -04:00
88d0539085 packaging: add Fedora 42
Change-Id: Ia03ae84d8ae435dd4e24fc1d0d64a9c70580e768
2025-05-08 14:16:55 -04:00
4b1c299a1d INSTALL.md: update windows build instructions
Change-Id: Ia6c246539ab5d76cd6a66df484427e94149d8791
2025-05-05 15:35:30 -04:00
479da3ca54 misc: bump daemon
Change-Id: I695d57f8feb393a23a3e36b89e03d1c2bb64b86c
2025-04-30 13:37:04 -04:00
02140a11c4 i18n: automatic bump
Change-Id: I13067c46aa61b9fb46ee7c58c23616afac0ef02f
2025-04-30 13:03:09 -04:00
b5dbe23c17 windowsharing: set the preview to 1 FPS
Set the preview of the windows shared at one FPS and allows to set
custom FPS count to a window.

GitLab: #1242
Change-Id: Ia189500267de18d0809d8d4db781c7015623fa8c
2025-04-29 14:27:59 -04:00
ff5f94b34a settings: update devices list when devices changed
When a new device is connected/disconnected update audio devices list in
the media settings.

This commit also bumps jami-daemon to support DevicesChanged events on
Windows.

Gitlab: #689
Gitlab: #1878
Change-Id: Ibb607939897853794fdbd09eab72f378257d458c
2025-04-24 13:14:28 -04:00
def2e19abe packaging: stop using dpkg-sig
The dpkg-sig tool appears to no longer be maintained and, as far as I
can tell, was never actually used by Debian or Ubuntu to verify the
integrity of packages. Both distributions no longer include the dpkg-sig
package in their newest releases [1, 2].

[1] https://tracker.debian.org/pkg/dpkg-sig
[2] https://manpages.ubuntu.com/manpages/jammy/en/man1/dpkg-sig.1.html

Change-Id: I356ff7eafb340a49622cc37899dad7ef84dbd100
2025-04-24 11:35:52 -04:00
69430c4af3 packaging: fix Qt build on Debian testing
Change-Id: I798cdcf297ac3c0b448b4f61e192edd177e7fcbf
2025-04-24 10:13:21 -04:00
911fdbc9e5 frameless: fix participant overlay actions
Fixed click actions on the overlay for group calls.

Gitlab: #1990
Change-Id: I2331c6f8b34f0b2c2a89ecb52bb65c3563d50f17
2025-04-23 14:54:05 -04:00
80b3336f1b misc: bump daemon
Change-Id: I86ab9faec20b702091136063e5e86d70f89c81f7
2025-04-22 13:43:48 -04:00
f8bafd4154 packaging: remove Fedora 37 and 38 (EOL)
Change-Id: I8d25303236781cad8f97b2f6f35ee159d814cdb6
2025-04-22 13:39:48 -04:00
b8b06ccfa1 packaging: remove openSUSE Leap 15.4 (EOL)
Change-Id: I7d4dac8a9a8463e402b4eaff501bbab4fb368661
2025-04-21 10:30:45 -04:00
6cb5a8206a packaging: add openSUSE Leap 15.6
Change-Id: Iacd096705f8e88bc886715d04a378e66c4042ede
2025-04-21 10:30:37 -04:00
ae1a2462e2 packaging: add Ubuntu 25.04
Change-Id: I19a0d3e5de48a4e85822d5fcd00f83af0da16e1a
2025-04-18 11:16:41 -04:00
31581db7f5 misc: bump daemon
Brings in some build fixes. Also prevents applying the qmsetup patch
on Windows, and calls build-windows.py --init with the qt parameter
which is required if when using Qt installed in a non-standard location.

Change-Id: I40facbdc93289792130a15b0f4151f78137bc1ef
2025-04-16 17:16:47 -04:00
c323dcfe13 bump daemon
Change-Id: I30104807a42b70d9e3d4dbbc9baff3ffea9ec923
2025-04-16 13:31:00 -04:00
8a31aca346 JamiStrings.qml: cleanup
other → {source, new}

Change-Id: I60f4b81a8fc2a47395f73768caed383e0a597b64
2025-04-13 03:29:00 -04:00
7eeabbe1c6 i18n: automatic bump
Change-Id: I50397f9858be1db3447afce3ceac6eb8086f8fbc
2025-04-11 16:25:03 -04:00
8c0ecaf3c5 bump daemon
Change-Id: I6d010bcec7e2ae2507349b5982f7c20a80af0bea
2025-04-11 15:48:15 -04:00
c91bff35b6 QWK: fix build issue on Debian/Ubuntu
This commit adds a patch for QWindowKit to ensure that it always
installs its dependency QMSetup in a directory where CMake will be able
to find it. This makes the previous QWindowKit patch unnecessary and
fixes a build issue when packaging Jami on Debian and Ubuntu that
started occurring when QWindowKit was updated in commit 6b70ffc.

GitLab: #1976
Change-Id: I5f23fcbb612aa6d0eb0e77e9a5a006b24a5af082
2025-04-03 09:29:45 -04:00
cb05b4afd0 i18n: automatic bump
Change-Id: Ic2efc297abc2410f951f2bdd185d5327e35829df
2025-03-31 16:42:43 -04:00
4419f7bfbc PopUp: Title margins
Added right margins to PopUp titles.

GitLab: #1968
Change-Id: I5a3ce3eb1abc6e7737acea8cb2ef6271df515f16
2025-03-31 13:34:39 -04:00
deaa15a36e misc: remove deprecated operator
The ""_qs operator (used to create QString literals) was deprecated in
version 6.8 of Qt:
https://doc.qt.io/qt-6/qstring-obsolete.html#operator-22-22_qs

GitLab: #1944
Change-Id: I4fc69f3aae6b1e2096735c3714e899ee3c8203bc
2025-03-30 21:55:29 -04:00
6b70ffcf3e QWK: fix build issue with version 6.8 of Qt
This commit updates QWindowKit in order to fix the following build issue
on Qt 6.8: https://github.com/stdware/qwindowkit/pull/154

GitLab: #1944
Change-Id: Iab82514b51577148ff5dc1ba382f8bb517c94f8a
2025-03-30 21:54:32 -04:00
a407fa2c47 fullscreen: reimplement fullscreen for reliability
Reimplement the fullscreen behavior to only work during calls
and to make it more consistent.

Change-Id: I8fbad30dfcf577f5af7d809073e20105374deb35
2025-03-28 09:32:43 -04:00
3143d60760 ConversationModel: use index in slotCallEnded
Change-Id: I2d2952007ce1c437bac9c96d35c2931816f185ac
2025-03-26 10:31:50 -04:00
73eacd5125 src/app/linkdevicemodel.cpp: cleanup
New device identifier is not recognized.\nPlease follow above instruction. → Unrecognized new device identifier. Please follow the instructions above.

Change-Id: I75a1f89d738629eff031bdd3258435d7b72a4fce
2025-03-25 18:12:38 -04:00
fc70ddc6dc src/app/currentconversation.cpp: cleanup
Change-Id: I9514660fc4a5b39232fb4b293b5f7957338185f4
2025-03-25 17:05:41 -04:00
e2e5a0c8cc RTL: RecordBox buttons
Adapted radius for RTL.

GitLab: #1967
Change-Id: Ic14b089f12d4a50227036b800353654a54584cc1
2025-03-25 11:28:14 -04:00
dd9ed8d57d i18n: automatic bump
Change-Id: If32bee03cbac617649bbded29bf732f907aed5d3
2025-03-24 16:42:45 -04:00
7eea1484c5 misc: bump daemon
Change-Id: I789d0ed1a76ebe3364e6fddae69393164d80b72d
2025-03-21 15:27:24 -04:00
6fac40340b messageparser: fix link recognition
The attempted fix in commit 65d3bef was based on the incorrect
assumption that md4c systematically fails to detect links that contain
at least one +, - or _. This commit removes the postprocessing step
added in 65d3bef and instead patches md4c to directly fix its link
recognition algorithm.

GitLab: #1903
GitLab: #1964
Change-Id: Ic1d6302e3250390af66611a16715a6397578abb5
2025-03-21 15:10:15 -04:00
04a1544d56 calls: fix call-action button sub-menu positioning
The submenus are no longer created dynamically, so bindings are
required for positioning.

Gitlab: #1965
Change-Id: Idc2fe77f00ff9b2124f0bad4cc1a8160cd01bf04
2025-03-21 15:07:45 -04:00
91fd8a0295 screen-share: fix the screen/window selection widget
The bug is caused by the computation of `elementWidth` when the list
model length is zero and `showWindows` is true. In this case, division
by zero causes the `elementWidth` to have the value `Infinity`. We
presume that at this point, the component's rendering may take a
while.

This commit refactors the layout to use a GridLayout and a more stable
approach to displaying the delegate components, while removing a
potentially harmful Qt bug [1] workaround.

[1]: https://bugreports.qt.io/browse/QTBUG-110323

Gitlab: #1242
Change-Id: Ib3df1568fdbcdd799fcdcf0b39cb87e3de50dc42
2025-03-21 15:07:45 -04:00
bad5698e71 RTL: JamiIdentifier layout fix
Adapted radius for RTL.

GitLab: #1953
Change-Id: I732cd33b403fea1f115527db19faffe131b259eb
2025-03-21 14:30:40 -04:00
7f0a94dd48 RTL: AboutPopUp fix
Fixed the alignment problem with RTL languages on the About Jami PopUp.

GitLab: #1952
Change-Id: I8262cb658ac3099a113e04574df3e93bd7993f0b
2025-03-21 13:58:56 -04:00
81112ff1f8 RTL: Popup layout fix
Reorganized layout margins for BaseModelDialog and adapted affected components.

GitLab: #1946
Change-Id: I36d0a99fb81fd645cdcdd33a3d10ccea6d4c0424
2025-03-21 13:23:16 -04:00
b63eb384b6 i18n: automatic bump
Change-Id: Ib0106a894896c24d466fd00c1025f1a7072823ff
2025-03-21 13:05:22 -04:00
ebcc60c570 RTL: display Azerbaijani as a RTL language
Azerbaijani is now recognised as an RTL language.

GitLab: #1957
Change-Id: Id1a4f947bf5d0371f558ad5fa507e375c4a2be32
2025-03-21 12:03:28 -04:00
c12a753979 misc: update background image
Homogenizes the image sizes and effect parameters.

Change-Id: Icd8b3968aec7311de5700664f03358c289622a40
2025-03-19 16:11:35 -04:00
386b578e47 UX: fix behavior with lists scrolling offscreen
Fixes behavior introduced in Qt where flickables (list) can scroll
infinitely off screen. Temporary fix to have more polished feel to
the app. Functionality to have a soft overscroll is supposedly fixed
in Qt 6.7 onward.

Change-Id: I031c590e1a351a0fe0d0ea1ea9ed17c24c5c572b
2025-03-19 14:49:25 -04:00
76417edfa4 build: update macOS dependencies
- Enable building natpmp
- Disable building freetype

Change-Id: Iba6c311dff4fb175efbe16cc1f82e51355f5d25e
2025-03-17 12:31:05 -05:00
960fdc0f05 misc: bump daemon
Change-Id: Ic85d1b225778c4e038091e8c1aa04f5706d59543
2025-03-14 17:12:19 -04:00
2567d81359 misc: update release name to Εἰρήνη
Change-Id: Id3d532358c3f5f8b4b17ce85efd0492e51e6877d
2025-03-14 16:49:08 -04:00
e700d8160a downloadprogressbar: fix the implementation
Implement a timer to refresh the download progress bar periodically.

GitLab: #1809
Change-Id: I0c9e142ce5d30c443c4fc6998de3387ec751b1d7
2025-03-14 16:40:26 -04:00
37065cb7d6 theme: reload cached image on theme change
Change-Id: Idf683c3c68c22889fb3e605112167930f2729cd8
2025-03-14 16:23:01 -04:00
03efee4c14 theme: update welcome page background
Change-Id: Ie534479b1af33b4a2d089425c26157a31dc8a5d8
2025-03-14 16:23:01 -04:00
04e43b07f4 RTL: fix GeneralMenuItem text position
Added anchors to improve design for RTL languages

Gitlab: #1949
Change-Id: I2f867a0cda6a9e70ddbb2960a8f466f5ee322421
2025-03-14 15:32:12 -04:00
a00a191371 RTLlanguages: Fix crash when opening settings
Delete the preferedWidth of a row in the accountComboBox to avoid an
infinite polish() loop when accessing the settings with an RTL language.

GitLab: #1945

Change-Id: I37a4a1c61a296743835d677ab242c0fe214e8d16
2025-03-14 14:07:05 -04:00
65d3befad8 messages display: fix the display of links
The links are now postprocessed to compensate for the malfunctions of
md4c. It now displays properly even with a + or - in it. It's also
checked by the unittests.

GitLab: #1903
Change-Id: I0d7f520a7a3fe06fb89107fe6b08f83325218cd4
2025-03-14 11:21:19 -04:00
84ac5dba02 main: fix desktop file name
Commit 49d83fd937 changed the name of
Jami's .desktop file, but didn't make the corresponding change to the
argument passed to setDesktopFileName in the main() function. This
causes a bug where GNOME (and possibly other desktop environments)
doesn't display the correct icon in the taskbar when Jami is running.

GitLab: #1948
Change-Id: I695057979b180777011a9995d799d38f9a4a0487
2025-03-13 16:23:41 -04:00
a149a575a7 cmake: add missing argument to add_subdirectory
We need the EXCLUDE_FROM_ALL argument when adding git submodules via
add_subdirectory in the CMakeLists file. Without it, the "install" make
target for Jami will also install the submodule's files.

GitLab: #1947
Change-Id: I477c4733951ac5a9fa2b6a52a1463c4a585ab8b7
2025-03-13 16:20:29 -04:00
407561732f packaging: add missing submodule
The ZXing-C++ library was recently added to the project as a git
submodule, but some of the packaging scripts were not updated
accordingly.

GitLab: #1947
Change-Id: Ic5324bd807e30bec44c0e07076b1f38903e12895
2025-03-12 15:38:07 -04:00
82c2a9d9c6 link device: correct tooltip for the close button
Change-Id: Ia0057b83b0484c656c33835dd4233e1c5b8fb9ee
2025-03-11 13:17:18 -04:00
1414e1804f link device: fix manual token entry
This patch fixes the export process when a token
is entered manually.

Gitlab: #1695
Change-Id: Ib87a933baa42319bcd17acf10402aafdccf23d1a
2025-03-11 11:09:36 -04:00
7146f20b18 UI/UX: fix link device issues
- Make token copyable
- Fix UI in dark mode
- Remove text animation for export side

Gitlab: #1695
Change-Id: Idb701867ba4998bb75715e598ddac66a5e1ac8ca
2025-03-11 11:09:36 -04:00
5ee4990534 tests: fix arguments for createNewAccount
Change-Id: Ied19a578f1dbe80d468fcf4c5220f2c340cadcab
2025-03-11 10:41:22 -04:00
0d1bdfdfdd link device: fix ui for dark mode
Change-Id: I2d978db411036dab5af45cfc44a7e404d97a177f
2025-03-10 14:52:15 -04:00
f3dd3b4643 chatview: settings: details: fix alignment issue
Fix the alignment of the avatars and text in the details panel

GitLab: #1796
Change-Id: I982ba3982b8128c6e43478146fa80dbfaa8f38cc
2025-03-07 20:53:18 -05:00
d3c76eac8d account: implement export-from-device using new API
- Implements new APIs
- Implements export-from-device mechanism
(link device in account settings)

Gitlab: #1695
Change-Id: I3d3486380e695ea44c199dbe0a0448f724b4d2db
2025-03-07 15:54:21 -05:00
33da15daba account: implement import-from-device using new API
- Implements new APIs
- Implements import-from-device mechanism (creation wizard)
- Minor refactoring of accountmodel and accountadapter

Gitlab: #1695
Change-Id: Ib3c6301b82b19a25320dd703f2f7e941f8048a8e
2025-03-07 15:54:15 -05:00
82c876c0fa message_search: remake component
GitLab: #1827
Change-Id: I877d8a6d15e56c6a8a40ffaa5768ba2812c86d39
2025-03-07 11:08:09 -05:00
83765dcebf view-coordinator: use the view name to destroy dialogs
In the case of a unique view, we need to use the view name used in
the viewmanager to destroy the dialog. This is now provided by the
viewName parameter of the callback used when creating the dialog.

Gitlab: #1938
Change-Id: I3645fc1c7fda44eea9fde8d9d5886647820685ea
2025-03-06 17:14:49 -05:00
b76570b892 conversation model: avoid using database for jami accounts
GitLab: #1794
Change-Id: I48e5e7c42854440f3ee389a7256b8b99a0520eb2
2025-03-06 17:14:37 -05:00
ffb9bb8748 misc: bump daemon
Change-Id: I60872d3444d91c33ce48e477f708fc1f26cc6f13
2025-03-06 10:33:53 -05:00
416137d6dd JamiStrings.qml: merge "clearConversation" with "deleteConversation"
https://review.jami.net/c/jami-client-ios/+/29862

Change-Id: I4a657f73a9240b335cfe04e88f0465abf9a73081
2025-03-05 18:00:31 -05:00
ffcfaffc90 Conversation: add "You left the conversation." string
Follow up to https://review.jami.net/c/jami-client-qt/+/30295

GitLab: #1932

Change-Id: Ic6e78bd3384c9b825a7fd3bc82409d3e6df2b721
2025-03-05 00:06:41 -05:00
a950a3f9e7 appversionmanager: improve version logging
Gitlab: #1934
Change-Id: Ic73b39bb3b6e9c14cbe4b4e0773d744da68f5c72
2025-03-04 15:02:32 -05:00
3c279b292d SimpleMessageDialog.qml: use var for buttonRoles
In practice, the QML engine fails to set arrays of non-variant types
when creating QML components dynamically.

Gitlab: #1934
Change-Id: I5e9c0e73dd35c088bdaf070e04cf73c009ea9099
2025-03-04 15:01:57 -05:00
c19af7f97f networkmanager: prevent generic network error when canceling download
To avoid multiple popups when canceling download, we avoid emitting the
`CANCELLED` signal directly, and rely on the QNetworkReply error handler
to emit the `CANCELLED` signal after translating the error triggered by
aborting the download.

Gitlab: #1934
Change-Id: I87bc1404405a9140b52c2c43d2aeb3501e06aec7
2025-03-04 15:01:09 -05:00
0087f1b8a8 UpdateDownloadDialog.qml: set autoClose to false
The `autoClose` property was set to the default value of `true`.
This causes an issue where if a user refocuses the Jami window, the
update dialog closes and cancels the update.

Gitlab: #1934
Change-Id: Ia7a90875702a0998de71133ed2215fb0583e161e
2025-03-04 14:06:10 -05:00
19f7f43912 crashreportclient: add build variant metadata
This will make it easier to reproduce the build that crashed.

Note: we should be able to use the build ID (build timestamp), but the
git tag is not the same as the build ID currently. This is a problem and
should be fixed in the future.

Gitlab: #1454
Change-Id: I8c6e25a685421398eef3052a9f48681ac369926c
2025-03-04 12:53:32 -05:00
c818eeedce MainApplicationWindow.qml: remove unused import of QtQuick.Dialogs
The module is not used anywhere in the file and breaks the client
on Windows.

GitLab: #1905
Change-Id: I7e4f6e3516a3fd88c7e150b3eeb70cab823d388b
2025-03-04 12:50:03 -05:00
0f08dbcf59 misc: bump daemon
Change-Id: I8743f9c6b0fcbd7cf187d78018420f2b94e5eb01
2025-03-04 11:41:11 -05:00
7d3331d235 i18n: automatic bump
Change-Id: Icf3c5ad4bf2757b2f16368d62f4a0bd837c4f602
2025-03-03 16:42:42 -05:00
aa375a7f89 FileDialog: make a single instance filedialog
Modify the presentDialog method to account for single instance windows and implement a "hack" around the modality issues of Qt.

GitLab: #1905
Change-Id: I166bfc028939240955f20ec9b5777d6f282ccf78
2025-03-03 15:35:36 -05:00
9b51f26e80 i18n: automatic bump
Change-Id: Ia7d8a7341370c77df4ddfb30cea75d8fe3c72e69
2025-03-03 13:58:25 -05:00
6b0adb7005 notifications: no longer blank notifications when leaving or joining a group
Fixed the issue of blank notification when leaving a group by updating the
OnNewUnreadNotification function.

GitLab: #1921

Change-Id: I87f4c3828a72c9b504a9a68707d6b257ce00154c
2025-03-03 09:19:16 -05:00
217efe603b calls: fix the display of incoming calls
When called, it shows "Incoming ... call from username" instead of
"incoming ....call from %1". This adress an issue created in the commit
30419 :https://review.jami.net/c/jami-client-qt/+/30419

GitLab: #1929
Change-Id: I4695a9aebf1787eebef148c234cf6b8eaa2d7ac0
2025-02-28 15:59:16 -05:00
00febee4c7 UserProfile: add ID copy functionnality
Allow to copy UID from the user profile menu.
Make the alias always visible and assure we cannot copy it by mistake.
Allow to copy the username from the chatViewHeader.

Change-Id: I8ff257850286e8a1142c5bd2fbb26e29e8fe5060
2025-02-27 16:10:01 -05:00
c88797163c misc: bump libjami version
Brings in fixes for broken account profiles on Windows.

Gitlab: #1899
Change-Id: I2ff2123a20b76b385413cd5d5fffd0120526a7c1
2025-02-27 14:41:02 -05:00
f7a771f7e1 JamiStrings.qml: unify
Change-Id: I6aea8d17415e362427a36f9092d7d40cefc3f99c
2025-02-27 14:07:33 -05:00
03756aedd0 MessageBar: show less is only visible when the context menu is open
Changed the property of ToolTipMoreButton on the messageBar to ensure that the show less
text display properly only when the context menu is open and not while holding click.

Gitlab: #1904
Change-Id: I4f74802d42e58c38abb3b64dc4277f5c1b79a5f6
2025-02-26 18:02:08 -05:00
8af5a25607 i18n: automatic bump
Change-Id: I1eaab0a31e05e9fedc1ba03f792f9ab5b479ffa2
2025-02-26 11:26:51 -05:00
fe4c63b775 contrib: Windows: bump openssl to 3.4.0
https: //git.jami.net/savoirfairelinux/jami-daemon/-/issues/1108
Change-Id: I689f2e4ac3fef152bcafd89e125f97b948627b8f
2025-02-26 11:26:36 -05:00
4ee1f1a5d3 documentation: update the build instructions for windows
Update install.md to add relevent init command to the windows
compilation steps.

Change-Id: I59be668fbba1f81db7ecfbf80d4ddd2f615eaf57
2025-02-26 09:29:00 -05:00
37f29c9882 videoprovider: fix possible use-after-free on Windows
This creates a deep copy QImage of the video frame during the call to
captureRawVideoFrame.

Gitlab: #1916
Change-Id: Ifa3ba8950ddd1fb13892665d011733fd45c88d12
2025-02-24 11:20:47 -05:00
1bfacdbb76 JamiStrings: cleanup of the usages of old variables
Add variables to strings to make complete sentences.

Change-Id: I669366ef6de92c3a7e49f677e88c10c59da0f92f
2025-02-21 13:32:29 -05:00
c5e455a9de JamiStrings.qml: cleanup
Join Jami → Create Jami account
not available → unavailable
would you → do you want to

https://review.jami.net/c/jami-client-ios/+/30358

Change-Id: I74535b7f502b34e5faa04bba2c6998ec4053c7ba
2025-02-20 16:15:13 -05:00
f489f21271 profile: vcard: fix add deletion logic check
If you are deleting a conversation with yourself, you
should not delete your own vCard. This will cause your profile
picture to be removed, among other things.

GitLab: #1838
Change-Id: I2e6ec3e941e6fdef1bf9df24238e720a73aba6dd
2025-02-20 13:58:18 -05:00
560f44f6f1 src/app/utils.cpp: cleanup
Remove consecutive whitespaces in string.

https://app.transifex.com/savoirfairelinux/search/?q=source_language%3Aen+target_language%3Ahu+source_text%3A%27%5BThis+is+a+list+of+people+who+have+made+a+significant+investment+of+time%2C++++++++with+useful+results%2C+into+Jami.+Any+such+contributors+who+want+to+be+added+to+the+list+++++++++should+contact+us.%5D%27

Change-Id: Id7ef7dac3a8dfafa50c69dc3182b8654b1695b72
2025-02-18 13:35:38 -05:00
d0639b4e88 src/libclient/api/interaction.h: cleanup
Change-Id: I5f3509ee76db39aa054f0ad8d06c3a3e49ca4c06
2025-02-17 18:22:22 -05:00
79d3c7be03 misc: bump daemon
Change-Id: I6ef2de4167439c6597dd9c9f6532c6763aeaa2df
2025-02-17 17:20:18 -05:00
5b6cc620cd chatview: fix timestamp and file info overlap
GitLab: #1876
Change-Id: I5e2760a45e6cd84c8cdbaa4a753e7241db0f9f3c
2025-02-15 15:15:32 -05:00
f4c997c62f new_swarm_page: fix button in borderless mode
The button could not be clicked.

Change-Id: If9248113b2a2cf007bb00a85f26d6444c1b2289e
2025-02-15 15:15:19 -05:00
2974cb52bd JamiStrings.qml: cleanup
Change-Id: I2caa2f50c8034d09591749f92fd124deb91dc62a
2025-02-14 16:59:15 -05:00
98e71a7c89 i18n: automatic bump
Change-Id: I8a360e9ce89447da2f53ba2e600d85108c682131
2025-02-14 14:05:10 -05:00
0b49077de9 add_contact: change default message when adding someone
Currently when adding a new user there is no indication
in the chatview whether that person is in your contacts.
This patch aims to work towards a chatview which makes
this interaction clearer.

Change-Id: I68827f42b0e97e0ee80e631ce057016eb8df0305
2025-02-12 10:44:27 -05:00
5540001e7a copyright: happy new year!
Cf. https://review.jami.net/c/jami-daemon/+/29901

Change-Id: I46a0d1297c2e60ca43dc5524fd6e8a192bc45139
2025-02-12 09:47:26 -05:00
71527afd76 Conversation: Fix bug not displaying "You joined the conversation"
Edited the getContactInteractionString function of the namespace interaction
to display properly the message when joining a chat.

Gitlab: #1889
Change-Id: Ic1d6780a4fe9b35c9ab8eeb8d9cec435b0321513
2025-02-11 14:14:30 -05:00
15d62f0200 Documentation: Clarified the need for libqt-jami during compilation
This commit clarifies the need for the user to specify the path to libqt-jami
in the ./build.py --install call.

Change-Id: I89d512bae7d476e9e5cbf73cb5e05b8d00e842cf
2025-02-10 17:21:11 -05:00
0024721192 misc: bump daemon
Change-Id: Idaa87f9147db5f7cede8643f368f386ab6913e9a
2025-02-06 15:10:08 -05:00
a540cbf529 i18n: automatic bump
Change-Id: Ia6400a3807ce5f3ef02ef4ddccd5a26aa334eaf1
2025-02-03 16:42:31 -05:00
6b142cd374 build: Windows: add a parameter to supply the crash report URL
This commit adds a parameter to the Windows-specific build script to
supply the crash report URL.

Gitlab: #1454
Change-Id: I9f131354c3e9041d068e399fd432c3f6c8325f51
2025-02-03 15:03:17 -05:00
4e235d60e8 misc: bump daemon submodule version
This includes a parsing error fix for namedirectory.

https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1097
Change-Id: If516184272b4b6fb4085eebae7c7579176826f6b
2025-02-03 15:19:49 -04:00
05954191a2 misc: unify terminology
kicked → blocked
{reinstate, reinstate as} → unblock
rejoined → unblocked
waiting until → waiting for

Change-Id: Ide75e75e840dc2933aab0aa4e8615051516a78ad
GitLab: #1730
2025-01-31 11:16:30 -05:00
56b8aa16e7 account: allow non-ASCII letters and numbers in name
Adapt to daemon changes that enable registered names
to include letters and numbers from all languages.

https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1097
Change-Id: Ibc4ab33e27743c78fb42de074223106c77d6d813
2025-01-30 19:32:24 -05:00
7acf48d919 build: crash-reporting: add scripting option to enable crash reporting
Gitlab: #1454
Change-Id: I51fdc2af15c7cdd6469dd817b6a4ad89e45bab1c
2025-01-30 17:14:46 -05:00
70c64a5947 snap: fix build error
GitLab: #1910
Change-Id: I89f63546fcc360ac35b767f0087640c550fa44fb
2025-01-22 13:08:39 -04:00
ca74c961ef packaging: remove Ubuntu 23.10 (EOL)
Support for Ubuntu 23.10 ended in July 2024.

Change-Id: I5ba01081c00711d2852236e12d978073f5447b6b
2025-01-22 10:51:42 -05:00
32a44c9820 chatview: image scaling algorithm
Revise the image scaling algorithm to deal with images
whose aspect ratio was too large or small. Deals with
oversized images as well as images which are too small.

GitLab: #1437
Change-Id: I454e64972ccde1415d80182a2aa89db9656fec1b
2025-01-21 11:28:45 -05:00
d1a8ec3af0 misc: bump daemon
Change-Id: Id9e2038c4ffde3e90cc24b9d393c1bddcad886eb
2025-01-20 15:32:26 -05:00
12628713f1 misc: ux/ui rename “swarm” to “group”
trust request → invitation
Swarm created → Group conversation created

GitLab: #1845
GitLab: #1886
Change-Id: I15932d607f8ccfbdbd332f500635a0c98298a576
2025-01-17 12:03:00 -05:00
7659080b34 crashpad: increase timeout for crashpad submission
Recent testing with a Windows 10 machine has shown that the crashpad
submission timeout is too short. This commit increases the timeout to
10 seconds, as around 5 seconds has been observed in practice.

Gitlab: #1454
Change-Id: I557a414ea371bd94a42696a835370068867c99dc
2025-01-14 16:25:16 -05:00
4152700848 crash-reporting: improve submission services
Provide general improvements to the crash reporting submission services
by adding a separate report access server with a simple UI and updating
the crashpad submission server to use waitress.

- changes crashpad.py to crashpad_submit_server.py
- adds report_access_server.py
- updates README.md

Gitlab: #1454
Change-Id: I4e97f77cf2e2c0bb405064b0187ed3dfc2ee703e
2025-01-14 16:25:16 -05:00
cba84f2cb7 conversation: simplify indexOfActiveCall
Change-Id: Ic31b708fc7bea67ea00171665aca955dd2633c37
2025-01-14 10:53:56 -05:00
7289a92b2b vcard: cleanup
Change-Id: I5ac983c5e34a3d691f97330a667ebf55b5e6a155
2025-01-14 10:53:56 -05:00
c6a474aa96 uri: fallthrough
Change-Id: I7713852196ab8823149014fdfcf970b4c0290109
2025-01-14 10:53:56 -05:00
2226d30123 i18n: automatic bump
Change-Id: I211dfce5a2db8d8072074f64f31e426b3012ac11
2025-01-14 10:36:32 -05:00
529b7cf529 troubleshooting: add configurable crash reporting with crashpad
This commit adds a basic crash-report system that can be optionally
configured to automatically send minidump crash-reports in addition
to product versions and a platform description including the OS
name and CPU architecture. Reports can be received at a configured
REST endpoint(POST). This endpoint URL can be configured using
a CMake variable `CRASH_REPORT_URL` which defaults to
"http://localhost:8080/submit".

- Introduces a new CMake option `ENABLE_CRASHREPORTS`, defaulting
  to OFF. This allows developers to enable crash reporting features
  at build time selectively. We also define a new macro with the
  same name to expose the state to QML in order to hide the UI
  components if needed.

- Implemented conditional inclusion of crashpad dependencies using
  `ENABLE_CRASHREPORTS`. If set, `ENABLE_CRASHPAD` is also enabled
  (other crash reporters exist and we may want to use them).

- 2 new application settings are added: `EnableCrashReporting` and
  `EnableAutomaticCrashReporting`. Default settings make it so
  crash-reports are generated but not automatically sent. With this
  default configuration, users will be prompted upon application
  start to confirm the report upload. Additionally, users may
  opt-in in order to have reports sent automatically at crash-time.

Gitlab: #1454
Change-Id: I53edab2dae210240a99272479381695fce1e221b
2025-01-13 15:56:11 -05:00
49d83fd937 packaging: fix AppStream issues
The AppStream specification includes both a "metainfo" file format,
which can be used (among other things) to provide metadata about a
specific application, as well as a "catalog" file format used to provide
information about the contents of a repository. This patch adds a
"catalog" file for the Jami repos, which seems to be necessary in order
for some graphical package management applications to be able to launch
or uninstall Jami. In particular, this was an issue with GNOME Software
on all the rpm-based distributions supported by Jami (Fedora, openSUSE,
AlmaLinux).

This patch also fixes a few minor noncompliance issues with the existing
metainfo and .desktop files:

- the metainfo and .desktop files were renamed so that the names'
  prefixes match the application's ID as defined by the <id> tag in the
  metainfo file (in our case "net.jami.Jami") [1];

- the <br/> tags in the metainfo file were removed (they are not
  supported -- metainfo files only allow a very limited number of tags,
  not arbitrary html [2]); the list (<ul>) and list item (<li>) tags are
  now used instead;

- the invalid categories "Communication" and "Productivity" were removed
  [3, 4].

[1] https://docs.fedoraproject.org/en-US/packaging-guidelines/AppData/
[2] https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-description
[3] https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-categories
[4] https://specifications.freedesktop.org/menu-spec/latest/category-registry.html

GitLab: #1842
Change-Id: I4a8bab79b6e54d02c08f509d7a9196a0a2e1541e
2025-01-10 15:32:41 -05:00
484808a2eb ContactSearchBar: remove obsolete component
All instances of ContactSearchBar were replaced by Searchbar in commit
91047b34c2.
https://review.jami.net/c/jami-client-qt/+/24659

Change-Id: I9bdba7fa686a1fe290a7c899128713e7efd10c40
2025-01-06 16:27:09 -05:00
dccc6c7e18 NotificationArea: don't rely on signal that's not always received
The current implementation of NotificationArea assumes that the
onActiveCallsChanged function in ChatView.qml will be called at least
once before the notification area becomes visible, but this isn't
necessarily the case.

GitLab: #1823
Change-Id: Ic85392dd9b6748b43f6c8d9cc002df973fc8be0e
2025-01-06 16:26:51 -05:00
53a3d32114 cleanup
→
base 64 → Base64
cancelled → canceled
{cannot, can't, couldn't} → unable to
inexistent → nonexistent
informations → information
not possible → impossible
retrieven → retrieved
SIP
try → attempt
URI
WebEngine
wish → want

Can this replace https://review.jami.net/c/jami-client-qt/+/27607 ?

Change-Id: I21e1615a0c6e2979f02f913093c503c03ab32c82
2025-01-02 12:29:20 -05:00
6fdcfc6317 i18n: automatic bump
Change-Id: Ie0e367aae8868fc59d7700dc94a6543a290dca7f
2024-12-30 16:42:35 -05:00
5352ded3e3 misc: unify terminology
Are you sure you → Do you really → Do you
by a password → with a password
confirmExtensionReset: OK → Reset
confirmExtensionUninstall: OK → Uninstall
confirmRmConversation → confirmLeaveConversation

Change-Id: I8e61197a19fb61f3d362d76b1a6d676dcb842b75
GitLab: #1730
2024-12-19 17:10:37 -05:00
9a0ed9995e homogenize appdata
Android client
full_description.txt

Qt client
jami.appdata.xml
snapcraft.yaml

Change-Id: I4e6e9b7c24ecf51fc6723fcb54f94f61b1950a8f
GitLab: #1730
2024-12-18 13:35:32 -05:00
9771e291c8 misc: bump daemon submodule
Includes dhtnet bump with UPnP fixes.

Change-Id: I58d6d5e8930e5f830d5273907262e5328b979c59
2024-12-17 16:00:21 -05:00
b37720e27f misc: bump daemon
Change-Id: I58a3e4fff562c336c2a4def7a008c270cf1e9b55
2024-12-09 14:58:33 -05:00
d3a7df2f18 docs: update install readme
- Give a hint on how to troubleshoot the contribs build.
- Add instruction for debugging runtime crashes using GDB.

Change-Id: I6ad931223ce0904fb292a59090d37a2cec422ae8
2024-12-06 16:16:21 -05:00
6093689cc4 update-profile: fix dbus build issue
The dbus build was failing due to updateProfile having an incorrect number of arguments.

Change-Id: I0045554e2fc62851fc2cffdac27c8ab1cb905547
2024-12-06 11:02:56 -05:00
d188284245 update-profile: Handle ProfileReceived Signal for SIP Accounts
Since SIP accounts lack a URI, we need to address scenarios where the daemon includes the accountID in the uri parameter. Refer to 29623 for more details.

Change-Id: Ib58e77dc953269c87d67d4068866c93432d08aae
2024-12-05 11:16:56 -04:00
a01b578099 update-profile: moved to new API for setting Avatar
This change only impacts avatar updates; moving to the new API for updating the displayName is still pending and may require additional work. Specifically, we need to provide the current profile picture path to prevent its removal during the update process.

Change-Id: Idbc1592eda2b533b633cc366c72224f5e1bdce98
2024-12-05 09:33:51 -05:00
04fca1fc75 callparticipantsmodel: fix typo
Change-Id: I32e7aa66466108b8ebac8a472a00f9f08e91a3b6
2024-12-05 09:29:05 -05:00
a5621a1af1 Shortcuts: remove unused shortcut
Change-Id: I28e5ef7dfca2e82fa65e40b2450db8c30a465926
2024-12-04 16:06:36 -05:00
a1c2b8adef account_archive: unify archive file type
When creating an account archive, there would be no default
suffix. Then, when importing the archives, we would filter
for .gz files by name. The goal is to implement a .jami
file extension for archives across all platforms.

Todo: implement custom MIME type for custom icons.

GitLab: #1256
Change-Id: I202ae5670c928f35b0eaf711abf7249ec3f304b9
2024-12-04 16:05:59 -05:00
7424227f00 i18n: automatic bump
Change-Id: I32516ba524aa9dec6b9c579f606cccdc7c5dbff8
2024-12-02 16:42:31 -05:00
b69d703e56 macOS: fix qrencode build
Sometimes qrencode failed when built from Jenkins.
This patch:
- Uses cmake for build.
- Automatically detect host architecture if none is specified.

Change-Id: I18dc90099e3b9efc531c7887b00fc615f69c50fa
2024-12-02 14:18:13 -05:00
bfe9128755 updateStatus: prevent status reduction
A very minor adjustment to ensure the status cannot be downgraded.

Change-Id: I1e0fe5461ad05f5cf9f88174b4253e0e63caa3bd
2024-11-29 11:07:33 -05:00
8b17b9e3cf instancemanager.cpp: fix typo
Change-Id: Ib1fb914135056fc4f87c8b0f461219473495c8dc
2024-11-26 23:57:58 -04:00
c2d5c3b764 misc: bump daemon submodule
This includes fixes for Windows and bumps to opendht and dhtnet.

Change-Id: I3deddd747943afe69b8b821ee12f886916fd596f
2024-11-26 16:33:40 -04:00
41f5d151d9 misc: unify terminology
Accept contact request → Accept invitation
Accept in audio → Accept with audio
Accept in video → Accept with video
Automatically answer calls → Automatically answer incoming calls
Decline call request → Decline call
Decline contact request → Decline invitation
Delete your account → Delete account
just now → Just now
Mute → Mute microphone
Type → Conversation type (https://review.jami.net/c/jami-client-android/+/29546)
Unmute → Unmute microphone

Change-Id: Ie88eabeb12514e2b0f0918c8ab77beaa0d90aecf
GitLab: #1730
2024-11-24 05:08:38 -04:00
542bd54c6b read_receipt: add logic when alone in a conversation
No logic was implemented when you were alone in a conversation
(either conv with yourself or swarm with 1 member). This adds
the logic. Currently the receipts will change in swarms
if you add a member.

GitLab: #1867
GitLab: #1017
Change-Id: Iff2ea5978ac988d30edef32d803c0b5b70b11d90
2024-11-21 13:36:36 -05:00
eb60b68747 misc: bump daemon
Change-Id: I67a6f538612ca1e6d8d3d2e4c7b7235472ce4fe3
2024-11-20 16:11:47 -05:00
950e32e9a6 avatars: fix duplication glitch when switching accounts
There was a timing issue between when a new account is connected
and the moment where the avatar cache is cleared. Thus, the ui
would use the cache of the previous account for certain
conversations.

GitLab: #1832
GitLab: #1559
Change-Id: I0319b3d81e0b6dfec9b5408806dfd48ff220ea9d
2024-11-19 14:24:15 -04:00
6ddd6a7f9e misc: bump daemon
Change-Id: Id63f29920e3d13f4082c186df92a90299503cb43
2024-11-18 13:34:21 -05:00
9ab5e52c8d contactmodel: look up name at most once per peer
The ContactModel::bestNameForContact function currently performs a
lookup on the name server every time it is called if its argument is the
URI of a peer which isn't a contact and doesn't have a registered name.
This patch modifies the function's behavior so that it doesn't perform
more than one lookup per peer, thus preventing the server from getting
spammed with large numbers of unnecessary requests.

GitLab: #1882
Change-Id: I7b7ef6a41d3db1001fc1418f8f35bd06b0932624
2024-11-18 10:36:59 -05:00
56401d4125 swarms: add camera MRL for host
When starting a swarm call with video, the MRL for the host
wasn't set. Thus, the camera button would appear muted and
starting/stopping video would have unintended behavior.

GitLab: #1869

Change-Id: I6ee2204d5b49b856bfc72fb560f6623f9c7c874f
2024-11-18 10:15:04 -05:00
7fdd2f5740 add_contact: refactor and change behavior
Change-Id: Ie8cfa5a39b25cd34c7706596a1c607dd1b8c8060
2024-11-14 17:27:34 -05:00
0f7e33cf33 misc: bump daemon
Change-Id: I37dc0b49217a2262ebf27ac83f4788b81b62fbbc
2024-11-12 16:38:38 -05:00
73258efdf7 i18n: automatic bump
Change-Id: Ice4cf7f5f34603b131e3ee070e141e9a2d196658
2024-11-11 16:42:30 -05:00
a29d5f791f message_bar: unify layout to be more coherent
The goal of this patch is to make the messagebar (and more broadly
the chatViewFooter) more coherent in its behavior and look/feel.

GitLab: #1846
GitLab: #1848
GitLab: #1639
GitLab: #1420
Change-Id: I0d0ed207df9eba50f724c69fa49f956dc8aaa573
2024-11-06 17:19:08 -05:00
5186c27325 chatview: fix issue with layout stacking
When the conversationview was resized horizontally to be small enough
so that only one pane is visible, the chatview header and footer would be visible, but clicking them would interact with the objects of
the pane below (the left side panel)

GitLab: #1868

Change-Id: Ic1fac91ef30fcc3078223e1705f10c8a112c2091
2024-11-06 15:31:00 -05:00
7e926a3e23 misc: ux/ui rename “swarm” to “group”
A(n) [type] error occurred while {verb} {noun}
createSwarm → createGroup → newGroup
Create swarm → Create new group
startSwarm → startGroup → newGroup
Start swarm → Create new group
swarmName → groupName
Swarm name → Group name

Change-Id: I9cb6f7b124d3db193bd190d2e52b5b27ea10ecf3
GitLab: #1845
2024-11-06 11:32:47 -05:00
93cde493d8 user_search: fix issue with user display incorrectly being updated
When searching for a user, if the user was found, a signal would be
sent to update the display name with incorrect formatting across the
application.

Change-Id: I20a453e2eddf1e1a402985ff741c8e7c7ea6f99f
2024-11-06 09:16:53 -05:00
cb829676e3 file_attachments: fix behaviour when changing conversations
Fixes an issue where the files that were loaded are not cleared
when switching conversations. Implements the correct behavior
for restoring the files as was done with text drafts.

GitLab: #1847
GitLab: #1528

Change-Id: Id04c9820d08f25ef247002da66d99ae893d8495a
2024-11-06 09:15:08 -05:00
112c6a4d7a chatview: disable visibility of sidepanel when adding contact
GitLab: #1871

Change-Id: I1949c0da388c637123801db39310a1c9fd8c7b99
2024-11-05 16:19:55 -05:00
188f487695 chatview: change visibility of reply component
Make it so that the reply/more/share buttons are visible
whenever the cursor hovers over the horizontal area
that a message takes up. Add message highlighting.
Fix small issue with "more" button not being deselected
after choosing an emoji

GitLab: #1870

Change-Id: I4db5230c2a50ce4640eececc69f8e88348356d79
2024-11-05 16:19:19 -05:00
0af01cc62d i18n: automatic bump
Change-Id: I552add4e22956ac7c9b8fd50704a9612e32c133e
2024-11-04 16:42:41 -05:00
a8acc71830 msi-installer: deploy VC CRT files locally with the application
This avoids merge modules which may crush system runtimes files. We've had several issues packaging vc_redist binaries also, so this seems to a better option for now.

Gitlab: #1865
Change-Id: I9ac3d3a1945136d7f78cf5be2de5d05cf377e126
2024-11-04 11:49:03 -05:00
eaf409d6d3 msi-installer: reformat xml
Switches formatter to one not dependant on JDK
- https://github.com/DotJoshJohnson/vscode-xml
- {
      "xmlTools.xmlFormatterImplementation": "v2",
      "xmlTools.splitAttributesOnFormat": true,
  }

Gitlab: #1453
Gitlab: #1865
Change-Id: I82e65d3097ac366f7873ac4c0e1d5beed3ee486e
2024-11-04 12:48:41 -04:00
42e3eeabf6 msi-installer: remove deployment of Windows 7 support runtimes
Gitlab: #1873
Change-Id: I239566f4cfa4dfbdfd08ccc496aa0bc206ece855
2024-11-04 12:47:54 -04:00
41cb6528c2 misc: unify terminology
{Noun} {verb} successfully
A(n) [type] error occurred while [attempting to] {verb} {noun}.
placeAudioCall → startAudioCall
placeVideoCall → startVideoCall
reconnectTry → reconnectAttempt

Change-Id: I918961894fc23989920727009031cc6a2ac1d8f3
GitLab: #1730
2024-11-01 15:30:44 -04:00
b6aa9eedfa misc: update jami.appdata.xml
<image> tag must be before <caption> tag
To translate <description>, tag must include xml:lang
Update URL addresses
Update description to include extensions, JAMS etc

GitLab: #1262

Change-Id: I8b313a02b119f5ddeaa2b9d760cac7ac5c147b7a
2024-11-01 15:14:02 -04:00
3c1b2c22b2 misc: bump daemon
Change-Id: Ica8a83b1ab8a7deaabec41f7fa6a1b72963913c5
2024-10-31 20:40:21 -04:00
fb660b928f about-dialog: only show the project versions if available
This is a workaround for an issue that occurs due to the way Linux
packaging is done, where the git repository is not available in the
build source at configure time, which is when the version files are
generated, so we prevent a "." from being displayed if the version
string is not available.

Gitlab: #1857
Change-Id: I2f6a281eb89ec0f977749d135da68fe5b7c9c2da
2024-10-31 17:23:07 -04:00
2f163846c7 i18n: automatic bump
Change-Id: Idbcacb51bb113174f455221f0b340bde571c9d35
2024-10-28 16:42:27 -04:00
c6f79f4132 misc: bump daemon
Change-Id: I1dc5b074a171311610fd884b6f9e2a26ad8a6395
2024-10-23 16:40:02 -04:00
6b9cb684ec call_notifications: fix editable state of call notifications
Text message notificaitons sent regarding the status of a call
(i.e. busy, call lasted xx:yy mins, etc) were editable due to being
a TextEdit and not a Text

Change-Id: I9ded20a9b4dbdbaee034b0de6ae42e1eca2c02a0
2024-10-23 09:53:55 -04:00
1d0fa772e2 UI : fix bi-colour message telling there was a call
setting message opacity to 1 to only have the messageInBgColor

Gitlab: #1799

Change-Id: I37d0a354412ec8f2e7127203a2d0adf185674cea
2024-10-23 09:52:38 -04:00
51c716d718 misc: bump daemon
Change-Id: I6fad7b305754f86b602a204977de1d8ed0add0ad
2024-10-22 16:00:39 -04:00
5e4556f786 snap: fix build error
GitLab: #1862
Change-Id: If7f13cc16c02d823dd98af84007b24a829579262
2024-10-22 13:35:30 -04:00
da667056fd About: fix binding loop
"anchors.centerIn: parent" caused a binding loop
with parent implicitHeight using contentHeight in Control.qml
Removing "anchors.centerIn: parent" fixed the warning while the
popup remains in the center of the page

Gitlab: #1508

Change-Id: I0d05597100e4c2b306180e83a7b88b6d5ee22f40
2024-10-22 12:10:22 -04:00
9d00c4f4e3 chatview: default view to chat instead of side-panel
When the application window or screen is too small and
the user opens the details side-panel, it will display
over the chat. This change makes it so that switching
conversation's defaults the view back to the chat and not
to the side-panel.

Change-Id: I3cffba24a7d23d7635937329c2078979722031c4
2024-10-22 11:35:11 -04:00
f5743da2d6 username: fix multiple usernames associated to one account
Added logic check to prevent disabled accounts from registering
multiple usernames after being restored from an archive.

https://git.jami.net/savoirfairelinux/jami-client-android/-/issues/1765

Change-Id: I58e3e018c85e335f043f232e391286e716201481
2024-10-21 15:13:19 -04:00
7152b51597 screenshare: fix issue where screenshare didnt close
When joining a callSwarm as a participant, your mediaList would
contain 3 medias if a stream and video were active. The logic
behind this function didn't take that into account. In the future
it would be good to re-write this for arbitrary amounts of
medias.

Change-Id: If128650c535ae8ba9b02ec4738e8ef103f4994df
2024-10-19 10:47:25 -04:00
4a53397561 misc: bump daemon
Change-Id: I8c3de76b2d8e77cd568e904dfd9fbacb3b1899dc
2024-10-19 09:06:54 -04:00
d86a90207a packaging: add Fedora 41
Change-Id: I2baeaecd66af8e4a9e64072e85b5e5ca35c240ad
2024-10-18 16:56:12 -04:00
7b298deee8 packaging: fix Qt build on Fedora 40
GitLab: #1858
Change-Id: Ib0cfa7a1c458faecdb9c82359c182d4debadc6ab
2024-10-18 16:56:02 -04:00
056cf14613 packaging: add Ubuntu 24.10
Change-Id: I8d176e7e2a72e8185442ea81c9c943e6ab5fb912
2024-10-17 10:00:13 -04:00
2e75dd8777 misc: bump daemon
Change-Id: I5e6ff040101d9662cbdbc8e37ccb17c9ed014bc3
2024-10-11 15:58:24 -04:00
8bda8da414 packaging: fix Docker build error
The libpcre3-dev package doesn't exist on Debian testing, which caused
an error when trying to build Dockerfile_debian_testing. Adding the
newer libpcre2-dev package as an alternative in the debian/control file
fixes the issue.

GitLab: #1856
Change-Id: I3f9068a67101597eb2ffe7cb5a358870e7284e5b
2024-10-10 22:13:53 -04:00
b7fb63ae40 versioning: use app/jamicore git SHAs as the version
Currently, the user-facing version number in the about dialog, is a
build-time timestamp that does help us isolate the project versions
accurately. Ultimately, we need to be able to reproduce issues
present in specific versions of Jami. This commit introduces a new
version number in the form: <client_sha>.<jamicore_sha>, allowing
us to reproduce builds more accurately.

Gitlab: #1820
Change-Id: Ie7e20b20da65284e33e745996c410f539b65080c
2024-10-08 16:19:20 -04:00
31bd0392da share message: add share feature
A share feature have been requested to share
to contacts pictures or text received from other contacts
you can access it by hovering the message you want to share

Gitlab: #1830
Change-Id: I2555433417867371161f927e9fc78bb47fec68d3
2024-10-08 14:41:30 -04:00
59f3aa7c44 i18n: automatic bump
Change-Id: Ib77c972963786716b5794baffbeedb5f6b0fd738
2024-10-07 16:46:35 -04:00
9aeb405644 doc: update documentation regarding the install path of libqt on certain os
Change-Id: I684ecb448479059be0a163c29ab8673f908f31a0
2024-10-02 14:51:44 -04:00
9e1d8e3e56 messagebar: move js into js file, simplify markdown editing
This will make the code easier to read/debug and get us closer to
adhering to the coding guidelines regarding QML file length.

Gitlab: #1639
Change-Id: I6d6e9604c4a54e9fe354c0d24ef66b41ebbbff2a
2024-10-02 13:44:51 -04:00
b65774add0 about: add special thanks & translation on credits
git.jami.net/savoirfairelinux/jami-client-android/-/issues/1607

Change-Id: I3e3029550d91adc36c620c80c1f9c8e1de24a74b
2024-10-01 12:00:23 -04:00
c55486988f misc: unify terminology
smart quotes {“,”,’}
remove spaces in keyboard shortcuts, eg Ctrl + F → Ctrl+F
add participant → invite member
A(n) [type] error occurred while [attempting to] {verb} {noun}.
avatar → profile picture
ban → block
join in… → join with…
mute camera → stop camera
plugin → extension
request → invitation
unmute camera → start camera

GitLab: #1730
Change-Id: Ied169aea3b15b341ff467bc838c70da6a3d5050f
2024-10-01 11:06:04 -04:00
39833924af i18n: automatic bump
Change-Id: Ibab0cadf2e8338c3c2e8cb5725c7e630cf37df47
2024-09-30 16:42:30 -04:00
a194e86d7a screenshare: fix bug on certain wayland systems
Fixed logic error which was causing screen sharing to stop working on certain Wayland environments.

GitLab: #1676

Change-Id: Idf3beb97a53d2eb88e082cee710be56c90c6df05
2024-09-26 21:34:39 -04:00
8cfd9bc3fc macos: use clang with c++17 standard
Change-Id: I0bcf97bc3cc338a1e6e182089638e0d62f2994af
2024-09-26 09:53:48 -04:00
bdec942d72 shortcuts: fix unintended menu behavior
Fixed small issue where the button to bring up the keyboard
shortcuts menu would not be brought up if it was previously
hidden or minimized.

Change-Id: I89b021ca7a00c67325c992fde9cd14fbb8b82cf3
2024-09-25 21:49:09 -04:00
35d5595401 searchbar: fix warnings for invalid regular expressions
Certain characters such as @ or < were being treated as invalid
regular expressions and caused warnings to be raised. Added check
for validity of expression.

GitLab: #1628

Change-Id: I8b66ebfcf029cd0568bccdcba96672d9005846a9
2024-09-23 13:29:31 -04:00
7330a87082 JamiSplitView: fix crash for right-to-left languages
GitLab: #1829
Change-Id: I273d23ae5a8cfb38862259ab413a0aa778ab0341
2024-08-23 15:02:15 -04:00
7243b10e81 interaction: move Info implementation to a cpp file
This fixes the no-libwrap build, which was broken by commit
96c00ff019 due to an additional header
file included in interaction.h

GitLab: #1828
Change-Id: Ic3490a64fdc1514e0b6533a380cb7115568ae9f1
2024-08-23 11:13:30 -04:00
964c8e0553 build.py : Added missing dependence pipewire to build.py
libpipewire-0.3-dev is used since commit Ia54dbc512aa87ae1cb1df7c1ffe71c153a4937a2

Change-Id: Ia1299ec938091a844581f8bea3c7c5486bd43f14
2024-08-23 09:30:32 -04:00
96c00ff019 interaction: set body and transferStatus of DATA_TRANSFER messages
This patch adds code in the interaction::Info::init function so that the
"body" and "transferStatus" fields are always set when an Info struct is
constructed for a message of type DATA_TRANSFER.

This removes some code duplication in conversationmodel.cpp, where these
fields were being set as an extra step after construction in three
different places.

It also fixes a bug in the ConversationModelPimpl::slotMessageUpdated
function, which did *not* set the "body" of DATA_TRANSFER messages. The
body was therefore empty instead of containing a file path, which is
what caused the image preview bug described in the following issue:
GitLab: #1671

The patch also reverts a change that was made in the
MessageListModel::update function by commit
d2eba1d91e. This change was a workaround
for the above bug, but it is no longer necessary (and it broke message
deletion, which relies on the body of the deleted message being set to
the empty string).
GitLab: #1825

Change-Id: I5848b93a12c1ef7b3735c5c6db6b32a9bbc4041d
2024-08-22 11:48:48 -04:00
c8716d1113 misc: unify terminology
Start audio call
Start video call
https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1730#note_51880

GitLab: #1730

Change-Id: I976a6ca890c4b28501da9754cbbee012a2993d73
2024-08-21 15:06:15 -04:00
630e5e9fe4 Added a line to thanks volunteers in credits
I added "And the volunteers who contribute to this project!" at the bottom of the credits in the "about Jami" pop-up.
It's already on the jami-client-android version.

Issue #1689 on gitlab

Change-Id: I59967e5b9e1e7eac0519c9b4960692c14c80dab7
2024-08-20 09:58:25 -04:00
f447327c02 i18n: automatic bump
Change-Id: Ia68b3566b33d82ed31401345e397474499339cba
2024-08-13 14:27:22 -04:00
650f98636b misc: bump daemon
Change-Id: I93d6954cb0e30831b8a4cf036b5cc2c3eefa9196
2024-08-13 10:54:57 -04:00
b92cd902b9 packaging: fix Qt build on Debian testing/unstable
This commit adds four patches to fix various issues that were preventing
Qt 6.6.1 from building on Debian testing and Debian unstable. These
patches are backports of fixes that were applied in later versions of
Qt; links to the relevant commits are included in the description at the
top of each patch.

There are also two changes in the Dockerfiles for Debian testing and
Debian unstable:
1) CMake 3.21 is no longer installed via the install-cmake.sh script.
   This is not necessary anymore given that Debian testing and Debian
   unstable now both come with more recent versions of CMake by default
   (3.29 and 3.30 respectively).
2) The libre2-dev package (which is part of the dependencies in
   debian-qt/control) is removed from the Docker image in order to force
   Qt to build using the bundled version of the RE2 library. This is
   necessary because the system version of the library on testing and
   unstable (libre2-11) is not compatible with earlier versions due to
   an API change, c.f.
   https://codereview.qt-project.org/c/qt/qtwebengine/+/516094

GitLab: #1822
Change-Id: I763fb6692949052e2a846b3f4ce54619e6d98108
2024-08-13 10:40:20 -04:00
b99c2674b4 tests: fix account accumulation on Linux systems
On non-dockerized Linux systems, the accounts generated during tests are
only cleaned up occassionally. The test suite design implements
consistent account cleanup post test. Accumulation of these accounts
interfere with subsequent test runs, rendering the test suite ineffective.

The main test scripts incorrectly utilize a Jami Windows environment
variable for Linux systems. In adherence with the Jami client design,
this patch utilizes the correct environment variable for Linux systems.
Windows formatted paths were also modified to allow recogntion in Linux
enironments

GitLab: #1801
Change-Id: I633dbd168af1e6d20ccee53d1109cd179bd1a187
2024-08-08 11:48:31 -04:00
1524ba0177 i18n: automatic bump
Change-Id: Ic9bd89443178a6f899caea1383d1621c7cfc4aeb
2024-08-05 16:42:31 -04:00
5503769023 packaging: remove Ubuntu 23.04 (EOL)
Support for Ubuntu 23.04 ended in January 2024.

Change-Id: Ib4a7a045762a391552da69ace333e46f10afdfb9
2024-08-02 11:37:31 -04:00
89354a07e1 conversation model: split logic for SIP and Jami
GitLab: #1794
Change-Id: Ief688df6778fe2758882ff1538371def8ba75d64
2024-07-26 15:46:50 -04:00
69400bee2a misc: bump daemon submodule
Brings in some changes intended to correct/improve CI building
on Windows.

https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1027
Change-Id: I7047cd343b5711adaf4c992b99dc07097e9ff05b
2024-07-26 14:50:10 -04:00
0e07f9cee7 JamiIdentifier: fix binding for Jami ID
GitLab: #1805
Change-Id: Ic847bb61ccb2c75873d91a35cd851caaedaf518d
2024-07-23 11:20:52 -04:00
d2eba1d91e chatview: fix datatransfer messages not showing
99254f8d02 introduced 2 issues:
- transfer messages not notifying the UI
- some file URLs being erased after loading the conversation
This commit addresses both of them.

Gitlab: #1671
Change-Id: I67a003ea1149c27e749efffe496f4c9ce86615ea
2024-07-22 12:10:25 -04:00
78389d8c28 data transfer model: fix warning
Change-Id: Ia4fcc47c9f033a8f136d6f6de0fc4bb666a1cdfc
2024-07-18 14:52:28 -04:00
e6d820850a misc: bump daemon submodule
In addition to integrating the new UPnP code introduced into
dhtnet, this bump also includes numerous bug-fixes:
https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1637
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1021
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1033
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1026
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/952
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1025

Change-Id: Ic7242e3dfe14550221d9d0de48ff84605b7fefd8
2024-07-16 14:09:50 -04:00
0a7f9349a9 smartlist: don't display misleading 'last interaction' date
If a conversation has no interactions (which shouldn't happen normally,
but sometimes occurs in practice), then its LastInteractionTimeStamp
will be zero, which causes the last interaction date in the smartlist to
be wrongly displayed as 31/12/1969 or 1/1/1970. This patch adds a check
to prevent this.

GitLab: #1794
Change-Id: I1384d6675c9fcaa1904bb6e1706589305b7618e9
2024-07-12 09:56:50 -04:00
99254f8d02 messagelistmodel: add support for file deletion
+ Add button to delete messages on file transfer
+ Show "Deleted media" on deleted files.
+ Update last interaction
+ Update icon for saving file, we're in 2024, no more floppy disk

Change-Id: I607b1a6beda443db85c60d8cf95a9aae29ce1f7c
GitLab: #1287
2024-07-10 16:00:39 -04:00
010a2c4eea linkdevicedialog: fix what seems to have been a copy-paste error
The "success" property of the wrong component was being set in the
"on-link-device" signal handler. This commit fixes that.

Gitlab: #1788
Change-Id: I99c9abbfa31ea9ea6e7828dbbed0a21081f8be19
2024-07-05 15:56:01 -04:00
61163037d4 misc: bump daemon submodule
This bump will include changes to fix failing builds on Windows.
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1022

Change-Id: Ic34a097fbcea5723c8fe44da9c5887368dce2258
2024-07-04 16:03:20 -04:00
3577982a93 testing: added account switcher box
Change-Id: I76b67b819cd8e028062406b96583a36ae6a6d509
2024-07-04 15:53:04 -04:00
3ad0b92dcd link-preview: use non-ASCII UTF-8 characters in a UTF-8 test
Non-ASCII characters in UTF-8 are encoded with multiple bytes. Testing with these characters ensures that the decoder correctly interprets multi-byte sequences.

Gitlab: #1536
Change-Id: I0a92ee91b6cd26d70daab1f9baef3a9577aee02e
2024-07-04 13:01:02 -04:00
91475c3a3f misc: bump daemon
This fixes a serious issue on version 6.9 of the Linux kernel that is
already impacting some users:
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1006

Change-Id: Id78643d51f38799be448034236364f746dbdfb10
2024-06-27 10:59:02 -04:00
9379af23ec callmodel: don't send profile
profile was not saved at reception anymore, this was wasting bandwidth

Change-Id: I3cbc1f1683a1e5a4b14616404cde5e27e07623e5
2024-06-21 14:30:53 -04:00
406a251c85 accountmodel: improve handling for account list reordering
This update fixes an issue where a stale account list might be used
in AccountListModel by synchronizing list invalidation with a newly
introduced signal (accountsReordered). This change prevents a data race
that could occur due to the asynchronous nature of setting the account
order over D-Bus, or when queuing the signal handling for
accountsChanged, which is emitted only once the reordering is saved.

As a result, QAbstractItemModel mutations are now performed within AccountListModel instead of in the UI.

Gitlab: #1638 (Account list in popup is incorrect after selection)
Change-Id: I7ed6eeb45eb319f21e40554f3d023ad24e139a6f
2024-06-10 10:29:24 -04:00
20e2852e44 misc: bump daemon (fixes missing API on macOS)
Change-Id: I9a04c1a87875a15b2d465982ddf5c3fa143a2dc0
2024-06-07 10:20:44 -04:00
3225f90ce8 misc: deploy and use ringtones on macOS
Gitlab: #1619
Change-Id: I7c19dfa4556f4f9dae827a1d0c967c9ebce7cc86
2024-06-04 12:36:41 -04:00
df3e76a1cf interaction: split status and transferStatus
This allow to show the correct sending/sent/state for the interaction
separated from the status of the dataTransfer. Else, we see a sent
check for a file even if the peer didn't receive the file

Change-Id: I15b9f0abc6a26a2ffd007be26827e9a37e859bca
2024-05-31 14:38:26 -04:00
c5e15d26a0 contactmodel: cache profiles for non contacts profile
If we're a member of a group swarm, we will receive profiles from
non contact (the other members of a conversation).
This patch try to get from cache before calling getContact() to be
able to retrieve profiles from non contacts if stored by the daemon

Change-Id: I864f1d5dd9f65232751e170b930606d23241d283
2024-05-31 10:22:12 -04:00
77e019b02b accountmodel: re-add save profile for JAMS account
JAMS account still use AccountProfileReceived

Change-Id: I010d459564a9230b7f06f4be55de668ec3526abd
2024-05-31 10:22:03 -04:00
89bed2bf85 avatar: fix image cropping
Take into consideration the vertical margin when cropping the image.

Change-Id: I140c96f54d2c1ae732bd104fb21ad04d66d97e9a
2024-05-30 15:09:55 -04:00
519871e458 DataTransferMessageDelegate: fix Url not defined
GitLab: #1563
Change-Id: Ie4ec46bbd7adb0fb0abf9da29224d7b87bcf0aa7
2024-05-30 11:45:53 -04:00
0a842042b0 ci/docker: add cppunit
Change-Id: I3abcdfa8d6a32eedbfd99ab0302d18b5bad6dae6
2024-05-30 10:55:55 -04:00
9aeb2377dc packaging: macos: simplify macdeployqt execution
Don't use a post build step, as it's only needed for packaging.

Change-Id: I1be4e7ac8042e1f211b4eeb15bc869e16eda1682
2024-05-29 12:45:41 -04:00
6ad5f4b850 snap: fix wayland scroll
GitLab: #1629
Change-Id: I74a651728c6d2d9c55b39772a11090d60231b3d5
2024-05-29 09:11:51 -05:00
f5c63d24fb packaging: fix opensuse leap 15.5
Change-Id: I555d6722fae688ba25c4eb2266088aeec0240528
2024-05-29 10:10:40 -04:00
5cb34bd31c misc: bump daemon
Change-Id: Id4f6d28423104965827d6b130533412dd918d536
2024-05-29 10:09:30 -04:00
e56a966de1 contactmodel: fix account avatar on link device
We do not need to write an empty profile since the daemon fully
manages the profile. Just update it from cache when new profile
is detected

GitLab: #1627
Change-Id: I31035f0666925d13f339f387e614f148b0eece8b
2024-05-29 10:08:10 -04:00
acc0c97234 contactmodel: fix contact initialization when linking a new device
getContacts() is called before sync is finished. This should be
done like conversations, after first initializing.
This fix the presence showing after sync.

GitLab: #1627
Change-Id: I4ec9b7e34b5bd93b9ae4437e6c6719dbc3b78a98
2024-05-29 10:08:10 -04:00
665af7c0c3 i18n: automatic bump
Change-Id: I1a004c1d7b2ad51eb3e59951f9e7158bc312c313
2024-05-27 16:42:57 -04:00
fa51e042e5 misc: update release name to Astarte
Change-Id: I64e7b601bbadc9055da912a7d6fe2304aa7a5169
2024-05-27 14:29:23 -04:00
3b9fb0bfca misc: bump daemon
Change-Id: I2c515128f5d2958f2e8e598f0bfd92d2ec5f1d1b
2024-05-24 14:40:00 -04:00
3673b0646c conversations: hide call view when swarm call is finished.
In the current implementation, the chatViewContainer of callStackView
is not destroyed for a swarm conference call because there are no
signals for call changes.This patch ensures chatViewContainer is used
when there is no call.

GitLab: #1625
Change-Id: Iefc39b747d92543244d30aa987eda134ff0a03f3
2024-05-24 14:39:20 -04:00
2e2f6423f8 misc: bump daemon
Change-Id: I38901aa3e8b5db4ec14c70f9b6df65a4f43eaad4
2024-05-22 08:58:16 -04:00
28c1cbbb34 call-swarm: follow daemon changes
Change-Id: I32e83c2ccf82be78fbdd6e9932105228dd6dee8b
2024-05-21 08:48:01 -04:00
87c215deb7 i18n: automatic bump
Change-Id: Ic221ee76c9b9310edea106aea28203a36fbe0617
2024-05-20 16:42:34 -04:00
77eddcd962 callmodel: fix bug in getProposed function
GitLab: #1607
Change-Id: I49062e2e02b4d8f39221243dcef49298117e2f9e
2024-05-17 13:22:48 -04:00
787 changed files with 321915 additions and 269469 deletions

1
.gitignore vendored
View File

@ -7,6 +7,7 @@ doc/Doxyfile
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
### VisualStudioCode Patch ###
# Ignore all local history of files

10
.gitmodules vendored
View File

@ -21,9 +21,17 @@
ignore = dirty
[submodule "3rdparty/md4c"]
path = 3rdparty/md4c
url = https://github.com/mity/md4c.git
url = https://github.com/fsimonfc/md4c.git
ignore = dirty
[submodule "3rdparty/tidy-html5"]
path = 3rdparty/tidy-html5
url = https://github.com/htacg/tidy-html5.git
ignore = dirty
[submodule "3rdparty/zxing-cpp"]
path = 3rdparty/zxing-cpp
url = https://github.com/nu-book/zxing-cpp.git
ignore = dirty
[submodule "3rdparty/hunspell"]
path = 3rdparty/hunspell
url = https://gitlab.savoirfairelinux.com/jami/hunspell.git
ignore = dirty

1
3rdparty/hunspell vendored Submodule

Submodule 3rdparty/hunspell added at 749cd84a0b

2
3rdparty/md4c vendored

1
3rdparty/zxing-cpp vendored Submodule

Submodule 3rdparty/zxing-cpp added at a920817b6f

View File

@ -1,11 +1,4 @@
# Copyright (C) 2020-2024 Savoir-faire Linux Inc.
#
# Author: Albert Babí <albert.babi@savoirfairelinux.com>
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
# Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
# Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
# Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
# Copyright (C) 2020-2025 Savoir-faire Linux Inc.
#
# 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
@ -29,10 +22,11 @@ else()
project(jami)
endif()
include(${PROJECT_SOURCE_DIR}/extras/build/cmake/extra_tools.cmake)
set(CMAKE_SCRIPTS_DIR ${PROJECT_SOURCE_DIR}/extras/build/cmake)
include(${CMAKE_SCRIPTS_DIR}/extra_tools.cmake)
option(WITH_DAEMON_SUBMODULE "Build with daemon submodule" ON)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" OFF)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" ON)
option(WITH_WEBENGINE "Build with WebEngine" ON)
option(ENABLE_LIBWRAP "Enable libwrap (single process mode)" ON)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@ -49,9 +43,13 @@ if(ENABLE_ASAN AND NOT MSVC)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
endif()
# Enable this option when building for production.
option(ENABLE_CRASHREPORTS "Enable crash reports" OFF)
# These values are exposed to QML and are better off being defined as values.
define_macro_with_value(WITH_WEBENGINE)
define_macro_with_value(APPSTORE)
define_macro_with_value(ENABLE_CRASHREPORTS)
# jami-core
if(NOT WITH_DAEMON_SUBMODULE)
@ -60,10 +58,9 @@ else()
set(DAEMON_DIR ${PROJECT_SOURCE_DIR}/daemon)
endif()
# For now only MSVC is supported for building Jami-core within the
# client cmake.
if(JAMICORE_AS_SUBDIR)
add_subdirectory(${DAEMON_DIR})
add_subdirectory(${DAEMON_DIR} EXCLUDE_FROM_ALL)
set(LIBJAMI_LIB jami-core)
endif()
# init some variables for includes, libs, etc.
@ -71,12 +68,6 @@ set(CLIENT_INCLUDE_DIRS, "")
set(CLIENT_LINK_DIRS, "")
set(CLIENT_LIBS, "")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT MSVC)
set(CMAKE_CXX_FLAGS_DEBUG "-Og -ggdb")
endif()
include(${PROJECT_SOURCE_DIR}/extras/build/cmake/contrib_tools.cmake)
set(EXTRA_PATCHES_DIR ${PROJECT_SOURCE_DIR}/extras/patches)
@ -84,31 +75,79 @@ list(APPEND QWINDOWKIT_OPTIONS
QWINDOWKIT_BUILD_WIDGETS OFF
QWINDOWKIT_INSTALL OFF
QWINDOWKIT_BUILD_STATIC ON
QWINDOWKIT_BUILD_QUICK ON
)
if(WIN32)
# Beta config
if(BETA)
message(STATUS "Beta config enabled")
add_definitions(-DBETA)
endif()
set(JAMI_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/${CMAKE_BUILD_TYPE})
endif()
if(WIN32)
list(APPEND QWINDOWKIT_OPTIONS QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS OFF)
endif()
# qmsetup uses the wrong package dir on some distributions
# (including Fedora and openSUSE Leap at least)
check_distro_needs_qmsetup_patch(DISTRO_NEEDS_QMSETUP_PATCH)
if(DISTRO_NEEDS_QMSETUP_PATCH)
list(APPEND QWINDOWKIT_PATCHES ${EXTRA_PATCHES_DIR}/0001-fix-fedora-fc-build.patch)
set(qmsetup_cmake_path ${CMAKE_BINARY_DIR}/_install/lib64/cmake/qmsetup)
# If qwindowkit can't find qmsetup via cmake's find_package function, it will install it and
# then call find_package again. Unfortunately, even the second call to find_package sometimes
# fails due to qmsetup having been installed in the wrong directory. The following patch
# ensures that qmsetup is always installed in the directory where find_package looks for it.
if(NOT WIN32)
list(APPEND QWINDOWKIT_PATCHES ${EXTRA_PATCHES_DIR}/0001-fix-qm_install_package-function.patch)
endif()
# qwindowkit (frameless window)
add_fetch_content(
TARGET qwindowkit
URL https://github.com/stdware/qwindowkit.git
BRANCH 79b1f3110754f9c21af2d7dacbd07b1a9dbaf6ef
BRANCH 758b00cb6c2d924be3a1ea137ec366dc33a5132d
PATCHES ${QWINDOWKIT_PATCHES}
OPTIONS ${QWINDOWKIT_OPTIONS}
)
list(APPEND CLIENT_INCLUDE_DIRS ${QWindowKit_BINARY_DIR}/include)
list(APPEND CLIENT_LIBS QWindowKit::Quick)
# If ENABLE_CRASHREPORTS is enabled, we will use crashpad_cmake for now.
if(ENABLE_CRASHREPORTS)
set(ENABLE_CRASHPAD ON)
set(CRASH_REPORT_URL "http://localhost:8080/submit" CACHE STRING "URL for crash handler uploads")
endif()
add_definitions(-DCRASH_REPORT_URL="${CRASH_REPORT_URL}")
# Crash-report client: crashpad
if(ENABLE_CRASHPAD)
message(STATUS "Crashpad enabled for client")
if(WIN32)
set(CMAKE_OBJECT_PATH_MAX 256)
add_definitions(-DNOMINMAX)
endif()
add_fetch_content(
TARGET crashpad_cmake
URL https://github.com/TheAssemblyArmada/crashpad-cmake.git
BRANCH 80573adcc845071401c73c99eaec7fd9847d45fb
)
add_definitions(-DENABLE_CRASHPAD)
if (WIN32)
# This makes sure the console window doesn't show up when running the
# crashpad_handler executable.
set_target_properties(crashpad_handler PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS")
# Set the output directory for the crashpad_handler executable. On Windows,
# we use either the Release or Beta directory depending on the BETA option
# which is set above.
set_target_properties(crashpad_handler PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${JAMI_OUTPUT_DIRECTORY_RELEASE}")
endif()
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT MSVC)
set(CMAKE_CXX_FLAGS_DEBUG "-Og -ggdb")
endif()
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
@ -117,6 +156,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
# src
set(LIBCLIENT_SRC_DIR ${PROJECT_SOURCE_DIR}/src/libclient)
set(APP_SRC_DIR ${PROJECT_SOURCE_DIR}/src/app)
set(VERSION_INFO_DIR ${PROJECT_SOURCE_DIR}/src/version_info)
# doc
set(DOC_DIR ${PROJECT_SOURCE_DIR}/doc)
# extras
@ -130,7 +170,7 @@ set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests)
# Here we let find_package(<PackageName>...) try to find Qt 6,
# If it is found, find_package will succeed, and the CMake variable
# QT_VERSION_MAJOR will be defined 6.
set(QT6_MINVER_MINOR 6)
set(QT6_MINVER_MINOR 8)
if(QT6_VER AND QT6_PATH)
find_package(QT NAMES Qt6 REQUIRED
PATHS ${QT6_PATH} NO_DEFAULT_PATH)
@ -139,15 +179,9 @@ else()
find_package(QT NAMES Qt6 REQUIRED)
endif()
if (${QT_VERSION_MINOR} GREATER_EQUAL ${QT6_MINVER_MINOR})
# Enforce a minimum Qt version of 6.6.2 for the Windows build
# https://github.com/stdware/qwindowkit/issues/23
if(MSVC AND ${QT_VERSION_MINOR} EQUAL 6 AND ${QT_VERSION_PATCH} LESS 2)
message(FATAL_ERROR "Qt 6.6.2 or higher is required. Found ${QT_VERSION}")
endif()
# Qt version is 6.6 or higher
message(STATUS "Found a suitable Qt version ${QT_VERSION}")
else()
message(FATAL_ERROR "Qt 6.6 or higher is required. Found ${QT_VERSION}")
message(FATAL_ERROR "Qt 6.8 or higher is required. Found ${QT_VERSION}")
endif()
# libjamiclient
@ -199,22 +233,41 @@ cloned this repository via git, perhaps you did not initialize its \
submodules afterwards. You can do so by running \"git submodule \
update --init\" in the repository.")
endif()
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIRS})
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/extras/build/cmake/modules)
if (NOT JAMICORE_AS_SUBDIR)
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIRS})
endif()
endif()
include(FindPython3)
find_package(Python3 3.6 REQUIRED COMPONENTS Interpreter)
set(PYTHON_EXEC ${Python3_EXECUTABLE})
# Versioning and build ID generation
set(VERSION_FILE ${CMAKE_CURRENT_BINARY_DIR}/version_info.cpp)
# Touch the file to ensure it exists at configure time as
# we add it to the target_sources below.
file(TOUCH ${VERSION_FILE})
add_custom_target(
generate_version_info ALL
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND}
-DAPP_SOURCE_DIR=${CMAKE_SOURCE_DIR}
-DAPP_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
-DCORE_SOURCE_DIR=${DAEMON_DIR}
-DCPP_INT_FILE=${VERSION_INFO_DIR}/version_info.cpp.in
-DBUILD_VERSION=${BUILD_VERSION}
-P ${CMAKE_SCRIPTS_DIR}/generate_version_info.cmake
)
list(APPEND CLIENT_INCLUDE_DIRS ${VERSION_INFO_DIR})
# Resource auto-gen
# QML and related code files
# Check files in the app's src directory and force a reconfigure if it
# changes.
# Only include webengine resources if specified.
# Only include WebEngine resources if specified.
if(WITH_WEBENGINE)
set(GEN_QRC_ARGS "--with-webengine")
endif()
@ -247,6 +300,7 @@ set(QML_IMPORT_PATH ${QML_DIRS}
add_definitions(-DQT_NO_KEYWORDS)
set(COMMON_SOURCES
${VERSION_FILE}
${APP_SRC_DIR}/bannedlistmodel.cpp
${APP_SRC_DIR}/accountlistmodel.cpp
${APP_SRC_DIR}/networkmanager.cpp
@ -286,6 +340,8 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/conversationlistmodel.cpp
${APP_SRC_DIR}/searchresultslistmodel.cpp
${APP_SRC_DIR}/calloverlaymodel.cpp
${APP_SRC_DIR}/spellcheckdictionarylistmodel.cpp
${APP_SRC_DIR}/spellcheckadapter.cpp
${APP_SRC_DIR}/filestosendlistmodel.cpp
${APP_SRC_DIR}/wizardviewstepmodel.cpp
${APP_SRC_DIR}/avatarregistry.cpp
@ -300,10 +356,13 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/currentcall.cpp
${APP_SRC_DIR}/messageparser.cpp
${APP_SRC_DIR}/previewengine.cpp
${APP_SRC_DIR}/imagedownloader.cpp
${APP_SRC_DIR}/filedownloader.cpp
${APP_SRC_DIR}/pluginversionmanager.cpp
${APP_SRC_DIR}/connectioninfolistmodel.cpp
${APP_SRC_DIR}/pluginversionmanager.cpp)
${APP_SRC_DIR}/pluginversionmanager.cpp
${APP_SRC_DIR}/linkdevicemodel.cpp
${APP_SRC_DIR}/qrcodescannermodel.cpp
${APP_SRC_DIR}/spellchecker.cpp)
set(COMMON_HEADERS
${APP_SRC_DIR}/global.h
@ -313,7 +372,6 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/appversionmanager.h
${APP_SRC_DIR}/utils.h
${APP_SRC_DIR}/bannedlistmodel.h
${APP_SRC_DIR}/version.h
${APP_SRC_DIR}/accountlistmodel.h
${APP_SRC_DIR}/instancemanager.h
${APP_SRC_DIR}/connectivitymonitor.h
@ -355,6 +413,8 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/conversationlistmodel.h
${APP_SRC_DIR}/searchresultslistmodel.h
${APP_SRC_DIR}/calloverlaymodel.h
${APP_SRC_DIR}/spellcheckdictionarylistmodel.h
${APP_SRC_DIR}/spellcheckadapter.h
${APP_SRC_DIR}/filestosendlistmodel.h
${APP_SRC_DIR}/wizardviewstepmodel.h
${APP_SRC_DIR}/avatarregistry.h
@ -369,17 +429,34 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/currentcall.h
${APP_SRC_DIR}/messageparser.h
${APP_SRC_DIR}/htmlparser.h
${APP_SRC_DIR}/imagedownloader.h
${APP_SRC_DIR}/filedownloader.h
${APP_SRC_DIR}/pluginversionmanager.h
${APP_SRC_DIR}/connectioninfolistmodel.h
${APP_SRC_DIR}/pttlistener.h)
${APP_SRC_DIR}/pttlistener.h
${APP_SRC_DIR}/crashreportclient.h
${APP_SRC_DIR}/crashreporter.h
${APP_SRC_DIR}/linkdevicemodel.h
${APP_SRC_DIR}/qrcodescannermodel.h
${APP_SRC_DIR}/spellchecker.h)
set(CONTRIB_DARWIN_FOLDER "")
if(APPLE)
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
if(ARCH_LEN EQUAL 1)
# single-arch -> use <arch>-apple-darwin<ver>
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
else() # multi-arch -> use apple-darwin<ver>
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
endif()
endif()
# For libavutil/avframe.
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
PATHS
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
include_directories(${AVUTIL_INCLUDE_DIR})
@ -391,6 +468,34 @@ endif()
# Define PREFER_VULKAN to prefer Vulkan over the default API
# on GNU/Linux and Windows. Metal is always preferred on macOS.
if(ENABLE_CRASHREPORTS)
set(CRASHREPORT_CLIENT_DIR ${APP_SRC_DIR}/crashreportclients)
if(ENABLE_CRASHPAD)
list(APPEND CLIENT_LIBS crashpad_client)
list(APPEND COMMON_SOURCES ${CRASHREPORT_CLIENT_DIR}/crashpad.cpp)
list(APPEND COMMON_HEADERS ${CRASHREPORT_CLIENT_DIR}/crashpad.h)
endif()
endif()
find_package(PkgConfig REQUIRED)
# hunspell
pkg_search_module(hunspell IMPORTED_TARGET hunspell)
if(hunspell_FOUND)
message(STATUS "hunspell found")
set(HUNSPELL_LIBRARIES PkgConfig::hunspell)
else()
message(STATUS "hunspell not found - building hunspell")
set(HUNSPELL_DIR ${PROJECT_SOURCE_DIR}/3rdparty/hunspell)
# Build using the submodule and its CMakeLists.txt
add_subdirectory(${HUNSPELL_DIR} hunspell_build EXCLUDE_FROM_ALL)
set(HUNSPELL_INCLUDE_DIR ${HUNSPELL_DIR}/src)
set(HUNSPELL_LIBRARIES hunspell::hunspell)
endif()
if(MSVC)
set(WINDOWS_SYS_LIBS
windowsapp.lib
@ -436,16 +541,6 @@ if(MSVC)
set(JAMID_SRC_PATH ${DAEMON_DIR}/contrib/msvc/include)
set(GNUTLS_LIB ${DAEMON_DIR}/contrib/msvc/lib/x64/libgnutls.lib)
# Beta config
if(BETA)
message(STATUS "Beta config enabled")
add_definitions(-DBETA)
set(JAMI_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Beta)
else()
set(JAMI_OUTPUT_DIRECTORY_RELEASE
${PROJECT_SOURCE_DIR}/x64/Release)
endif()
include_directories(
${JAMID_SRC_PATH}
${LIBCLIENT_SRC_DIR}
@ -463,8 +558,6 @@ elseif (NOT APPLE)
${APP_SRC_DIR}/screencastportal.h)
list(APPEND QT_MODULES DBus)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GLIB REQUIRED glib-2.0)
if(GLIB_FOUND)
add_definitions(${GLIB_CFLAGS_OTHER})
@ -493,19 +586,12 @@ elseif (NOT APPLE)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
endif()
list(PREPEND CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
pkg_check_modules(LIBAVUTIL libavutil>=55.75.100)
list(REMOVE_ITEM CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
include_directories(
${LIBCLIENT_SRC_DIR}
${LIBNM_INCLUDE_DIRS}
${LIBNOTIFY_INCLUDE_DIRS}
${LIBGDKPIXBUF_INCLUDE_DIRS}
${GLIB_INCLUDE_DIRS}
${LIBAVUTIL_INCLUDE_DIRS})
${GLIB_INCLUDE_DIRS})
set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
@ -547,6 +633,13 @@ else() # APPLE
endif()
endif()
message(STATUS "Adding HUNSPELL_INCLUDE_DIR" ${HUNSPELL_INCLUDE_DIR})
list(APPEND CLIENT_INCLUDE_DIRS ${HUNSPELL_INCLUDE_DIR} ${CMAKE_BINARY_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/hunspell/src)
message(STATUS "Adding HUNSPELL_LIBRARIES" ${HUNSPELL_INCLUDE_DIR})
list(APPEND CLIENT_LIBS ${HUNSPELL_LIBRARIES})
# Qt find package
if(QT6_VER AND QT6_PATH)
message(STATUS "Using custom Qt version")
@ -600,20 +693,43 @@ add_subdirectory(3rdparty/SortFilterProxyModel)
set(SFPM_OBJECTS $<TARGET_OBJECTS:SortFilterProxyModel>)
# md4c
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Don't build md2html executable" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
list(APPEND CLIENT_LIBS md4c-html)
find_package(md4c)
if(md4c_FOUND)
message(STATUS "Using system-provided md4c-html")
list(APPEND CLIENT_LIBS md4c::md4c-html)
else()
message("Using bundled md4c-html library")
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Don't build md2html executable" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
list(APPEND CLIENT_LIBS md4c-html)
endif()
# tidy-html5
set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
list(APPEND CLIENT_LIBS tidy-static)
pkg_check_modules(tidy IMPORTED_TARGET tidy)
if(tidy_FOUND)
message(STATUS "Using system-provided tidy")
list(APPEND CLIENT_LIBS PkgConfig::tidy)
else()
message("Using bundled tidy library")
set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
list(APPEND CLIENT_LIBS tidy-static)
endif()
# ZXing-cpp configuration
set(BUILD_EXAMPLES OFF CACHE BOOL "")
set(BUILD_BLACKBOX_TESTS OFF CACHE BOOL "")
add_subdirectory(3rdparty/zxing-cpp EXCLUDE_FROM_ALL)
# Add ZXing-cpp to includes and libraries
list(APPEND CLIENT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/zxing-cpp/core/src)
list(APPEND CLIENT_LIBS ZXing)
# common executable sources
qt_add_executable(
@ -624,7 +740,13 @@ qt_add_executable(
${COMMON_SOURCES}
${QML_RESOURCES}
${QML_RESOURCES_QML}
${SFPM_OBJECTS})
${SFPM_OBJECTS}
src/app/spellcheckadapter.h src/app/spellcheckadapter.cpp)
#add_dependencies(${PROJECT_NAME} hunspell)
# Ensure the generated version file can be found.
add_dependencies(${PROJECT_NAME} generate_version_info)
foreach(MODULE ${QT_MODULES})
list(APPEND QT_LIBS "Qt::${MODULE}")
@ -692,13 +814,13 @@ elseif (NOT APPLE)
# Install .desktop in XDG desktop direcory so that it is recognized
# by the system.
install(
FILES ${DATA_DIR}/jami.desktop
FILES ${DATA_DIR}/net.jami.Jami.desktop
DESTINATION ${JAMI_DATA_PREFIX}/applications)
# Install .desktop in the jami data directory, so that it can be
# copied to the autostart directory by the client.
install(
FILES ${DATA_DIR}/jami.desktop
FILES ${DATA_DIR}/net.jami.Jami.desktop
DESTINATION "${JAMI_DATA_PREFIX}/${PROJECT_NAME}"
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) # 644
@ -717,14 +839,19 @@ elseif (NOT APPLE)
PRIVATE
JAMI_INSTALL_PREFIX="${JAMI_DATA_PREFIX}")
target_compile_definitions(
${PROJECT_NAME}
PRIVATE
HUNSPELL_INSTALL_DIR="${HUNSPELL_DICT_DIR}")
# Logos
install(
FILES resources/images/jami.svg
FILES resources/images/net.jami.Jami.svg
DESTINATION
${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
install(
FILES resources/images/jami-48px.png
FILES resources/images/net.jami.Jami-48px.png
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
RENAME jami.png)
@ -733,9 +860,19 @@ elseif (NOT APPLE)
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
RENAME jami.xpm)
# AppStream metadata
#
# MetaInfo file:
install(
FILES ${DATA_DIR}/jami.appdata.xml
FILES ${DATA_DIR}/net.jami.Jami.metainfo.xml
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
# Catalog file:
if(NOT DEFINED APPSTREAM_CATALOG_DIR)
set(APPSTREAM_CATALOG_DIR /share/swcatalog/xml)
endif()
install(
FILES ${DATA_DIR}/jami.xml
DESTINATION ${CMAKE_INSTALL_PREFIX}${APPSTREAM_CATALOG_DIR})
# man page
install(
@ -807,7 +944,7 @@ else()
target_sources(${PROJECT_NAME} PRIVATE ${resources})
list(APPEND CLIENT_LIBS ${libs})
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib/*.a)
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/lib/*.a)
list(APPEND CLIENT_LIBS ${CONTRIB})
find_package(Iconv REQUIRED)
@ -819,12 +956,20 @@ else()
"-framework Security"
compression
resolv
)
)
set(APP_CONTAINER "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app/Contents")
# ringtones. Copy the entire directory to the app bundle.
# daemon/ringtones -> Jami.app/Contents/Resources/ringtones
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy_directory
${DAEMON_DIR}/ringtones
${APP_CONTAINER}/Resources/ringtones
)
# translations
if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
set(APP_CONTAINER
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app/Contents")
file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
# Generate lproj folders.
@ -852,26 +997,26 @@ else()
MACOSX_BUNDLE_SHORT_VERSION_STRING "${JAMI_VERSION}"
MACOSX_BUNDLE_BUNDLE_VERSION "${JAMI_BUILD}"
MACOSX_BUNDLE_COPYRIGHT "${PROJ_COPYRIGHT}")
if(APPSTORE)
message(STATUS "app store version")
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/appstore/Jami.entitlements")
else()
set_target_properties(${PROJECT_NAME} PROPERTIES
SPARKLE_URL "${SPARKLE_URL}"
SPARKLE_PUBLIC_KEY "${SPARKLE_PUBLIC_KEY}"
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/Jami.entitlements"
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME TRUE)
endif()
if(DEPLOY)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -DQML_SRC_DIR=${SRC_DIR}
-DMAC_DEPLOY_QT_PATH=${CMAKE_PREFIX_PATH}/bin
-DEXE_NAME="${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app"
-DSPARKLE_PATH=${SPARKLE_FRAMEWORK}
-DENABLE_SPARKLE=${ENABLE_SPARKLE}
-P ${EXTRAS_DIR}/build/cmake/macos_qt_deploy.cmake)
endif()
if(APPSTORE)
message(STATUS "app store version")
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/appstore/Jami.entitlements")
else()
set_target_properties(${PROJECT_NAME} PROPERTIES
SPARKLE_URL "${SPARKLE_URL}"
SPARKLE_PUBLIC_KEY "${SPARKLE_PUBLIC_KEY}"
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/Jami.entitlements"
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME TRUE)
endif()
if(DEPLOY)
execute_process(COMMAND
"${CMAKE_PREFIX_PATH}/bin/macdeployqt"
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app"
-qmldir=${QML_SRC_DIR})
if(${ENABLE_SPARKLE} MATCHES true)
file(COPY ${SPARKLE_FRAMEWORK} DESTINATION ${EXE_NAME}/Contents/Frameworks/)
endif()
endif()
endif()
target_include_directories(${PROJECT_NAME} PRIVATE ${CLIENT_INCLUDE_DIRS})
@ -884,5 +1029,6 @@ qt_finalize_executable(${PROJECT_NAME})
# tests
if(BUILD_TESTING)
message("Add Jami tests")
enable_testing()
add_subdirectory(${TESTS_DIR})
endif()

View File

@ -14,7 +14,7 @@ So, you will need to get Qt 6.6 first. For this, there is 3 methods:
### Qt from our repo (recommended)
If your distribution is supported, we provide a Qt package (libqt-jami) on our repo.
The files will be installed in `/usr/lib/libqt-jami`.
The files will be installed to `/usr/lib/libqt-jami` on Debian-like distributions. For RPM based distributions the files will be installed to `/usr/lib64/qt-jami`.
#### Install libqt-jami, Ubuntu based
@ -113,7 +113,7 @@ sudo ./build.py --dependencies
Then, you can build daemon and the client using:
```bash
./build.py --install
./build.py --install [--qt=<path/to/qt> (this needs to be the same as in the previous ./build.py --init)]
```
If you use a Qt version that is not system-wide installed, you need to
@ -189,18 +189,20 @@ Only 64-bit MSVC build can be compiled.
- Download [Qt (Open Source)](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
- Using the online installer, install the following Qt 6.6.1 components:
- Using the online installer, install the following Qt 6.8.3 components:
- Git 2.10.2
- MSVC 2019 64-bit
- Qt 5 Compatibility Module
- MSVC 2022 64-bit
- Extension :
- Qt WebEngine
- Additional Libraries
- Qt Multimedia
- Qt Network Authorization
- Qt WebChannel
- Qt WebEngine
- Qt WebSockets
- Qt WebView
- Qt 5 Compatibility Module
- Qt Positioning
- Download [Visual Studio](https://visualstudio.microsoft.com/) (versions 2019 or 2022). _See the SDK notes below._
@ -212,7 +214,7 @@ Only 64-bit MSVC build can be compiled.
| | Qt Version |
| -------------------- | ---------- |
| Minimum requirement: | 6.6.2 |
| Minimum requirement: | 6.8.3 |
- Install [Python3](https://www.python.org/downloads/) for Windows
@ -238,9 +240,14 @@ Only 64-bit MSVC build can be compiled.
- Using a new **Non-Elevated Command Prompt**
```bash
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
```bash
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
> **CMake** Note: The build script does not specify what CMake generator should be used. This means CMake will search the system for the appropriate generator, which might not always select the right one if, for instance, Ninja is installed. To resolve that, the CMAKE_GENERATOR environment variable can be used, set to "Visual Studio 16 2019" or "Visual Studio 19 2022" depending on the installed Visual Studio version.
> **SDK** Note:
> Jami can be build with more recent Windows SDK than the one specified in the table above. However, if your have another version than SDK 10.0.18362.0 installed, you need to identify it according to the example below. And you still need to have the required version in addition to the one you chose.
@ -288,12 +295,12 @@ Once the build has finished, you should then be able to use the Visual Studio So
**Set up**
- macOS minimum version 11.0
- macOS minimum version 12.0
- install python3
- download xcode
- install Qt 6.6
- install Qt 6.8
Qt 6.6 can be installed via brew
Qt 6.8 can be installed via brew
```bash
brew install qt
@ -343,9 +350,24 @@ Built client could be find in `build/Jami`
- These environment variables will be temporarily set when using build-windows.py to run tests.
## Troubleshooting
Build errors may occur if daemon dependencies have been updated since the last build, as the script may not fully detect or rebuild them in the correct order. For the same reason, you may also occasionally encounter linker errors.
To resolve this, clean and restart the installation to ensure a fresh rebuild of all components (delete all temporary files generated by the build process):
```bash
./build.py --clean
./build.py --install
```
## Debugging
Compile the client with with `-DCMAKE_BUILD_TYPE=Debug`.
Compile the client with `-DCMAKE_BUILD_TYPE=Debug`. Then, if you want to enable logging when running `jami`, launch it with `-d` or `--debug`.
Then, if you want to enable logging when running `jami`, launch it
with `-d` or `--debug`.
To diagnose a crash, use GDB:
```sh
./build.py --install --debug
gdb -ex run --args ./jami --debug
```

View File

@ -1,3 +1,4 @@
/obj
/bin
Components.wxs
AppComponents.wxs
CrtComponents.wxs

View File

@ -3,13 +3,6 @@
<?define Name="Jami" ?>
<?define ExeName="Jami" ?>
<?define AppName="Jami" ?>
<?if $(var.Configuration) = Release ?>
<?define ReleaseDir="..\x64\Release"?>
<?else?>
<?define ReleaseDir="..\x64\Beta"?>
<?endif ?>
<?define Manufacturer="Savoir-Faire Linux"?>
<?define UcrtDir="C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64"?>
<?define ReleaseDir="..\x64\Release"?>
</Include>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-16"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DeployedProjects />
<DirectoryMappings />
<FileMappings />

View File

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="4.0"
DefaultTargets="Build"
InitialTargets="EnsureWixToolsetInstalled"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x64</Platform>
@ -13,20 +16,10 @@
<InstallerPlatform>x64</InstallerPlatform>
<DefineSolutionProperties>false</DefineSolutionProperties>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>HarvestPath=..\x64\Release</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
<WixVariables>
</WixVariables>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Beta|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>HarvestPath=..\x64\Beta</DefineConstants>
<PropertyGroup>
<OutputPath>bin\Release\</OutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<DefineConstants>AppHarvestPath=..\x64\Release;CrtHarvestPath=$(VC_CRT_Dir)</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
@ -35,8 +28,8 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />
<Compile Include="StandardComponents.wxs" />
<Compile Include="Components.wxs" />
<Compile Include="AppComponents.wxs" />
<Compile Include="CrtComponents.wxs" />
</ItemGroup>
<ItemGroup>
<Content Include="Config.wxi" />
@ -58,13 +51,36 @@
<ItemGroup>
<EmbeddedResource Include="Localization.wxl" />
</ItemGroup>
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
<Import Project="$(WixTargetsPath)"
Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets"
Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled"
Condition=" '$(WixTargetsImported)' != 'true' ">
<Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
</Target>
<Target Name="BeforeBuild">
<HeatDirectory Directory="..\x64\$(Configuration)" PreprocessorVariable="var.HarvestPath" OutputFile="Components.wxs" ComponentGroupName="HeatGenerated" DirectoryRefId="APPLICATIONFOLDER" AutogenerateGuids="true" ToolPath="$(WixToolPath)" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" Transforms="HarvestFilter.xslt" />
<HeatDirectory Directory="..\x64\Release"
PreprocessorVariable="var.AppHarvestPath"
OutputFile="AppComponents.wxs"
ComponentGroupName="AppHeatGenerated"
DirectoryRefId="APPLICATIONFOLDER"
AutogenerateGuids="true"
ToolPath="$(WixToolPath)"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true"
Transforms="HarvestFilter.xslt" />
<HeatDirectory Directory="$(VC_CRT_Dir)"
PreprocessorVariable="var.CrtHarvestPath"
OutputFile="CrtComponents.wxs"
ComponentGroupName="CrtHeatGenerated"
DirectoryRefId="APPLICATIONFOLDER"
AutogenerateGuids="true"
ToolPath="$(WixToolPath)"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true" />
</Target>
<Target Name="AfterBuild">
</Target>

View File

@ -2,6 +2,14 @@
<WixLocalization Culture="en-us"
xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine">By installing this software you agree to the terms in the license agreement</String>
<UI Dialog="ExitDialog" Control="OptionalCheckBox" Width="10" Height="10" X="135" Y="110" />
<UI Dialog="ExitDialog" Control="OptionalText" X="150" Y="110" />
<UI Dialog="ExitDialog"
Control="OptionalCheckBox"
Width="10"
Height="10"
X="135"
Y="110" />
<UI Dialog="ExitDialog"
Control="OptionalText"
X="150"
Y="110" />
</WixLocalization>

View File

@ -1,134 +1,220 @@
<?xml version="1.0" encoding="UTF-8"?>
<?include Config.wxi?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="$(var.Name)" Language="1033" Version="$(fun.AutoVersion(1.0))" Manufacturer="$(var.Manufacturer)" UpgradeCode="7c45b52b-0390-4fe8-947a-3f13e82dd346">
<Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" />
<Product Id="*"
Name="$(var.Name)"
Language="1033"
Version="$(fun.AutoVersion(1.0))"
Manufacturer="$(var.Manufacturer)"
UpgradeCode="7c45b52b-0390-4fe8-947a-3f13e82dd346">
<Package InstallerVersion="301"
Compressed="yes"
InstallScope="perMachine" />
<MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="yes"/>
<MediaTemplate EmbedCab="yes" CompressionLevel="high" MaximumUncompressedMediaSize="4" />
<MajorUpgrade Schedule="afterInstallInitialize"
AllowDowngrades="yes"/>
<MediaTemplate EmbedCab="yes"
CompressionLevel="high"
MaximumUncompressedMediaSize="4" />
<!--Disables interaction of the package with the Restart Manager.-->
<Property Id="MSIRESTARTMANAGERCONTROL" Value="Disable" />
<Property Id="MSIRESTARTMANAGERCONTROL"
Value="Disable" />
<!--Icon File should be in release folder(not wix project), otherwise cannot be read-->
<Icon Id="icon.ico" SourceFile="$(var.ReleaseDir)\jami.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<Property Id="ARPNOMODIFY" Value="1" />
<Icon Id="icon.ico"
SourceFile="$(var.ReleaseDir)\jami.ico" />
<Property Id="ARPPRODUCTICON"
Value="icon.ico" />
<Property Id="ARPNOMODIFY"
Value="1" />
<!-- It seems that QtWebEngineProcess.exe versioning requires us to force reinstall. -->
<Property Id="REINSTALLMODE" Value="dms" />
<Property Id="REINSTALLMODE"
Value="dms" />
<Feature Id="ProductFeature" Title="Main" Level="1" Absent="disallow">
<ComponentGroupRef Id="StandardComponents" Primary="yes" />
<ComponentGroupRef Id="HeatGenerated" />
<Feature Id="ProductFeature"
Title="Main"
Level="1"
Absent="disallow">
<ComponentGroupRef Id="MainExecutable"
Primary="yes" />
<ComponentGroupRef Id="AppHeatGenerated" />
<ComponentGroupRef Id="CrtHeatGenerated" />
<ComponentRef Id="ApplicationShortcutDesktop" />
<ComponentRef Id="ApplicationShortcutStartMenu" />
<ComponentRef Id="RegistryEntries" />
<ComponentRef Id="URLProtocolRegistryEntries" />
</Feature>
<!--Visual C++ Redist merge module-->
<DirectoryRef Id="TARGETDIR">
<Merge Id="VCRedist" SourceFile="$(env.VCRedistMergeModule)" DiskId="1" Language="0" />
</DirectoryRef>
<Feature Id="VCRedist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedist"/>
</Feature>
<SetProperty After="FindRelatedProducts" Id="FirstInstall" Value="true">
<SetProperty After="FindRelatedProducts"
Id="FirstInstall"
Value="true">
NOT Installed AND NOT WIX_UPGRADE_DETECTED AND NOT WIX_DOWNGRADE_DETECTED
</SetProperty>
<SetProperty After="SetFirstInstall" Id="Upgrading" Value="true">
<SetProperty After="SetFirstInstall"
Id="Upgrading"
Value="true">
WIX_UPGRADE_DETECTED AND NOT (REMOVE="ALL")
</SetProperty>
<SetProperty After="RemoveExistingProducts" Id="RemovingForUpgrade" Sequence="execute" Value="true">
(REMOVE="ALL") AND UPGRADINGPRODUCTCODE
<SetProperty After="RemoveExistingProducts"
Id="RemovingForUpgrade"
Sequence="execute"
Value="true"> (REMOVE="ALL") AND UPGRADINGPRODUCTCODE
</SetProperty>
<SetProperty After="SetUpgrading" Id="Uninstalling" Value="true">
<SetProperty After="SetUpgrading"
Id="Uninstalling"
Value="true">
Installed AND (REMOVE="ALL") AND NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE)
</SetProperty>
<SetProperty After="SetUninstalling" Id="Maintenance" Value="true">
<SetProperty After="SetUninstalling"
Id="Maintenance"
Value="true">
Installed AND NOT Upgrading AND NOT Uninstalling AND NOT UPGRADINGPRODUCTCODE
</SetProperty>
<!--SetDirectory of APPLICATIONFOLDER -->
<SetDirectory Id="APPLICATIONFOLDER" Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<SetProperty Id="ARPINSTALLLOCATION" Value="[APPLICATIONFOLDER]" After="CostFinalize" />
<SetDirectory Id="APPLICATIONFOLDER"
Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<SetProperty Id="ARPINSTALLLOCATION"
Value="[APPLICATIONFOLDER]"
After="CostFinalize" />
<UIRef Id="CustomUI" />
<WixVariable Id="WixUIInfoIcon" Value="icon.ico"/>
<WixVariable Id="WixUIBannerBmp" Value="top-banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="main-banner.bmp" />
<WixVariable Id="WixUISupportPerUser" Value="0" />
<WixVariable Id="WixUIInfoIcon"
Value="icon.ico"/>
<WixVariable Id="WixUIBannerBmp"
Value="top-banner.bmp" />
<WixVariable Id="WixUIDialogBmp"
Value="main-banner.bmp" />
<WixVariable Id="WixUISupportPerUser"
Value="0" />
<CustomAction Id="RemoveOldJamiFiles"
Directory="APPLICATIONFOLDER"
ExeCommand="cmd /c &quot;del vc_redist.x64.exe; del uninstall.exe; del WinSparkle.dll;&quot;"
Execute="deferred"
Return="ignore"
HideTarget="no"
Impersonate="no"/>
Directory="APPLICATIONFOLDER"
ExeCommand="cmd /c &quot;del vc_redist.x64.exe; del uninstall.exe; del WinSparkle.dll;&quot;"
Execute="deferred"
Return="ignore"
HideTarget="no"
Impersonate="no"/>
<Property Id="QtExecCmdLine"
Value='"[APPLICATIONFOLDER]/$(var.ExeName).exe" --term'/>
Value='"[APPLICATIONFOLDER]/$(var.ExeName).exe" --term'/>
<CustomAction Id="TerminateAppProcess"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="immediate"
Return="ignore"/>
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="immediate"
Return="ignore"/>
</Product>
<Fragment Id="DirectoryStructure">
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="TARGETDIR"
Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="APPLICATIONFOLDER" Name="$(var.Name)" />
<Directory Id="APPLICATIONFOLDER"
Name="$(var.Name)" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="DesktopFolder"
Name="Desktop" />
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" />
</Directory>
<Directory Id="WindowsFolder" Name="WINDOWS"/>
<Directory Id="WindowsFolder"
Name="WINDOWS"/>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="MainExecutable"
Directory="APPLICATIONFOLDER">
<Component Id="cmp9CFEE34E3A162AB05264E8B756EC1DEC"
Guid="*">
<File Id="fileMain.exe"
KeyPath="yes"
Source="$(var.ReleaseDir)\$(var.ExeName).exe" />
</Component>
</ComponentGroup>
</Fragment>
<Fragment Id="Shortcuts">
<DirectoryRef Id="DesktopFolder">
<Component Id="ApplicationShortcutDesktop" Guid="*" Win64="yes">
<Shortcut Id="ApplicationShortcutDesktop" Name="$(var.Name)" Description="Launch $(var.Name)" Target="[#fileMain.exe]" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.Name)" Name="desktop" Type="integer" Value="1" KeyPath="yes" />
<Component Id="ApplicationShortcutDesktop"
Guid="*"
Win64="yes">
<Shortcut Id="ApplicationShortcutDesktop"
Name="$(var.Name)"
Description="Launch $(var.Name)"
Target="[#fileMain.exe]"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="DesktopFolder"
On="uninstall" />
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.Name)"
Name="desktop"
Type="integer"
Value="1"
KeyPath="yes" />
<Condition>FirstInstall</Condition>
</Component>
</DirectoryRef>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcutStartMenu" Guid="*" Win64="yes">
<Shortcut Id="ApplicationShortcutStartMenu" Name="$(var.Name)" Description="Launch $(var.Name)" Target="[#fileMain.exe]" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="StartMenuFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.Name)" Name="startmenu" Type="integer" Value="1" KeyPath="yes" />
<Component Id="ApplicationShortcutStartMenu"
Guid="*"
Win64="yes">
<Shortcut Id="ApplicationShortcutStartMenu"
Name="$(var.Name)"
Description="Launch $(var.Name)"
Target="[#fileMain.exe]"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="StartMenuFolder"
On="uninstall" />
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.Name)"
Name="startmenu"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment Id="OtherRegistryEntries">
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntries" Guid="*" Win64="yes">
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.AppName)" Name="hasRun" Type="integer" Value="0" KeyPath="yes" />
<Component Id="RegistryEntries"
Guid="*"
Win64="yes">
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.AppName)"
Name="hasRun"
Type="integer"
Value="0"
KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment Id="URLProtocol">
<DirectoryRef Id="TARGETDIR">
<Component Id="URLProtocolRegistryEntries" Guid="*" Win64="yes">
<RegistryKey Root="HKCR" Key="jami" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryValue Type="string" Name="URL Protocol" Value="" />
<RegistryValue Type="string" Value="URL:jami"/>
<Component Id="URLProtocolRegistryEntries"
Guid="*"
Win64="yes">
<RegistryKey Root="HKCR"
Key="jami"
ForceCreateOnInstall="yes"
ForceDeleteOnUninstall="yes">
<RegistryValue Type="string"
Name="URL Protocol"
Value="" />
<RegistryValue Type="string"
Value="URL:jami"/>
<RegistryKey Key="DefaultIcon">
<RegistryValue Type="string" Value="[APPLICATIONFOLDER]$(var.ExeName).exe" />
<RegistryValue Type="string"
Value="[APPLICATIONFOLDER]$(var.ExeName).exe" />
</RegistryKey>
<RegistryKey Key="shell\open\command">
<RegistryValue Type="string" Value='"[APPLICATIONFOLDER]$(var.ExeName).exe" "%1"' />
<RegistryValue Type="string"
Value='"[APPLICATIONFOLDER]$(var.ExeName).exe" "%1"' />
</RegistryKey>
</RegistryKey>
</Component>
@ -137,47 +223,88 @@
<Fragment Id="UI">
<UI Id="CustomUI">
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<Property Id="WixAppFolder"
Value="WixPerMachineFolder" />
<!--APPLICATIONFOLDER required by WixUI_Advanced, ApplicationFolderName reset APPLICATIONFOLDER path-->
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)\$(var.AppName)" />
<Property Id="ApplicationFolderName"
Value="$(var.Manufacturer)\$(var.AppName)" />
<UIRef Id="WixUI_Advanced" />
<!--Remove User Exit Dialog-->
<Publish Dialog="AdvancedWelcomeEulaDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="FeaturesDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="AdvancedWelcomeEulaDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="FeaturesDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="MaintenanceTypeDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<!--Launch Program If Checkbox is clicked-->
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
<InstallUISequence>
<Show Dialog="UserExit" OnExit="cancel">NOT AbortInstall = 1</Show>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Show Dialog="UserExit"
OnExit="cancel">NOT AbortInstall = 1</Show>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder"
After="WixSetDefaultPerMachineFolder" />
</InstallUISequence>
</UI>
<InstallExecuteSequence>
<Custom Action='TerminateAppProcess' Before='InstallValidate'/>
<Custom Action="RemoveOldJamiFiles" After="RemoveFiles" />
<Custom Action="LaunchApplication_nonUI" After="InstallFinalize"> WIXNONUILAUNCH </Custom>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Custom Action='TerminateAppProcess'
Before='InstallValidate'/>
<Custom Action="RemoveOldJamiFiles"
After="RemoveFiles" />
<Custom Action="LaunchApplication_nonUI"
After="InstallFinalize"> WIXNONUILAUNCH </Custom>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder"
After="WixSetDefaultPerMachineFolder" />
</InstallExecuteSequence>
<!--License check box text, Launch check box text (auto check)-->
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT"
Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT"
Value="Launch $(var.Name)" />
<!--CheckBox Default Set to One-->
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
<Property Id="LicenseAccepted" Value="1"/>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX"
Value="1"/>
<Property Id="LicenseAccepted"
Value="1"/>
<Property Id="WixShellExecTarget" Value="[#fileMain.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<CustomAction Id="LaunchApplication_nonUI" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes"/>
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" />
<Property Id="WixShellExecTarget"
Value="[#fileMain.exe]" />
<CustomAction Id="LaunchApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Impersonate="yes" />
<CustomAction Id="LaunchApplication_nonUI"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Impersonate="yes"/>
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder"
Property="WixPerMachineFolder"
Value="[ProgramFiles64Folder][ApplicationFolderName]"
Execute="immediate" />
<!--License File-->
<WixVariable Id="WixUILicenseRtf" Value="$(var.ReleaseDir)\License.rtf"/>
<WixVariable Id="WixUILicenseRtf"
Value="$(var.ReleaseDir)\License.rtf"/>
</Fragment>
</Wix>

View File

@ -1,86 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Generated with WiX's heat tool using the command:
heat.exe dir x64\Release -ag -cg ProductComponents -dr APPLICATIONFOLDER -srd -var var.ReleaseDir -out JamiInstaller\Components.wxs
Includes:
- the api-ms-win dlls missing parts of vc merge module for windows 7 support
- Jami.exe with a named Id so we can reference it in Product.wxs to launch after install
We run heat in the prebuild step on x64\Release without Jami.exe (instead of an XSLT file), to harvest everything else.
-->
<?include Config.wxi?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<ComponentGroup Id="StandardComponents">
<Component Id="cmp9C61F84AF9761955FBF397AFAE21C11B" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil2089BEC9A7AB899CED5A5EE501789299" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-file-l1-2-0.dll" />
</Component>
<Component Id="cmp03BB2697EE10869C4A329E3EA987EFAA" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil44C27F2C97596734BB3BEB7C21F7B71C" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-file-l2-1-0.dll" />
</Component>
<Component Id="cmp6B6AA7AEA5A4D324A4EE7DAE1B1193E0" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil1D16BE23D323A1E37FC1FC7354A9305F" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-localization-l1-2-0.dll" />
</Component>
<Component Id="cmpB5454FB66442C9BFD2145AE30B32D7A9" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil031B78DF53F7A3AC109410907624FC3E" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-processthreads-l1-1-1.dll" />
</Component>
<Component Id="cmp9F6D22CD9B1739E4F75F92F3A07E4CA1" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE9A3672FA504AA8E518DD72A02CD3E77" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-synch-l1-2-0.dll" />
</Component>
<Component Id="cmp9451422B7074D46F019614C3DE73BD17" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil3C902CA2889BB8855D285C3FBABB334F" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-timezone-l1-1-0.dll" />
</Component>
<Component Id="cmp349250459EC2D8C328EED5138B073E7A" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil2466F3D9FBA095A007D0909040D4D688" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-conio-l1-1-0.dll" />
</Component>
<Component Id="cmpCC880F2B054A87EF5FC68232652231BF" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil605A691486569535A1C3548F7DCE753C" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-convert-l1-1-0.dll" />
</Component>
<Component Id="cmpD6CB40D5A5AFF2161B7B4B4F06F03301" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil09AE032A32E2E542A232F7941AC77320" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-environment-l1-1-0.dll" />
</Component>
<Component Id="cmpC02538029646A27A9F786AD690EB3C8E" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil7DE9C3CADCA188356922B0CBD8E313E7" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-filesystem-l1-1-0.dll" />
</Component>
<Component Id="cmp8E50197B377636123F0F1F94FFB004E7" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil584F158D11B8A380C73F1EFE8BBA92B4" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-heap-l1-1-0.dll" />
</Component>
<Component Id="cmp7F729C94A363C73DC4D91B6F48E4F859" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil4BE19B924B98D56F3155B66496D574E5" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-locale-l1-1-0.dll" />
</Component>
<Component Id="cmp7C573E66B0904BA73880788F7057AF88" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE8495C446FA1237E92562498D20261AA" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-math-l1-1-0.dll" />
</Component>
<Component Id="cmp7A91CED53D8F6E5F20F2049B3B5CD143" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil06951EB208628753677745AF15CC12A5" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-multibyte-l1-1-0.dll" />
</Component>
<Component Id="cmp1CE713C705A95306A1D246AC3AB9DE25" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil8D102BB81768F998470C34797459E306" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-private-l1-1-0.dll" />
</Component>
<Component Id="cmp35840DFBF4D6AE827AFC4EF2A17BB3EB" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filC6C457BD901F940DCB673D271728F9FE" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-process-l1-1-0.dll" />
</Component>
<Component Id="cmpEBB86BDA48FE3B9E2043C1A80D26ACD5" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE1B2095225B01DEFA5DA9895B432FBCB" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-runtime-l1-1-0.dll" />
</Component>
<Component Id="cmp80C8534B553078EA8B86F100FF542776" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filDAFE58019AD70832B8304DCEA534B5EE" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-stdio-l1-1-0.dll" />
</Component>
<Component Id="cmpCFC348111B5343749A2273A62421C07C" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil1F1B38DB330CA413655F715578D4BE1A" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-string-l1-1-0.dll" />
</Component>
<Component Id="cmp7D5450E04EC419244107942A00DF7DDF" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filEB03BCF3155C5BAE2C2EDBF036EB659D" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-time-l1-1-0.dll" />
</Component>
<Component Id="cmp5456679BDCC818B2E9476B416F71AAA5" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil5B120DD384CABED37DFC2652C6462666" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-utility-l1-1-0.dll" />
</Component>
<Component Id="cmpF23755F862A15FFCBD109C85599B7F20" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filD6887AD9110E4A8D49143C9A8F0B5843" KeyPath="yes" Source="$(var.UcrtDir)\ucrtbase.dll" />
</Component>
<Component Id="cmp9CFEE34E3A162AB05264E8B756EC1DEC" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fileMain.exe" KeyPath="yes" Source="$(var.ReleaseDir)\$(var.ExeName).exe" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>

View File

@ -38,7 +38,7 @@ cf [INSTALL.md](/INSTALL.md)
# License
Copyright (C) 2020-2024 Savoir-faire Linux Inc.
Copyright (C) 2020-2025 Savoir-faire Linux Inc.
Jami 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.

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# build.py --- Convenience script for building and running Jami
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# 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
@ -100,7 +100,7 @@ ZYPPER_DEPENDENCIES = [
'speexdsp-devel', 'speex-devel', 'libdbus-c++-devel', 'jsoncpp-devel', 'yaml-cpp-devel',
'yasm', 'libuuid-devel', 'libnettle-devel', 'libopus-devel', 'libexpat-devel',
'libgnutls-devel', 'msgpack-c-devel', 'msgpack-cxx-devel', 'libavcodec-devel', 'libavdevice-devel', 'pcre-devel',
'alsa-devel', 'libpulse-devel', 'libudev-devel', 'libva-devel', 'libvdpau-devel',
'alsa-devel', 'libpulse-devel', 'libudev-devel', 'libva-devel', 'libvdpau-devel', 'pipewire-devel',
'libopenssl-devel', 'libavutil-devel',
]
@ -112,7 +112,7 @@ ZYPPER_CLIENT_DEPENDENCIES = [
'qt6-svg-devel', 'qt6-multimedia-devel', 'qt6-multimedia-imports',
'qt6-declarative-devel', 'qt6-qmlcompiler-private-devel',
'qt6-quickcontrols2-devel', 'qt6-shadertools-devel',
'qrencode-devel', 'NetworkManager-devel'
'qrencode-devel', 'NetworkManager-devel', 'hunspell-devel', 'libhunspell-devel'
]
ZYPPER_QT_WEBENGINE = [
@ -130,7 +130,7 @@ DNF_DEPENDENCIES = [
'gcc-c++', 'which', 'alsa-lib-devel', 'systemd-devel', 'libuuid-devel',
'uuid-devel', 'gnutls-devel', 'nettle-devel', 'opus-devel', 'speexdsp-devel',
'yaml-cpp-devel', 'swig', 'jsoncpp-devel',
'patch', 'libva-devel', 'openssl-devel', 'libvdpau-devel', 'msgpack-devel',
'patch', 'libva-devel', 'openssl-devel', 'libvdpau-devel', 'pipewire-devel', 'msgpack-devel',
'sqlite-devel', 'openssl-static', 'pandoc', 'nasm',
'bzip2'
]
@ -139,7 +139,7 @@ DNF_CLIENT_DEPENDENCIES = [
'libnotify-devel',
'qt6-qtbase-devel',
'qt6-qtsvg-devel', 'qt6-qtmultimedia-devel', 'qt6-qtdeclarative-devel',
'qrencode-devel', 'NetworkManager-libnm-devel'
'qrencode-devel', 'NetworkManager-libnm-devel', 'hunspell-devel', 'libhunspell-devel'
]
DNF_QT_WEBENGINE = ['qt6-qtwebengine-devel']
@ -154,7 +154,7 @@ APT_DEPENDENCIES = [
'libopus-dev', 'libpcre3-dev', 'libpulse-dev', 'libssl-dev',
'libspeex-dev', 'libspeexdsp-dev', 'libswscale-dev', 'libtool',
'libudev-dev', 'libyaml-cpp-dev', 'sip-tester', 'swig',
'uuid-dev', 'yasm', 'libjsoncpp-dev', 'libva-dev', 'libvdpau-dev', 'libmsgpack-dev',
'uuid-dev', 'yasm', 'libjsoncpp-dev', 'libva-dev', 'libvdpau-dev', 'libpipewire-0.3-dev', 'libmsgpack-dev',
'pandoc', 'nasm', 'dpkg-dev', 'libsystemd-dev'
]
@ -171,7 +171,7 @@ APT_CLIENT_DEPENDENCIES = [
'qml6-module-qtquick-dialogs', 'qml6-module-qtquick-layouts',
'qml6-module-qtquick-shapes', 'qml6-module-qtquick-window',
'qml6-module-qtquick-templates', 'qml6-module-qt-labs-platform',
'libqrencode-dev', 'libnm-dev'
'libqrencode-dev', 'libnm-dev', 'hunspell', 'libhunspell-dev'
]
APT_QT_WEBENGINE = [
@ -194,7 +194,7 @@ PACMAN_CLIENT_DEPENDENCIES = [
'qt6-declarative', 'qt6-5compat', 'qt6-multimedia',
'qt6-networkauth', 'qt6-shadertools',
'qt6-svg', 'qt6-tools',
'qrencode', 'libnm'
'qrencode', 'libnm', 'hunspell'
]
PACMAN_QT_WEBENGINE = ['qt6-webengine']
@ -299,7 +299,7 @@ def run_dependencies(args):
print("The win32 version does not install dependencies with this script.\nPlease continue with the --install instruction.")
sys.exit(1)
elif args.distribution == 'guix':
print(f"Building the profile defined in '{GUIX_MANIFEST}'...")
print(f"Building the profile defined in '{GUIX_MANIFEST}'")
execute_script([f'guix shell --manifest={GUIX_MANIFEST} -- true'])
else:
@ -316,7 +316,7 @@ def run_init(args):
client_hooks_dir = '.git/hooks'
daemon_hooks_dir = '.git/modules/daemon/hooks'
print("Installing commit-msg hooks...")
print("Installing commit-msg hooks")
# Copy the commit-msg hook to all modules in the same way.
for hooks_dir in [client_hooks_dir, daemon_hooks_dir]:
if not os.path.exists(hooks_dir):
@ -324,7 +324,7 @@ def run_init(args):
copy_file("./extras/scripts/commit-msg",
os.path.join(hooks_dir, "commit-msg"))
print("Installing pre-commit hooks...")
print("Installing pre-commit hooks")
format_script = "./extras/scripts/format.py"
# Prepend with the python executable if on Windows (not WSL).
if sys.platform == 'win32':
@ -366,13 +366,27 @@ def cwd(path):
def run_install(args):
# Platforms with special compilation scripts
if args.distribution == WIN32_DISTRIBUTION_NAME:
# Build daemon if not using pywinmake
if not args.pywinmake:
with cwd('daemon/compat/msvc'):
execute_script([f'python winmake.py -iv -s {args.sdk} -b daemon'])
# Prepare the build-windows.py script call
build_windows = 'extras/scripts/build-windows.py'
execute_script([f'python {build_windows} --init'])
execute_script([f'python {build_windows} --qt={args.qt}'])
# Initialize build environment
execute_script([f'python {build_windows} --init --qt={args.qt}'])
# Construct build command with options
build_cmd = [
'python',
build_windows,
f'--qt={args.qt}'
]
if args.enable_crash_reports:
build_cmd.append('--enable-crash-reports')
execute_script([' '.join(build_cmd)])
return True
# Unix-like platforms
@ -401,6 +415,10 @@ def run_install(args):
install_args += ('-a', args.arch)
if args.extra_cmake_flags:
install_args += ('-D', args.extra_cmake_flags)
if args.enable_crash_reports:
install_args.append('-C')
if args.ignore_system_libs:
install_args.append('-i')
if args.distribution == OSX_DISTRIBUTION_NAME:
# The `universal_newlines` parameter has been renamed to `text` in
@ -604,7 +622,7 @@ def run_run(args):
client_process.wait()
except KeyboardInterrupt:
print("\nCaught KeyboardInterrupt...")
print("\nCaught KeyboardInterrupt")
finally:
if args.debug:
@ -614,7 +632,7 @@ def run_run(args):
try:
# Only kill the processes if they are running, as they
# could have been closed by the user.
print("Killing processes...")
print("Killing processes")
if args.no_libwrap:
jamid_log.close()
if jamid_process.poll() is None:
@ -750,6 +768,12 @@ def parse_args():
# Allow supplying extra congifure flags to the client cmake.
ap.add_argument('--extra-cmake-flags', type=str,
help='Extra flags to pass to the client cmake')
ap.add_argument('--enable-crash-reports',
action='store_true', default=False,
help='Enable crash reporting')
ap.add_argument('--ignore_system_libs', dest='ignore_system_libs',
default=False, action='store_true',
help='Build contrib packages regardless of system detection')
dist = choose_distribution()

2
daemon

Submodule daemon updated: d15b4f7961...c53658e211

View File

@ -1,7 +1,7 @@
# Taken from:
# https://cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
#
# Copyright (C) 2021-2024 Savoir-faire Linux Inc.
# Copyright (C) 2021-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024 Savoir-faire Linux Inc.
# Copyright (C) 2024-2025 Savoir-faire Linux Inc.
#
# 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
@ -17,32 +17,6 @@
include(FetchContent)
include(CMakeParseArguments)
# Helper function to check if we're on a distribution that requires us
# to apply a patch in order for qmsetup to use the right package directory
function(check_distro_needs_qmsetup_patch DISTRO_NEEDS_QMSETUP_PATCH)
set(${DISTRO_NEEDS_QMSETUP_PATCH} FALSE PARENT_SCOPE)
# Check for the existence of /etc/os-release
if(EXISTS "/etc/os-release")
# Read the content of the file
file(READ "/etc/os-release" OS_RELEASE_CONTENT)
# Check if the distribution is Fedora or Red Hat-based
string(REGEX MATCH "ID=fedora|ID_LIKE=\"rhel fedora\"|ID_LIKE=\"rhel centos fedora\"" RED_HAT_BASED "${OS_RELEASE_CONTENT}")
# Check if the distribution is openSUSE Leap
string(REGEX MATCH "ID=\"opensuse-leap\"" OPENSUSE_LEAP "${OS_RELEASE_CONTENT}")
if(RED_HAT_BASED)
set(${DISTRO_NEEDS_QMSETUP_PATCH} TRUE PARENT_SCOPE)
message(STATUS "Running on a Red Hat-based distribution (Fedora, RHEL, CentOS, etc.)")
elseif(OPENSUSE_LEAP)
set(${DISTRO_NEEDS_QMSETUP_PATCH} TRUE PARENT_SCOPE)
message(STATUS "Running on openSUSE Leap")
else()
message(STATUS "Distribution is not openSUSE Leap or Red Hat-based")
endif()
else()
message(STATUS "Cannot determine the distribution type: /etc/os-release not found")
endif()
endfunction()
# Helper function to add external content with patches and options.
# Parameters:
# TARGET: Name of the target to create

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024 Savoir-faire Linux Inc.
# Copyright (C) 2024-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -0,0 +1,35 @@
find_package(Git QUIET REQUIRED)
message(STATUS "Generating version information...")
function(configure_version_string SOURCE_DIR VERSION_STRING_OUT)
# Get short git SHA
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD
WORKING_DIRECTORY "${SOURCE_DIR}"
OUTPUT_VARIABLE _GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Output the VERSION_STRING_OUT to the caller
set(${VERSION_STRING_OUT} "${_GIT_SHA}" PARENT_SCOPE)
endfunction()
# These need to be set to the parent scripts values for configure_file to work,
# as it prepends CMAKE_CURRENT_SOURCE_DIR to the <input> and CMAKE_CURRENT_BINARY_DIR
# to <output>.
set(CMAKE_CURRENT_SOURCE_DIR ${APP_SOURCE_DIR})
set(CMAKE_CURRENT_BINARY_DIR ${APP_BINARY_DIR})
# Generate the version string for the application and core
configure_version_string(${APP_SOURCE_DIR} APP_VERSION_STRING)
configure_version_string(${CORE_SOURCE_DIR} CORE_VERSION_STRING)
set(BUILD_VERSION_STRING ${BUILD_VERSION})
# Get output file names with the .in extension removed
get_filename_component(VERSION_CPP_FILENAME ${CPP_INT_FILE} NAME_WE)
set(VERSION_CPP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${VERSION_CPP_FILENAME}.cpp")
message(STATUS "infiles: ${CPP_INT_FILE}")
message(STATUS "outfiles: ${VERSION_CPP_FILE}")
configure_file(${CPP_INT_FILE} ${VERSION_CPP_FILE})

View File

@ -1,7 +0,0 @@
message("Qt deploying in dir " ${QML_SRC_DIR})
execute_process(COMMAND "${MAC_DEPLOY_QT_PATH}/macdeployqt"
${EXE_NAME}
-qmldir=${QML_SRC_DIR})
if(${ENABLE_SPARKLE} MATCHES true)
file(COPY ${SPARKLE_PATH} DESTINATION ${EXE_NAME}/Contents/Frameworks/)
endif()

View File

@ -1,8 +1,4 @@
# Copyright (C) 2015-2024 Savoir-faire Linux Inc.
#
# Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
# Author: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Copyright (C) 2015-2025 Savoir-faire Linux Inc.
#
# 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
@ -20,30 +16,19 @@
# Once done, this find module will set:
#
# LIBJAMI_INCLUDE_DIRS - libjami include directories
# LIBJAMI_INCLUDE_DIR - libjami include directory
# LIBJAMI_FOUND - whether it was able to find the include directories
# LIBJAMI_LIB - path to libjami or libring library
set(LIBJAMI_FOUND true)
if(WITH_DAEMON_SUBMODULE)
set(LIBJAMI_INCLUDE_DIRS ${DAEMON_DIR}/src/jami)
set(LIBJAMI_INCLUDE_DIR ${DAEMON_DIR}/src/jami)
else()
if(EXISTS ${LIBJAMI_INCLUDE_DIR}/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_INCLUDE_DIR})
elseif(EXISTS ${LIBJAMI_BUILD_DIR}/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_BUILD_DIR}/jami)
elseif(EXISTS ${RING_INCLUDE_DIR}/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${RING_INCLUDE_DIR})
elseif(EXISTS ${RING_BUILD_DIR}/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${RING_BUILD_DIR}/jami)
elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/include/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/jami)
elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/daemon/include/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/daemon/include/jami)
else()
find_path(LIBJAMI_INCLUDE_DIR jami.h PATH_SUFFIXES jami)
if(NOT LIBJAMI_INCLUDE_DIR)
message(STATUS "Jami daemon headers not found!
Set -DLIBJAMI_BUILD_DIR or -DCMAKE_INSTALL_PREFIX")
To build using the daemon git submodule, set -DWITH_DAEMON_SUBMODULE")
set(LIBJAMI_FOUND false)
endif()
endif()
@ -56,7 +41,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
set(LIBJAMI_NAMES
jami-core
jami
ring
)
if(WITH_DAEMON_SUBMODULE)
@ -125,5 +109,5 @@ endif()
# Restore the original value of CMAKE_FIND_LIBRARY_SUFFIXES.
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_orig})
message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIRS})
message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIR})
message(STATUS "Jami daemon library is at " ${LIBJAMI_LIB})

View File

@ -4,11 +4,24 @@ ENV DEBIAN_FRONTEND noninteractive
ENV QT_QUICK_BACKEND software
ENV QT_QPA_PLATFORM offscreen
RUN apt-get clean
RUN apt-get update && \
apt-get install -y devscripts equivs
apt-get install -y --no-install-recommends ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Use only the custom Savoir-faire Linux Ubuntu mirror
RUN rm -f /etc/apt/sources.list /etc/apt/sources.list.d/* && \
echo "deb http://gpl.savoirfairelinux.net/pub/mirrors/ubuntu jammy main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb http://gpl.savoirfairelinux.net/pub/mirrors/ubuntu jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://gpl.savoirfairelinux.net/pub/mirrors/ubuntu jammy-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
devscripts \
equivs \
gnupg \
dirmngr \
curl
RUN apt install gnupg dirmngr ca-certificates curl --no-install-recommends
RUN curl -s https://dl.jami.net/public-key.gpg | tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/internal/ubuntu_22.04/ jami main' > /etc/apt/sources.list.d/jami.list"
RUN apt-get update && apt-get install libqt-jami -y
@ -66,9 +79,11 @@ RUN apt-get install -y -o Acquire::Retries=10 \
libvdpau-dev \
libssl-dev
RUN apt-get install -y pandoc \
libcppunit-dev \
googletest \
libgtest-dev \
wget
wget && \
rm -rf /var/lib/apt/lists/*
# Install a recent version of CMake
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2024 Savoir-faire Linux Inc.
* Copyright (C) 2022-2025 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as

View File

@ -0,0 +1,9 @@
# python virtual environment
venv/
# python compiled files
*.pyc
# python cache
__pycache__
# example output
crash_reports/

View File

@ -0,0 +1,51 @@
# Crash report submission server examples
## Overview
This directory contains an example of a crash report submission server. This server is responsible for receiving crash reports from clients and storing them. The example is written in Python and uses the Flask web framework with Waitress as the WSGI server. It exposes one endpoint for submitting crash reports on the `/submit` path using the POST method on port `8080`.
It also contains an example of a crash report access server. This server is responsible for displaying the crash reports. It uses port `8081` and provides a simple HTML page that lists crash reports by page.
## Running the examples
To run the examples, you need to have Python 3 installed. You can just use the virtual environment provided in this directory. To activate the virtual environment, run the following commands:
```
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -r requirements.txt
```
> ⚠️ On Windows, you need to use `venv\Scripts\activate` instead of `source venv/bin/activate`.
After activating the virtual environment, you can should be able to execute the example submission server. To run the example submission server that uses the Crashpad format, run the following command:
```
python3 crashpad_submit_server.py
```
To run a server that displays the crash reports, run the following command:
```
python3 report_access_server.py
```
> ⚠️ It is recommended to run the report access server in a way that is not publicly accessible.
Either server can be run on the same machine or on different machines, and each can be run using the `--debug` flag to enable debugging.
## Metadata
The crash report submission servers expect the crash reports to contain a JSON object. The JSON object should contain the following basic metadata:
```
{
"build_id": "202410021437",
"client_sha": "77149ebd62",
"guid": "50c4218a-bcb9-48a9-8093-a06e6435cd61",
"jamicore_sha": "cbf8f0af6",
"platform": "Ubuntu 22.04.4 LTS_x86_64"
}
```
The `build_id` field is the build identifier of the client application. The `client_sha` field is the SHA-1 hash of the client application. The `guid` field is a unique identifier for the crash report. The `jamicore_sha` field is the SHA-1 hash of the Jami core library. The `platform` field is the platform on which the client application is running.

View File

@ -0,0 +1,60 @@
#!/usr/bin/env python3
import os
from flask import Flask, request, jsonify
import json
import argparse
app = Flask(__name__)
BASE_PATH = 'crash_reports'
@app.route('/submit', methods=['POST'])
def submit():
try:
print("Received a crash report GUID: %s" % request.form.get('guid', 'No GUID provided'))
file_storage = request.files.get('upload_file_minidump')
dump_id = ""
if file_storage:
dump_id = file_storage.filename
# Create a directory to store the crash reports if it doesn't exist
if not os.path.exists(BASE_PATH):
os.makedirs(BASE_PATH)
filepath = os.path.join(BASE_PATH, dump_id)
# Attempt to write the file, fail gracefully if it already exists
if os.path.exists(filepath):
print(f"File {filepath} already exists.")
return 'File already exists', 409
with open(filepath, 'wb') as f:
f.write(file_storage.read())
print(f"File saved successfully at {filepath}")
# Now save the metadata in {request.form} as separate filename <UID>.info.
metadata_filepath = os.path.join(BASE_PATH, f"{dump_id}.info")
with open(metadata_filepath, 'w') as f:
f.write(str(json.dumps(dict(request.form), indent=4)))
else:
print("No file found for the key 'upload_file_minidump'")
return 'No file found', 400
return 'Crash report received', 200
except OSError as e:
print(f"Error creating directory or writing file: {e}")
return 'Internal Server Error', 500
except Exception as e:
print(f"An unexpected error occurred: {e}")
return 'Internal Server Error', 500
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Crash report submission server')
parser.add_argument('--debug', action='store_true', help='Run in debug mode')
args = parser.parse_args()
if args.debug:
app.run(port=8080, debug=True)
else:
from waitress import serve
print("Starting production server on port 8080...")
serve(app, host='0.0.0.0', port=8080)

View File

@ -0,0 +1,252 @@
#!/usr/bin/env python3
import os
from flask import Flask, request, jsonify, render_template_string, send_file
import json
from datetime import datetime
import argparse
app = Flask(__name__)
BASE_PATH = 'crash_reports'
@app.route('/', methods=['GET'])
def list_reports():
try:
if not os.path.exists(BASE_PATH):
return jsonify({"error": "No reports directory found"}), 404
# Get page number from query parameters, default to 1
page = int(request.args.get('page', 1))
per_page = 10
reports = os.listdir(BASE_PATH)
if not reports:
return render_template_string("""
<h1>Crash Reports</h1>
<p>No crash reports found.</p>
""")
# Build report pairs with metadata
report_pairs = []
for report in reports:
if not report.endswith('.info'):
info_file = f"{report}.info"
if info_file in reports:
try:
dump_path = os.path.join(BASE_PATH, report)
timestamp = os.path.getctime(dump_path)
upload_time = datetime.fromtimestamp(timestamp)
with open(os.path.join(BASE_PATH, info_file), 'r') as f:
metadata = json.load(f)
report_pairs.append({
'dump_file': report,
'info_file': info_file,
'metadata': metadata,
'sort_key': f"{metadata.get('client_sha', '')}-{metadata.get('jamicore_sha', '')}",
'download_name': f"{metadata.get('client_sha', 'unknown')}-{metadata.get('jamicore_sha', 'unknown')}-{metadata.get('platform', 'unknown').replace(' ', '_')}",
'upload_time': upload_time
})
except json.JSONDecodeError:
print(f"Error parsing metadata file: {info_file}")
continue
# Sort reports by upload time (most recent first), then by SHA
report_pairs.sort(key=lambda x: (-x['upload_time'].timestamp(), x['sort_key']))
# Calculate pagination values
total_reports = len(report_pairs)
total_pages = (total_reports + per_page - 1) // per_page
page = min(max(1, page), total_pages or 1) # Handle case when total_pages is 0
start_idx = (page - 1) * per_page
end_idx = start_idx + per_page
# Get current page's reports
current_page_reports = report_pairs[start_idx:end_idx]
return render_template_string("""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Crash Reports</title>
<style>
body { font-family: Arial, sans-serif; margin: 2em; }
.header {
margin-bottom: 2em;
}
.header h1 {
margin-bottom: 0.5em;
}
.report-list { list-style: none; padding: 0; }
.report-item { margin: 1em 0; padding: 1em; border: 1px solid #ddd; border-radius: 4px; }
.download-link {
display: inline-block;
padding: 8px 16px;
background-color: #0066cc;
color: white;
text-decoration: none;
border-radius: 4px;
margin: 8px 0;
}
.download-link:hover { background-color: #0052a3; }
.metadata-table {
border-collapse: collapse;
width: 100%;
margin: 8px 0;
}
.metadata-table td {
padding: 4px 8px;
border-bottom: 1px solid #ddd;
}
.metadata-table td:first-child {
font-weight: bold;
width: 150px;
}
.upload-time {
color: #666;
font-size: 0.9em;
margin-bottom: 8px;
}
.pagination {
margin: 1em 0;
text-align: center;
}
.pagination a, .pagination span {
display: inline-block;
padding: 8px 16px;
margin: 0 4px;
border: 1px solid #ddd;
border-radius: 4px;
text-decoration: none;
color: #0066cc;
}
.pagination .current {
background-color: #0066cc;
color: white;
border-color: #0066cc;
}
.pagination a:hover {
background-color: #f5f5f5;
}
.pagination-info {
text-align: center;
color: #666;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="header">
<h1>Crash Reports</h1>
<div class="pagination-info">
Showing {{ start_idx + 1 }}-{{ [end_idx, total_reports] | min }} of {{ total_reports }} reports
</div>
<div class="pagination">
{% if page > 1 %}
<a href="{{ url_for('list_reports', page=1) }}">&laquo; First</a>
<a href="{{ url_for('list_reports', page=page-1) }}">&lsaquo; Previous</a>
{% endif %}
{% for p in range([1, page-2] | max, [total_pages + 1, page + 3] | min) %}
{% if p == page %}
<span class="current">{{ p }}</span>
{% else %}
<a href="{{ url_for('list_reports', page=p) }}">{{ p }}</a>
{% endif %}
{% endfor %}
{% if page < total_pages %}
<a href="{{ url_for('list_reports', page=page+1) }}">Next &rsaquo;</a>
<a href="{{ url_for('list_reports', page=total_pages) }}">Last &raquo;</a>
{% endif %}
</div>
</div>
<div class="report-list">
{% for report in reports %}
<div class="report-item">
<h3>Report: {{ report['sort_key'] }}</h3>
<div class="upload-time">
Uploaded: {{ report['upload_time'].strftime('%Y-%m-%d %H:%M:%S') }}
</div>
<table class="metadata-table">
<tr>
<td>Platform:</td>
<td>{{ report['metadata']['platform'] }}</td>
</tr>
<tr>
<td>Client SHA:</td>
<td>{{ report['metadata']['client_sha'] }}</td>
</tr>
<tr>
<td>Jami Core SHA:</td>
<td>{{ report['metadata']['jamicore_sha'] }}</td>
</tr>
<tr>
<td>Build ID:</td>
<td>{{ report['metadata']['build_id'] }}</td>
</tr>
<tr>
<td>GUID:</td>
<td>{{ report['metadata']['guid'] }}</td>
</tr>
</table>
<a class="download-link" href="{{ url_for('download_report_bundle', dump_file=report['dump_file'], info_file=report['info_file'], download_name=report['download_name']) }}">
Download Report Bundle
</a>
</div>
{% endfor %}
</div>
</body>
</html>
""", reports=current_page_reports, page=page, total_pages=total_pages,
start_idx=start_idx, end_idx=end_idx, total_reports=total_reports)
except Exception as e:
print(f"Error listing reports: {e}")
return 'Internal Server Error', 500
@app.route('/download-bundle/<path:dump_file>/<path:info_file>/<path:download_name>')
def download_report_bundle(dump_file, info_file, download_name):
try:
import zipfile
from io import BytesIO
# Create a memory file for the zip
memory_file = BytesIO()
# Create the zip file
with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf:
# Add the dump file
dump_path = os.path.join(BASE_PATH, dump_file)
zf.write(dump_path, f"{download_name}.dmp")
# Add the info file
info_path = os.path.join(BASE_PATH, info_file)
zf.write(info_path, f"{download_name}.info")
# Seek to the beginning of the memory file
memory_file.seek(0)
return send_file(
memory_file,
mimetype='application/zip',
as_attachment=True,
download_name=f"{download_name}.zip"
)
except Exception as e:
print(f"Error creating zip bundle: {e}")
return 'Internal Server Error', 500
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Crash reports viewing server')
parser.add_argument('--debug', action='store_true', help='Run in debug mode')
args = parser.parse_args()
if args.debug:
app.run(port=8081, debug=True)
else:
from waitress import serve
print("Starting production server on port 8081...")
serve(app, host='0.0.0.0', port=8081)

View File

@ -0,0 +1,6 @@
Flask==3.0.3
requests==2.24.0
markupsafe==2.1.1
itsdangerous==2.1.2
werkzeug==3.0.0
waitress==3.0.2

View File

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) 2015-2024 Savoir-faire Linux Inc. -->
<component type="desktop-application">
<id>net.jami.Jami</id>
<metadata_license>CC-BY-SA-3.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<name>Jami</name>
<summary>Privacy-oriented voice, video, chat, and conference platform</summary>
<summary xml:lang="hu">Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform</summary>
<icon type="stock">jami</icon>
<description>
<p>
An end-to-end encrypted secure and distributed voice, video, and
chat communication platform that requires no central server and
leaves the power of privacy and freedom in the hands of users.
</p>
<p>
Jami supports the following key features:
</p>
<ul>
<li>One-to-one conversations</li>
<li>File sharing</li>
<li>Audio calls and conferences</li>
<li>Video calls and conferences</li>
<li>Screen sharing in video calls and conferences</li>
<li>Recording and sending audio messages</li>
<li>Recording and sending video messages</li>
<li>Functioning as a SIP phone software</li>
</ul>
<p>
Client applications for GNU/Linux, Windows, macOS, iOS, Android,
and Android TV are available, making Jami an interoperable and
cross-platform communication framework.
</p>
<p xml:lang="hu">
Végpontokig titkosított biztonságos és elosztott hang-, videó-
és csevegés-kommunikációs platform, amely nem igényel központi
kiszolgálót, és a felhasználók kezében hagyja a magánélet és a
szabadság hatalmát.
</p>
<p xml:lang="hu">
A Jami a következő főbb funkciókat támogatja:
</p>
<ul>
<li xml:lang="hu">Személyes beszélgetések</li>
<li xml:lang="hu">Fájlmegosztás</li>
<li xml:lang="hu">Hanghívások és konferenciák</li>
<li xml:lang="hu">Videohívások és konferenciák</li>
<li xml:lang="hu">Képernyőmegosztás videohívásokban és
konferenciákon</li>
<li xml:lang="hu">Hangüzenetek rögzítése és küldése</li>
<li xml:lang="hu">Videoüzenetek rögzítése és küldése</li>
<li xml:lang="hu">SIP-telefonszoftverként működik</li>
</ul>
<p xml:lang="hu">
Elérhetők a GNU/Linux, Windows, macOS, iOS, Android és Android TV
ügyfélalkalmazásai, így a Jami interoperábilis és többplatformos
kommunikációs keretrendszerré válik.
</p>
</description>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://jami.net/help/</url>
<url type="help">https://docs.jami.net</url>
<url type="donation">https://www.paypal.com/donate/?hosted_button_id=MGUDJLQZ4TP5W</url>
<url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
<!-- Maximum caption length is 60 characters -->
<!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
<screenshots>
<screenshot type="default">
<caption>Send Audio, Video and Chat messages</caption>
<caption xml:lang="hu">Hang-, video- és csevegőüzeneteket küldhet</caption>
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
</screenshot>
<screenshot>
<caption>Easily share desktop contents</caption>
<caption xml:lang="hu">Könnyen megoszthatja az asztali tartalmat</caption>
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
</screenshot>
<screenshot>
<caption>Crystal clear audio calls between Jami users</caption>
<caption xml:lang="hu">Kristálytiszta hanghívások a Jami felhasználók között</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
</screenshot>
<screenshot>
<caption>Conference calls with an unlimited participants</caption>
<caption xml:lang="hu">Konferenciahívások korlátlan számú résztvevővel</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
</screenshot>
<screenshot>
<caption>Encrypted and secure text messaging, no servers</caption>
<caption xml:lang="hu">Titkosított és biztonságos csevegési üzenetküldés, kiszolgálók nélkül</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
</screenshot>
<screenshot>
<caption>Send files of any size</caption>
<caption xml:lang="hu">Bármilyen méretű fájl küldése</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
</screenshot>
</screenshots>
<launchable type="desktop-id">jami.desktop</launchable>
<provides><binary>jami</binary></provides>
<!-- https://specifications.freedesktop.org/menu-spec/latest/apa.html -->
<!-- https://specifications.freedesktop.org/menu-spec/latest/apas02.html -->
<categories>
<category>Chat</category>
<category>Communication</category>
<category>FileTransfer</category>
<category>InstantMessaging</category>
<category>Network</category>
<category>P2P</category>
<category>Productivity</category>
</categories>
<translation type="gettext">jami-client-qt</translation>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">intense</content_attribute>
<content_attribute id="social-audio">intense</content_attribute>
</content_rating>
<requires><id>net.jami.daemon</id></requires>
</component>

View File

@ -1,14 +0,0 @@
[Desktop Entry]
Name=Jami
GenericName=Jami
Comment=Privacy-oriented voice, video, chat, and conference platform
Comment[hu]=Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform
Comment[ru]=Jami — приложение для защищённой связи с распределённой архитектурой
Exec=jami %u
Icon=jami
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;Telephony;
Keywords=Qt;chat;talk;im;message;voip;
MimeType=x-scheme-handler/jami;

153
extras/data/jami.xml Normal file
View File

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<components version="0.14" origin="jami">
<component type="desktop-application">
<id>net.jami.Jami</id>
<pkgname>jami</pkgname>
<name>Jami</name>
<summary>Privacy-oriented voice, video, chat, and conference platform</summary>
<summary xml:lang="hu">Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform</summary>
<project_license>GPL-3.0+</project_license>
<description>
<p>Jami, a GNU package, is software for universal and distributed peer-to-peer communication that respects the freedom and privacy of its users.</p>
<p>Jami is the simplest and easiest way to connect with people (and devices) with instant messaging, audio and video calls over the Internet and LAN/WAN intranets.</p>
<p>Jami is a free/libre, end-to-end encrypted, and private communication platform.</p>
<p>Jami which used to be known as Ring is also an open-source alternative (to Facebook Messenger, Signal, Skype, Teams, Telegram, TikTok, Viber, WhatsApp, Zoom) that prioritizes the privacy of its users.</p>
<p>Jami has a professional-looking design and is available for a wide range of platforms. Unlike the alternatives, calls using Jami are directly between users as it does not use servers to handle calls.</p>
<p>This gives the greatest privacy as the distributed nature of Jami means your calls are only between participants.</p>
<p>One-to-one and group conversations with Jami are enhanced with: instant messaging; audio and video calling; recording and sending audio and video messages; file transfers; screen sharing; and, location sharing.</p>
<p>Jami can also function as a SIP client.</p>
<p>Jami has multiple extensions available: Audio Filter; Auto Answer; Green Screen; Watermark; and, Whisper Transcript.</p>
<p>Jami can be easily deployed in organizations with the “Jami Account Management Server” (JAMS), allowing users to connect with their corporate credentials or create local accounts. JAMS allows you to manage your own Jami community while taking advantage of Jamis distributed network architecture.</p>
<p>Jami is available for GNU/Linux, Windows, macOS, iOS, Android, and Android TV, making Jami an interoperable and cross-platform communication framework.</p>
<p>Manage multiple SIP accounts, Jami accounts and JAMS accounts with the Jami client installed on one or multiple devices.</p>
<p>Jami is free, unlimited, private, advertising free, compatible, fast, autonomous, and anonymous.</p>
<p>Learn more about:</p>
<ul>
<li>Jami: https://jami.net/</li>
<li>Jami extensions: https://jami.net/extensions/</li>
<li>“Jami Account Management Server” (JAMS): https://jami.biz/</li>
<li>Jami documentation: https://docs.jami.net/</li>
</ul>
<p>Follow us for more:</p>
<ul>
<li>Mastodon: https://mstdn.io/@Jami</li>
<li>X: https://x.com/jami_social</li>
<li>YouTube: https://www.youtube.com/@jami9311</li>
</ul>
<p>Wed love to hear from you! Join the Jami community:</p>
<ul>
<li>Contribute: https://jami.net/contribute/</li>
<li>Forum: https://forum.jami.net/</li>
</ul>
<p>Build with Jami on your IoT project: re-use the universal communications technology of Jami with its portable library on your system of choice.</p>
<p>Jami for Android TV is tested on NVIDIA SHIELD TV with Logitech cameras.</p>
<p>Jami is published under the GPL license, version 3 or higher.</p>
<p>Copyright © Savoir-faire Linux Inc.</p>
</description>
<description xml:lang="hu">
<p>A Jami, egy GNU-csomag, egy univerzális és elosztott társ-társ kommunikációra szolgáló szoftver, amely tiszteletben tartja a felhasználók szabadságát és magánéletét.</p>
<p>A Jami a legegyszerűbb és legegyszerűbb módja annak, hogy azonnali üzenetküldéssel, hang- és videohívásokkal kapcsolódjon az emberekhez (és eszközökhöz) az interneten és a LAN/WAN intraneteken keresztül.</p>
<p>A Jami egy ingyenes, teljes körűen titkosított és privát kommunikációs platform.</p>
<p>A Jami amelyet korábban Ring néven ismertek egy nyílt forráskódú alternatíva is (a Facebook Messenger, a Signal, a Skype, a Teams, a Telegram, a TikTok, a Viber, a WhatsApp, a Zoom számára), amely előtérbe helyezi a felhasználók magánéletét.</p>
<p>A Jami professzionális megjelenésű, és platformok széles skálájához elérhető. Az alternatívákkal ellentétben a Jami-t használó hívások közvetlenül a felhasználók között zajlanak, mivel nem használ kiszolgálókat a hívások kezelésére.</p>
<p>Ez biztosítja a legnagyobb magánéletet, mivel a Jami elosztott jellege azt jelenti, hogy a hívások csak a résztvevők között zajlanak.</p>
<p>A Jamival folytatott személyes és csoportos beszélgetéseket a következők javítják: azonnali üzenetküldés; hang- és videohívások; hang- és videoüzenetek rögzítése és küldése; fájlátvitel; képernyőmegosztás; és helymegosztás.</p>
<p>A Jami SIP-ügyfélként is működhet.</p>
<p>A Jami-nek több bővítménye is elérhető: hangszűrő; automatikus válasz; zöld képernyő; vízjel; és, suttogó átirat.</p>
<p>A Jami könnyen telepíthető a szervezetekben a JAMS (Jami Account Management Server Jami fiókkezelő kiszolgáló), amely lehetővé teszi a felhasználók számára, hogy csatlakozzanak vállalati hitelesítő adataikhoz, vagy helyi fiókokat hozzanak létre. A JAMS lehetővé teszi saját Jami közösségének kezelését, miközben kihasználja a Jami elosztott hálózati architektúráját.</p>
<p>A Jami elérhető GNU/Linux, Windows, macOS, iOS, Android és Android TV rendszereken, így a Jami egy interoperábilis és platformok közötti kommunikációs keretrendszer.</p>
<p>Kezeljen több SIP-fiókot, Jami-fiókot és JAMS-fiókot az egy vagy több eszközre telepített Jami-ügyféllel.</p>
<p>A Jami ingyenes, korlátlan, privát, reklámmentes, kompatibilis, gyors, autonóm és névtelen.</p>
<p>További tájékoztatás:</p>
<ul>
<li>Jami: https://jami.net/hu/</li>
<li>Jami-bővítmények: https://jami.net/hu/extensions/</li>
<li>JAMS (Jami Account Management Server Jami fiókkezelő kiszolgáló): https://jami.biz/</li>
<li>Jami-dokumentáció: https://docs.jami.net/hu/</li>
</ul>
<p>Kövess minket a továbbiakért:</p>
<ul>
<li>Mastodon: https://mstdn.io/@Jami</li>
<li>X: https://x.com/jami_social</li>
<li>YouTube: https://www.youtube.com/@jami9311</li>
</ul>
<p>Szívesen hallanánk felőled! Csatlakozzon a Jami közösséghez:</p>
<ul>
<li>Közreműködés: https://jami.net/hu/contribute/</li>
<li>Fórum: https://forum.jami.net/</li>
</ul>
<p>Építsen a Jamival IoT-projektjére: használja újra a Jami univerzális kommunikációs technológiáját a hordozható könyvtárával a választott rendszerén.</p>
<p>A Jami for Android TV-t Logitech kamerákkal ellátott NVIDIA SHIELD TV-n tesztelték.</p>
<p>A Jami a GPL licenc 3-as vagy újabb verziója alatt jelent meg.</p>
<p>Szerzői jog © Savoir-faire Linux Inc.</p>
</description>
<requires>
<id>net.jami.daemon</id>
</requires>
<launchable type="desktop-id">net.jami.Jami.desktop</launchable>
<icon type="stock">net.jami.Jami</icon>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://docs.jami.net/user/faq.html</url>
<url type="help">https://forum.jami.net/</url>
<url type="donation">https://jami.net/whydonate/</url>
<url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
<categories>
<category>Chat</category>
<category>FileTransfer</category>
<category>InstantMessaging</category>
<category>Network</category>
<category>P2P</category>
<category>Telephony</category>
<category>VideoConference</category>
</categories>
<provides>
<binary>jami</binary>
<mediatype>x-scheme-handler/jami</mediatype>
</provides>
<screenshots>
<screenshot type="default">
<caption>Send chat messages and talk with audio and video</caption>
<caption xml:lang="hu">Csevegőüzenetek küldése, valamint hang- és videobeszélgetés</caption>
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
</screenshot>
<screenshot>
<caption>Screen sharing</caption>
<caption xml:lang="hu">Képernyőmegosztás</caption>
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
</screenshot>
<screenshot>
<caption>Crystal clear audio calls between Jami users</caption>
<caption xml:lang="hu">Kristálytiszta hanghívások a Jami felhasználók között</caption>
<video codec="vp9" container="webm" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
</screenshot>
<screenshot>
<caption>Conference calls with an unlimited number of participants</caption>
<caption xml:lang="hu">Konferenciahívások korlátlan számú résztvevővel</caption>
<video codec="vp9" container="webm" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
</screenshot>
<screenshot>
<caption>Encrypted and secure text messaging without servers</caption>
<caption xml:lang="hu">Titkosított és biztonságos csevegési üzenetküldés, kiszolgálók nélkül</caption>
<video codec="vp9" container="webm" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
</screenshot>
<screenshot>
<caption>Transfer files of any size</caption>
<caption xml:lang="hu">Bármilyen méretű fájl küldése</caption>
<video codec="vp9" container="webm" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
</screenshot>
</screenshots>
<keywords>
<keyword>Qt</keyword>
<keyword>chat</keyword>
<keyword>talk</keyword>
<keyword>im</keyword>
<keyword>message</keyword>
<keyword>voip</keyword>
</keywords>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">intense</content_attribute>
<content_attribute id="social-audio">intense</content_attribute>
</content_rating>
</component>
</components>

View File

@ -0,0 +1,83 @@
[Desktop Entry]
Name=Jami
GenericName=Jami
Comment=Share, freely and privately
Comment[ab]=Ацеиҩшара, хақәиҭла, хала
Comment[af]=Deel, vrylik en privaat
Comment[am]=በነጻ እና በግል ያካፍሉ።
Comment[ar]=شارك بحرية وبشكل خاص
Comment[az]=Sərbəst və gizli şəkildə paylaşın
Comment[be]=Падзяліцеся свабодна і прыватна
Comment[bg]=Споделяйте, свободно и частно
Comment[bn]=শেয়ার করুন, অবাধে এবং গোপনে
Comment[ca]=Comparteix, lliurement i de forma privada
Comment[cs]=Sdílejte svobodně a soukromě
Comment[da]=Del, frit og privat
Comment[de]=Teilen, frei und privat
Comment[el]=Κοινοποιήστε, ελεύθερα και ιδιωτικά
Comment[eo]=Kunhavigu, libere kaj private
Comment[es]=Comparte, libre y privadamente
Comment[et]=Jaga, vabalt ja privaatselt
Comment[fa]=به اشتراک بگذارید، آزادانه و خصوصی
Comment[fi]=Jaa, vapaasti ja yksityisesti
Comment[fil]=Ibahagi, libre at pribado
Comment[fr]=Partagez, librement, gratuitement et en toute confidentialité
Comment[gl]=Comparte, de xeito libre e privado
Comment[he]=שתפו, באופן חופשי ופרטי
Comment[hi]=स्वतंत्र रूप से और निजी तौर पर साझा करें
Comment[hr]=Dijelite, slobodno i privatno
Comment[hu]=Megosztás, szabadon és bizalmasan
Comment[hy]=Տարածեք, ազատ և մասնավոր
Comment[id]=Berbagi, secara bebas dan pribadi
Comment[is]=Deildu, frjálslega og einslega
Comment[it]=Condividere, liberamente e privatamente
Comment[ja]=自由に、プライベートに共有
Comment[ka]=გააზიარეთ, თავისუფლად და პირადად
Comment[km]=ចែករំលែកដោយសេរី និងឯកជន
Comment[kn]=ಮುಕ್ತವಾಗಿ ಮತ್ತು ಖಾಸಗಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ
Comment[ko]=자유롭고 비공개적으로 공유하세요
Comment[ky]=Бөлүшүү, эркин жана купуя
Comment[la]=Communicantes, libere et privatim
Comment[lo]=ແບ່ງ​ປັນ​, ຢ່າງ​ເສລີ​ແລະ​ເປັນ​ສ່ວນ​ຕົວ​
Comment[lt]=Dalintis, laisvai ir privačiai
Comment[lv]=Kopīgojiet, brīvi un privāti
Comment[mk]=Споделете, слободно и приватно
Comment[ml]=സ്വതന്ത്രമായും സ്വകാര്യമായും പങ്കിടുക
Comment[mn]=Чөлөөт, хувийн байдлаар хуваалцах
Comment[mr]=सामायिक करा, मुक्तपणे आणि खाजगीरित्या
Comment[ms]=Kongsi, secara bebas dan peribadi
Comment[my]=လွတ်လပ်စွာ သီးသန့်မျှဝေပါ။
Comment[ne]=स्वतन्त्र र गोप्य रूपमा सेयर गर्नुहोस्
Comment[nl]=Deel, vrij en privé
Comment[no]=Del, fritt og privat
Comment[pl]=Udostępniaj swobodnie i prywatnie
Comment[pt_BR]=Compartilhe, livre e privadamente
Comment[pt_PT]=Partilhe, livre e privadamente
Comment[ro]=Distribuie, în mod liber și privat
Comment[ru]=Делитесь, свободно и конфиденциально
Comment[si]=නිදහසේ සහ පෞද්ගලිකව බෙදා ගන්න
Comment[sk]=Zdieľajte, slobodne a súkromne
Comment[sl]=Delite brezplačno in zasebno
Comment[sq]=Shpërndaje, lirisht dhe privatisht
Comment[sr]=Делите, слободно и приватно
Comment[sv]=Dela, fritt och privat
Comment[sw]=Shiriki, kwa uhuru na kwa faragha
Comment[ta]=பகிரவும், சுதந்திரமாகவும் தனிப்பட்ட முறையிலும்
Comment[te]=ఉచితంగా మరియు ప్రైవేట్‌గా షేర్ చేయండి
Comment[th]=แบ่งปันได้อย่างอิสระและเป็นส่วนตัว
Comment[tl]=Ibahagi, libre at pribado
Comment[tr]=Özgürce ve özel olarak paylaşın
Comment[uk]=Поділіться вільно та приватно
Comment[vi]=Chia sẻ, tự do và riêng tư
Comment[zh_CN]=自由且私密地分享
Comment[zh_HK]=自由且私密地分享
Comment[zh_TW]=自由且私密地分享
Comment[zu]=Yabelana, ngokukhululekile nangasese
Exec=jami %u
Icon=net.jami.Jami
StartupNotify=true
Terminal=false
Type=Application
Categories=Chat;FileTransfer;InstantMessaging;Network;P2P;Telephony;VideoConference;
Keywords=Qt;chat;talk;im;message;voip;
MimeType=x-scheme-handler/jami;

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,4 @@
// Copyright (C) 2021-2024 Savoir-faire Linux Inc.
//
// Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
// Copyright (C) 2021-2025 Savoir-faire Linux Inc.
//
// 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
@ -35,7 +33,9 @@
def SUBMODULES = ['daemon',
'3rdparty/SortFilterProxyModel',
'3rdparty/md4c',
'3rdparty/tidy-html5']
'3rdparty/tidy-html5',
'3rdparty/zxing-cpp',
'3rdparty/hunspell']
def TARGETS = [:]
def REMOTE_HOST = env.SSH_HOST_DL_RING_CX
def REMOTE_BASE_DIR = '/srv/repository/ring'
@ -85,6 +85,10 @@ pipeline {
environment {
TARBALLS = '/var/cache/jami' // set the cache directory
BUILD_VERSION = sh(
returnStdout: true,
script: 'date +"%Y%m%d%H%M"'
).trim()
}
stages {

View File

@ -1,7 +1,5 @@
# -*- mode: makefile; -*-
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
#
# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# 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
@ -46,9 +44,9 @@ DEBIAN_DSC_FILENAME := jami_$(DEBIAN_VERSION).dsc
# Qt versions
QT_MAJOR := 6
QT_MINOR := 6
QT_PATCH := 1
QT_TARBALL_CHECKSUM := dd3668f65645fe270bc615d748bd4dc048bd17b9dc297025106e6ecc419ab95d
QT_MINOR := 8
QT_PATCH := 3
QT_TARBALL_CHECKSUM := cdd3a69967208276bb01af7ace7dba0ba53e679f886a4cbe624225c60fb73f2c
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-0
DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
QT_JAMI_PREFIX := /usr/lib/libqt-jami
@ -129,7 +127,9 @@ $(RELEASE_TARBALL_FILENAME): tarballs.manifest
. \
./3rdparty/SortFilterProxyModel \
./3rdparty/md4c \
./3rdparty/tidy-html5; do \
./3rdparty/tidy-html5 \
./3rdparty/zxing-cpp \
./3rdparty/hunspell; do \
(cd "$$m" && git archive --prefix "$$m/" HEAD \
| tar xf - -C $(TMPDIR)/$(RELEASE_DIRNAME)); \
done
@ -164,18 +164,14 @@ DISTRIBUTIONS := \
debian_12 \
debian_testing \
debian_unstable \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_23.04 \
ubuntu_23.10 \
ubuntu_24.04 \
fedora_37 \
fedora_38 \
fedora_39 \
fedora_40 \
ubuntu_25.04 \
fedora_41 \
fedora_42 \
alma_9 \
opensuse-leap_15.4 \
opensuse-leap_15.5 \
alma_10 \
opensuse-leap_15.6 \
snap
IS_SHELL_INTERACTIVE := $(shell [ -t 0 ] && echo yes)
@ -194,6 +190,7 @@ $(1)-docker-image-name := jami-packaging-$(1)
$(1)-docker-image-file := .docker-image-$$($(1)-docker-image-name)
$(1)-docker-run-command := docker run \
--rm --privileged --security-opt apparmor=docker-default \
-e BUILD_VERSION=${BUILD_VERSION} \
-e RELEASE_VERSION="$(RELEASE_VERSION)" \
-e RELEASE_DIRNAME="$(RELEASE_DIRNAME)" \
-e RELEASE_TARBALL_FILENAME="$(RELEASE_TARBALL_FILENAME)" \
@ -252,10 +249,11 @@ GUIX_PACK_FORMATS = deb rpm
define guix-pack-command
guix pack -C xz -f $(1) -m $(CURDIR)/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm -v3 \
-S /usr/bin/jami=bin/jami \
-S /usr/share/applications/jami.desktop=share/applications/jami.desktop \
-S /usr/share/icons/hicolor/scalable/apps/jami.svg=share/icons/hicolor/scalable/apps/jami.svg \
-S /usr/share/applications/net.jami.Jami.desktop=share/applications/net.jami.Jami.desktop \
-S /usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg=share/icons/hicolor/scalable/apps/net.jami.Jami.svg \
-S /usr/share/icons/hicolor/48x48/apps/jami.png=share/icons/hicolor/48x48/apps/jami.png \
-S /usr/share/metainfo/jami.appdata.xml=share/metainfo/jami.appdata.xml \
-S /usr/share/metainfo/net.jami.Jami.metainfo.xml=share/metainfo/net.jami.Jami.metainfo.xml \
-S /usr/share/swcatalog/xml/jami.xml=share/swcatalog/xml/jami.xml \
$(and $(findstring deb,$(1)), \
--postinst-file=$(CURDIR)/extras/packaging/gnu-linux/guix/guix-pack-deb.postinst)
endef

View File

@ -1,106 +1,94 @@
FROM fedora:37
RUN dnf clean all
RUN dnf update -y
FROM almalinux:10
RUN dnf clean all && dnf update -y
RUN dnf install -y epel-release
RUN dnf install -y 'dnf-command(config-manager)'
RUN dnf config-manager --set-enabled crb
RUN dnf config-manager --set-enabled appstream
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN yum install -y xorg-x11-xauth
RUN dnf install -y \
git \
rpm-build \
tar \
make \
alsa-lib-devel \
astyle \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
bison \
check \
chrpath \
clang15-devel \
cmake \
cryptopp-devel \
cups-devel \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
python2.7 \
python3-html5lib \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-devel \
cryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-devel \
NetworkManager-libnm-devel \
openssl-devel \
clutter-devel \
clutter-gtk-devel \
libappindicator-gtk3-devel \
libnotify-devel \
libupnp-devel \
qrencode-devel \
libargon2-devel \
libsndfile-devel \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
nodejs \
flex \
fmt-devel \
gcc-c++ \
gettext-devel \
git \
gnutls-devel \
gperf \
gsm-devel \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-bad-free-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
jsoncpp-devel \
libX11-devel \
libXext-devel \
libXfixes-devel \
libXrender-devel \
libappindicator-gtk3-devel \
libargon2-devel \
libcanberra-devel \
libcurl-devel \
libdrm \
libnatpmp-devel \
libnotify \
libnotify-devel \
libsndfile-devel \
libstdc++-static \
libtool \
libupnp-devel \
libuuid-devel \
libva-devel \
libvdpau-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
llvm15-devel \
make \
mesa-dri-drivers \
mesa-libgbm-devel \
msgpack-devel \
nasm \
nettle-devel \
NetworkManager-libnm-devel \
ninja-build \
clang \
cmake \
fmt-devel \
nodejs \
nss-devel \
openssl-devel \
opus-devel \
pcre2-devel \
perl-English \
perl-generators \
pipewire-devel \
cups-devel #Chromium for Qt
pulseaudio-libs-devel \
python3-html5lib \
qrencode-devel \
speex-devel \
speexdsp-devel \
sqlite-devel \
systemd-devel \
uuid-devel \
vulkan-devel \
webkitgtk6.0-devel \
wget \
which \
xcb-util-* \
xkeyboard-config \
yaml-cpp-devel \
yasm
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]
CMD ["/opt/build-package-rpm.sh"]

View File

@ -70,9 +70,8 @@ RUN dnf install -y \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
clang16-devel \
llvm16-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
@ -96,11 +95,11 @@ RUN dnf install -y \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -27,6 +27,7 @@ RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab

View File

@ -18,5 +18,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -11,14 +11,6 @@ RUN apt-get update --allow-releaseinfo-change && \
wget \
nasm
# As of January 2024, the default compiler on Debian testing is GCC 13.2.0, which
# can't build one of Qt 6.6.1's dependencies, see:
# https://github.com/qt/qtquick3d-assimp/commit/253f8bfa621a9fa6cd2c36291cdaa8c60c99322c
# The linked commit above fixes the problem and is included in more recent versions of Qt.
# For now, we use GCC 12 as a temporary workaround:
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 12
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
@ -27,9 +19,8 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -11,14 +11,6 @@ RUN apt-get update && \
libdbus-1-dev \
wget
# As of January 2024, the default compiler on Debian unstable is GCC 13.2.0, which
# can't build one of Qt 6.6.1's dependencies, see:
# https://github.com/qt/qtquick3d-assimp/commit/253f8bfa621a9fa6cd2c36291cdaa8c60c99322c
# The linked commit above fixes the problem and is included in more recent versions of Qt.
# For now, we use GCC 12 as a temporary workaround:
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 12
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
@ -27,9 +19,8 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,105 +0,0 @@
FROM fedora:40
RUN dnf clean all
RUN dnf update -y
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN dnf install -y \
git \
rpm-build \
tar \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-devel \
cryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-devel \
NetworkManager-libnm-devel \
openssl-devel \
clutter-devel \
clutter-gtk-devel \
libappindicator-gtk3-devel \
libnotify-devel \
libupnp-devel \
qrencode-devel \
libargon2-devel \
libsndfile-devel \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3.10 \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -1,4 +1,4 @@
FROM fedora:38
FROM fedora:41
RUN dnf clean all
RUN dnf update -y
@ -6,7 +6,7 @@ RUN dnf update -y
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN dnf group install -y x-software-development
RUN dnf install -y \
git \
@ -30,7 +30,6 @@ RUN dnf install -y \
libXext-devel \
libXfixes-devel \
yasm \
python2.7 \
speex-devel \
gsm-devel \
chrpath \
@ -68,9 +67,8 @@ RUN dnf install -y \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
clang18-devel \
llvm18-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
@ -94,13 +92,13 @@ RUN dnf install -y \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -1,4 +1,4 @@
FROM fedora:39
FROM fedora:42
RUN dnf clean all
RUN dnf update -y
@ -6,12 +6,10 @@ RUN dnf update -y
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN dnf group install -y x-software-development
RUN dnf install -y \
git \
rpm-build \
tar \
make \
autoconf \
automake \
@ -22,13 +20,10 @@ RUN dnf install -y \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
gsm-devel \
@ -37,16 +32,15 @@ RUN dnf install -y \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
gcc14 \
gcc14-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-devel \
@ -64,28 +58,20 @@ RUN dnf install -y \
qrencode-devel \
libargon2-devel \
libsndfile-devel \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
clang18-devel \
llvm18-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
@ -93,13 +79,13 @@ RUN dnf install -y \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3.10 \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -1,122 +0,0 @@
FROM opensuse/leap:15.4
RUN zypper refresh
RUN zypper --non-interactive install -y \
dnf \
dnf-command\(builddep\) \
rpmdevtools \
Mesa-dri-devel Mesa-dri \
git \
gcc10 \
gcc10-c++ \
rpm-build \
tar \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
libpulse-devel \
libcanberra-devel \
libcurl-devel \
libtool \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
libgsm-devel \
chrpath \
check \
astyle \
gettext-devel \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
libopus-devel \
patch \
jsoncpp-devel \
webkit2gtk3-devel \
libcryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-devel \
clutter-devel \
openssl-devel \
clutter-gtk-devel \
libnma-devel \
libcryptopp-devel \
libexpat-devel \
gnome-icon-theme-symbolic \
libgsm-devel \
gtk3-devel \
libappindicator-devel \
sqlite-devel \
ffmpeg-4-libavutil-devel \
gtk3-devel\
qrencode-devel \
python310 \
python3-python-dateutil \
python3-html5lib \
libsndfile-devel \
libdrm \
gperf \
bison \
flex \
ffmpeg ffmpeg-devel \
nodejs18 \
mozilla-nss-devel \
python-xml \
python3-six \
python3-importlib-metadata \
libxcb* \
libxkb* \
libX11-devel \
libXrender-devel \
libfreetype6 \
xcb-util-image-devel \
xcb-util-keysyms-devel \
xcb-util-renderutil-devel \
xcb-util-wm-devel \
xorg-x11-devel \
xz \
xkeyboard-config \
libnotify \
argon2-devel \
libxshmfence-devel \
xproto-devel \
xcb-proto-devel \
xcb-* \
xorg-* \
vulkan-devel \
ninja \
gstreamer-devel \
gstreamer-plugins-good \
gstreamer-plugins-bad-devel \
gstreamer-plugins-base-devel \
cmake \
wget \
pipewire-devel
# openSUSE Leap 15.4 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.6.1
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.10 /usr/bin/python3
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 50
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 50
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
ENV CC=gcc
ENV CXX=g++
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on openSUSE Leap 15.4 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-rpm.sh"]

View File

@ -1,10 +1,9 @@
FROM opensuse/leap:15.5
FROM opensuse/leap:15.6
RUN zypper refresh
RUN zypper --gpg-auto-import-keys refresh
RUN zypper --non-interactive install -y \
dnf \
dnf-command\(builddep\) \
rpmdevtools \
Mesa-dri-devel Mesa-dri \
git \
@ -29,11 +28,11 @@ RUN zypper --non-interactive install -y \
speex-devel \
libgsm-devel \
chrpath \
check \
check-devel \
astyle \
gettext-devel \
gettext-tools \
which \
alsa-lib-devel \
alsa-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
@ -47,7 +46,7 @@ RUN zypper --non-interactive install -y \
msgpack-c-devel \
msgpack-cxx-devel \
clutter-devel \
openssl-devel \
libopenssl-devel \
clutter-gtk-devel \
libnma-devel \
libcryptopp-devel \
@ -56,24 +55,22 @@ RUN zypper --non-interactive install -y \
libgsm-devel \
gtk3-devel \
libappindicator-devel \
sqlite-devel \
ffmpeg-4-libavutil-devel \
sqlite3-devel \
gtk3-devel\
qrencode-devel \
python310 \
python3-python-dateutil \
python3-html5lib \
python311 \
python311-python-dateutil \
python311-html5lib \
python311-six \
python311-importlib-metadata \
libsndfile-devel \
libdrm \
libdrm-devel \
gperf \
bison \
flex \
ffmpeg ffmpeg-devel \
nodejs20 \
mozilla-nss-devel \
python-xml \
python3-six \
python3-importlib-metadata \
libxcb* \
libxkb* \
libX11-devel \
@ -86,7 +83,7 @@ RUN zypper --non-interactive install -y \
xorg-x11-devel \
xz \
xkeyboard-config \
libnotify \
libnotify-devel \
argon2-devel \
libxshmfence-devel \
xproto-devel \
@ -103,13 +100,14 @@ RUN zypper --non-interactive install -y \
wget \
pipewire-devel
# openSUSE Leap 15.5 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.6.1
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.10 /usr/bin/python3
# openSUSE Leap 15.6 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.8.3
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.11 /usr/bin/python3
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 50
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 50
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
ENV CC=gcc

View File

@ -1,10 +1,12 @@
ARG RISK=edge
ARG UBUNTU=focal
# This file is based on the examples at the following links:
# https://snapcraft.io/docs/build-on-docker
# https://github.com/canonical/snapcraft/issues/5079#issuecomment-2414199613
FROM ubuntu:$UBUNTU as builder
ARG RISK
ARG UBUNTU=jammy
FROM ubuntu:$UBUNTU AS builder
ARG UBUNTU
RUN echo "Building snapcraft:$RISK in ubuntu:$UBUNTU"
RUN echo "Building snapcraft in ubuntu:$UBUNTU"
# Grab dependencies
RUN apt-get update
@ -14,67 +16,41 @@ RUN apt-get install --yes \
jq \
squashfs-tools
# Grab the core snap (for backwards compatibility) from the stable channel and
# unpack it in the proper place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core' | jq '.download_url' -r) --output core.snap
RUN mkdir -p /snap/core
RUN unsquashfs -d /snap/core/current core.snap
# Grab the core22 snap (which snapcraft uses as a base) from the stable channel
# and unpack it in the proper place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22?channel='$RISK | jq '.download_url' -r) --output core22.snap
# Download and unpack the core22 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22' | jq '.download_url' -r) --output core22.snap
RUN mkdir -p /snap/core22
RUN unsquashfs -d /snap/core22/current core22.snap
# Grab the core20 snap (which snapcraft uses as a base) from the stable channel
# and unpack it in the proper place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core20' | jq '.download_url' -r) --output core20.snap
RUN mkdir -p /snap/core20
RUN unsquashfs -d /snap/core20/current core20.snap
# Download and unpack the core24 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core24' | jq '.download_url' -r) --output core24.snap
RUN mkdir -p /snap/core24
RUN unsquashfs -d /snap/core24/current core24.snap
# Grab the core20 snap (which snapcraft uses as a base) from the stable channel
# and unpack it in the proper place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/lxd' | jq '.download_url' -r) --output lxd.snap
RUN mkdir -p /snap/lxd
RUN unsquashfs -d /snap/lxd/current lxd.snap
# Grab the snapcraft snap from the $RISK channel and unpack it in the proper
# place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/snapcraft?channel='$RISK | jq '.download_url' -r) --output snapcraft.snap
# Download and unpack snapcraft
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/snapcraft' | jq '.download_url' -r) --output snapcraft.snap
RUN mkdir -p /snap/snapcraft
RUN unsquashfs -d /snap/snapcraft/current snapcraft.snap
# Fix Python3 installation: Make sure we use the interpreter from
# the snapcraft snap:
RUN unlink /snap/snapcraft/current/usr/bin/python3
RUN ln -s /snap/snapcraft/current/usr/bin/python3.* /snap/snapcraft/current/usr/bin/python3
RUN echo /snap/snapcraft/current/lib/python3.*/site-packages >> /snap/snapcraft/current/usr/lib/python3/dist-packages/site-packages.pth
# Create a snapcraft runner (TODO: move version detection to the core of
# snapcraft).
# Create a snapcraft runner
RUN mkdir -p /snap/bin
RUN echo "#!/bin/sh" > /snap/bin/snapcraft
RUN snap_version="$(awk '/^version:/{print $2}' /snap/snapcraft/current/meta/snap.yaml | tr -d \')" && echo "export SNAP_VERSION=\"$snap_version\"" >> /snap/bin/snapcraft
RUN echo 'exec "$SNAP/usr/bin/python3" "$SNAP/bin/snapcraft" "$@"' >> /snap/bin/snapcraft
RUN echo 'exec "/snap/snapcraft/current/bin/python3" -m snapcraft "$@"' >> /snap/bin/snapcraft
RUN chmod +x /snap/bin/snapcraft
# Multi-stage build, only need the snaps from the builder. Copy them one at a
# time so they can be cached.
FROM ubuntu:$UBUNTU
COPY --from=builder /snap/core /snap/core
COPY --from=builder /snap/core22 /snap/core22
COPY --from=builder /snap/core20 /snap/core20
COPY --from=builder /snap/lxd /snap/lxd
COPY --from=builder /snap/core24 /snap/core24
COPY --from=builder /snap/snapcraft /snap/snapcraft
COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
# Generate locale and install dependencies.
RUN apt-get update && apt-get dist-upgrade --yes && apt-get install --yes snapd sudo apt-transport-https locales wget && locale-gen en_US.UTF-8
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
# Set the proper environment.
ENV LANG="en_US.UTF-8"
ENV LANGUAGE="en_US:en"
@ -83,6 +59,7 @@ ENV PATH="/snap/bin:/snap/snapcraft/current/usr/bin:/snap/snapcraft/current/libe
ENV SNAP="/snap/snapcraft/current"
ENV SNAP_NAME="snapcraft"
ENV SNAP_ARCH="amd64"
ENV SNAPCRAFT_BUILD_ENVIRONMENT=host
ADD extras/packaging/gnu-linux/scripts/build-package-snap.sh /opt/build-package-snap.sh
CMD ["/opt/build-package-snap.sh"]

View File

@ -1,42 +0,0 @@
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget \
curl
# Installing GCC 10 because GCC 9 (the default on Ubuntu 20.04) doesn't support
# the --std=gnu++20 option, which is used by one of Qt 6.6.1's dependencies
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 10
# nodejs
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt install nodejs -y
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on Ubuntu 20.04 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -23,5 +23,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,30 +0,0 @@
FROM ubuntu:23.10
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget
# The default compiler on Ubuntu 23.10, GCC 13.2.0, can't build one of Qt 6.6.1's
# dependencies, see:
# https://github.com/qt/qtquick3d-assimp/commit/253f8bfa621a9fa6cd2c36291cdaa8c60c99322c
# The linked commit above fixes the problem and is included in more recent versions of Qt.
# For now, we use GCC 12 as a temporary workaround:
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 12
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -21,5 +21,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,4 +1,4 @@
FROM ubuntu:23.04
FROM ubuntu:25.04
ENV DEBIAN_FRONTEND=noninteractive
@ -18,5 +18,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,7 +1,5 @@
#!/bin/sh
# Copyright (C) 2021-2024 Savoir-faire Linux Inc.
#
# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
# Copyright (C) 2021-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -1,6 +1,4 @@
;;; Copyright (C) 2021-2024 Savoir-faire Linux Inc.
;;;
;;; Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
;;; Copyright (C) 2021-2025 Savoir-faire Linux Inc.
;;;
;;; 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

View File

@ -24,7 +24,10 @@
(list
;; Minimal requirements of the daemon contrib build system.
"coreutils"
"gcc-toolchain"
;; When using GCC 15, Jami fails to link with errors like:
;; ld: CMakeFiles/jami.dir/src/app/main.cpp.o:(.rodata+0x0):
;; multiple definition of `QtPrivate::IsFloatType_v<_Float16>'
"gcc-toolchain@14"
"git-minimal"
"grep"
"gzip"
@ -42,18 +45,12 @@
"alsa-lib"
"autoconf"
"automake"
"asio"
"bash"
"bzip2"
"cmake"
"dbus"
;; Bundled because broken with GCC 7 upstream (unmaintained). When
;; attempting to use it, it would cause confusing errors such as
;; "ld: ../src/.libs/libring.a(libupnpcontrol_la-upnp_context.o): in
;; function `jami::upnp::UPnPContext::updateMappingList(bool)':
;; upnp_context.cpp:(.text+0xa4be): undefined reference to
;; `std::__cxx11::basic_ostringstream<char, std::char_traits<char>,
;; std::allocator<char> >::basic_ostringstream()'
;;"dbus-c++" ;for dbusxx-xml2cpp
;;"dhtnet" ;bundled because tightly coupled
"diffutils"
"doxygen"
"eudev" ;udev library
@ -67,6 +64,7 @@
"gsm"
"gtk-doc"
"http-parser"
"jack@0"
"jsoncpp"
"libarchive"
"libgit2"
@ -84,16 +82,24 @@
"patch"
"pcre"
"perl"
"pipewire"
;;"pjproject" ;bundled because patched
"pulseaudio"
"sdbus-c++@1"
"speex"
"speexdsp"
"webrtc-audio-processing@0"
"which"
"yaml-cpp"
"yasm"
;; For the Qt client.
"glib"
"hunspell"
"libnotify"
"libxcb"
"libxkbcommon"
"md4c"
"network-manager" ;libnm
"qrencode"
"qtbase"
@ -103,10 +109,13 @@
"qtnetworkauth"
"qtpositioning"
"qtsvg"
"qwindowkit"
"qttools"
"qtwebchannel"
"qtwebengine"
"tidy-html"
"vulkan-headers"
"zxing-cpp"
;; For tests and debugging.
"file"

View File

@ -261,7 +261,7 @@ Build-Depends: debhelper (>= 9),
gperf,
khronos-api,
# libasound2-dev [linux-any],
libavcodec-dev (>= 7:3.4.8~),
libavcodec-dev (>= 7:3.4.8~) | libavcodec-extra-dev (>= 7:3.4.8~),
libavformat-dev (>= 7:3.4.8~),
libavutil-dev (>= 7:3.4.8~),
libcap-dev [linux-any],

View File

@ -0,0 +1,39 @@
From 0d0856252b48895a8d6cad7bff66c904ccfc0725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 16 Jul 2025 13:49:54 -0400
Subject: [PATCH] qtwebengine: fix build error due to missing chromium
dependency
Error:
In file included from ../../../3rdparty/chromium/ui/gl/gl_surface.h:30,
from ../../../3rdparty/chromium/tools/v8_context_snapshot/qt_overrides.cc:13:
../../../3rdparty/chromium/ui/gl/gl_implementation.h:18:10: fatal error: ui/gl/buildflags.h: No such file or directory
18 | #include "ui/gl/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Patch taken from: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/637889
---
.../src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
index 812445d934..97cd46140d 100644
--- a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
@@ -455,6 +455,10 @@ if (is_linux && !is_qtwebengine) {
output_name = "webenginedriver"
deps -= [ "//net/traffic_annotation:test_support" ]
+ if (is_linux || is_mac) {
+ deps += [ "//ui/gl:buildflags" ]
+ }
+
if (is_linux) {
sources += [
"//content/public/common/content_switches.cc",
--
2.34.1

View File

@ -1,314 +0,0 @@
From deeacfdb5a6d1d300d4ba991df76aa12e5dbaa42 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
<sebastien.blin@savoirfairelinux.com>
Date: Tue, 16 Apr 2024 09:54:32 -0400
Subject: [PATCH] fix imp->importlib
---
.../mojo/public/tools/mojom/mojom/fileutil.py | 1 -
.../tools/mojom/mojom/fileutil_unittest.py | 5 +----
.../mojom/mojom/generate/generator_unittest.py | 7 ++-----
.../mojom/mojom/generate/translate_unittest.py | 4 ----
.../tools/mojom/mojom/parse/ast_unittest.py | 6 ------
.../mojom/parse/conditional_features_unittest.py | 8 ++------
.../mojo/public/tools/mojom/mojom/parse/lexer.py | 1 -
.../tools/mojom/mojom/parse/lexer_unittest.py | 7 ++-----
.../tools/mojom/mojom/parse/parser_unittest.py | 5 -----
.../3rdparty/chromium/third_party/six/src/six.py | 16 ++++++++++++++++
10 files changed, 23 insertions(+), 37 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
index 29daec367c..124f12c134 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
@@ -3,7 +3,6 @@
# found in the LICENSE file.
import errno
-import imp
import os.path
import sys
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
index 48eaf4eca9..c93d22898d 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
@@ -2,19 +2,16 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
import os.path
import shutil
-import sys
import tempfile
import unittest
from mojom import fileutil
-
class FileUtilTest(unittest.TestCase):
def testEnsureDirectoryExists(self):
- """Test that EnsureDirectoryExists fuctions correctly."""
+ """Test that EnsureDirectoryExists functions correctly."""
temp_dir = tempfile.mkdtemp()
try:
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
index 76cda3981f..7143e07c4d 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os.path
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -20,12 +19,11 @@ def _GetDirAbove(dirname):
try:
- imp.find_module("mojom")
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
from mojom.generate import generator
-
class StringManipulationTest(unittest.TestCase):
"""generator contains some string utilities, this tests only those."""
@@ -69,6 +67,5 @@ class StringManipulationTest(unittest.TestCase):
self.assertEquals("SNAKE_D3D11_CASE",
generator.ToUpperSnakeCase("snakeD3d11Case"))
-
if __name__ == "__main__":
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
index 4259374513..558e71e119 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
@@ -2,16 +2,12 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.generate import module as mojom
from mojom.generate import translate
from mojom.parse import ast
-
class TranslateTest(unittest.TestCase):
"""Tests |parser.Parse()|."""
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
index c36376712e..b289f7b11f 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
@@ -2,14 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.parse import ast
-
class _TestNode(ast.NodeBase):
"""Node type for tests."""
@@ -20,13 +16,11 @@ class _TestNode(ast.NodeBase):
def __eq__(self, other):
return super().__eq__(other) and self.value == other.value
-
class _TestNodeList(ast.NodeListBase):
"""Node list type for tests."""
_list_item_type = _TestNode
-
class ASTTest(unittest.TestCase):
"""Tests various AST classes."""
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
index 5fc582025e..2fa5d2be6a 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -18,9 +17,8 @@ def _GetDirAbove(dirname):
if tail == dirname:
return path
-
try:
- imp.find_module('mojom')
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove('pylib'), 'pylib'))
import mojom.parse.ast as ast
@@ -29,7 +27,6 @@ import mojom.parse.parser as parser
ENABLED_FEATURES = frozenset({'red', 'green', 'blue'})
-
class ConditionalFeaturesTest(unittest.TestCase):
"""Tests |mojom.parse.conditional_features|."""
@@ -356,6 +353,5 @@ class ConditionalFeaturesTest(unittest.TestCase):
conditional_features.RemoveDisabledDefinitions,
definition, ENABLED_FEATURES)
-
if __name__ == '__main__':
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
index 73ca15df94..1083a1af7b 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
@@ -2,7 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
import os.path
import sys
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
index ce376da66e..bc9f835431 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os.path
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -18,17 +17,15 @@ def _GetDirAbove(dirname):
if tail == dirname:
return path
-
sys.path.insert(1, os.path.join(_GetDirAbove("mojo"), "third_party"))
from ply import lex
try:
- imp.find_module("mojom")
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
import mojom.parse.lexer
-
# This (monkey-patching LexToken to make comparison value-based) is evil, but
# we'll do it anyway. (I'm pretty sure ply's lexer never cares about comparing
# for object identity.)
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
index 0513343ec7..0a26307b1a 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
@@ -2,16 +2,12 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.parse import ast
from mojom.parse import lexer
from mojom.parse import parser
-
class ParserTest(unittest.TestCase):
"""Tests |parser.Parse()|."""
@@ -1375,6 +1371,5 @@ class ParserTest(unittest.TestCase):
r" *associated\? MyInterface& a;$"):
parser.Parse(source3, "my_file.mojom")
-
if __name__ == "__main__":
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/six/src/six.py b/qtwebengine/src/3rdparty/chromium/third_party/six/src/six.py
index 5fe9f8e141..96b06f8ce7 100644
--- a/qtwebengine/src/3rdparty/chromium/third_party/six/src/six.py
+++ b/qtwebengine/src/3rdparty/chromium/third_party/six/src/six.py
@@ -71,6 +71,11 @@ else:
MAXSIZE = int((1 << 63) - 1)
del X
+if PY34:
+ from importlib.util import spec_from_loader
+else:
+ spec_from_loader = None
+
def _add_doc(func, doc):
"""Add documentation to a function."""
@@ -186,6 +191,11 @@ class _SixMetaPathImporter(object):
return self
return None
+ def find_spec(self, fullname, path, target=None):
+ if fullname in self.known_modules:
+ return spec_from_loader(fullname, self)
+ return None
+
def __get_module(self, fullname):
try:
return self.known_modules[fullname]
@@ -223,6 +233,12 @@ class _SixMetaPathImporter(object):
return None
get_source = get_code # same as get_code
+ def create_module(self, spec):
+ return self.load_module(spec.name)
+
+ def exec_module(self, module):
+ pass
+
_importer = _SixMetaPathImporter(__name__)
--
2.43.0

View File

@ -1,16 +0,0 @@
qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
index 3488120543..120e47a76f 100644
--- a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
+++ b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
@@ -472,7 +472,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length)
}
catch (const DeadlyImportError& e)
{
- if (!is64bits && (length > std::numeric_limits<std::uint32_t>::max())) {
+ if (!is64bits && (length > std::numeric_limits<uint32_t>::max())) {
throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (", ai_to_string(version), ") of the FBX format. (", e.what(), ")");
}
throw;

View File

@ -0,0 +1,79 @@
From 24dd03e131cd3edc89907a699369562e61d8aa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Mon, 21 Jul 2025 13:19:58 -0400
Subject: [PATCH] qtwebengine: fix ASSERT_TRIVIALLY_COPYABLE failure
Some compilers don't implement std::is_trivially_copyable correctly,
which can cause chromium's build to fail with the following error:
In file included from ../../../3rdparty/chromium/v8/src/base/bits.h:12,
from ../../../3rdparty/chromium/v8/src/base/small-vector.h:12,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/graph.h:17,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.h:9,
from ./../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.cc:5,
from gen/v8/v8_turboshaft_jumbo_1.cc:5:
../../../3rdparty/chromium/v8/src/base/small-vector.h: In instantiation of 'class v8::base::SmallVector&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt;, 16&gt;':
../../../3rdparty/chromium/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:433:11: required from here
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: error: static assertion failed: T should be trivially copyable
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: note: 'v8::base::is_trivially_copyable&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt; &gt;::value' evaluates to false
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
References:
https://chromium-review.googlesource.com/c/v8/v8/+/5679182
https://chromium-review.googlesource.com/c/v8/v8/+/5872655
https://github.com/rubyjs/libv8-node/pull/57
https://github.com/nodejs/node/issues/54576
---
qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h | 3 ++-
qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
index 93a99ec136..88c6555189 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
@@ -173,7 +173,8 @@ namespace base {
// base::is_trivially_copyable will differ for these cases.
template <typename T>
struct is_trivially_copyable {
-#if V8_CC_MSVC
+#if V8_CC_MSVC || (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) || \
+ (defined(__clang__) && __clang_major__ <= 17)
// Unfortunately, MSVC 2015 is broken in that std::is_trivially_copyable can
// be false even though it should be true according to the standard.
// (status at 2018-02-26, observed on the msvc waterfall bot).
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
index b1b5d64198..ce2e003fb9 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
@@ -22,7 +22,7 @@ template <typename T, size_t kSize, typename Allocator = std::allocator<T>>
class SmallVector {
// Currently only support trivially copyable and trivially destructible data
// types, as it uses memcpy to copy elements and never calls destructors.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
static_assert(std::is_trivially_destructible<T>::value);
public:
@@ -193,7 +193,7 @@ class SmallVector {
void resize_no_init(size_t new_size) {
// Resizing without initialization is safe if T is trivially copyable.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
if (new_size > capacity()) Grow(new_size);
end_ = begin_ + new_size;
}
--
2.34.1

View File

@ -0,0 +1,49 @@
From 5c247c7a084661932969acf2f7103096b8b0d6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Tue, 22 Jul 2025 13:40:55 -0400
Subject: [PATCH] qtwebengine: fix zygote_communication_linux dependency
Commit 42e09c7bea of qtwebengine-chromium added
content/public/browser/child_process_host.h to the list of header files
included in zygote_communication_linux.cc, which can cause the build to
fail with the following error:
In file included from ../../../3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc:21:
../../../3rdparty/chromium/content/public/browser/child_process_host.h:17:10: fatal error: content/common/buildflags.h: No such file or directory
17 | #include "content/common/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
.../content/common/zygote/zygote_communication_linux.cc | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
index 5bd9a53568..ff883d59e4 100644
--- a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
+++ b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
@@ -18,7 +18,7 @@
#include "base/posix/eintr_wrapper.h"
#include "base/posix/unix_domain_socket.h"
#include "content/common/zygote/zygote_commands_linux.h"
-#include "content/public/browser/child_process_host.h"
+#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "sandbox/policy/switches.h"
@@ -237,8 +237,11 @@ void ZygoteCommunication::Init(
base::OnceCallback<pid_t(base::CommandLine*, base::ScopedFD*)> launcher) {
CHECK(!init_);
- base::FilePath chrome_path = content::ChildProcessHost::GetChildPath(
- content::ChildProcessHost::CHILD_NORMAL);
+ base::FilePath chrome_path = base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
+ switches::kBrowserSubprocessPath);
+ if (chrome_path.empty()) {
+ base::PathService::Get(CHILD_PROCESS_EXE, &chrome_path);
+ }
base::CommandLine cmd_line(chrome_path);
cmd_line.AppendSwitchASCII(switches::kProcessType, switches::kZygoteProcess);
--
2.34.1

View File

@ -1,2 +1,3 @@
0001-replace_imp_by_importlib.patch
0002-fix-binary-tokenizer.patch
0001-qtwebengine-fix-build-error-due-to-missing-chromium-dependency.patch
0002-qtwebengine-fix-ASSERT_TRIVIALLY_COPYABLE-failure.patch
0003-qtwebengine-fix-zygote_communication_linux-dependency.patch

View File

@ -12,10 +12,14 @@ override_dh_auto_configure:
-confirm-license \
-nomake examples \
-nomake tests \
-prefix "${QT_JAMI_PREFIX}"
-prefix "${QT_JAMI_PREFIX}" \
-- -DFFMPEG_DIR=/opt/libqt-jami-ffmpeg -DQT_DEPLOY_FFMPEG=ON
override_dh_auto_build:
cmake --build . --parallel
override_dh_auto_install:
cmake --install . --prefix $(CURDIR)/debian/tmp/${QT_JAMI_PREFIX}
override_dh_shlibdeps:
dh_shlibdeps -v -l$(CURDIR)/debian/libqt-jami/usr/lib/libqt-jami/lib

View File

@ -22,7 +22,7 @@ Build-Depends: debhelper (>= 9),
libpulse-dev,
libasound2-dev,
libexpat1-dev,
libpcre3-dev,
libpcre3-dev | libpcre2-dev,
libyaml-cpp-dev,
libboost-dev,
libxext-dev,
@ -30,7 +30,7 @@ Build-Depends: debhelper (>= 9),
libspeex-dev,
libspeexdsp-dev,
uuid-dev,
libavcodec-dev,
libavcodec-dev | libavcodec-extra-dev,
libavutil-dev,
libavformat-dev,
libswscale-dev,

View File

@ -3,7 +3,7 @@ Upstream-Name: jami
Upstream-Contact: Amin Bandali <bandali@gnu.org>
Source: https://dl.jami.net/release/tarballs/
Files: *
Copyright: 2004-2024 Savoir-faire Linux Inc.
Copyright: 2004-2025 Savoir-faire Linux Inc.
License: GPL-3+
Comment: Upstream embeds everything that is needed to build Jami inside the release tarball.
Everything that is already in Debian has been removed.

View File

@ -95,16 +95,12 @@ if [ -f /etc/os-release ]; then
ENDTAG="debian_11"
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
ENDTAG="debian_12"
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
ENDTAG="ubuntu_20.04"
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "lunar" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.04" ]; then
ENDTAG="ubuntu_23.04"
elif [ "${UBUNTU_CODENAME}" = "mantic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.10" ]; then
ENDTAG="ubuntu_23.10"
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then
ENDTAG="ubuntu_24.04"
elif [ "${UBUNTU_CODENAME}" = "plucky" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_25.04" ]; then
ENDTAG="ubuntu_25.04"
elif [ "${ID}" = "debian" ] && \
[ "$(command -v lsb_release)" ] && \
[ "$(lsb_release -rs)" = "testing" ]; then

View File

@ -45,7 +45,7 @@ QT_JAMI_PREFIX := ${QT_JAMI_PREFIX}
export PATH := $(QT_JAMI_PREFIX)/bin:${PATH}
export LD_LIBRARY_PATH := $(QT_JAMI_PREFIX)/lib:${LD_LIBRARY_PATH}
export PKG_CONFIG_PATH := $(QT_JAMI_PREFIX)/lib/pkgconfig:${PKG_CONFIG_PATH}
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX)/lib/cmake:${CMAKE_PREFIX_PATH}
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX):${CMAKE_PREFIX_PATH}
export CFLAGS := $(CFLAGS) -fno-lto
export CXXFLAGS := $(CXXFLAGS) -fno-lto
@ -74,7 +74,7 @@ override_dh_auto_build:
--disable-gsm \
--disable-speexdsp \
--disable-natpmp \
--enable-gnutls $(BUNDLED_PKGS) && \
$(BUNDLED_PKGS) && \
make list && \
make -j$(NO_CPUS) V=1
cd daemon && \
@ -91,11 +91,13 @@ override_dh_auto_build:
mkdir build && \
cd build && \
cmake \
-DBUILD_VERSION=$(BUILD_VERSION) \
-DCMAKE_INSTALL_PREFIX=/usr \
-DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
-DENABLE_LIBWRAP=true \
-DBUILD_TESTING=Off \
$(CMAKE_OPTIONS) ..
make -C build -j$(NO_CPUS) V=1
make -C build -j$(NO_CPUS) VERBOSE=1
override_dh_auto_clean:
# Daemon clean

View File

@ -49,7 +49,7 @@ BuildRequires: libXfixes-devel
BuildRequires: libuuid-devel
BuildRequires: libva-devel
BuildRequires: libvdpau-devel
BuildRequires: pcre-devel
BuildRequires: (pcre-devel or pcre2-devel)
BuildRequires: pipewire-devel
BuildRequires: uuid-devel
BuildRequires: yaml-cpp-devel
@ -82,7 +82,6 @@ cd %{_builddir}/jami-%{version}/daemon/contrib/native && \
make list && \
make fetch && \
make %{_smp_mflags} V=1 && \
make %{_smp_mflags} V=1 .ffmpeg
# Configure the daemon.
cd %{_builddir}/jami-%{version}/daemon && \
./autogen.sh && \

View File

@ -16,9 +16,9 @@
%define computed_job_count_ %(echo $(( %available_memory / %memory_required_per_core / %max_parallel_builds )))
%define computed_job_count %max %computed_job_count_ 1
%define job_count %min %cpu_count %computed_job_count
# Exclude vendored Qt6 from dependency generator
# Exclude vendored Qt6 and FFmpeg libraries from dependency generator
%define __provides_exclude_from ^%{_libdir}/qt-jami/.*$
%define __requires_exclude ^libQt6.*$
%define __requires_exclude ^(libQt6.*|libavcodec.*|libavformat.*|libavutil.*|libswresample.*|libswscale.*)$
Name: %{name}
Version: %{version}
@ -29,7 +29,9 @@ License: GPLv3+
Vendor: Savoir-faire Linux Inc.
URL: https://jami.net/
Source: jami-libqt-%{version}.tar.xz
Patch0: 0001-fix-gcc14.patch
Patch0: 0001-qtwebengine-fix-build-error-due-to-missing-chromium-dependency.patch
Patch1: 0002-qtwebengine-fix-ASSERT_TRIVIALLY_COPYABLE-failure.patch
Patch2: 0003-qtwebengine-fix-zygote_communication_linux-dependency.patch
%global gst 0.10
%if 0%{?fedora} || 0%{?rhel} > 7
@ -65,35 +67,12 @@ This package contains Qt libraries for Jami.
%prep
%setup -n qt-everywhere-src-%{version}
%patch0 -p1
%patch -P 0 -p1
%patch -P 1 -p1
%patch -P 2 -p1
%build
echo "Building Qt using %{job_count} parallel jobs"
# Qt 6.4 (https://wiki.linuxfromscratch.org/blfs/ticket/14729)
sed -i 's,default=False,default=True,g' qtwebengine/src/3rdparty/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents.py
# Gcc 13
sed -i 's,std::uint32_t,uint32_t,g' qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
sed -i 's,std::uint32_t,uint32_t,g' qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
# https://bugs.gentoo.org/768261 (Qt 5.15)
sed -i 's,#include "absl/base/internal/spinlock.h"1,#include "absl/base/internal/spinlock.h"1\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc
sed -i 's,#include <stdint.h>,#include <stdint.h>\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h
# else, break build for fedora 35
sed -i 's/static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);/static const size_t kSigStackSize = std::max(size_t(16384), size_t(SIGSTKSZ));/g' qtwebengine/src/3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
# https://bugreports.qt.io/browse/QTBUG-93452 (Qt 5.15)
sed -i 's,# include <utility>,# include <utility>\n# include <limits>,g' qtbase/src/corelib/global/qglobal.h
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qendian.h
cat qtbase/src/corelib/global/qendian.h
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
cat qtwebengine/configure.cmake
#https://bugreports.qt.io/browse/QTBUG-117979
if test -f "/usr/bin/python3.10"; then
/usr/bin/python3.10 -m venv env
source env/bin/activate
python -m pip install html5lib
python -m pip install six
fi
# recent gcc version do not like lto from qt
CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) ${LDFLAGS}" ./configure \
@ -101,8 +80,8 @@ CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) $
-confirm-license \
-nomake examples \
-nomake tests \
-prefix "%{_libdir}/qt-jami"
sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
-prefix "%{_libdir}/qt-jami" \
-- -DFFMPEG_DIR=/opt/libqt-jami-ffmpeg -DQT_DEPLOY_FFMPEG=ON
# Chromium is built using Ninja, which doesn't honor MAKEFLAGS.
cmake --build . --parallel

View File

@ -1,6 +1,7 @@
%define name jami
%define version RELEASE_VERSION
%define release 0
%define appstream_catalog_dir /share/swcatalog/xml
# Exclude vendored Qt6 from dependency generator
%define __requires_exclude ^libQt6.*$
@ -69,10 +70,14 @@ cd %{_builddir}/jami-%{version} && \
-DLIBJAMI_BUILD_DIR=%{_builddir}/jami-%{version}/daemon/src \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DCMAKE_INSTALL_LIBDIR=%{_libdir} \
-DAPPSTREAM_CATALOG_DIR=%{appstream_catalog_dir} \
-DWITH_DAEMON_SUBMODULE=true \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_VERSION=${BUILD_VERSION} \
-DCMAKE_PREFIX_PATH=%{QT_JAMI_PREFIX} \
-DBUILD_TESTING=Off \
..
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} V=2
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} VERBOSE=1
%install
DESTDIR=%{buildroot} make -C %{_builddir}/jami-%{version}/build install V=2
@ -80,11 +85,12 @@ DESTDIR=%{buildroot} make -C %{_builddir}/jami-%{version}/build install V=2
%files
%defattr(-,root,root,-)
%{_bindir}/jami
%{_datadir}/applications/jami.desktop
%{_datadir}/jami/jami.desktop
%{_datadir}/icons/hicolor/scalable/apps/jami.svg
%{_datadir}/applications/net.jami.Jami.desktop
%{_datadir}/jami/net.jami.Jami.desktop
%{_datadir}/icons/hicolor/scalable/apps/net.jami.Jami.svg
%{_datadir}/icons/hicolor/48x48/apps/jami.png
%{_datadir}/pixmaps/jami.xpm
%{_datadir}/metainfo/jami.appdata.xml
%{_datadir}/metainfo/net.jami.Jami.metainfo.xml
%{_prefix}%{appstream_catalog_dir}/jami.xml
%{_datadir}/jami/translations/*
%doc %{_mandir}/man1/jami*

View File

@ -1,26 +0,0 @@
From 9721082687c9529fe6ae3c5304dcf079158e8a77 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Sun, 04 Jun 2023 04:15:16 +0100
Subject: [PATCH] heap: Add missing <algorithm> include for std::remove
GCC 14 changes some internal includes within libstdc++ so this transient
include gets lost. Include <algorithm> explicitly for std::remove.
Change-Id: Iab8a2c751a0f9c9dc6a770d6296ad6de724ef3bb
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4583222
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#88037}
---
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
index 2cf728489d..d8414ae3c6 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
@@ -8,6 +8,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <algorithm>
#include <atomic>
#include <vector>

View File

@ -0,0 +1,39 @@
From 0d0856252b48895a8d6cad7bff66c904ccfc0725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 16 Jul 2025 13:49:54 -0400
Subject: [PATCH] qtwebengine: fix build error due to missing chromium
dependency
Error:
In file included from ../../../3rdparty/chromium/ui/gl/gl_surface.h:30,
from ../../../3rdparty/chromium/tools/v8_context_snapshot/qt_overrides.cc:13:
../../../3rdparty/chromium/ui/gl/gl_implementation.h:18:10: fatal error: ui/gl/buildflags.h: No such file or directory
18 | #include "ui/gl/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Patch taken from: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/637889
---
.../src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
index 812445d934..97cd46140d 100644
--- a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
@@ -455,6 +455,10 @@ if (is_linux && !is_qtwebengine) {
output_name = "webenginedriver"
deps -= [ "//net/traffic_annotation:test_support" ]
+ if (is_linux || is_mac) {
+ deps += [ "//ui/gl:buildflags" ]
+ }
+
if (is_linux) {
sources += [
"//content/public/common/content_switches.cc",
--
2.34.1

View File

@ -0,0 +1,79 @@
From 24dd03e131cd3edc89907a699369562e61d8aa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Mon, 21 Jul 2025 13:19:58 -0400
Subject: [PATCH] qtwebengine: fix ASSERT_TRIVIALLY_COPYABLE failure
Some compilers don't implement std::is_trivially_copyable correctly,
which can cause chromium's build to fail with the following error:
In file included from ../../../3rdparty/chromium/v8/src/base/bits.h:12,
from ../../../3rdparty/chromium/v8/src/base/small-vector.h:12,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/graph.h:17,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.h:9,
from ./../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.cc:5,
from gen/v8/v8_turboshaft_jumbo_1.cc:5:
../../../3rdparty/chromium/v8/src/base/small-vector.h: In instantiation of 'class v8::base::SmallVector&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt;, 16&gt;':
../../../3rdparty/chromium/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:433:11: required from here
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: error: static assertion failed: T should be trivially copyable
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: note: 'v8::base::is_trivially_copyable&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt; &gt;::value' evaluates to false
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
References:
https://chromium-review.googlesource.com/c/v8/v8/+/5679182
https://chromium-review.googlesource.com/c/v8/v8/+/5872655
https://github.com/rubyjs/libv8-node/pull/57
https://github.com/nodejs/node/issues/54576
---
qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h | 3 ++-
qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
index 93a99ec136..88c6555189 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
@@ -173,7 +173,8 @@ namespace base {
// base::is_trivially_copyable will differ for these cases.
template <typename T>
struct is_trivially_copyable {
-#if V8_CC_MSVC
+#if V8_CC_MSVC || (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) || \
+ (defined(__clang__) && __clang_major__ <= 17)
// Unfortunately, MSVC 2015 is broken in that std::is_trivially_copyable can
// be false even though it should be true according to the standard.
// (status at 2018-02-26, observed on the msvc waterfall bot).
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
index b1b5d64198..ce2e003fb9 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
@@ -22,7 +22,7 @@ template <typename T, size_t kSize, typename Allocator = std::allocator<T>>
class SmallVector {
// Currently only support trivially copyable and trivially destructible data
// types, as it uses memcpy to copy elements and never calls destructors.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
static_assert(std::is_trivially_destructible<T>::value);
public:
@@ -193,7 +193,7 @@ class SmallVector {
void resize_no_init(size_t new_size) {
// Resizing without initialization is safe if T is trivially copyable.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
if (new_size > capacity()) Grow(new_size);
end_ = begin_ + new_size;
}
--
2.34.1

View File

@ -0,0 +1,49 @@
From 5c247c7a084661932969acf2f7103096b8b0d6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Tue, 22 Jul 2025 13:40:55 -0400
Subject: [PATCH] qtwebengine: fix zygote_communication_linux dependency
Commit 42e09c7bea of qtwebengine-chromium added
content/public/browser/child_process_host.h to the list of header files
included in zygote_communication_linux.cc, which can cause the build to
fail with the following error:
In file included from ../../../3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc:21:
../../../3rdparty/chromium/content/public/browser/child_process_host.h:17:10: fatal error: content/common/buildflags.h: No such file or directory
17 | #include "content/common/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
.../content/common/zygote/zygote_communication_linux.cc | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
index 5bd9a53568..ff883d59e4 100644
--- a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
+++ b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
@@ -18,7 +18,7 @@
#include "base/posix/eintr_wrapper.h"
#include "base/posix/unix_domain_socket.h"
#include "content/common/zygote/zygote_commands_linux.h"
-#include "content/public/browser/child_process_host.h"
+#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "sandbox/policy/switches.h"
@@ -237,8 +237,11 @@ void ZygoteCommunication::Init(
base::OnceCallback<pid_t(base::CommandLine*, base::ScopedFD*)> launcher) {
CHECK(!init_);
- base::FilePath chrome_path = content::ChildProcessHost::GetChildPath(
- content::ChildProcessHost::CHILD_NORMAL);
+ base::FilePath chrome_path = base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
+ switches::kBrowserSubprocessPath);
+ if (chrome_path.empty()) {
+ base::PathService::Get(CHILD_PROCESS_EXE, &chrome_path);
+ }
base::CommandLine cmd_line(chrome_path);
cmd_line.AppendSwitchASCII(switches::kProcessType, switches::kZygoteProcess);
--
2.34.1

View File

@ -1,7 +1,4 @@
# Copyright (C) 2019-2024 Savoir-faire Linux Inc.
#
# Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Copyright (C) 2019-2025 Savoir-faire Linux Inc.
#
# 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
@ -51,47 +48,63 @@ icon: common/icons/jami.svg
license: GPL-3.0+
summary: 'Privacy-oriented voice, video, chat, and conference platform and SIP phone'
description: |
Jami is free software for universal communication that respects the
freedom and privacy of its users.
Jami, a GNU package, is software for universal and distributed peer-to-peer communication that respects the freedom and privacy of its users.
Jami is an end-to-end encrypted secure and distributed voice, video,
and chat communication platform. Jami requires no central server
for these communications and leaves the power of privacy and freedom
in the hands of users.
Jami is the simplest and easiest way to connect with people (and devices) with instant messaging, audio and video calls over the Internet and LAN/WAN intranets.
Jami provides the following key features to its users:
Jami is a free/libre, end-to-end encrypted, and private communication platform.
* Synchronized and enriched one-to-one conversations
* Group conversations (Beta)
* Audio/video calls and conferences
* Screen sharing in video calls and conferences
* Unlimited peer-to-peer file sharing
* Recording and sending audio/video messages
* Jami plugins SDK for additional functionality (green screen,
watermark, audio filters, and more)
* Use Jami as your SIP phone with a variety of media codecs
and VoIP providers
Jami which used to be known as Ring is also an open-source alternative (to Facebook Messenger, Signal, Skype, Teams, Telegram, TikTok, Viber, WhatsApp, Zoom) that prioritizes the privacy of its users.
Client applications for GNU/Linux, Windows, macOS, iOS, Android,
and Android TV are available, making Jami an interoperable and
cross-platform communication framework.
Jami has a professional-looking design and is available for a wide range of platforms. Unlike the alternatives, calls using Jami are directly between users as it does not use servers to handle calls.
Seamlessly deploy Jami in your organization using
Jami Account Management Server (JAMS). With JAMS, you can enable
your users to connect using their LDAP/ActiveDirectory credentials
or create local accounts, enabling you to manage your own
Jami community while taking advantage of Jami's distributed network
architecture. For more information, please visit https://jami.biz.
This gives the greatest privacy as the distributed nature of Jami means your calls are only between participants.
One-to-one and group conversations with Jami are enhanced with: instant messaging; audio and video calling; recording and sending audio and video messages; file transfers; screen sharing; and, location sharing.
Jami can also function as a SIP client.
Jami has multiple extensions available: Audio Filter; Auto Answer; Green Screen; Watermark; and, Whisper Transcript.
Jami can be easily deployed in organizations with the “Jami Account Management Server” (JAMS), allowing users to connect with their corporate credentials or create local accounts. JAMS allows you to manage your own Jami community while taking advantage of Jamis distributed network architecture.
Jami is available for GNU/Linux, Windows, macOS, iOS, Android, and Android TV, making Jami an interoperable and cross-platform communication framework.
Manage multiple SIP accounts, Jami accounts and JAMS accounts with the Jami client installed on one or multiple devices.
Jami is free, unlimited, private, advertising free, compatible, fast, autonomous, and anonymous.
Learn more about:
Jami: https://jami.net/
Jami extensions: https://jami.net/extensions/
“Jami Account Management Server” (JAMS): https://jami.biz/
Jami documentation: https://docs.jami.net/
Follow us for more:
Mastodon: https://mstdn.io/@Jami
X: https://x.com/jami_social
YouTube: https://www.youtube.com/@jami9311
Wed love to hear from you! Join the Jami community:
Contribute: https://jami.net/contribute/
Forum: https://forum.jami.net/
Build with Jami on your IoT project: re-use the universal communications technology of Jami with its portable library on your system of choice.
Jami for Android TV is tested on NVIDIA SHIELD TV with Logitech cameras.
Jami is published under the GPL license, version 3 or higher.
Copyright © Savoir-faire Linux Inc.
confinement: strict
grade: stable
base: core20
base: core22
plugs:
gnome-3-38-2004:
gnome-42-2204:
interface: content
target: $SNAP/gnome-platform
default-provider: gnome-3-38-2004:gnome-3-38-2004
default-provider: gnome-42-2204
gtk-3-themes:
interface: content
target: $SNAP/data-dir/themes
@ -116,8 +129,8 @@ slots:
name: cx.ring.Ring
layout:
/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib:
bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib
/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib
/usr/share/alsa:
bind: $SNAP/usr/share/alsa
/usr/share/X11/xkb:
@ -126,7 +139,7 @@ layout:
environment:
XDG_CURRENT_DESKTOP: Unity
QT_BASE_DIR: "/usr/lib/libqt-jami"
LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP$QT_BASE_DIR/lib"
LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SNAP$QT_BASE_DIR/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pulseaudio"
apps:
jami:
@ -135,13 +148,13 @@ apps:
- bin/desktop-launch
- snap/command-chain/alsa-launch
- bin/jami-wrapper
autostart: jami.desktop
autostart: net.jami.Jami.desktop
common-id: net.jami.Jami
desktop: usr/share/applications/jami.desktop
desktop: usr/share/applications/net.jami.Jami.desktop
environment:
PIPEWIRE_CONFIG_NAME: "$SNAP/usr/share/pipewire/pipewire.conf"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/spa-0.2"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/spa-0.2"
slots:
- dbus-jami
- dbus-ring
@ -172,7 +185,7 @@ package-repositories:
components: [main]
suites: [jami]
key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
url: https://dl.jami.net/nightly/ubuntu_20.04/
url: https://dl.jami.net/internal/ubuntu_22.04/
parts:
desktop-launch:
@ -188,14 +201,14 @@ parts:
- devscripts
- equivs
override-pull: |
snapcraftctl pull
craftctl default
sed -i -E 's|\. \$SNAP/flavor-select|USE_gtk3=true|' gtk/launcher-specific
sed -i -E 's|\. \$SNAP/flavor-select|USE_qt5=true|' qt/launcher-specific
sed -i -E 's|(append_dir GTK_PATH \$RUNTIME/usr/lib/\$ARCH/gtk-2.0)|#\1|' qt/launcher-specific
sed -i -E 's|\$RUNTIME|$SNAP|g' qt/launcher-specific
sed -i -E 's|\$WITH_RUNTIME|no|g' qt/launcher-specific
override-build: |
snapcraftctl build
craftctl default
gcc -Wall -O2 -o bindtextdomain.so -fPIC -shared src/bindtextdomain.c -ldl
echo "#!/bin/bash" > desktop-launch
@ -211,10 +224,10 @@ parts:
cat common/mark-and-exec >> desktop-launch
install -D -m755 desktop-launch $SNAPCRAFT_PART_INSTALL/bin/desktop-launch
install -D -m644 bindtextdomain.so $SNAPCRAFT_PART_INSTALL/lib/bindtextdomain.so
install -D -m755 desktop-launch $CRAFT_PART_INSTALL/bin/desktop-launch
install -D -m644 bindtextdomain.so $CRAFT_PART_INSTALL/lib/bindtextdomain.so
mkdir -pv $SNAPCRAFT_PART_INSTALL/gnome-platform
mkdir -pv $CRAFT_PART_INSTALL/gnome-platform
scripts:
plugin: dump
@ -242,7 +255,7 @@ parts:
after: [alsa-mixin]
source: .
plugin: nil
parse-info: [usr/share/metainfo/jami.appdata.xml]
parse-info: [usr/share/metainfo/net.jami.Jami.metainfo.xml]
stage:
- -usr/lib/x86_64-linux-gnu/liblber-2.4.so*
- -usr/lib/x86_64-linux-gnu/libldap_r-2.4.so*
@ -251,44 +264,48 @@ parts:
build-environment:
- QT_BASE_DIR: "/usr/lib/libqt-jami"
- PATH: "$QT_BASE_DIR/bin:$PATH"
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib:$LD_LIBRARY_PATH"
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH"
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
override-pull: |
ls
snapcraftctl pull
craftctl default
sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/jami.svg|' extras/data/jami.desktop
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg|' extras/data/net.jami.Jami.desktop
override-build: |
$SNAPCRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
$CRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
cd $SNAPCRAFT_PART_BUILD/daemon/contrib
cd $CRAFT_PART_BUILD/daemon/contrib
mkdir -p native
cd native
../bootstrap
make .ffmpeg
make
cd $SNAPCRAFT_PART_BUILD/daemon
cd $CRAFT_PART_BUILD/daemon
./autogen.sh
./configure --prefix=/usr --without-dbus
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
cd $SNAPCRAFT_PART_BUILD/
cd $CRAFT_PART_BUILD/
mkdir build
cd build
cmake .. -DENABLE_LIBWRAP=true \
-DLIBJAMI_BUILD_DIR=$SNAPCRAFT_PART_BUILD/daemon/src \
-DLIBJAMI_BUILD_DIR=$CRAFT_PART_BUILD/daemon/src \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$QT_BASE_DIR \
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER \
-DBUILD_TESTING=Off
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
build-packages:
- autoconf
- autoconf-archive
- automake
- autopoint
- bzip2
- cmake
- curl
- gcc
- g++
@ -325,6 +342,13 @@ parts:
- libgnutls28-dev # TLS
- gnutls-bin
- libssl-dev
- git # PipeWire build dependencies
- meson #
- libasound2-dev #
- libdbus-1-dev # These packages are needed by the
- libglib2.0-dev # install-pipewire-from-source.sh
- ninja-build # script in order to build PipeWire
- pkg-config # from source.
stage-packages:
- libgnutls30
- libavutil56
@ -332,7 +356,7 @@ parts:
- libegl1
- libgbm1
- libgudev-1.0-0
- libjsoncpp1
- libjsoncpp25
- libllvm12
- libminizip1
- libnm0
@ -365,6 +389,6 @@ parts:
- -usr/lib/libqt-jami/bin/
- -usr/lib/libqt-jami/docs/
- -usr/lib/libqt-jami/examples/
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libLLVM-*.so*
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libclang-*.so*
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libflite*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libLLVM-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libclang-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite*.so*

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
@ -44,26 +44,12 @@ QUILT_REFRESH_ARGS="-p 1"
if [ ! -f "${qt_deb_path}" ] || [ "${FORCE_REBUILD_QT}" = "true" ]; then
(
# HACK: For now on ubuntu 24.04 there is no python3.10 package
# So create a PyEnv environment to install the required packages
if cat /etc/os-release | grep -Eq "24.04"; then
apt-get install git gcc make python3-pip libssl-dev curl libreadline-dev -y
curl https://pyenv.run | bash
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
pyenv install 3.10.0
pyenv local 3.10.0
python -m pip install html5lib
python -m pip install six
fi
flock 9 # block until the lock file is gone
test -f "${qt_deb_path}" && exit 0 # check again
# Build and install the correct version of FFmpeg.
/opt/install-ffmpeg-for-qt.sh
# Build Qt.
mkdir /opt/libqt-jami-build
cd /opt/libqt-jami-build

View File

@ -1,9 +1,6 @@
#!/usr/bin/env bash
#
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
#
# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# 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
@ -41,9 +38,9 @@ QT_JAMI_PREFIX="/usr/lib64/qt-jami"
PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
LD_LIBRARY_PATH="${QT_JAMI_PREFIX}/lib:${LD_LIBRARY_PATH}"
PKG_CONFIG_PATH="${QT_JAMI_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}:${CMAKE_PREFIX_PATH}"
QT_MAJOR=6
QT_MINOR=6
QT_MINOR=8
QT_PATCH=3
QT_RELEASE_PATCH=0
@ -53,7 +50,7 @@ QT_MAJOR_MINOR_PATCH=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
QT_TARBALL_URL=https://download.qt.io/archive/qt/$QT_MAJOR_MINOR/\
$QT_MAJOR_MINOR_PATCH/single/qt-everywhere-src-$QT_MAJOR_MINOR_PATCH.tar.xz
QT_TARBALL_SHA256="69d0348fef415da98aa890a34651e9cfb232f1bffcee289b7b4e21386bf36104"
QT_TARBALL_SHA256="cdd3a69967208276bb01af7ace7dba0ba53e679f886a4cbe624225c60fb73f2c"
QT_TARBALL_FILE_NAME=$(basename "$QT_TARBALL_URL")
CACHED_QT_TARBALL=$TARBALLS/$QT_TARBALL_FILE_NAME
@ -70,6 +67,10 @@ if [ ! -f "${RPM_PATH}" ]; then
flock 9 # block until the lock is available
test -f "$RPM_PATH" && exit 0 # check again
# Build and install the correct version of FFmpeg.
/opt/install-ffmpeg-for-qt.sh
# Build Qt.
mkdir /opt/qt-jami-build
cd /opt/qt-jami-build
tar xf "/src/$RELEASE_TARBALL_FILENAME" \
@ -104,18 +105,14 @@ if [ ! -f "${RPM_PATH}" ]; then
# Cache the built Qt RPM package.
if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el8.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_36" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc36.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_37" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc37.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_38" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc38.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_39" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc39.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_40" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc40.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_41" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc41.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_42" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc42.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "alma_9" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el9.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "alma_10" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el10.x86_64.rpm "${RPM_PATH}"
else
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm "${RPM_PATH}"
fi
@ -139,7 +136,10 @@ rpmbuild --define "debug_package %{nil}" -ba jami-libclient.spec
rpmbuild --define "debug_package %{nil}" -ba jami-qt.spec
# Build the Qt client.
rpmbuild --define "debug_package %{nil}" -ba jami.spec
rpmbuild --define "debug_package %{nil}" \
--define "BUILD_VERSION ${BUILD_VERSION}" \
--define "QT_JAMI_PREFIX ${QT_JAMI_PREFIX}" \
-ba jami.spec
# Move the built packages to the output directory.
mv /root/rpmbuild/RPMS/*/* /opt/output

View File

@ -1,8 +1,6 @@
#!/usr/bin/env bash
#
# Copyright (C) 2020-2024 Savoir-faire Linux Inc.
#
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Copyright (C) 2020-2025 Savoir-faire Linux Inc.
#
# 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
@ -31,6 +29,9 @@ cp -r extras/packaging/gnu-linux/rules/snap/${SNAP_PKG_NAME}/snapcraft.yaml .
# set the version and tarball filename
sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" snapcraft.yaml
# set the build version of the app
sed -i "s/BUILD_VERSION_PLACEHOLDER/${BUILD_VERSION}/g" snapcraft.yaml
snapcraft # requires snapcraft >= 4.8
# move the built snap to output

View File

@ -1,9 +1,6 @@
#!/usr/bin/env bash
#
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
#
# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
# Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# 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
@ -83,9 +80,6 @@ EOF
find ./extras/packaging/gnu-linux/packages -type f -name '*.ddeb' -print0 | xargs -0 -I{} mv {} {}.deb
for package in ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.deb; do
echo "## signing: ${package} ##"
dpkg-sig -k ${KEYID} --sign builder ${package}
echo "## including ${package} ##"
package_name=$(dpkg -I ${package} | grep -m 1 Package: | awk '{print $2}')
package_arch=$(dpkg -I ${package} | grep -m 1 Architecture: | awk '{print $2}')

View File

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Building Qt Multimedia requires the FFmpeg headers and libraries to be installed:
# https://doc.qt.io/qt-6.8/qtmultimedia-building-from-source.html
# For Qt 6.8.3, the recommended FFmpeg version is 7.1:
# https://doc.qt.io/qt-6.8/qtmultimedia-index.html#target-platform-and-backend-notes
# This script is based on the instructions at:
# https://doc.qt.io/qt-6.8/qtmultimedia-building-ffmpeg-linux.html
set -e
INSTALL_DIR=/opt/libqt-jami-ffmpeg
cd /tmp
git clone --branch n11.1.5.2 https://github.com/FFmpeg/nv-codec-headers.git nv-codec-headers
cd nv-codec-headers
make -j install
cd /tmp
git clone --branch n7.1.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
mkdir build
cd build
../configure --prefix=${INSTALL_DIR} --disable-doc --enable-network --enable-shared
make -j install
cd /tmp
rm -rf nv-codec-headers ffmpeg

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
# The purpose of this script is to build PipeWire from source in a snap based on core20 / Ubuntu 20.04
# The purpose of this script is to build PipeWire from source in a snap based on core22 / Ubuntu 22.04
# It must be called in the "override-build" section of the relevant part in snapcraft.yaml
set -e
@ -8,31 +8,23 @@ set -e
OLD_WD=$(pwd)
cd /tmp
# Install PipeWire's build dependencies
apt-get install --yes gcc git libasound2-dev libdbus-1-dev libglib2.0-dev ninja-build pkg-config
# Get a version of Meson that's recent enough to build PipeWire 1.0.5 (the one available via apt is too old)
wget -q https://github.com/mesonbuild/meson/releases/download/0.61.1/meson-0.61.1.tar.gz
echo "feb2cefb325b437dbf36146df7c6b87688ddff0b0205caa31dc64055c6da410c meson-0.61.1.tar.gz" | sha256sum --check
tar xzf meson-0.61.1.tar.gz
# Build PipeWire 1.0.5 and install it in the /usr directory of the build environment
wget -q https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/1.0.5/pipewire-1.0.5.tar.gz
echo "c5a5de26d684a1a84060ad7b6131654fb2835e03fccad85059be92f8e3ffe993 pipewire-1.0.5.tar.gz" | sha256sum --check
tar xzf pipewire-1.0.5.tar.gz
cd pipewire-1.0.5
../meson-0.61.1/meson.py setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
../meson-0.61.1/meson.py compile -C builddir
../meson-0.61.1/meson.py install -C builddir
meson setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
meson compile -C builddir
meson install -C builddir
# The files installed by the previous command are only for the "Build" step of the snap
# creation process (https://snapcraft.io/docs/how-snapcraft-builds). In order to ensure
# that PipeWire is installed in the final snap archive, we also need to copy all the
# required files under the $SNAPCRAFT_PART_INSTALL directory.
../meson-0.61.1/meson.py configure builddir -Dprefix=$SNAPCRAFT_PART_INSTALL/usr/
../meson-0.61.1/meson.py install -C builddir
# required files under the $CRAFT_PART_INSTALL directory.
meson configure builddir -Dprefix=$CRAFT_PART_INSTALL/usr/
meson install -C builddir
# Cleanup
cd /tmp
rm -rf meson-0.61.1 meson-0.61.1.tar.gz pipewire-1.0.5 pipewire-1.0.5.tar.gz
rm -rf pipewire-1.0.5 pipewire-1.0.5.tar.gz
cd $OLD_WD

View File

@ -1,8 +1,6 @@
#!/usr/bin/env bash
#
# Copyright (C) 2021-2024 Savoir-faire Linux Inc.
#
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Copyright (C) 2021-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -1,8 +1,6 @@
#!/bin/sh
#
# Copyright (C) 2024 Savoir-faire Linux Inc.
#
# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
# Copyright (C) 2024-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -34,7 +34,7 @@ cat << EOFILE > ${REPO_FOLDER}/${SPARKLE_FILE}
<pubDate>$DATE_RFC2822</pubDate>
<sparkle:version>${BUILD}</sparkle:version>
<sparkle:shortVersionString>${VERSION}</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
<sparkle:minimumSystemVersion>12.0</sparkle:minimumSystemVersion>
<enclosure url="${REPO_URL}/$(basename ${PACKAGE})" type="application/octet-stream" $(./sign_update ${PACKAGE}) />
</item>
$(echo -e "${ITEMS}")

View File

@ -1,25 +0,0 @@
From 161d28abb6784115ad71fcb6977e112e9d5756d4 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Tue, 23 Jan 2024 15:38:34 -0500
Subject: [PATCH] fix-fedora-fc-build
---
CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0fb89c8..3a6ad6d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -65,7 +65,7 @@ if(NOT TARGET qmsetup::library)
)
# Find package again
- find_package(qmsetup REQUIRED PATHS ${_package_path})
+ find_package(qmsetup REQUIRED PATHS ${_package_path} ${qmsetup_cmake_path})
# Update import path
set(qmsetup_DIR ${_package_path} CACHE PATH "" FORCE)
--
2.34.1

View File

@ -0,0 +1,32 @@
From 56830725e641705e0113a068ee58df7029202439 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 2 Apr 2025 20:54:02 -0400
Subject: [PATCH] fix qm_install_package function
---
cmake/modules/private/InstallPackage.cmake | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/qmsetup/cmake/modules/private/InstallPackage.cmake b/qmsetup/cmake/modules/private/InstallPackage.cmake
index 70174bc..f067de5 100644
--- a/qmsetup/cmake/modules/private/InstallPackage.cmake
+++ b/qmsetup/cmake/modules/private/InstallPackage.cmake
@@ -101,6 +101,7 @@ function(qm_install_package _name)
execute_process(
COMMAND ${CMAKE_COMMAND} -S ${_src_dir} -B ${_build_dir}
${_extra_args} ${_build_type}
+ "-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}"
"-DCMAKE_INSTALL_PREFIX=${_install_dir}" ${FUNC_CONFIGURE_ARGS}
OUTPUT_FILE ${_log_file}
ERROR_FILE ${_log_file}
@@ -150,4 +151,4 @@ function(qm_install_package _name)
if(FUNC_RESULT_PATH)
set(${FUNC_RESULT_PATH} ${_install_cmake_dir} PARENT_SCOPE)
endif()
-endfunction()
\ No newline at end of file
+endfunction()
--
2.34.1

View File

@ -9,14 +9,15 @@ and package the project for Windows.
usage: build.py [-q] [-h] [-a ARCH] [-c CONFIG] [-t] [-i] [-v] {pack} ...
optional arguments:
-q, --qt PATH Sets the Qt installation path
-a ARCH, --arch ARCH Sets the build architecture
-q, --qt PATH Sets the Qt installation path
-a ARCH, --arch ARCH Sets the build architecture
-c CONFIG, --config CONFIG
Sets the build configuration type
-t, --tests Build and run tests
-i, --init Initialize submodules
-v, --version Show the version number and exit
-s, --skip-build Only do packaging or run tests, skip building
Sets the build configuration type
-t, --tests Build and run tests
-i, --init Initialize submodules
-v, --version Show the version number and exit
-s, --skip-build Only do packaging or run tests, skip building
--enable-crash-reports Enable crash reports
positional arguments:
{pack}
@ -210,6 +211,8 @@ def init_submodules():
"3rdparty/SortFilterProxyModel",
"3rdparty/md4c",
"3rdparty/tidy-html5",
"3rdparty/zxing-cpp",
"3rdparty/hunspell",
]
if execute_cmd(["git", "submodule", "update", "--init" ] + submodules,
False):
@ -260,7 +263,7 @@ def cmake_build(config_str, env_vars, cmake_build_dir):
return True
def build(config_str, qt_dir, tests):
def build(config_str, qt_dir, tests, build_version, enable_crash_reports, crash_report_url=None):
"""Use cmake to build the project."""
print("Building with Qt at " + qt_dir)
@ -284,6 +287,16 @@ def build(config_str, qt_dir, tests):
"-DBETA=" + str((0, 1)[config_str == "Beta"]),
]
if enable_crash_reports:
cmake_options.append("-DENABLE_CRASHREPORTS=ON")
if crash_report_url:
cmake_options.append(f"-DCRASH_REPORT_URL={crash_report_url}")
else:
cmake_options.append("-DENABLE_CRASHREPORTS=OFF")
if build_version:
cmake_options.append("-DBUILD_VERSION=" + build_version)
# Make sure the build directory exists.
if not os.path.exists(build_dir):
os.makedirs(build_dir)
@ -297,11 +310,11 @@ def build(config_str, qt_dir, tests):
sys.exit(1)
def deploy_runtimes(config_str, qt_dir):
def deploy_runtimes(qt_dir):
"""Deploy the dependencies to the runtime directory."""
print("Deploying runtime dependencies")
runtime_dir = os.path.join(repo_root_dir, "x64", config_str)
runtime_dir = os.path.join(repo_root_dir, "x64", "Release")
stamp_file = os.path.join(runtime_dir, ".deploy.stamp")
if os.path.exists(stamp_file):
return
@ -314,8 +327,8 @@ def deploy_runtimes(config_str, qt_dir):
shutil.copy(os.path.join(rel_path, src), runtime_dir)
print("Copying libjami dependencies")
install_file("contrib/build/openssl/libcrypto-1_1-x64.dll", daemon_dir)
install_file("contrib/build/openssl/libssl-1_1-x64.dll", daemon_dir)
install_file("contrib/build/openssl/libcrypto-3-x64.dll", daemon_dir)
install_file("contrib/build/openssl/libssl-3-x64.dll", daemon_dir)
# Ringtone files (ul,ogg,wav,opus files in the daemon ringtone dir).
print("Copying ringtones")
@ -341,8 +354,8 @@ def deploy_runtimes(config_str, qt_dir):
install_file("resources/images/jami.ico", repo_root_dir)
# windeployqt
print("Running windeployqt (this may take a while)...")
win_deploy_qt = os.path.join(qt_dir, "bin", "windeployqt.exe")
print(f"Running windeployqt ({win_deploy_qt}) (this may take a while)...")
qml_src_dir = os.path.join(repo_root_dir, "src", "app")
installation_dir = get_vs_prop("installationPath")
if not installation_dir:
@ -460,6 +473,8 @@ def parse_args():
help='Sets the Qt root path')
parser.add_argument(
"-a", "--arch", default="x64", help="Sets the build architecture")
parser.add_argument(
"--build-version", help="Sets the build version string used for defining app build version")
parser.add_argument(
"-t", "--tests", action="store_true", help="Build and run tests")
parser.add_argument(
@ -471,17 +486,24 @@ def parse_args():
parser.add_argument(
"-i", "--init", action="store_true", help="Initialize submodules")
parser.add_argument(
'-sd',
'--skip-deploy',
action='store_true',
default=False,
help='Force skip deployment of runtime files needed for packaging')
parser.add_argument(
"-sb",
"--skip-build",
action="store_true",
default=False,
help="Only do packaging or run tests, skip build step")
parser.add_argument(
'--enable-crash-reports',
action='store_true',
default=False,
help='Enable crash reporting')
parser.add_argument(
'--crash-report-url',
help='Override the crash report submission URL',
default=None)
pack_arg_parser = subparsers.add_parser("pack")
pack_group = pack_arg_parser.add_mutually_exclusive_group(required=True)
@ -534,9 +556,12 @@ def main():
def do_build(do_tests):
if not parsed_args.skip_build:
build(config_str, parsed_args.qt, do_tests)
build(config_str, parsed_args.qt, do_tests,
parsed_args.build_version,
parsed_args.enable_crash_reports,
parsed_args.crash_report_url)
if not parsed_args.skip_deploy:
deploy_runtimes(config_str, parsed_args.qt)
deploy_runtimes(parsed_args.qt)
if parsed_args.subcommand == "pack":
do_build(False)

View File

@ -52,7 +52,7 @@ for ARCH in "${ARCHS[@]}"; do
# force to build every contrib
for dir in "$DAEMON"/contrib/src/*/; do
PKG=$(basename -- "$dir")
if [ "$PKG" != "sdbus-cpp" ] && [ "$PKG" != "natpmp" ] &&
if [ "$PKG" != "sdbus-cpp" ] && [ "$PKG" != "freetype" ] &&
[ "$PKG" != "portaudio" ] && [ "$PKG" != "pthreads" ] &&
[ "$PKG" != "lttng-ust" ] && [ "$PKG" != "openssl" ] &&
[ "$PKG" != "media-sdk" ] && [ "$PKG" != "jack" ] &&
@ -99,6 +99,12 @@ for ARCH in "${ARCHS[@]}"; do
echo "$ARCH"
cd "$DAEMON"
HOST="${ARCH}-apple-darwin"
SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
CC="xcrun -sdk macosx clang"
CXX="xcrun -sdk macosx clang++"
CFLAGS="-arch $ARCH -isysroot $SDKROOT"
CXXFLAGS="-std=c++17 $CFLAGS"
CONFIGURE_FLAGS=" --without-dbus --host=${HOST} -with-contrib=$DAEMON/contrib/${ARCH}-apple-darwin${OS_VER} --prefix=${INSTALL}/daemon/$ARCH"
if [ "${debug}" = "true" ]; then
@ -113,7 +119,11 @@ for ARCH in "${ARCHS[@]}"; do
mkdir -p "build-macos-${ARCH}"
cd "build-macos-${ARCH}"
"$DAEMON"/configure $CONFIGURE_FLAGS ARCH="$ARCH" || exit 1
"$DAEMON"/configure $CONFIGURE_FLAGS ARCH="$ARCH" \
CC="$CC $CFLAGS" \
CXX="$CXX $CXXFLAGS" \
CFLAGS="$CFLAGS" \
CXXFLAGS="$CXXFLAGS" || exit 1
echo "$CONFIGURE_FLAGS"

View File

@ -1,61 +1,89 @@
#!/usr/bin/env bash
set -e
# Flags:
# -a: architecture to build. Accepted values arm64, x86_64, unified
# Usage:
# ./build_qrencode.sh -a <architecture>
# Accepted architectures: arm64, x86_64, unified
# If no architecture is specified, the script builds for the host architecture.
# Initialize variables
arch=''
while getopts "a:" OPT; do
case "$OPT" in
a)
arch="${OPTARG}"
;;
\?)
exit 1
;;
a)
arch="${OPTARG}"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
echo "Usage: $0 [-a architecture]"
echo "Accepted architectures: arm64, x86_64, unified"
exit 1
;;
esac
done
# Determine architectures to build
if [[ "$arch" == 'unified' ]]; then
ARCHS=("arm64" "x86_64")
elif [[ "$arch" == '' ]]; then
ARCHS=("arm64")
# Detect host architecture
HOST_ARCH=$(uname -m)
case "$HOST_ARCH" in
x86_64|arm64)
ARCHS=("$HOST_ARCH")
;;
*)
echo "Unsupported host architecture: $HOST_ARCH"
echo "Supported architectures are: arm64, x86_64, unified"
exit 1
;;
esac
else
ARCHS=("$arch")
# Validate specified architecture
case "$arch" in
x86_64|arm64)
ARCHS=("$arch")
;;
*)
echo "Invalid architecture specified: $arch"
echo "Accepted architectures are: arm64, x86_64, unified"
exit 1
;;
esac
fi
TOP="$(pwd)"
QRENCODEDIR="${TOP}/3rdparty/libqrencode"
if [ -z "$NPROC" ]; then
NPROC=$(sysctl -n hw.ncpu || echo -n 1)
fi
BUILDDIR="${QRENCODEDIR}/build-libqrencode"
LIBDIR="${QRENCODEDIR}/lib"
INCLUDEDIR="${QRENCODEDIR}/include"
for ARCH in "${ARCHS[@]}"; do
cd "$QRENCODEDIR" || exit 1
BUILDDIR="$ARCH-libqrencode"
mkdir "$BUILDDIR"
make clean
./autogen.sh
./configure --host="$ARCH" --without-png --prefix="${QRENCODEDIR}/${BUILDDIR}" CFLAGS=" -arch $ARCH $CFLAGS"
make -j"$NPROC"
make install
done
mkdir -p "$QRENCODEDIR"/lib
mkdir -p "$QRENCODEDIR"/include
# Clean up build directory
echo "Preparing clean build directory"
rm -rf "$BUILDDIR"
mkdir -p "$BUILDDIR"
if ((${#ARCHS[@]} == "2")); then
echo "Making fat lib for ${ARCHS[0]} and ${ARCHS[1]}"
LIBFILES="$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/*.a"
for f in $LIBFILES; do
libFile=${f##*/}
echo "$libFile"
lipo -create "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/$libFile" \
"$QRENCODEDIR/${ARCHS[1]}-libqrencode/lib/$libFile" \
-output "${QRENCODEDIR}/lib/$libFile"
done
else
echo "No need for fat lib"
rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/"*.a "${QRENCODEDIR}/lib/"
fi
# Clean output directories
rm -rf "$LIBDIR" "$INCLUDEDIR"
mkdir -p "$LIBDIR"
mkdir -p "$INCLUDEDIR"
rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/include/"* "${QRENCODEDIR}/include/"
# Convert architectures to semicolon-separated format for cmake
ARCHS_SEMICOLON_SEPARATED=$(IFS=";"; echo "${ARCHS[*]}")
echo "Configuring CMake for architectures: ${ARCHS[*]}"
cd "$BUILDDIR"
cmake "$QRENCODEDIR" \
-DCMAKE_OSX_ARCHITECTURES="$ARCHS_SEMICOLON_SEPARATED" \
-DCMAKE_INSTALL_PREFIX="$QRENCODEDIR" \
-DWITHOUT_PNG=ON \
-DBUILD_SHARED_LIBS=OFF \
-G "Xcode"
echo "Building libqrencode for architectures: ${ARCHS[*]}"
cmake --build . --config Release
echo "Installing libqrencode to $LIBDIR and $INCLUDEDIR"
cmake --install . --config Release
echo "Build and installation completed successfully, with outputs in $LIBDIR and $INCLUDEDIR."

View File

@ -139,14 +139,14 @@ def main():
if args.type in ["cpp", "both"]:
if command_exists("clang-format-" + CFVERSION):
CLANGFORMAT = "clang-format-" + CFVERSION
CLANGFORMAT = "clang-format-" + CFVERSION
elif command_exists("clang-format"):
CLANGFORMAT = "clang-format"
CLANGFORMAT = "clang-format"
if CLANGFORMAT is not None:
print("Using source formatter: " + CLANGFORMAT)
else:
print("clang-format not found. can't format source files")
print("clang-format not found, unable to format source files")
if args.qt is not None and args.type in ["qml", "both"]:
global QMLFORMAT # pylint: disable=global-statement
@ -154,7 +154,7 @@ def main():
if QMLFORMAT is not None:
print("Using qmlformatter: " + QMLFORMAT)
else:
print("qmlformat not found, can't format QML files")
print("qmlformat not found, unable to format QML files")
if args.install:
if CLANGFORMAT is not None or QMLFORMAT is not None:
@ -171,10 +171,10 @@ def main():
exit_if_no_files()
else:
if src_files and args.type in ["cpp", "both"] and CLANGFORMAT:
print("Formatting source files...")
print("Formatting source files")
clang_format_files(src_files)
if qml_files and args.type in ["qml", "both"] and QMLFORMAT:
print("Formatting QML files...")
print("Formatting QML files")
qml_format_files(qml_files)

View File

@ -1,92 +1,92 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2022-2024 Savoir-faire Linux Inc.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
# USA.
"""
Generate qrc file for qml and related code files recursively within the source
directory.
"""
import os
# These paths should be relative to the working directory of the
# script as set in the project CMakeLists, which should in turn be
# where the resources.qrc will be located (currently 'src/app').
app_src_dir = os.path.join('..', '..', 'src', 'app')
resfile = os.path.join('qml.qrc')
def path_contains_dir(filepath, dir_str):
""" Return True if the given filepath contains the given directory. """
# Split the filepath into its components
path_components = os.path.normpath(filepath).split(os.sep)
# Return True if the given directory is in the path
return dir_str in path_components
def posix_path(path):
"""
Force the use of POSIX path separators for the resource prefixes
and paths (useful only if versioning the qml.qrc file).
"""
return path.replace(os.sep, '/')
def gen_qml_qrc(with_webengine):
""" Generate the qml.qrc file. """
print("Generating qml.qrc file ...")
with open(resfile, 'w', encoding='utf-8') as qrc:
qrc.write('<RCC>\n')
for root, _, files in os.walk(app_src_dir):
# Skip the nowebengine directory if we can use webengine
if with_webengine and path_contains_dir(root, 'nowebengine'):
continue
# Skip the webengine directory if we can't use webengine
if not with_webengine and path_contains_dir(root, 'webengine'):
continue
filtered = [k for k in files if k.endswith('.qml') or
k.endswith('.js') or k.endswith('.html') or
k.endswith('.css') or k.endswith('.conf') or
k == 'qmldir']
# if there are no files of interest in this directory, skip it
if not filtered:
continue
# For now, get the relative resource prefix for this directory,
# remove the leading slash, and add it as a comment to the line.
# Ideally, we should use the actual resource prefix instead of /,
# but this will require some refactoring of the QML code.
prefix = root.split(app_src_dir)[-1][1:]
qrc.write(
f'\t<qresource prefix="/"> <!--{posix_path(prefix)}-->\n')
for file in filtered:
relpath = os.path.relpath(
os.path.join(root, file), app_src_dir)
qrc.write(f'\t\t<file>{posix_path(relpath)}</file>\n')
qrc.write('\t</qresource>\n')
qrc.write('</RCC>')
if __name__ == '__main__':
# We can't use webengine if we're building for macOS app store
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--with-webengine', action='store_true',
default=False, help='Include webengine resources')
args = parser.parse_args()
gen_qml_qrc(args.with_webengine)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2022-2025 Savoir-faire Linux Inc.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
# USA.
"""
Generate qrc file for qml and related code files recursively within the source
directory.
"""
import os
# These paths should be relative to the working directory of the
# script as set in the project CMakeLists, which should in turn be
# where the resources.qrc will be located (currently 'src/app').
app_src_dir = os.path.join('..', '..', 'src', 'app')
resfile = os.path.join('qml.qrc')
def path_contains_dir(filepath, dir_str):
""" Return True if the given filepath contains the given directory. """
# Split the filepath into its components
path_components = os.path.normpath(filepath).split(os.sep)
# Return True if the given directory is in the path
return dir_str in path_components
def posix_path(path):
"""
Force the use of POSIX path separators for the resource prefixes
and paths (useful only if versioning the qml.qrc file).
"""
return path.replace(os.sep, '/')
def gen_qml_qrc(with_webengine):
""" Generate the qml.qrc file. """
print("Generating qml.qrc file")
with open(resfile, 'w', encoding='utf-8') as qrc:
qrc.write('<RCC>\n')
for root, _, files in os.walk(app_src_dir):
# Skip the nowebengine directory if we can use WebEngine
if with_webengine and path_contains_dir(root, 'nowebengine'):
continue
# Skip the webengine directory if WebEngine is unable to be used
if not with_webengine and path_contains_dir(root, 'webengine'):
continue
filtered = [k for k in files if k.endswith('.qml') or
k.endswith('.js') or k.endswith('.html') or
k.endswith('.css') or k.endswith('.conf') or
k == 'qmldir']
# if there are no files of interest in this directory, skip it
if not filtered:
continue
# For now, get the relative resource prefix for this directory,
# remove the leading slash, and add it as a comment to the line.
# Ideally, we should use the actual resource prefix instead of /,
# but this will require some refactoring of the QML code.
prefix = root.split(app_src_dir)[-1][1:]
qrc.write(
f'\t<qresource prefix="/"> <!--{posix_path(prefix)}-->\n')
for file in filtered:
relpath = os.path.relpath(
os.path.join(root, file), app_src_dir)
qrc.write(f'\t\t<file>{posix_path(relpath)}</file>\n')
qrc.write('\t</qresource>\n')
qrc.write('</RCC>')
if __name__ == '__main__':
# WebEngine is unable to be used if building for macOS App Store
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--with-webengine', action='store_true',
default=False, help='Include WebEngine resources')
args = parser.parse_args()
gen_qml_qrc(args.with_webengine)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2021-2024 Savoir-faire Linux Inc.
# Copyright (C) 2021-2025 Savoir-faire Linux Inc.
#
# 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
@ -64,7 +64,7 @@ def gen_resources_qrc(with_webengine):
qrc.write('<RCC>\n')
qml.write('pragma Singleton\nimport QtQuick\nQtObject {\n')
for root, _, files in os.walk(resdir):
# Skip the webengine directory if we can't use webengine
# Skip the WebEngine directory if WebEngine is unable to used
if not with_webengine and path_contains_dir(root, 'webengine'):
continue
prefix = root.rsplit(os.sep, 1)[-1]
@ -90,10 +90,10 @@ def gen_resources_qrc(with_webengine):
if __name__ == '__main__':
# We can't use webengine if we're building for macOS app store
# WebEngine is unable to be used if building for macOS App Store
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--with-webengine', action='store_true',
default=False, help='Include webengine resources')
default=False, help='Include WebEngine resources')
args = parser.parse_args()
gen_resources_qrc(args.with_webengine)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2019-2024 Savoir-faire Linux Inc.
# Copyright (C) 2019-2025 Savoir-faire Linux Inc.
#
# 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

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# install.sh --- build and install Jami daemon and client
# Copyright (C) 2016-2024 Savoir-faire Linux Inc.
# Copyright (C) 2016-2025 Savoir-faire Linux Inc.
#
# 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
@ -31,6 +31,8 @@ export OSTYPE
# -a: arch to build
# -A: enable AddressSanitizer
# -D: extra CMake flags for the client
# -C: enable crash reporting
# -i: ignore system libraries and build everything regardless of system detection
set -ex
@ -49,8 +51,10 @@ asan=
extra_cmake_flags=''
arch=''
enable_testing=false
enable_crashreports=false
ignore_system_libs=false
while getopts gsc:dQ:P:p:uWwa:AtD: OPT; do
while getopts gsc:dQ:P:p:uWwa:AtD:Ci OPT; do
case "$OPT" in
g)
global='true'
@ -91,6 +95,12 @@ while getopts gsc:dQ:P:p:uWwa:AtD: OPT; do
D)
extra_cmake_flags="${OPTARG}"
;;
C)
enable_crashreports='true'
;;
i)
ignore_system_libs='true'
;;
\?)
exit 1
;;
@ -119,79 +129,81 @@ else
BUILD_DIR="build"
fi
# jamid
DAEMON="${TOP}/daemon"
if [[ "$OSTYPE" == "darwin"* ]]; then
sh "${TOP}"/extras/scripts/build_daemon_macos.sh -a "$arch" -d "$debug"
else
cd "$DAEMON"
# Build the contribs.
mkdir -p contrib/native
(
cd contrib/native
../bootstrap ${prefix:+"--prefix=$prefix"} ${asan:+"--enable-asan"}
make -j"${proc}"
)
if [[ "${enable_libwrap}" != "true" ]]; then
# Disable shared if requested
if [[ "$OSTYPE" != "darwin"* ]]; then
CONFIGURE_FLAGS+=" --disable-shared"
fi
else
CONFIGURE_FLAGS+="--without-dbus"
fi
BUILD_TYPE="Release"
if [ "${debug}" = "true" ]; then
BUILD_TYPE="Debug"
CONFIGURE_FLAGS+=" --enable-debug"
fi
if [ "${asan}" = "true" ]; then
CONFIGURE_FLAGS+=" --enable-asan"
fi
# Build the daemon itself.
test -f configure || ./autogen.sh
if [ "${global}" = "true" ]; then
./configure ${CONFIGURE_FLAGS} ${prefix:+"--prefix=$prefix"}
else
./configure ${CONFIGURE_FLAGS} --prefix="${INSTALL_DIR}"
fi
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
fi
# jamid
DAEMON="${TOP}/daemon"
cd "$DAEMON"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
daemon_cmake_flags=(-DCMAKE_BUILD_TYPE="${BUILD_TYPE}")
if [ "${asan}" = "true" ]; then
daemon_cmake_flags+=(-DENABLE_ASAN=On)
fi
if [ "${ignore_system_libs}" = "true" ]; then
daemon_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_libwrap}" = "false" ]; then
daemon_cmake_flags+=(-DJAMI_DBUS=On)
else
daemon_cmake_flags+=(-DJAMI_DBUS=Off)
fi
if [ "${enable_testing}" = "true" ]; then
daemon_cmake_flags+=(-DBUILD_TESTING=On)
else
daemon_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${global}" = "true" ]; then
daemon_cmake_flags+=(${prefix:+"-DCMAKE_INSTALL_PREFIX=$prefix"})
else
daemon_cmake_flags+=(-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}")
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
daemon_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
fi
cmake .. "${daemon_cmake_flags[@]}"
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
fi
# fi
# client
cd "${TOP}"
mkdir -p "${BUILD_DIR}"
@ -212,14 +224,17 @@ else
client_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${ignore_system_libs}" = "true" ]; then
client_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_crashreports}" = "true" ]; then
client_cmake_flags+=(-DENABLE_CRASHREPORTS=ON)
else
client_cmake_flags+=(-DENABLE_CRASHREPORTS=OFF)
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
client_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
# build qrencode
(

View File

@ -1,10 +1,7 @@
#!/usr/bin/python
##
## Copyright (C) 2016-2024 Savoir-faire Linux Inc.
##
## Author: Edric Milaret <edric.ladent-milaret@savoirfairelinux.com>
## Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
## Copyright (C) 2016-2025 Savoir-faire Linux Inc.
##
## 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
@ -26,9 +23,9 @@ import shutil
print("== Updating from sources")
if os.system("lupdate jami.pro -no-obsolete"):
print("trying with 'lupdate-qt5'")
print("Attempting with 'lupdate-qt5'")
if os.system("lupdate-qt5 jami.pro -no-obsolete"):
raise RuntimeError("unable to find any suitable lupdate Qt tool on this system. Stopping")
raise RuntimeError("Unable to find any suitable lupdate Qt tool on this system. Stopping")
print("== Pushing sources")
os.system("tx push -s")

View File

@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<string>12.0</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>LSApplicationCategoryType</key>

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M42 13.85V39q0 1.2-.9 2.1-.9.9-2.1.9H9q-1.2 0-2.1-.9Q6 40.2 6 39V9q0-1.2.9-2.1Q7.8 6 9 6h25.15Zm-3 1.35L32.8 9H9v30h30ZM24 35.75q2.15 0 3.675-1.525T29.2 30.55q0-2.15-1.525-3.675T24 25.35q-2.15 0-3.675 1.525T18.8 30.55q0 2.15 1.525 3.675T24 35.75ZM11.65 18.8h17.9v-7.15h-17.9ZM9 15.2V39 9Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#e8eaed"><path d="M480-313 287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193ZM220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Z"/></svg>

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 268 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<path d="M17.1,15.7c-0.8,0-1.5,0.3-2.1,0.8l-5.3-3.3C9.9,12.8,10,12.4,10,12c0-0.4-0.1-0.8-0.3-1.2l5.3-3.3c0.6,0.5,1.3,0.8,2.1,0.8
c1.7,0,3.1-1.4,3.1-3.1S18.9,2,17.1,2C15.4,2,14,3.4,14,5.1c0,0.4,0.1,0.8,0.3,1.2L8.9,9.6C8.3,9.1,7.6,8.9,6.9,8.9
c-1.7,0-3.1,1.4-3.1,3.1s1.4,3.1,3.1,3.1c0.8,0,1.5-0.3,2.1-0.8l5.3,3.3C14.1,18,14,18.4,14,18.9c0,1.7,1.4,3.1,3.1,3.1
c1.7,0,3.1-1.4,3.1-3.1S18.9,15.7,17.1,15.7z M17.1,20.6c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8c1,0,1.8,0.8,1.8,1.8
S18.1,20.6,17.1,20.6z M17.1,3.4c1,0,1.8,0.8,1.8,1.8s-0.8,1.8-1.8,1.8c-1,0-1.8-0.8-1.8-1.8S16.2,3.4,17.1,3.4z M6.9,13.8
c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8S8.6,11,8.6,12S7.8,13.8,6.9,13.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1019 B

Some files were not shown because too many files have changed in this diff Show More