Kotatogram: add recipe

This commit is contained in:
Gerasim Troeglazov
2021-11-10 20:10:33 +10:00
parent 6c1a240620
commit 862593c122
9 changed files with 2189 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
resource app_flags B_MULTIPLE_LAUNCH;
resource app_version {
major = @MAJOR@,
middle = @MIDDLE@,
minor = @MINOR@,
variety = B_APPV_FINAL,
internal = 0,
short_info = "Kotatogram",
long_info = "@LONG_INFO@"
};
resource app_signature "@APP_SIGNATURE@";
resource("QT:QPA_FLAGS") "Q_KILL_ON_EXIT|Q_REF_TO_ARGV";
resource vector_icon {
$"6E636966040200060239C33A3D8036BD9F1D39E4714ACB9348D35600C8B3FFFF"
$"5A478B02000602B221D73BFF6EBC9FA0B2CC6A4A8C2B4A3DAB00FFFFFFFFD2BA"
$"FF050004016802000EBEC5B41FBEC5B41FC0A2B3F6C442B501C289B443C6EEB6"
$"21CA48BAFAC921B851CAEABC6DCB37BF98CB3EBE03CB42C13FCA2BC464CADAC2"
$"E4C94EC641C63DC907C7EFC7DFC518C9D1C274CAB8C3CDCA62C0CACB1EBD5DCA"
$"C9BF09CB26BB49CA58B7CEC7D4B95458B5D9C5FBB455C0BDB49AC36AB453C04E"
$"B446BF71B441BFE1B44CBE85B4A3BCB4B468BD99B527BAA7B7CBB74CB645B8C3"
$"B9AAB57BBEC5B41FBC2CB457BEC5B41F021AC07EBD1A4036C0B1BD7AC157BE0B"
$"C0F5BDD6C189BE27C1FBBE2FC1C2BE2EC287BE30C390BE8FC313BE4FC404BEC8"
$"C4CCBF6AC468BF1AC563BFE4C6C8C084C60EC04BC739C0A8C825C087C7B4C0AB"
$"C8ABC05EC99ABFCCC921C010C93FC07CC838C1A6C8C5C11CC77DC25DC587C30B"
$"C68EC2E8C489C324C29CC28DC382C2FFC1FFC243C0E8C176C177C1D8C07FC12E"
$"BF7EC108C002C0EFBEEEC124BE03C1D9BE7AC188BD43C266BB79C2FEBC68C2D8"
$"BB07C316BA1DC310BA91C312B93BC2FCB7B5C20DB865C299B708C183B607C018"
$"B679C0D5B5F8C000B5E0BFCCB5ECBFE6B691C032B821C0A0B74BC0B2B8C9C091"
$"B9F4BFEEB964C042BA9CBF89BBD2BE9BBB23BEF5BC59BE50BD8DBE2EBCF4BE2F"
$"BDCBBE2FBE3BBDFCBE08BE1EBE98BDBEBF09BCFDBED7BD5F4036403640364036"
$"050A030100023F4D7C0000000000003DC8104744E74A31B40A020100123F3BB4"
$"0000000000003F7D354490EE45036301178500040A000100023F3BB400000000"
$"00003F7D354490EE4503630A02010112402E08000000000000403200C3568A40"
$"996E01178422040A01010102402E08000000000000403200C3568A40996E"
};

View File

@@ -0,0 +1,326 @@
SUMMARY="Experimental Telegram Desktop fork"
DESCRIPTION="Kotatogram Desktop, being based on Telegram Desktop, has all \
its features, but it also has some more useful and cosmetic features."
HOMEPAGE="https://kotatogram.github.io/"
COPYRIGHT="2013-2021 Telegram
2021 Kotatogram Team"
LICENSE="GNU GPL v3"
REVISION="1"
SOURCE_URI="https://github.com/kotatogram/kotatogram-desktop/archive/refs/tags/k$portVersion.tar.gz"
CHECKSUM_SHA256="453b1fb7ed280fd4c05d922553343cef7f06b408bfd1cfb24e7e7d1faf5d82ba"
SOURCE_FILENAME="kotatogram-$portVersion.tar.gz"
SOURCE_DIR="kotatogram-desktop-k$portVersion"
#libtgvoip
srcGitRev_2="373e41668b265864f8976b83bb66dd6e9a583915"
SOURCE_URI_2="https://github.com/telegramdesktop/libtgvoip/archive/$srcGitRev_2.tar.gz"
CHECKSUM_SHA256_2="6bdf3af434004617018988decd47e0eeb839fbff26574f5adaf129410d5463ce"
SOURCE_FILENAME_2="libtgvoip-$srcGitRev_2.tar.gz"
SOURCE_DIR_2="libtgvoip-$srcGitRev_2"
#rlottie
srcGitRev_3="cbd43984ebdf783e94c8303c41385bf82aa36d5b"
SOURCE_URI_3="https://github.com/desktop-app/rlottie/archive/$srcGitRev_3.tar.gz"
CHECKSUM_SHA256_3="0946541630edf1b4172a59b1fb167468f52945a9c0d5076a698c916c8488e5bd"
SOURCE_FILENAME_3="rlottie-$srcGitRev_3.tar.gz"
SOURCE_DIR_3="rlottie-$srcGitRev_3"
#lib_crl
srcGitRev_4="ec103d6bccaa59b56537c8658c9e41415bb9ccaf"
SOURCE_URI_4="https://github.com/desktop-app/lib_crl/archive/$srcGitRev_4.tar.gz"
CHECKSUM_SHA256_4="64edbf9083c9ce7f6e98e741596e47dafc9dbcc818e45b3288186c9668fad153"
SOURCE_FILENAME_4="lib_crl-$srcGitRev_4.tar.gz"
SOURCE_DIR_4="lib_crl-$srcGitRev_4"
#lib_rpl
srcGitRev_5="df721be3fa14a27dfc230d2e3c42bb1a7c9d0617"
SOURCE_URI_5="https://github.com/desktop-app/lib_rpl/archive/$srcGitRev_5.tar.gz"
CHECKSUM_SHA256_5="574a680d488bb25402463c3ef5f263df76635a805cfb00da87b59ab8c39c198d"
SOURCE_FILENAME_5="lib_rpl-$srcGitRev_5.tar.gz"
SOURCE_DIR_5="lib_rpl-$srcGitRev_5"
#lib_base
srcGitRev_6="e5a3b470d6524cdeb3e2deb92f04b0d290ceec24"
SOURCE_URI_6="https://github.com/desktop-app/lib_base/archive/$srcGitRev_6.tar.gz"
CHECKSUM_SHA256_6="579b60f2ea4c0a6874b7d0c383ec46896e56e4dc2d44156a5eb7c75187924313"
SOURCE_FILENAME_6="lib_base-$srcGitRev_6.tar.gz"
SOURCE_DIR_6="lib_base-$srcGitRev_6"
#codegen
srcGitRev_7="15026c5b6c5be43edae5c7737dbc011eec486e16"
SOURCE_URI_7="https://github.com/desktop-app/codegen/archive/$srcGitRev_7.tar.gz"
CHECKSUM_SHA256_7="435f2d18ec0916028a1611b4439ad7f69f2df16c6ea0d5303ba84227d7ec0af2"
SOURCE_FILENAME_7="codegen-$srcGitRev_7.tar.gz"
SOURCE_DIR_7="codegen-$srcGitRev_7"
#lib_ui
srcGitRev_8="eb86d2dc51aedc0a53188f1f2beb932e19442f9b"
SOURCE_URI_8="https://github.com/kotatogram/lib_ui/archive/$srcGitRev_8.tar.gz"
CHECKSUM_SHA256_8="c4e9eab8d179ef5a9304e863877f5e5b35121826d1eff862a14777dec652eea9"
SOURCE_FILENAME_8="lib_ui-$srcGitRev_8.tar.gz"
SOURCE_DIR_8="lib_ui-$srcGitRev_8"
#lib_rlottie
srcGitRev_9="0671bf70547381effcf442ec9618e04502a8adbc"
SOURCE_URI_9="https://github.com/desktop-app/lib_rlottie/archive/$srcGitRev_9.tar.gz"
CHECKSUM_SHA256_9="28b68af080b03bf0dd66bab5f9dceb712e0b3203fd5ad7f8096050272234941b"
SOURCE_FILENAME_9="lib_rlottie-$srcGitRev_9.tar.gz"
SOURCE_DIR_9="lib_rlottie-$srcGitRev_9"
#lib_lottie
srcGitRev_10="6fe29a2dfe8904559d31e3c9df5d51e9ed123011"
SOURCE_URI_10="https://github.com/desktop-app/lib_lottie/archive/$srcGitRev_10.tar.gz"
CHECKSUM_SHA256_10="f14a09b03a7d2402a531790cab01b601c80e4ab3dd6ce6eafd4a03614e6114bb"
SOURCE_FILENAME_10="lib_lottie-$srcGitRev_10.tar.gz"
SOURCE_DIR_10="lib_lottie-$srcGitRev_10"
#lib_tl
srcGitRev_11="45faed44e7f4d11fec79b7a70e4a35dc91ef3fdb"
SOURCE_URI_11="https://github.com/desktop-app/lib_tl/archive/$srcGitRev_11.tar.gz"
CHECKSUM_SHA256_11="1db86a372f9c5d87b836a60ee16bf6a69dd343840498bc0121118ac9fc2b80e1"
SOURCE_FILENAME_11="lib_tl-$srcGitRev_11.tar.gz"
SOURCE_DIR_11="lib_tl-$srcGitRev_11"
#lib_spellcheck
srcGitRev_12="212d660cbbb49592103de7a98fcb1c0f16efc36b"
SOURCE_URI_12="https://github.com/desktop-app/lib_spellcheck/archive/$srcGitRev_12.tar.gz"
CHECKSUM_SHA256_12="29b76026b4da7f146b238f25909b5f6acbbc6e233ecd861b1d98f3974e065ab8"
SOURCE_FILENAME_12="lib_spellcheck-$srcGitRev_12.tar.gz"
SOURCE_DIR_12="lib_spellcheck-$srcGitRev_12"
#lib_storage
srcGitRev_13="73d57840ac603107381e0e6b22d5b3bdcae492c6"
SOURCE_URI_13="https://github.com/desktop-app/lib_storage/archive/$srcGitRev_13.tar.gz"
CHECKSUM_SHA256_13="ce440ae1cbfc35a4e1f04adfe14497991a9347045970620b199abfd3f162b65b"
SOURCE_FILENAME_13="lib_storage-$srcGitRev_13.tar.gz"
SOURCE_DIR_13="lib_storage-$srcGitRev_13"
#cmake_helpers
srcGitRev_14="dfd1ab4b4959b943bb0236046d8f89bdacaaa266"
SOURCE_URI_14="https://github.com/kotatogram/cmake_helpers/archive/$srcGitRev_14.tar.gz"
CHECKSUM_SHA256_14="4ef8882f6575a2dbcc9c56cc45de63dc48cb186946419e71df372f36ae0bd342"
SOURCE_FILENAME_14="cmake_helpers-$srcGitRev_14.tar.gz"
SOURCE_DIR_14="cmake_helpers-$srcGitRev_14"
#QR-Code-generator
srcGitRev_15="67c62461d380352500fc39557fd9f046b7fe1d18"
SOURCE_URI_15="https://github.com/nayuki/QR-Code-generator/archive/$srcGitRev_15.tar.gz"
CHECKSUM_SHA256_15="1f1218c0a0abfc420cbc651675434d971b5e672b54428860339c51ecdf1958fc"
SOURCE_FILENAME_15="QR-Code-generator-$srcGitRev_15.tar.gz"
SOURCE_DIR_15="QR-Code-generator-$srcGitRev_15"
#lib_qr
srcGitRev_16="2b08c71c6edcfc3e31f7d7f518cc963493b6e189"
SOURCE_URI_16="https://github.com/desktop-app/lib_qr/archive/$srcGitRev_16.tar.gz"
CHECKSUM_SHA256_16="f1aee181ebbcec2e8b8f4d8321d966f8a51ee0f015153602987e88113d6816e9"
SOURCE_FILENAME_16="lib_qr-$srcGitRev_16.tar.gz"
SOURCE_DIR_16="lib_qr-$srcGitRev_16"
#lib_webrtc
srcGitRev_17="29d51317915ca43db45d436cba8eac3f40dea36b"
SOURCE_URI_17="https://github.com/desktop-app/lib_webrtc/archive/$srcGitRev_17.tar.gz"
CHECKSUM_SHA256_17="c5488b1d32d8509df2053413388f3b4e3adeb6da573552ac540d83a1edb6a63c"
SOURCE_FILENAME_17="lib_webrtc-$srcGitRev_17.tar.gz"
SOURCE_DIR_17="lib_webrtc-$srcGitRev_17"
#tgcalls
srcGitRev_18="f76a9290fa502a8df473dd872aedf9a553b089cc"
SOURCE_URI_18="https://github.com/TelegramMessenger/tgcalls/archive/$srcGitRev_18.tar.gz"
CHECKSUM_SHA256_18="6d5e4505e10c1be5ed1674ddb3a314bc8274cd216090a5f02cdc86c3c276a1b1"
SOURCE_FILENAME_18="tgcalls-$srcGitRev_18.tar.gz"
SOURCE_DIR_18="tgcalls-$srcGitRev_18"
#lib_webview
srcGitRev_19="0a3584b8d8e37f9745a0cb0fae725e8e8ea0d989"
SOURCE_URI_19="https://github.com/desktop-app/lib_webview/archive/$srcGitRev_19.tar.gz"
CHECKSUM_SHA256_19="16122bd4c13fc47ae19c10b7a2af6c9138b4cdd8a0b6e472148d7ce659d88b33"
SOURCE_FILENAME_19="lib_webview-$srcGitRev_19.tar.gz"
SOURCE_DIR_19="lib_webview-$srcGitRev_19"
#expected
srcGitRev_20="1d9c5d8c0da84b8ddc54bd3d90d632eec95c1f13"
SOURCE_URI_20="https://github.com/TartanLlama/expected/archive/$srcGitRev_20.tar.gz"
CHECKSUM_SHA256_20="95b82e57a6214ca84105016670eb7f080ad54f71290d8169fcaa969cb6dfc6c8"
SOURCE_FILENAME_20="expected-$srcGitRev_20.tar.gz"
SOURCE_DIR_20="expected-$srcGitRev_20"
#GSL
srcGitRev_21="1999b48a519196711f0d03af3b7eedd49fcc6db3"
SOURCE_URI_21="https://github.com/Microsoft/GSL/archive/$srcGitRev_21.tar.gz"
CHECKSUM_SHA256_21="486d9c18da2303e212165bee7e14fbe5565084b30b1ad7810e26a8a64059492f"
SOURCE_FILENAME_21="GSL-$srcGitRev_21.tar.gz"
SOURCE_DIR_21="GSL-$srcGitRev_21"
#APIKEY
srcGitRev_22="2b383fe05f8ae78ac99470b9a2b9ea22b3ee5a92"
SOURCE_URI_22="https://salsa.debian.org/debian/telegram-desktop/-/raw/$srcGitRev_22/debian/rules#noarchive"
CHECKSUM_SHA256_22="613e7e357518739e1f7d035337f37c344b248283fd4d916ddc95df73c2ff84ad"
PATCHES="kotatogram_desktop-$portVersion.patchset"
PATCHES_2="libtgvoip-$portVersion.patchset"
PATCHES_6="lib_base-$portVersion.patchset"
PATCHES_8="lib_ui-$portVersion.patchset"
PATCHES_14="cmake_helpers-$portVersion.patchset"
PATCHES_17="lib_webrtc-$portVersion.patchset"
PATCHES_18="tgcalls-$portVersion.patchset"
ADDITIONAL_FILES="kotatogram_desktop.rdef.in"
ARCHITECTURES="all !x86_gcc2"
SECONDARY_ARCHITECTURES="x86"
PROVIDES="
kotatogram_desktop$secondaryArchSuffix = $portVersion
app:Kotatogram
"
REQUIRES="
haiku$secondaryArchSuffix
lib:libabsl_strings$secondaryArchSuffix
lib:libabsl_throw_delegate$secondaryArchSuffix
lib:libatomic$secondaryArchSuffix
lib:libavcodec$secondaryArchSuffix
lib:libavformat$secondaryArchSuffix
lib:libavutil$secondaryArchSuffix
lib:libcrypto$secondaryArchSuffix
lib:libgiomm_2.4$secondaryArchSuffix
lib:libglib_2.0$secondaryArchSuffix
lib:libglibmm_2.4$secondaryArchSuffix
lib:libgthread_2.0$secondaryArchSuffix
lib:libhunspell_1.7$secondaryArchSuffix
lib:libintl$secondaryArchSuffix
lib:libjpeg$secondaryArchSuffix
lib:liblz4$secondaryArchSuffix
lib:liblzma$secondaryArchSuffix
lib:libminizip$secondaryArchSuffix
lib:libopenal$secondaryArchSuffix
lib:libopus$secondaryArchSuffix
lib:libQt5Core$secondaryArchSuffix
lib:libQt5Gui$secondaryArchSuffix
lib:libQt5Network$secondaryArchSuffix
lib:libQt5Widgets$secondaryArchSuffix
lib:librnnoise$secondaryArchSuffix
lib:libsigc_2.0$secondaryArchSuffix
lib:libswresample$secondaryArchSuffix
lib:libswscale$secondaryArchSuffix
lib:libxxhash$secondaryArchSuffix
lib:libz$secondaryArchSuffix
"
BUILD_REQUIRES="
haiku${secondaryArchSuffix}_devel
devel:libabsl_strings$secondaryArchSuffix
devel:libabsl_throw_delegate$secondaryArchSuffix
devel:libavcodec$secondaryArchSuffix
devel:libavformat$secondaryArchSuffix
devel:libavutil$secondaryArchSuffix
devel:libcrypto$secondaryArchSuffix
devel:libglib_2.0$secondaryArchSuffix
devel:libglibmm_2.4$secondaryArchSuffix
devel:libgthread_2.0$secondaryArchSuffix
devel:libhunspell_1.7$secondaryArchSuffix
devel:libjpeg$secondaryArchSuffix
devel:liblz4$secondaryArchSuffix
devel:liblzma$secondaryArchSuffix
devel:libminizip$secondaryArchSuffix
devel:libopenal$secondaryArchSuffix
devel:libopus$secondaryArchSuffix
devel:libqrcodegen$secondaryArchSuffix
devel:libQt5Core$secondaryArchSuffix
devel:libQt5Gui$secondaryArchSuffix
devel:libQt5Network$secondaryArchSuffix
devel:libQt5Widgets$secondaryArchSuffix
devel:librapidjson$secondaryArchSuffix
devel:librnnoise$secondaryArchSuffix
devel:libswresample$secondaryArchSuffix
devel:libswscale$secondaryArchSuffix
devel:libtg_owt$secondaryArchSuffix
devel:libxxhash$secondaryArchSuffix
devel:libz$secondaryArchSuffix
devel:range_v3$secondaryArchSuffix
"
BUILD_PREREQUIRES="
cmd:cmake
cmd:gawk
cmd:gcc$secondaryArchSuffix
cmd:lrelease$secondaryArchSuffix >= 5
cmd:make
cmd:pkg_config$secondaryArchSuffix
cmd:python
cmd:sed
cmd:yasm
"
BUILD()
{
export DISABLE_ASLR=1
# get API_ID and API_HASH from Debian
local TELEGRAM_API_ID=`sed -n "/TDESKTOP_API_ID/p" $sourceDir22/rules | cut -d'=' -f2 | cut -d' ' -f1`
local TELEGRAM_API_HASH=`sed -n "/TDESKTOP_API_HASH/p" $sourceDir22/rules | cut -d'=' -f2 | cut -d' ' -f1`
if [ -z $TELEGRAM_API_ID ] || [ -z $TELEGRAM_API_HASH ]; then
TELEGRAM_API_ID="17349"
TELEGRAM_API_HASH="344583e45741c457fe1862106095a5eb"
echo -e "\e[91m***************************************************************************\e[39m"
echo -e "\e[91m Use demo API_ID = $TELEGRAM_API_ID and API_HASH = $TELEGRAM_API_HASH \e[39m"
echo -e "\e[91m***************************************************************************\e[39m"
else
echo -e "\e[32m***************************************************************************\e[39m"
echo -e "\e[32m Use custom API_ID = $TELEGRAM_API_ID and API_HASH = $TELEGRAM_API_HASH \e[39m"
echo -e "\e[32m***************************************************************************\e[39m"
fi
# link submodules
rm -rf $sourceDir/cmake
rm -rf $sourceDir/Telegram/ThirdParty/{libtgvoip,rlottie,QR,tgcalls,expected,GSL}
rm -rf $sourceDir/Telegram/{lib_crl,lib_rpl,lib_base,codegen,lib_ui,lib_lottie,lib_rlottie}
rm -rf $sourceDir/Telegram/{lib_tl,lib_spellcheck,lib_storage,lib_qr,lib_webrtc,lib_webview}
ln -sf $sourceDir2 $sourceDir/Telegram/ThirdParty/libtgvoip
ln -sf $sourceDir3 $sourceDir/Telegram/ThirdParty/rlottie
ln -sf $sourceDir4 $sourceDir/Telegram/lib_crl
ln -sf $sourceDir5 $sourceDir/Telegram/lib_rpl
ln -sf $sourceDir6 $sourceDir/Telegram/lib_base
ln -sf $sourceDir7 $sourceDir/Telegram/codegen
ln -sf $sourceDir8 $sourceDir/Telegram/lib_ui
ln -sf $sourceDir9 $sourceDir/Telegram/lib_rlottie
ln -sf $sourceDir10 $sourceDir/Telegram/lib_lottie
ln -sf $sourceDir11 $sourceDir/Telegram/lib_tl
ln -sf $sourceDir12 $sourceDir/Telegram/lib_spellcheck
ln -sf $sourceDir13 $sourceDir/Telegram/lib_storage
ln -sf $sourceDir14 $sourceDir/cmake
ln -sf $sourceDir15 $sourceDir/Telegram/ThirdParty/QR
ln -sf $sourceDir16 $sourceDir/Telegram/lib_qr
ln -sf $sourceDir17 $sourceDir/Telegram/lib_webrtc
ln -sf $sourceDir18 $sourceDir/Telegram/ThirdParty/tgcalls
ln -sf $sourceDir19 $sourceDir/Telegram/lib_webview
ln -sf $sourceDir20 $sourceDir/Telegram/ThirdParty/expected
ln -sf $sourceDir21 $sourceDir/Telegram/ThirdParty/GSL
# build telegram
mkdir -p build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DTDESKTOP_API_TEST=OFF \
-DTDESKTOP_DISABLE_GTK_INTEGRATION=ON \
-DDESKTOP_APP_DISABLE_CRASH_REPORTS=ON \
-DDESKTOP_APP_DISABLE_DBUS_INTEGRATION=ON \
-DDESKTOP_APP_DISABLE_GTK_INTEGRATION=ON \
-DDESKTOP_APP_DISABLE_WAYLAND_INTEGRATION=ON \
-DDESKTOP_APP_DISABLE_X11_INTEGRATION=ON \
-DDESKTOP_APP_DISABLE_AUTOUPDATE=ON \
-DDESKTOP_APP_DISABLE_WEBKITGTK=ON \
-DDESKTOP_APP_USE_PACKAGED_FONTS=OFF \
-DDESKTOP_APP_USE_HUNSPELL_ONLY=ON \
-DTDESKTOP_USE_PACKAGED_TGVOIP=OFF \
-DLIBTGVOIP_DISABLE_ALSA=ON \
-DLIBTGVOIP_DISABLE_PULSEAUDIO=ON \
-DTDESKTOP_API_ID=$TELEGRAM_API_ID \
-DTDESKTOP_API_HASH=$TELEGRAM_API_HASH
make $jobArgs
}
INSTALL()
{
mkdir -p $appsDir
cp build/bin/Kotatogram $appsDir
strip $appsDir/Kotatogram
local APP_SIGNATURE="application/x-vnd.kotatogram"
local MAJOR="`echo "$portVersion" | cut -d. -f1`"
local MIDDLE="`echo "$portVersion" | cut -d. -f2`"
local MINOR="`echo "$portVersion" | cut -d. -f3`"
local LONG_INFO="$SUMMARY"
sed \
-e "s|@APP_SIGNATURE@|$APP_SIGNATURE|" \
-e "s|@MAJOR@|$MAJOR|" \
-e "s|@MIDDLE@|$MIDDLE|" \
-e "s|@MINOR@|$MINOR|" \
-e "s|@LONG_INFO@|$LONG_INFO|" \
$portDir/additional-files/kotatogram_desktop.rdef.in > build/kotatogram_desktop.rdef
addResourcesToBinaries build/kotatogram_desktop.rdef $appsDir/Kotatogram
addAppDeskbarSymlink $appsDir/Kotatogram
}

View File

@@ -0,0 +1,39 @@
From 3d7f45b060924521b13a80acd670fc32fbeabc28 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:21:03 +1000
Subject: Fixes for Haiku
diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt
index 58ba80a..fe98397 100644
--- a/external/CMakeLists.txt
+++ b/external/CMakeLists.txt
@@ -37,7 +37,7 @@ if (add_hunspell_library)
add_checked_subdirectory(hunspell)
endif()
add_checked_subdirectory(iconv)
-if (LINUX)
+if (LINUX AND NOT HAIKU)
add_checked_subdirectory(jemalloc)
endif()
add_checked_subdirectory(jpeg)
diff --git a/options_linux.cmake b/options_linux.cmake
index 2797c7b..26368f2 100644
--- a/options_linux.cmake
+++ b/options_linux.cmake
@@ -45,10 +45,12 @@ if (DESKTOP_APP_SPECIAL_TARGET)
target_link_options(common_options INTERFACE $<IF:$<CONFIG:Debug>,,-g -flto -fuse-linker-plugin>)
endif()
+if (NOT HAIKU)
target_link_libraries(common_options
INTERFACE
desktop-app::external_jemalloc
)
+endif()
if (DESKTOP_APP_USE_ALLOCATION_TRACER)
target_link_options(common_options
--
2.30.2

View File

@@ -0,0 +1,600 @@
From 116afdf52d051c7eec50258c47885b93e8c9d2ed Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 19:31:53 +1000
Subject: Add Haiku support
diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt
index 6567be6..f9d7122 100644
--- a/Telegram/CMakeLists.txt
+++ b/Telegram/CMakeLists.txt
@@ -89,6 +89,15 @@ PRIVATE
desktop-app::external_xxhash
)
+if (HAIKU)
+ target_link_libraries(Telegram
+ PRIVATE
+ be
+ jpeg
+ translation
+ )
+endif()
+
target_precompile_headers(Telegram PRIVATE ${src_loc}/stdafx.h)
nice_target_sources(Telegram ${src_loc}
PRIVATE
@@ -1182,6 +1191,16 @@ else()
)
endif()
+if (HAIKU)
+ remove_target_sources(Telegram ${src_loc}
+ platform/linux/notifications_manager_linux_dummy.cpp
+ )
+ nice_target_sources(Telegram ${src_loc}
+ PRIVATE
+ platform/linux/notifications_manager_haiku.cpp
+ )
+endif()
+
if (DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION)
remove_target_sources(Telegram ${src_loc}
platform/linux/linux_wayland_integration.cpp
@@ -1311,7 +1330,7 @@ else()
endif()
set(bundle_identifier "io.github.kotatogram")
-if (LINUX AND DESKTOP_APP_USE_PACKAGED)
+if (LINUX AND NOT HAIKU AND DESKTOP_APP_USE_PACKAGED)
set(output_name "kotatogram-desktop")
else()
set(output_name "Kotatogram")
diff --git a/Telegram/SourceFiles/calls/group/calls_group_menu.cpp b/Telegram/SourceFiles/calls/group/calls_group_menu.cpp
index 0fdaf4c..ea0f606 100644
--- a/Telegram/SourceFiles/calls/group/calls_group_menu.cpp
+++ b/Telegram/SourceFiles/calls/group/calls_group_menu.cpp
@@ -583,6 +583,7 @@ void FillMenu(
real->recordStartDateValue(),
handler));
}
+#ifndef Q_OS_HAIKU
if (addScreenCast) {
const auto sharing = call->isSharingScreen();
const auto toggle = [=] {
@@ -600,6 +601,7 @@ void FillMenu(
: tr::lng_group_call_screen_share_start(tr::now)),
toggle);
}
+#endif
menu->addAction(tr::lng_group_call_settings(tr::now), [=] {
if (const auto strong = weak.get()) {
showBox(Box(SettingsBox, strong));
diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp
index c71c522..2c3d1dc 100644
--- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp
+++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp
@@ -1935,7 +1935,9 @@ void Panel::updateButtonsGeometry() {
const auto muteSize = _mute->innerSize().width() + 2 * addSkip;
const auto skip = st::groupCallButtonSkipSmall;
const auto fullWidth = (_video->width() + skip)
+#ifndef Q_OS_HAIKU
+ (_screenShare->width() + skip)
+#endif
+ (muteSize + skip)
+ (_settings ->width() + skip)
+ _hangup->width();
@@ -1946,9 +1948,13 @@ void Panel::updateButtonsGeometry() {
- membersWidth
- membersSkip
- fullWidth) / 2;
+#ifndef Q_OS_HAIKU
toggle(_screenShare, !hidden);
_screenShare->moveToLeft(left, buttonsTop);
left += _screenShare->width() + skip;
+#else
+ toggle(_screenShare, false);
+#endif
toggle(_video, !hidden);
_video->moveToLeft(left, buttonsTop);
left += _video->width() + skip;
diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h
index 9b896a5..2eb6523 100644
--- a/Telegram/SourceFiles/core/core_settings.h
+++ b/Telegram/SourceFiles/core/core_settings.h
@@ -707,7 +707,7 @@ private:
rpl::variable<float64> _dialogsWidthRatio; // per-window
rpl::variable<int> _thirdColumnWidth = kDefaultThirdColumnWidth; // p-w
bool _notifyFromAll = true;
- rpl::variable<bool> _nativeWindowFrame = Platform::IsLinux();
+ rpl::variable<bool> _nativeWindowFrame = true;
rpl::variable<std::optional<bool>> _systemDarkMode = std::nullopt;
rpl::variable<bool> _systemDarkModeEnabled = false;
WindowPosition _windowPosition; // per-window
diff --git a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp
index 453ccfd..c8374f9 100644
--- a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp
+++ b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp
@@ -14,6 +14,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "platform/linux/linux_xdp_open_with_dialog.h"
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#include <InterfaceKit.h>
+#include <StorageKit.h>
+#include <SupportKit.h>
+#include <MimeType.h>
+#include <Roster.h>
+#endif
+
#include <QtCore/QProcess>
#include <QtGui/QDesktopServices>
@@ -48,6 +57,23 @@ void UnsafeOpenEmailLink(const QString &email) {
}
bool UnsafeShowOpenWith(const QString &filepath) {
+#ifdef Q_OS_HAIKU
+ BMessenger trackerMessenger("application/x-vnd.Be-TRAK");
+ if (trackerMessenger.IsValid()) {
+ update_mime_info(filepath.toUtf8().data(), false, true, false);
+
+ BEntry fileEntry(filepath.toUtf8().data());
+ entry_ref fileRef;
+ if (fileEntry.GetRef(&fileRef) == B_OK) {
+ BMessage openCommand(B_REFS_RECEIVED);
+ openCommand.AddRef("refs", &fileRef);
+ openCommand.AddInt32("launchUsingSelector", 0);
+ if (trackerMessenger.SendMessage(&openCommand) == B_OK)
+ return true;
+ }
+ }
+#endif
+
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
if (internal::ShowXDPOpenWithDialog(filepath)) {
return true;
diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp
index 5fb5fbb..52b7711 100644
--- a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp
+++ b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp
@@ -935,11 +935,17 @@ bool MainWindow::hasTrayIcon() const {
bool MainWindow::isActiveForTrayMenu() {
updateIsActive();
+#ifdef Q_OS_HAIKU
+ return isVisible();
+#else
return Platform::IsWayland() ? isVisible() : isActive();
+#endif
}
void MainWindow::psShowTrayMenu() {
+#ifndef Q_OS_HAIKU
_trayIconMenuXEmbed->popup(QCursor::pos());
+#endif
}
void MainWindow::psTrayMenuUpdated() {
@@ -971,7 +977,9 @@ void MainWindow::psSetupTrayIcon() {
if (!trayIcon) {
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(TrayIconGen(counter, muted));
-
+#ifdef Q_OS_HAIKU
+ trayIcon->setContextMenu(trayIconMenu);
+#endif
attachToTrayIcon(trayIcon);
}
updateIconCounters();
@@ -1063,8 +1071,10 @@ void MainWindow::updateIconCounters() {
}
void MainWindow::initTrayMenuHook() {
+#ifndef Q_OS_HAIKU
_trayIconMenuXEmbed.emplace(nullptr, trayIconMenu);
_trayIconMenuXEmbed->deleteOnHide(false);
+#endif
}
void MainWindow::createGlobalMenu() {
diff --git a/Telegram/SourceFiles/platform/linux/notifications_manager_haiku.cpp b/Telegram/SourceFiles/platform/linux/notifications_manager_haiku.cpp
new file mode 100644
index 0000000..72bda83
--- /dev/null
+++ b/Telegram/SourceFiles/platform/linux/notifications_manager_haiku.cpp
@@ -0,0 +1,270 @@
+/*
+This file is part of Telegram Desktop for Haiku,
+
+For license and copyright information please follow this link:
+https://github.com/desktop-app/legal/blob/master/LEGAL
+
+Copyright (c) 2018-2021 Gerasim Troeglazov, 3dEyes@gmail.com
+*/
+
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "platform/linux/notifications_manager_linux.h"
+
+#include "window/notifications_utilities.h"
+#include "history/history.h"
+#include "lang/lang_keys.h"
+#include "core/application.h"
+#include "core/core_settings.h"
+#include "main/main_session.h"
+
+#define USE_HAIKU_UINT64
+#include "base/haiku_types.h"
+
+#include <AppKit.h>
+#include <SupportKit.h>
+#include <Notification.h>
+#include <InterfaceKit.h>
+#include <TranslationUtils.h>
+#include <OS.h>
+
+#define NOTIFY_MESSAGE_DEEP 16
+#define NOTIFY_PORT_NAME "tg_notify"
+#define NOTIFY_GATE_NAME "/bin/qnotify"
+#define NOTIFY_MESSAGE 'QNTF'
+
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QTimer>
+
+namespace Platform {
+namespace Notifications {
+
+bool Supported() {
+ return true;
+}
+
+void Finish() {
+}
+
+bool SkipAudio() {
+ return false;
+}
+
+bool SkipToast() {
+ return false;
+}
+
+bool SkipFlashBounce() {
+ return false;
+}
+
+bool SkipAudioForCustom() {
+ return false;
+}
+
+bool SkipToastForCustom() {
+ return false;
+}
+
+bool SkipFlashBounceForCustom() {
+ return false;
+}
+
+bool Enforced() {
+ return false;
+}
+
+bool ByDefault() {
+ return true;
+}
+
+void Create(Window::Notifications::System *system) {
+ if (Core::App().settings().nativeNotifications() && Supported()) {
+ auto result = std::make_unique<Manager>(system);
+ system->setManager(std::move(result));
+ return;
+ }
+ system->setManager(nullptr);
+}
+
+class Manager::Private : public QObject {
+
+public:
+ using Type = Window::Notifications::CachedUserpics::Type;
+ explicit Private(not_null<Manager*> manager, Type type);
+
+ void showNotification(
+ not_null<PeerData*> peer,
+ std::shared_ptr<Data::CloudImageView> &userpicView,
+ MsgId msgId,
+ const QString &title,
+ const QString &subtitle,
+ const QString &msg,
+ bool hideNameAndPhoto,
+ bool hideReplyButton);
+
+ ~Private();
+
+private:
+ void CheckNotificationAction();
+
+ QTimer *_checkNotificationTimer;
+ Window::Notifications::CachedUserpics _cachedUserpics;
+ const not_null<Manager*> _manager;
+ int32 _portId;
+};
+
+Manager::Private::Private(not_null<Manager*> manager, Type type)
+: _cachedUserpics(type)
+, _manager(manager) {
+ _portId = create_port(NOTIFY_MESSAGE_DEEP, NOTIFY_PORT_NAME);
+ _checkNotificationTimer = new QTimer(this);
+ connect(_checkNotificationTimer, &QTimer::timeout, this, &Manager::Private::CheckNotificationAction);
+ _checkNotificationTimer->start(250);
+}
+
+Manager::Private::~Private() {
+ delete _checkNotificationTimer;
+ if (_portId > 0)
+ delete_port(_portId);
+}
+
+void Manager::Private::CheckNotificationAction()
+{
+ ssize_t msgSize;
+
+ do {
+ msgSize = port_buffer_size_etc(_portId, B_RELATIVE_TIMEOUT, 0);
+ } while (msgSize == B_INTERRUPTED);
+
+ if (msgSize < 0)
+ return;
+
+ char* buffer = new(std::nothrow) char[msgSize];
+ if (!buffer)
+ return;
+
+ int32 code;
+ status_t result;
+ do {
+ result = read_port(_portId, &code, buffer, msgSize);
+ } while (result == B_INTERRUPTED);
+
+ BMessage message;
+
+ if (result < 0 || code != NOTIFY_MESSAGE) {
+ delete[] buffer;
+ return;
+ }
+
+ if (message.Unflatten(buffer) == B_OK) {
+ uint64 sessionId = message.GetUInt64("session", 0);
+ uint64 peerId = message.GetUInt64("peer", 0);
+ int32 messageId = message.GetInt32("message", 0);
+
+ const auto key = FullPeer{
+ .sessionId = sessionId,
+ .peerId = PeerId(peerId)
+ };
+ const auto notificationId = NotificationId{ .full = key, .msgId = messageId };
+
+ crl::on_main(this, [=] {
+ _manager->notificationActivated(notificationId);
+ });
+ }
+ delete[] buffer;
+}
+
+void Manager::Private::showNotification(
+ not_null<PeerData*> peer,
+ std::shared_ptr<Data::CloudImageView> &userpicView,
+ MsgId msgId,
+ const QString &title,
+ const QString &subtitle,
+ const QString &msg,
+ bool hideNameAndPhoto,
+ bool hideReplyButton) {
+ auto titleText = title;
+ auto subtitleText = subtitle;
+ auto msgText = msg;
+
+ const auto key = hideNameAndPhoto
+ ? InMemoryKey()
+ : peer->userpicUniqueKey(userpicView);
+
+ auto userpicPath = _cachedUserpics.get(key, peer, userpicView);
+ BBitmap *icon = BTranslationUtils::GetBitmapFile(userpicPath.toUtf8().data());
+ QString args = QString(
+ "mode:port "
+ "target:tg_notify "
+ "session:uint64:%1 "
+ "peer:uint64:%2 "
+ "message:int32:%3")
+ .arg(peer->session().uniqueId()).arg(peer->id.value).arg(msgId);
+ BNotification notify(B_INFORMATION_NOTIFICATION);
+ if (icon)
+ notify.SetIcon(icon);
+ notify.SetGroup("Telegram");
+ notify.SetTitle(titleText.toUtf8().data());
+ notify.SetContent(msgText.toUtf8().data());
+ entry_ref ref;
+ BEntry entry(NOTIFY_GATE_NAME);
+ entry.GetRef(&ref);
+ notify.SetOnClickFile(&ref);
+ notify.AddOnClickArg(BString(args.toUtf8().data()));
+ notify.Send();
+}
+
+Manager::Manager(not_null<Window::Notifications::System*> system)
+: NativeManager(system)
+, _private(std::make_unique<Private>(this, Private::Type::Rounded)) {
+}
+
+Manager::~Manager() = default;
+
+void Manager::doShowNativeNotification(
+ not_null<PeerData*> peer,
+ std::shared_ptr<Data::CloudImageView> &userpicView,
+ MsgId msgId,
+ const QString &title,
+ const QString &subtitle,
+ const QString &msg,
+ bool hideNameAndPhoto,
+ bool hideReplyButton) {
+ _private->showNotification(
+ peer,
+ userpicView,
+ msgId,
+ title,
+ subtitle,
+ msg,
+ hideNameAndPhoto,
+ hideReplyButton);
+}
+
+void Manager::doClearAllFast() { }
+
+void Manager::doClearFromHistory(not_null<History*> history) { }
+
+void Manager::doClearFromSession(not_null<Main::Session*> session) { }
+
+bool Manager::doSkipAudio() const {
+ return false;
+}
+
+bool Manager::doSkipToast() const {
+ return false;
+}
+
+bool Manager::doSkipFlashBounce() const {
+ return false;
+}
+
+} // namespace Notifications
+} // namespace Platform
diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp
index dcdb784..7529ac6 100644
--- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp
+++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp
@@ -38,6 +38,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "webview/platform/linux/webview_linux_webkit2gtk.h"
#endif // !DESKTOP_APP_DISABLE_WEBKITGTK
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#endif
+
#include <QtWidgets/QApplication>
#include <QtWidgets/QStyle>
#include <QtWidgets/QDesktopWidget>
@@ -49,7 +53,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#ifdef Q_OS_FREEBSD
#include <malloc_np.h>
-#else // Q_OS_FREEBSD
+#elif !defined (Q_OS_HAIKU) // Q_OS_FREEBSD
#include <jemalloc/jemalloc.h>
#endif // Q_OS_FREEBSD
@@ -591,7 +595,7 @@ void psActivateProcess(uint64 pid) {
namespace {
-#ifdef __HAIKU__
+#ifdef Q_OS_HAIKU
void HaikuAutostart(bool start) {
const auto home = QDir::homePath();
if (home.isEmpty()) {
@@ -616,7 +620,7 @@ void HaikuAutostart(bool start) {
file.remove();
}
}
-#endif // __HAIKU__
+#endif // Q_OS_HAIKU
} // namespace
@@ -635,7 +639,11 @@ QString psAppDataPath() {
}
*/
- return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + '/';
+#ifdef Q_OS_HAIKU
+ return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + '/';
+#else
+ return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + '/';
+#endif
}
void psDoCleanup() {
@@ -663,8 +671,9 @@ namespace Platform {
void start() {
auto backgroundThread = true;
+#ifndef Q_OS_HAIKU
mallctl("background_thread", nullptr, nullptr, &backgroundThread, sizeof(bool));
-
+#endif
// Prevent any later calls into setlocale() by Qt
QCoreApplicationPrivate::initLocale();
@@ -796,7 +805,7 @@ bool OpenSystemSettings(SystemSettingsType type) {
} else if (DesktopEnvironment::IsMATE()) {
add("mate-volume-control");
}
-#ifdef __HAIKU__
+#ifdef Q_OS_HAIKU
add("Media");
#endif // __ HAIKU__
add("pavucontrol-qt");
diff --git a/Telegram/cmake/lib_tgvoip.cmake b/Telegram/cmake/lib_tgvoip.cmake
index f332b18..73c1930 100644
--- a/Telegram/cmake/lib_tgvoip.cmake
+++ b/Telegram/cmake/lib_tgvoip.cmake
@@ -123,6 +123,14 @@ if (NOT TGVOIP_FOUND)
os/linux/AudioPulse.cpp
os/linux/AudioPulse.h
+ # Haiku
+ os/haiku/AudioInputHaiku.cpp
+ os/haiku/AudioInputHaiku.h
+ os/haiku/AudioOutputHaiku.cpp
+ os/haiku/AudioOutputHaiku.h
+ os/haiku/RingBuffer.cpp
+ os/haiku/RingBuffer.h
+
# POSIX
os/posix/NetworkSocketPosix.cpp
os/posix/NetworkSocketPosix.h
@@ -160,6 +168,25 @@ if (NOT TGVOIP_FOUND)
TGVOIP_NO_OSX_PRIVATE_API
)
endif()
+ elseif (HAIKU)
+ target_compile_definitions(lib_tgvoip_bundled
+ PUBLIC
+ WEBRTC_POSIX
+ WEBRTC_HAIKU
+ )
+ target_compile_options(lib_tgvoip_bundled
+ PRIVATE
+ -Wno-unknown-pragmas
+ -Wno-error=sequence-point
+ -Wno-error=unused-result
+ -mmmx
+ -msse2
+ )
+ target_link_libraries(lib_tgvoip_bundled
+ PRIVATE
+ network
+ media
+ )
else()
add_library(lib_tgvoip_bundled_options INTERFACE)
target_compile_options(lib_tgvoip_bundled_options
--
2.30.2

View File

@@ -0,0 +1,170 @@
From 00c1e5974b4d6d6cbafe5ae42ab70766370b8580 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:14:13 +1000
Subject: Fixes for Haiku
diff --git a/base/haiku_types.h b/base/haiku_types.h
new file mode 100644
index 0000000..3a57ce2
--- /dev/null
+++ b/base/haiku_types.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#ifdef Q_OS_HAIKU
+
+#define _SUPPORT_DEFS_H
+
+#ifdef __x86_64__
+#define int64 __haiku_int64
+#ifdef USE_HAIKU_UINT64
+#define uint64 __haiku_uint64
+#endif
+#else
+#define int32 __haiku_int32
+#define uint32 __haiku_uint32
+#endif
+
+typedef int32 status_t;
+typedef uint32 type_code;
+typedef uint32 perform_code;
+
+typedef int64 bigtime_t;
+typedef int64 nanotime_t;
+
+#endif
diff --git a/base/platform/linux/base_file_utilities_linux.cpp b/base/platform/linux/base_file_utilities_linux.cpp
index b3ba5f3..a481e3b 100644
--- a/base/platform/linux/base_file_utilities_linux.cpp
+++ b/base/platform/linux/base_file_utilities_linux.cpp
@@ -27,8 +27,58 @@
#include <stdio.h>
#include <fcntl.h>
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#include <AppKit.h>
+#include <StorageKit.h>
+#endif
+
namespace base::Platform {
namespace {
+
+#ifdef Q_OS_HAIKU
+bool HaikuShowInFolder(const QString &filepath) {
+ try {
+ BMessenger trackerMessenger("application/x-vnd.Be-TRAK");
+ if (!trackerMessenger.IsValid())
+ return false;
+
+ BEntry fileEntry(filepath.toUtf8().data());
+ entry_ref fileRef;
+ if (fileEntry.GetRef(&fileRef) != B_OK)
+ return false;
+
+ if (!fileEntry.Exists())
+ return false;
+
+ BEntry folderEntry;
+ if (fileEntry.GetParent(&folderEntry) != B_OK)
+ return false;
+
+ entry_ref folderRef;
+ if (folderEntry.GetRef(&folderRef) != B_OK)
+ return false;
+
+ BMessage openCommand(B_REFS_RECEIVED);
+ openCommand.AddRef("refs", &folderRef);
+ node_ref fileNodeRef;
+ if (fileEntry.GetNodeRef(&fileNodeRef) == B_OK) {
+ openCommand.AddData("nodeRefToSelect", B_RAW_TYPE,
+ static_cast<void*>(&fileNodeRef), sizeof(node_ref));
+ }
+ if (trackerMessenger.SendMessage(&openCommand) == B_OK) {
+ snooze(300000);
+ BMessage selectCommand('Tsel');
+ selectCommand.AddRef("refs", &fileRef);
+ trackerMessenger.SendMessage(&selectCommand);
+ return true;
+ }
+ } catch (...) {
+ }
+
+ return false;
+}
+#endif
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
bool PortalShowInFolder(const QString &filepath) {
@@ -152,6 +202,12 @@ bool ShowInFolder(const QString &filepath) {
return true;
}
+#ifdef Q_OS_HAIKU
+ if (HaikuShowInFolder(filepath)) {
+ return true;
+ }
+#endif
+
if (ProcessShowInFolder(filepath)) {
return true;
}
diff --git a/base/platform/linux/base_last_input_linux.cpp b/base/platform/linux/base_last_input_linux.cpp
index 1021c85..fd6e541 100644
--- a/base/platform/linux/base_last_input_linux.cpp
+++ b/base/platform/linux/base_last_input_linux.cpp
@@ -24,6 +24,11 @@
#include <xcb/screensaver.h>
#endif // !DESKTOP_APP_DISABLE_X11_INTEGRATION
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#include <InterfaceDefs.h>
+#endif
+
namespace base::Platform {
namespace {
@@ -184,9 +189,23 @@ std::optional<crl::time> MutterDBusLastUserInputTime() {
}
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
+#ifdef Q_OS_HAIKU
+std::optional<crl::time> HaikuLastUserInputTime() {
+ const auto idle = idle_time() / 1000;
+ return (crl::now() - static_cast<crl::time>(idle));
+}
+#endif
+
} // namespace
std::optional<crl::time> LastUserInputTime() {
+#ifdef Q_OS_HAIKU
+ const auto haikuResult = HaikuLastUserInputTime();
+ if (haikuResult.has_value()) {
+ return haikuResult;
+ }
+#endif
+
#ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION
if (::Platform::IsX11()) {
const auto xcbResult = XCBLastUserInputTime();
diff --git a/base/platform/linux/base_url_scheme_linux.cpp b/base/platform/linux/base_url_scheme_linux.cpp
index 20aed5e..61d46fc 100644
--- a/base/platform/linux/base_url_scheme_linux.cpp
+++ b/base/platform/linux/base_url_scheme_linux.cpp
@@ -13,6 +13,10 @@
#include "base/platform/linux/base_linux_glibmm_helper.h"
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#endif
+
#include <QtCore/QFile>
#include <QtCore/QProcess>
#include <QtGui/QWindow>
--
2.30.2

View File

@@ -0,0 +1,40 @@
From 4abc5f9628b9b0e9a82aec9de03a0a43abf3618e Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:18:12 +1000
Subject: Fixes for Haiku
diff --git a/ui/platform/linux/ui_utility_linux.cpp b/ui/platform/linux/ui_utility_linux.cpp
index 87c3c04..9d1ef4f 100644
--- a/ui/platform/linux/ui_utility_linux.cpp
+++ b/ui/platform/linux/ui_utility_linux.cpp
@@ -612,7 +612,7 @@ TitleControls::Layout TitleControlsLayout() {
}
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
-#ifdef __HAIKU__
+#ifdef Q_OS_HAIKU
return TitleControls::Layout{
.left = {
TitleControls::Control::Close,
@@ -622,7 +622,7 @@ TitleControls::Layout TitleControlsLayout() {
TitleControls::Control::Maximize,
}
};
-#else // __HAIKU__
+#else // Q_OS_HAIKU
return TitleControls::Layout{
.right = {
TitleControls::Control::Minimize,
@@ -630,7 +630,7 @@ TitleControls::Layout TitleControlsLayout() {
TitleControls::Control::Close,
}
};
-#endif // !__HAIKU__
+#endif // !Q_OS_HAIKU
}
} // namespace Platform
--
2.30.2

View File

@@ -0,0 +1,41 @@
From d65252fda59ee58fc8e913be59358b42b34e3a32 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:19:20 +1000
Subject: Fixes for Haiku
diff --git a/webrtc/details/webrtc_openal_adm.cpp b/webrtc/details/webrtc_openal_adm.cpp
index 8aa87d7..19deeff 100644
--- a/webrtc/details/webrtc_openal_adm.cpp
+++ b/webrtc/details/webrtc_openal_adm.cpp
@@ -4,6 +4,11 @@
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
+
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#endif
+
#include "webrtc/details/webrtc_openal_adm.h"
#include "base/timer.h"
diff --git a/webrtc/webrtc_audio_input_tester.cpp b/webrtc/webrtc_audio_input_tester.cpp
index 092b667..204e259 100644
--- a/webrtc/webrtc_audio_input_tester.cpp
+++ b/webrtc/webrtc_audio_input_tester.cpp
@@ -4,6 +4,11 @@
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
+
+#ifdef Q_OS_HAIKU
+#include <base/haiku_types.h>
+#endif
+
#include "webrtc/webrtc_audio_input_tester.h"
#include "webrtc/webrtc_create_adm.h"
--
2.30.2

View File

@@ -0,0 +1,887 @@
From 4f1be262da4a9901dc7129c5340290c9f6770dec Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:14:40 +1000
Subject: Add Haiku support
diff --git a/VoIPController.cpp b/VoIPController.cpp
index 22978e3..264cbee 100644
--- a/VoIPController.cpp
+++ b/VoIPController.cpp
@@ -8,6 +8,9 @@
#include <unistd.h>
#include <sys/time.h>
#endif
+#ifdef __HAIKU__
+#include <OS.h>
+#endif
#include <errno.h>
#include <string.h>
#include <wchar.h>
@@ -3009,6 +3012,10 @@ double VoIPController::GetCurrentTime(){
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec+(double)ts.tv_nsec/1000000000.0;
+#elif defined(__HAIKU__)
+ struct timeval tm;
+ gettimeofday(&tm, NULL);
+ return tm.tv_sec+(double)tm.tv_usec/1000000.0;
#elif defined(__APPLE__)
static pthread_once_t token = PTHREAD_ONCE_INIT;
pthread_once(&token, &initMachTimestart);
diff --git a/audio/AudioIO.cpp b/audio/AudioIO.cpp
index 29d5ad9..994d938 100644
--- a/audio/AudioIO.cpp
+++ b/audio/AudioIO.cpp
@@ -39,6 +39,9 @@
#ifndef WITHOUT_PULSE
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioInputHaiku.h"
+#include "../os/haiku/AudioOutputHaiku.h"
#else
#error "Unsupported operating system"
#endif
@@ -65,6 +68,8 @@ AudioIO* AudioIO::Create(std::string inputDevice, std::string outputDevice){
return new ContextlessAudioIO<AudioInputWave, AudioOutputWave>(inputDevice, outputDevice);
#endif
return new ContextlessAudioIO<AudioInputWASAPI, AudioOutputWASAPI>(inputDevice, outputDevice);
+#elif defined(__HAIKU__)
+ return new ContextlessAudioIO<AudioInputHaiku, AudioOutputHaiku>();
#elif defined(__linux__) || defined(__FreeBSD__)
#ifndef WITHOUT_ALSA
#ifndef WITHOUT_PULSE
diff --git a/audio/AudioInput.cpp b/audio/AudioInput.cpp
index efdc535..12fbc5a 100644
--- a/audio/AudioInput.cpp
+++ b/audio/AudioInput.cpp
@@ -33,6 +33,8 @@
#ifndef WITHOUT_PULSE
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioInputHaiku.h"
#else
#error "Unsupported operating system"
#endif
diff --git a/audio/AudioOutput.cpp b/audio/AudioOutput.cpp
index 3f88799..97820b6 100644
--- a/audio/AudioOutput.cpp
+++ b/audio/AudioOutput.cpp
@@ -37,6 +37,8 @@
#include "../os/linux/AudioOutputPulse.h"
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioOutputHaiku.h"
#else
#error "Unsupported operating system"
#endif
diff --git a/os/haiku/AudioInputHaiku.cpp b/os/haiku/AudioInputHaiku.cpp
new file mode 100644
index 0000000..7cce3e3
--- /dev/null
+++ b/os/haiku/AudioInputHaiku.cpp
@@ -0,0 +1,276 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <dlfcn.h>
+#include "AudioInputHaiku.h"
+#include "../../logging.h"
+#include "../../audio/Resampler.h"
+#include "../../VoIPController.h"
+
+#include "RingBuffer.h"
+
+using namespace tgvoip::audio;
+
+void RecordData(void* cookie, bigtime_t timestamp, void* data, size_t size, const media_format &format)
+{
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
+ if (!audioInput->IsRecording())
+ return;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT &&
+ format.u.raw_audio.channel_count == 1) {
+ audioInput->fRingBuffer->Write((unsigned char*)data, size);
+ return;
+ }
+
+ uint32 bytesPerSample = 2;
+ switch (format.u.raw_audio.format) {
+ case media_raw_audio_format::B_AUDIO_CHAR:
+ bytesPerSample = 1;
+ break;
+ case media_raw_audio_format::B_AUDIO_SHORT:
+ bytesPerSample = 2;
+ break;
+ case media_raw_audio_format::B_AUDIO_INT:
+ bytesPerSample = 4;
+ break;
+ case media_raw_audio_format::B_AUDIO_FLOAT:
+ bytesPerSample = 4;
+ break;
+ default:
+ break;
+ }
+
+ int frames = size / (format.u.raw_audio.channel_count * bytesPerSample);
+ int16_t *dst = audioInput->workBuffer;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_CHAR) {
+ unsigned char* src=reinterpret_cast<unsigned char*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += ((int32_t)(*src) - INT8_MAX) * UINT8_MAX;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT) {
+ int16_t* src=reinterpret_cast<int16_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_INT) {
+ int32_t* src=reinterpret_cast<int32_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int64_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += (int64_t)(*src);
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value / (UINT16_MAX + 1));
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_FLOAT) {
+ float* src=reinterpret_cast<float*>(data);
+ for (int n=0; n < frames; n++) {
+ float value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value*INT16_MAX);
+ }
+ }
+
+ if(format.u.raw_audio.frame_rate != audioInput->tgFrameRate) {
+ size_t len = tgvoip::audio::Resampler::Convert(dst, audioInput->convertBuffer,
+ frames, frames, audioInput->tgFrameRate, format.u.raw_audio.frame_rate) * audioInput->tgBytesPerSample;
+ audioInput->fRingBuffer->Write((unsigned char*)audioInput->convertBuffer, len);
+ } else {
+ audioInput->fRingBuffer->Write((unsigned char*)dst, frames * audioInput->tgBytesPerSample);
+ }
+}
+
+void NotifyRecordData(void * cookie, BMediaRecorder::notification code, ...)
+{
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
+ if (code == BMediaRecorder::B_WILL_STOP) {
+ if (audioInput->IsRecording()) {
+ audioInput->Stop();
+ }
+ }
+}
+
+AudioInputHaiku::AudioInputHaiku()
+{
+ fRecorder = NULL;
+ fRingBuffer = NULL;
+ isRecording = false;
+
+ tgFrameRate = 48000;
+ tgChannelsCount = 1;
+ tgBytesPerSample = 2;
+
+ status_t error;
+
+ fRoster = BMediaRoster::Roster(&error);
+ if (!fRoster) {
+ failed=true;
+ return;
+ }
+ error = fRoster->GetAudioInput(&fAudioInputNode);
+ if (error < B_OK) {
+ failed=true;
+ return;
+ }
+ error = fRoster->GetAudioMixer(&fAudioMixerNode);
+ if (error < B_OK) {
+ failed=true;
+ return;
+ }
+ fRecorder = new BMediaRecorder("Telegram", B_MEDIA_RAW_AUDIO);
+ if (fRecorder->InitCheck() < B_OK) {
+ failed=true;
+ return;
+ }
+ media_format output_format;
+ output_format.type = B_MEDIA_RAW_AUDIO;
+ output_format.u.raw_audio = media_raw_audio_format::wildcard;
+ output_format.u.raw_audio.channel_count = 1;
+ fRecorder->SetAcceptedFormat(output_format);
+
+ const int maxInputCount = 64;
+ dormant_node_info dni[maxInputCount];
+
+ int32 real_count = maxInputCount;
+
+ error = fRoster->GetDormantNodes(dni, &real_count, 0, &output_format, 0, B_BUFFER_PRODUCER | B_PHYSICAL_INPUT);
+ if (real_count > maxInputCount)
+ real_count = maxInputCount;
+ char selected_name[B_MEDIA_NAME_LENGTH] = "Default input";
+
+ for (int i = 0; i < real_count; i++) {
+ media_node_id ni[12];
+ int32 ni_count = 12;
+ error = fRoster->GetInstancesFor(dni[i].addon, dni[i].flavor_id, ni, &ni_count);
+ if (error == B_OK) {
+ for (int j = 0; j < ni_count; j++) {
+ if (ni[j] == fAudioInputNode.node) {
+ strcpy(selected_name, dni[i].name);
+ break;
+ }
+ }
+ }
+ }
+
+ media_output audioOutput;
+ if (!fRecorder->IsConnected()) {
+ int32 count = 0;
+ error = fRoster->GetFreeOutputsFor(fAudioInputNode, &audioOutput, 1, &count, B_MEDIA_RAW_AUDIO);
+ if (error < B_OK) {
+ failed=true;
+ return;
+ }
+
+ if (count < 1) {
+ failed=true;
+ return;
+ }
+ fRecordFormat.u.raw_audio = audioOutput.format.u.raw_audio;
+ } else {
+ fRecordFormat.u.raw_audio = fRecorder->AcceptedFormat().u.raw_audio;
+ }
+ fRecordFormat.type = B_MEDIA_RAW_AUDIO;
+
+ error = fRecorder->SetHooks(RecordData, NotifyRecordData, this);
+ if (error < B_OK) {
+ failed=true;
+ return;
+ }
+
+ if (!fRecorder->IsConnected()) {
+ error = fRecorder->Connect(fAudioInputNode, &audioOutput, &fRecordFormat);
+ if (error < B_OK) {
+ fRecorder->SetHooks(NULL, NULL, NULL);
+ failed=true;
+ return;
+ }
+ }
+
+ fRingBuffer = new RingBuffer(BUFFER_SIZE * 2 * 3);
+ if (fRingBuffer->InitCheck() != B_OK) {
+ failed=true;
+ return;
+ }
+}
+
+AudioInputHaiku::~AudioInputHaiku(){
+ if (fRecorder != NULL) {
+ if (fRecorder->InitCheck() == B_OK) {
+ if (fRecorder->IsConnected())
+ fRecorder->Disconnect();
+ }
+ delete fRecorder;
+ }
+ if (fRingBuffer != NULL)
+ delete fRingBuffer;
+}
+
+void AudioInputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){
+ tgFrameRate = sampleRate;
+ tgChannelsCount = channels;
+ tgBytesPerSample = bitsPerSample / 8;
+}
+
+bool AudioInputHaiku::IsRecording(){
+ return isRecording;
+}
+
+void AudioInputHaiku::Start(){
+ if(failed || isRecording)
+ return;
+
+ isRecording=true;
+
+ thread = new Thread(std::bind(&AudioInputHaiku::RunThread, this));
+ thread->SetName("AudioInputHaiku");
+ thread->Start();
+
+ fRecorder->Start();
+}
+
+void AudioInputHaiku::Stop(){
+ if(!isRecording)
+ return;
+
+ isRecording=false;
+
+ fRecorder->Stop();
+
+ thread->Join();
+ delete thread;
+ thread=NULL;
+}
+
+void AudioInputHaiku::RunThread(){
+ unsigned char buffer[BUFFER_SIZE*2];
+ while (isRecording){
+ if (fRingBuffer->GetReadAvailable() >= sizeof(buffer)) {
+ int readed = fRingBuffer->Read(buffer, sizeof(buffer));
+ if (readed < sizeof(buffer))
+ memset(buffer + readed, 0, sizeof(buffer) - readed);
+ InvokeCallback(buffer, sizeof(buffer));
+ } else
+ snooze(100);
+ }
+}
diff --git a/os/haiku/AudioInputHaiku.h b/os/haiku/AudioInputHaiku.h
new file mode 100644
index 0000000..1c63afe
--- /dev/null
+++ b/os/haiku/AudioInputHaiku.h
@@ -0,0 +1,66 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+#ifndef LIBTGVOIP_AUDIOINPUTHAIKU_H
+#define LIBTGVOIP_AUDIOINPUTHAIKU_H
+
+#include "../../audio/AudioInput.h"
+#include "../../threading.h"
+
+#include <OS.h>
+#include <MediaFile.h>
+#include <MediaNode.h>
+#include <MediaRecorder.h>
+#include <MediaTrack.h>
+#include <MediaRoster.h>
+#include <TimeSource.h>
+#include <NodeInfo.h>
+#include <MediaAddOn.h>
+
+#include "RingBuffer.h"
+
+#define BUFFER_SIZE 960
+
+namespace tgvoip{
+namespace audio{
+
+class AudioInputHaiku : public AudioInput{
+
+public:
+ AudioInputHaiku();
+ virtual ~AudioInputHaiku();
+ virtual void Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels);
+ virtual void Start();
+ virtual void Stop();
+ virtual bool IsRecording();
+
+ RingBuffer *fRingBuffer;
+ int16_t workBuffer[BUFFER_SIZE * 64];
+ int16_t convertBuffer[BUFFER_SIZE * 64];
+
+ uint32 tgFrameRate;
+ uint32 tgChannelsCount;
+ uint32 tgBytesPerSample;
+
+private:
+ void RunThread();
+
+ bool isConfigured;
+ bool isRecording;
+
+ BMediaRoster * fRoster;
+ BMediaRecorder * fRecorder;
+ media_format fRecordFormat;
+ media_node fAudioInputNode;
+ media_node fAudioMixerNode;
+
+ Thread* thread;
+};
+
+}
+}
+
+#endif //LIBTGVOIP_AUDIOINPUTHAIKU_H
diff --git a/os/haiku/AudioOutputHaiku.cpp b/os/haiku/AudioOutputHaiku.cpp
new file mode 100644
index 0000000..2fca8a1
--- /dev/null
+++ b/os/haiku/AudioOutputHaiku.cpp
@@ -0,0 +1,99 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+
+#include <assert.h>
+#include <dlfcn.h>
+#include "AudioOutputHaiku.h"
+#include "../../logging.h"
+#include "../../VoIPController.h"
+
+#define BUFFER_SIZE 960
+
+using namespace tgvoip::audio;
+
+static void playerProc(void *cookie, void *buffer, size_t len, const media_raw_audio_format &format)
+{
+ AudioOutputHaiku *obj = (AudioOutputHaiku*)cookie;
+ obj->InvokeCallback((unsigned char*)buffer, len);
+}
+
+
+AudioOutputHaiku::AudioOutputHaiku(){
+ soundPlayer = NULL;
+ isPlaying = false;
+ isConfigured = false;
+ Configure(48000, 16, 1);
+ return;
+}
+
+AudioOutputHaiku::~AudioOutputHaiku(){
+ if (isConfigured) {
+ if (soundPlayer != NULL) {
+ soundPlayer->Stop();
+ delete soundPlayer;
+ }
+ }
+}
+
+void AudioOutputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){
+ media_raw_audio_format mediaKitFormat = {
+ (float)sampleRate,
+ (uint32)channels,
+ media_raw_audio_format::B_AUDIO_SHORT,
+ B_MEDIA_LITTLE_ENDIAN,
+ (uint32)BUFFER_SIZE * (bitsPerSample / 8) * channels
+ };
+
+ switch (bitsPerSample) {
+ case 8:
+ mediaKitFormat.format = media_raw_audio_format::B_AUDIO_CHAR;
+ break;
+ case 16:
+ mediaKitFormat.format = media_raw_audio_format::B_AUDIO_SHORT;
+ break;
+ case 32:
+ mediaKitFormat.format = media_raw_audio_format::B_AUDIO_INT;
+ break;
+ default:
+ mediaKitFormat.format = media_raw_audio_format::B_AUDIO_SHORT;
+ break;
+ }
+
+ soundPlayer = new BSoundPlayer(&mediaKitFormat, "Telegram", playerProc, NULL, (void*)this);
+
+ if(soundPlayer->InitCheck() != B_OK) {
+ delete soundPlayer;
+ soundPlayer = NULL;
+ isPlaying = false;
+ failed = true;
+ return;
+ }
+
+ isConfigured = true;
+}
+
+void AudioOutputHaiku::Start(){
+ if(soundPlayer == NULL || isPlaying)
+ return;
+
+ soundPlayer->Start();
+ soundPlayer->SetHasData(true);
+
+ isPlaying=true;
+}
+
+void AudioOutputHaiku::Stop(){
+ if(!isPlaying)
+ return;
+
+ soundPlayer->Stop();
+ isPlaying=false;
+}
+
+bool AudioOutputHaiku::IsPlaying(){
+ return isPlaying;
+}
diff --git a/os/haiku/AudioOutputHaiku.h b/os/haiku/AudioOutputHaiku.h
new file mode 100644
index 0000000..91f2521
--- /dev/null
+++ b/os/haiku/AudioOutputHaiku.h
@@ -0,0 +1,35 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+#ifndef LIBTGVOIP_AUDIOOUTPUTHAIKU_H
+#define LIBTGVOIP_AUDIOOUTPUTHAIKU_H
+
+#include "../../audio/AudioOutput.h"
+#include "../../threading.h"
+
+#include <SoundPlayer.h>
+
+namespace tgvoip{
+namespace audio{
+
+class AudioOutputHaiku : public AudioOutput{
+public:
+ AudioOutputHaiku();
+ virtual ~AudioOutputHaiku();
+ virtual void Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels);
+ virtual void Start();
+ virtual void Stop();
+ virtual bool IsPlaying() override;
+private:
+ bool isPlaying;
+ bool isConfigured;
+ BSoundPlayer *soundPlayer;
+};
+
+}
+}
+
+#endif //LIBTGVOIP_AUDIOOUTPUTHAIKU_H
diff --git a/os/haiku/RingBuffer.cpp b/os/haiku/RingBuffer.cpp
new file mode 100644
index 0000000..6c94933
--- /dev/null
+++ b/os/haiku/RingBuffer.cpp
@@ -0,0 +1,136 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <OS.h>
+
+#include "RingBuffer.h"
+
+RingBuffer::RingBuffer( int size )
+{
+ initialized = false;
+ Buffer = new unsigned char[size];
+ if(Buffer!=NULL) {
+ memset( Buffer, 0, size );
+ BufferSize = size;
+ } else {
+ BufferSize = 0;
+ }
+ reader = 0;
+ writer = 0;
+ writeBytesAvailable = size;
+ if((locker=create_sem(1,"locker")) >= B_OK) {
+ initialized = true;
+ } else {
+ if(Buffer!=NULL) {
+ delete[] Buffer;
+ }
+ }
+}
+
+RingBuffer::~RingBuffer( )
+{
+ if(initialized) {
+ delete[] Buffer;
+ delete_sem(locker);
+ }
+}
+
+bool
+RingBuffer::Empty( void )
+{
+ memset( Buffer, 0, BufferSize );
+ reader = 0;
+ writer = 0;
+ writeBytesAvailable = BufferSize;
+ return true;
+}
+
+int
+RingBuffer::Read( unsigned char *data, int size )
+{
+ acquire_sem(locker);
+
+ if( data == 0 || size <= 0 || writeBytesAvailable == BufferSize ) {
+ release_sem(locker);
+ return 0;
+ }
+
+ int readBytesAvailable = BufferSize - writeBytesAvailable;
+
+ if( size > readBytesAvailable ) {
+ size = readBytesAvailable;
+ }
+
+ if(size > BufferSize - reader) {
+ int len = BufferSize - reader;
+ memcpy(data, Buffer + reader, len);
+ memcpy(data + len, Buffer, size-len);
+ } else {
+ memcpy(data, Buffer + reader, size);
+ }
+
+ reader = (reader + size) % BufferSize;
+ writeBytesAvailable += size;
+
+ release_sem(locker);
+ return size;
+}
+
+int
+RingBuffer::Write( unsigned char *data, int size )
+{
+ acquire_sem(locker);
+
+ if( data == 0 || size <= 0 || writeBytesAvailable == 0 ) {
+ release_sem(locker);
+ return 0;
+ }
+
+ if( size > writeBytesAvailable ) {
+ size = writeBytesAvailable;
+ }
+
+ if(size > BufferSize - writer) {
+ int len = BufferSize - writer;
+ memcpy(Buffer + writer, data, len);
+ memcpy(Buffer, data+len, size-len);
+ } else {
+ memcpy(Buffer + writer, data, size);
+ }
+
+ writer = (writer + size) % BufferSize;
+ writeBytesAvailable -= size;
+
+ release_sem(locker);
+ return size;
+}
+
+int
+RingBuffer::GetSize( void )
+{
+ return BufferSize;
+}
+
+int
+RingBuffer::GetWriteAvailable( void )
+{
+ return writeBytesAvailable;
+}
+
+int
+RingBuffer::GetReadAvailable( void )
+{
+ return BufferSize - writeBytesAvailable;
+}
+
+status_t
+RingBuffer::InitCheck( void )
+{
+ return initialized?B_OK:B_ERROR;
+}
diff --git a/os/haiku/RingBuffer.h b/os/haiku/RingBuffer.h
new file mode 100644
index 0000000..01f6096
--- /dev/null
+++ b/os/haiku/RingBuffer.h
@@ -0,0 +1,37 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
+// you should have received with this source code distribution.
+//
+
+#ifndef __RING_BUFFER_H__
+#define __RING_BUFFER_H__
+
+#include <OS.h>
+
+class RingBuffer {
+
+public:
+ RingBuffer(int size);
+ ~RingBuffer();
+ int Read( unsigned char* dataPtr, int numBytes );
+ int Write( unsigned char *dataPtr, int numBytes );
+
+ bool Empty( void );
+ int GetSize( );
+ int GetWriteAvailable( );
+ int GetReadAvailable( );
+ status_t InitCheck( );
+private:
+ unsigned char *Buffer;
+ int BufferSize;
+ int reader;
+ int writer;
+ int writeBytesAvailable;
+
+ sem_id locker;
+
+ bool initialized;
+};
+
+#endif
diff --git a/os/posix/NetworkSocketPosix.cpp b/os/posix/NetworkSocketPosix.cpp
index 78e0583..81bf9fc 100644
--- a/os/posix/NetworkSocketPosix.cpp
+++ b/os/posix/NetworkSocketPosix.cpp
@@ -248,12 +248,13 @@ void NetworkSocketPosix::Open(){
}
int flag=0;
int res=setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, sizeof(flag));
+#ifndef __HAIKU__
if(res<0){
LOGE("error enabling dual stack socket: %d / %s", errno, strerror(errno));
failed=true;
return;
}
-
+#endif
SetMaxPriority();
fcntl(fd, F_SETFL, O_NONBLOCK);
@@ -403,6 +404,8 @@ std::string NetworkSocketPosix::GetLocalInterfaceInfo(IPv4Address *v4addr, IPv6A
if(didAttach){
sharedJVM->DetachCurrentThread();
}
+#elif defined(__HAIKU__)
+ return name;
#else
struct ifaddrs* interfaces;
if(!getifaddrs(&interfaces)){
diff --git a/threading.h b/threading.h
old mode 100755
new mode 100644
index 37de500..2017b83
--- a/threading.h
+++ b/threading.h
@@ -9,7 +9,7 @@
#include <functional>
-#if defined(_POSIX_THREADS) || defined(_POSIX_VERSION) || defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))
+#if defined(_POSIX_THREADS) || defined(_POSIX_VERSION) || defined(__unix__) || defined(__unix) || defined(__HAIKU__) || (defined(__APPLE__) && defined(__MACH__))
#include <pthread.h>
#include <semaphore.h>
@@ -95,6 +95,7 @@ namespace tgvoip{
static void* ActualEntryPoint(void* arg){
Thread* self=reinterpret_cast<Thread*>(arg);
if(self->name){
+#ifndef __HAIKU__
#if defined(__linux__) || defined(__FreeBSD__)
pthread_setname_np(self->thread, self->name);
#elif defined(__APPLE__)
@@ -103,6 +104,7 @@ namespace tgvoip{
DarwinSpecific::SetCurrentThreadPriority(DarwinSpecific::THREAD_PRIO_USER_INTERACTIVE);
}
#endif
+#endif //__HAIKU__
}
self->entry();
return NULL;
diff --git a/webrtc_dsp/rtc_base/logging_webrtc.cc b/webrtc_dsp/rtc_base/logging_webrtc.cc
old mode 100755
new mode 100644
index a8d1522..991241b
--- a/webrtc_dsp/rtc_base/logging_webrtc.cc
+++ b/webrtc_dsp/rtc_base/logging_webrtc.cc
@@ -28,6 +28,10 @@
static const int kMaxLogLineSize = 1024 - 60;
#endif // WEBRTC_MAC && !defined(WEBRTC_IOS) || WEBRTC_ANDROID
+#if defined(WEBRTC_HAIKU)
+#include <OS.h>
+#endif
+
#include <stdio.h>
#include <string.h>
#include <time.h>
@@ -120,7 +124,12 @@ LogMessage::LogMessage(const char* file,
if (thread_) {
PlatformThreadId id = CurrentThreadId();
+#if defined(WEBRTC_HAIKU)
+ thread_id tid = get_pthread_thread_id(id);
+ print_stream_ << "[" << tid << "] ";
+#else
print_stream_ << "[" << id << "] ";
+#endif
}
if (file != nullptr) {
diff --git a/webrtc_dsp/rtc_base/platform_file.h b/webrtc_dsp/rtc_base/platform_file.h
old mode 100755
new mode 100644
diff --git a/webrtc_dsp/rtc_base/platform_thread_types.cc b/webrtc_dsp/rtc_base/platform_thread_types.cc
index cf7d478..f27b9a1 100644
--- a/webrtc_dsp/rtc_base/platform_thread_types.cc
+++ b/webrtc_dsp/rtc_base/platform_thread_types.cc
@@ -20,6 +20,8 @@ namespace rtc {
PlatformThreadId CurrentThreadId() {
#if defined(WEBRTC_WIN)
return GetCurrentThreadId();
+#elif defined(WEBRTC_HAIKU)
+ return pthread_self();
#elif defined(WEBRTC_POSIX)
#if defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
return pthread_mach_thread_np(pthread_self());
diff --git a/webrtc_dsp/rtc_base/platform_thread_types.h b/webrtc_dsp/rtc_base/platform_thread_types.h
index 0bc42eb..c87cde9 100644
--- a/webrtc_dsp/rtc_base/platform_thread_types.h
+++ b/webrtc_dsp/rtc_base/platform_thread_types.h
@@ -35,6 +35,9 @@ typedef DWORD PlatformThreadRef;
#elif defined(WEBRTC_FUCHSIA)
typedef zx_handle_t PlatformThreadId;
typedef zx_handle_t PlatformThreadRef;
+#elif defined(WEBRTC_HAIKU)
+typedef pthread_t PlatformThreadId;
+typedef pthread_t PlatformThreadRef;
#elif defined(WEBRTC_POSIX)
typedef pid_t PlatformThreadId;
typedef pthread_t PlatformThreadRef;
--
2.30.2

View File

@@ -0,0 +1,44 @@
From d709b1c94721cae577710164b7640d1d42b7cda4 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 10 Nov 2021 18:11:20 +1000
Subject: Fixes for Haiku
diff --git a/tgcalls/MediaManager.cpp b/tgcalls/MediaManager.cpp
index fd81ab1..73cdc47 100644
--- a/tgcalls/MediaManager.cpp
+++ b/tgcalls/MediaManager.cpp
@@ -964,7 +964,7 @@ void MediaManager::fillCallStats(CallStats &callStats) {
}
void MediaManager::setAudioInputDevice(std::string id) {
-#if defined(WEBRTC_IOS)
+#if defined(WEBRTC_IOS) || defined(__HAIKU__)
#else
SetAudioInputDeviceById(_audioDeviceModule.get(), id);
#endif
diff --git a/tgcalls/group/GroupInstanceCustomImpl.cpp b/tgcalls/group/GroupInstanceCustomImpl.cpp
index b3fcaea..6a7ac01 100644
--- a/tgcalls/group/GroupInstanceCustomImpl.cpp
+++ b/tgcalls/group/GroupInstanceCustomImpl.cpp
@@ -2791,7 +2791,7 @@ public:
}
void setAudioOutputDevice(const std::string &id) {
-#ifndef WEBRTC_IOS
+#if !defined(WEBRTC_IOS) && !defined(__HAIKU__)
_threads->getWorkerThread()->Invoke<void>(RTC_FROM_HERE, [&] {
SetAudioOutputDeviceById(_audioDeviceModule.get(), id);
});
@@ -2799,7 +2799,7 @@ public:
}
void setAudioInputDevice(const std::string &id) {
-#ifndef WEBRTC_IOS
+#if !defined(WEBRTC_IOS) && !defined(__HAIKU__)
_threads->getWorkerThread()->Invoke<void>(RTC_FROM_HERE, [&] {
SetAudioInputDeviceById(_audioDeviceModule.get(), id);
});
--
2.30.2