Compare commits

...

117 Commits

Author SHA1 Message Date
John Preston
9e1d5da5a1 version 0.6.14 2014-11-24 16:24:31 +03:00
John Preston
e97cc9f172 fixing http-transport crash 2014-11-24 16:21:27 +03:00
John Preston
3ce8d9f0b7 version 0.6.13 - new icon, critical bug fix in win version 2014-11-24 11:30:43 +03:00
John Preston
b23ffe6c94 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-24 11:23:47 +03:00
John Preston
276ef42c8f fixed crash in win version 2014-11-24 11:23:39 +03:00
John Preston
79a41d541d Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-24 11:23:20 +03:00
John Preston
61e3f9000b icon changed in mac version 2014-11-24 11:23:12 +03:00
John Preston
a4c13e0720 fixed Download button in mediaview 2014-11-24 10:54:06 +03:00
John Preston
a09460dc84 fixed emojis, now work like on iOS 2014-11-24 00:49:14 +03:00
John Preston
4bcfee22ef icon changed in win version 2014-11-23 14:20:40 +03:00
John Preston
880c2697d1 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-22 13:23:40 +03:00
John Preston
188e1b61c5 improved deploy bat 2014-11-22 13:23:30 +03:00
John Preston
696c5df092 improved deploy sh 2014-11-22 13:21:50 +03:00
John Preston
408b38b41f added localstorage to xcode project 2014-11-22 13:01:28 +03:00
John Preston
4a6b6fad77 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-22 12:46:12 +03:00
John Preston
f7fa13899f default recent emojis fixed 2014-11-22 12:45:54 +03:00
John Preston
f370e2b85d version 0.6.12 - local image cache, drafts, shared contact fix, some network fixes 2014-11-22 12:45:04 +03:00
John Preston
5d649f750b fixed maximize button in windows 2014-11-18 18:22:05 +03:00
John Preston
cfcf4d2336 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-18 16:59:38 +03:00
John Preston
922ab40c75 version 0.6.11 fixed photos click area 2014-11-18 16:59:18 +03:00
John Preston
2532245413 fixed xcode warning 2014-11-18 16:18:42 +03:00
John Preston
85ca7e0f05 version 0.6.10 prepared 2014-11-18 15:59:16 +03:00
John Preston
28c8d125cf Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-18 15:41:51 +03:00
John Preston
799a81966a min connection timeout 4secs, fixed photo display, thumbs size is less now, update button text and animation added 2014-11-18 15:41:33 +03:00
John Preston
6333bc59b1 fixed os x dark theme tray icon, added os x main menu 2014-11-18 15:40:43 +03:00
John Preston
d953f894a1 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-15 02:24:00 +03:00
John Preston
868b9843b0 version 0.6.9 - some network and protocol improvements, checkboxes in photos overview, other fixes 2014-11-15 02:23:35 +03:00
John Preston
c89f13bb53 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-13 21:32:24 +03:00
John Preston
722c801f8a fixed pspecific_linux 2014-11-13 10:32:06 -08:00
John Preston
269e588ad0 version 0.6.8 prepared 2014-11-13 21:32:03 +03:00
John Preston
4ee33d3bd9 added os x window icon and qt os x build fix to git 2014-11-13 21:26:39 +03:00
John Preston
85285d9862 fixed os x mouse input, window icon, qt os x build-from-source 2014-11-13 21:26:17 +03:00
John Preston
84226635b2 locations displayed as image links from google maps, killSession crash fixed 2014-11-13 14:27:10 +03:00
John Preston
8ed0cb7bf1 youtube and instagram links wrap fixed for os x 2014-11-13 01:35:00 +03:00
John Preston
55649ad6c4 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-11-12 23:30:32 +03:00
John Preston
379c5f75e7 os x setup done, fixing localtime on each os x wakeup or application active status change 2014-11-12 23:30:26 +03:00
John Preston
a75f57beb8 youtube and instagram preview display added (instead of messages with only one such link) 2014-11-12 23:18:00 +03:00
John Preston
e0ef1d434d version 0.6.7: invokeAfter, long messages split, protocol implementation improvements 2014-11-05 20:43:32 +03:00
John Preston
cdff62547b fixed to os x warnings 2014-10-31 15:57:32 +03:00
John Preston
5dc9cdbd3c version 0.6.6 - some network fixes and download/upload optimizations 2014-10-30 19:23:44 +03:00
John Preston
a8fd1c54c0 2x sprite updated 2014-10-30 19:14:03 +03:00
John Preston
cc45e06ea9 fixed some emojis not displayed in os x font 2014-10-25 19:40:20 +04:00
John Preston
898f8e66c1 fixed debug logs in os x crashes 2014-10-25 13:25:18 +04:00
John Preston
a9a01cf396 fixed << and >> for linux, global people search found part highlight 2014-10-23 20:05:33 +04:00
John Preston
0685cf34d3 fixed username save error 2014-10-23 00:27:49 +04:00
John Preston
4991b6743f Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-10-22 23:45:38 +04:00
John Preston
12ff311114 fixed settings on restart 2014-10-22 23:44:30 +04:00
John Preston
38f606b612 version 0.6.5 done for linux 2014-10-22 23:26:33 +04:00
John Preston
b4427a0073 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-10-22 23:02:01 +04:00
John Preston
f0900bc02e version 0.6.5: usernames 2014-10-22 23:01:13 +04:00
John Preston
5dfd499e07 usernames merged to os x and linux builds 2014-10-22 22:55:15 +04:00
John Preston
30ae073080 username support added, layer 18 2014-10-22 22:39:03 +04:00
John Preston
3daa74ff27 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-10-21 02:50:02 +04:00
John Preston
ccba1c8c6f some changes made to debug tl text serialize 2014-10-21 02:49:37 +04:00
John Preston
8f8a1e0d1f Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-10-17 23:49:31 +04:00
John Preston
ac81f16107 removed warning in linux 2014-10-17 23:49:02 +04:00
John Preston
ebe9b4f80f fixed os x 10.10 dragndrop 2014-10-17 23:14:42 +04:00
John Preston
b35b3bcb87 some template send improvements 2014-10-17 22:32:34 +04:00
John Preston
21a7e0243c fixed read history on msg forward 2014-10-17 19:18:57 +04:00
John Preston
8c668cfa24 version 0.6.4 prepared 2014-10-17 17:36:02 +04:00
John Preston
87d795807d added linux deploy script to git 2014-10-17 17:27:48 +04:00
John Preston
6377f59e23 added linux deploy script to git 2014-10-17 17:27:05 +04:00
John Preston
c81beeb023 fixed new photoviewer for linux 2014-10-17 17:24:17 +04:00
John Preston
f07606a0ce photoviewer updated, recent emojis filled with some by default 2014-10-17 16:57:14 +04:00
John Preston
e1adf54b36 fixed gif animations for wide gifs 2014-10-10 17:47:39 +04:00
John Preston
09e2fbaa6b inline gif view done, some design improvements, version 0.6.3 2014-10-10 16:46:20 +04:00
John Preston
3009200b76 fixed crash on logout 2014-10-08 11:45:32 +04:00
John Preston
e0910bfb3e fixed dialogs preloading on scroll 2014-10-08 11:42:36 +04:00
John Preston
d874609816 fixed mediaview zoom 2014-10-07 22:38:22 +04:00
John Preston
aebe171f55 0.6.2 version, context menus fixed, image documents view in overlay added 2014-10-07 21:57:57 +04:00
John Preston
c3a5194a6c fixed os x crash with tray icon disabled, fixed retina photos overview indicators 2014-09-30 15:50:35 -07:00
John Preston
9a3ea063c8 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-09-30 12:25:15 -07:00
John Preston
276e122b62 fixed context menus, version 0.6.1 2014-09-30 12:24:56 -07:00
John Preston
2c03abaa8e Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-09-30 11:33:08 -07:00
John Preston
fe87d45221 fixed os x photos display 2014-09-30 11:32:57 -07:00
John Preston
c216a888be 0.6 version prepared for linux build 2014-09-30 07:45:47 -07:00
John Preston
cb076e3587 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-09-30 07:13:52 -07:00
John Preston
1fd25e8778 fixed custom context menu for os x, fixed file drag-n-drop in os x 10.10 2014-09-30 07:13:47 -07:00
John Preston
311292c3a3 version 0.6 prepared, changed "Win (Unofficial)" to "Desktop", photo loader animation, custom context menu, default Downloads folder, cyclic logs 2014-09-30 07:11:09 -07:00
John Preston
0d85f91453 custom context menus (including tray menu for windows) done 2014-09-28 19:47:30 -07:00
John Preston
a4e9dadc2d mac tray icon/menu support improved, custom context menu started 2014-09-26 16:48:19 -07:00
John Preston
68a63e2217 prepared version 0.5.21 2014-09-21 20:57:21 -07:00
John Preston
40641133bc photos overview blur, multimonitor photoview fix, os x file dialog default path 2014-09-21 20:52:37 -07:00
John Preston
af9117e084 qt 5.3.1 patch updated for os x tray icon support, must rebuild qt 2014-09-20 16:20:53 -07:00
John Preston
8fcc9494fe prepared 0.5.20: photos blur, mac tray icon, apple emojis, win version signed 2014-09-20 14:52:47 -07:00
John Preston
08b9760939 Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-09-20 14:35:57 -07:00
John Preston
da0df57563 prepared win version sign, saving compress image checkbox state, not loaded images blur added 2014-09-20 14:35:46 -07:00
John Preston
b9ed9e0b6d moved to xcode 6 beta, emoji changed to apple default, tray icon on os x added 2014-09-20 14:31:03 -07:00
John Preston
67e74e7aed Merge branch 'master' of https://github.com/telegramdesktop/tdesktop 2014-09-06 16:35:34 +04:00
John Preston
fe536fa15b build instructions improved for qt creator 2014-09-06 16:35:17 +04:00
John Preston
cc971e6a3e using self built opus/ogg/openal 2014-09-06 15:03:25 +04:00
John Preston
1acbed1f7f up to 1mb voice messages autoload, fixed voice messages in app playing, version 0.5.19 2014-09-05 14:40:22 +04:00
John Preston
25c19812e1 prepared openal sound and voice messages in linux 2014-09-04 23:24:03 +04:00
John Preston
57cbc06fd8 openal audio and voice messages prepared for os x 2014-09-04 16:23:28 +04:00
John Preston
9bbc99a6b4 openal audio and voice messages 2014-09-04 11:33:44 +04:00
John Preston
90a9c92d38 enabled contact share from templates, copy phone number from context menu in profiles 2014-08-22 18:55:23 +04:00
John Preston
38e8e51ec5 fixed file sending from templates 2014-08-22 14:27:05 +04:00
John Preston
2a8bf173b2 supporting many templates files 2014-08-22 13:53:53 +04:00
John Preston
63c38712a9 added file, img+text and file+text templates support, file send confirm 2014-08-22 13:35:22 +04:00
John Preston
ceb899b69b ctrl+pageup/pagedown/tab/shift+tab now work in search results 2014-08-22 11:41:39 +04:00
John Preston
7bff0bcdb2 version 0.5.17 prepared: some crash fixes, multi media overview selection 2014-08-21 17:35:39 +04:00
John Preston
8a817eb204 media overview multiple selection done, fixed search result delete crash 2014-08-21 16:18:56 +04:00
John Preston
db7fa9ba2f multi select in media overview done properly 2014-08-20 23:13:00 +04:00
John Preston
dfb4d01015 multi select started in media overview 2014-08-20 09:32:50 +04:00
John Preston
c6423c0b65 some photo viewer fixes 2014-08-17 11:37:24 +04:00
John Preston
0a69ed37da OS X signing fixed 2014-08-15 17:31:03 +04:00
John Preston
be939201fd fixed media overview scroll init, version 0.5.16 2014-08-15 16:44:01 +04:00
John Preston
5ebe0056dd added media overview to linux version, fixed scroll, smooth photos overview thumbs 2014-08-15 16:19:18 +04:00
John Preston
a4728238bb fixed mediaview in os x, added mac sign shell script, os x media overview supported 2014-08-15 15:53:58 +04:00
John Preston
0b403c88ae Merge branch 'dev' 2014-08-15 15:21:38 +04:00
John Preston
a2179c77ba media overview almost done 2014-08-15 15:19:32 +04:00
John Preston
73b6ec8ff0 Merge branch 'dev' of https://github.com/telegramdesktop/tdesktop into dev 2014-08-12 00:54:45 +04:00
John Preston
ed3d5cf0ef removed code sign for now 2014-08-12 00:54:39 +04:00
John Preston
7f976fa251 0.5.15 version with fixes in photo viewer 2014-08-12 00:53:25 +04:00
John Preston
16d5e6e2f3 Merge branch 'dev' of https://github.com/telegramdesktop/tdesktop into dev 2014-08-12 00:16:02 +04:00
John Preston
771841a2aa fixed photos overview update on new messages 2014-08-12 00:15:31 +04:00
John Preston
3a9a79e2f1 added mediaview to Qt Creator project 2014-08-11 16:50:58 +04:00
1916 changed files with 30550 additions and 13683 deletions

54
MSVC.md
View File

@@ -66,6 +66,57 @@ or download in ZIP and extract to **D:\TBuild\Libraries\**, rename **libexif-0.6
* Build Debug configuration
* Build Release configuration
####OpenAL Soft
Get sources by git in [Git Bash](http://git-scm.com/downloads) go to **/d/tbuild/libraries** and run
git clone git://repo.or.cz/openal-soft.git
to have **D:\TBuild\Libraries\openal-soft\CMakeLists.txt**
#####Building library
* Install [CMake](http://www.cmake.org/)
* Go in **cmd** to **D:\TBuild\Libraries\openal-soft\build\**
* Run **cmake -G "Visual Studio 12 2013" -D LIBTYPE:STRING=STATIC ..**
* Open in VS2013 **D:\TBuild\Libraries\openal-soft\build\OpenAL.sln**
* For **Debug** configuration
* OpenAL32 Properties > C/C++ > Code Generation > Runtime Library = **Multi-threaded Debug (/MTd)** **OK**
* common Properties > C/C++ > Code Generation > Runtime Library = **Multi-threaded Debug (/MTd)** **OK**
* For **Release** configuration
* OpenAL32 Properties > C/C++ > Code Generation > Runtime Library = **Multi-threaded (/MT)** **OK**
* common Properties > C/C++ > Code Generation > Runtime Library = **Multi-threaded (/MT)** **OK**
####libogg 1.3.2
Get sources from http://xiph.org/downloads/ in [ZIP](http://downloads.xiph.org/releases/ogg/libogg-1.3.2.zip) and extract to **D:\TBuild\Libraries\**
#####Building library
* Open in VS2013 **D:\TBuild\Libraries\libogg-1.3.2\win32\VS2010\libogg_static.sln** > One-way upgrade **OK**
* Build Debug configuration
* Build Release configuration
####Opus codec, opusfile
Get sources by git in [Git Bash](http://git-scm.com/downloads) go to **/d/tbuild/libraries** and run
git clone git://git.opus-codec.org/opus.git
git clone git://git.xiph.org/opusfile.git
to have **D:\TBuild\Libraries\opus\win32**
#####Building libraries
* Open in VS2013 **D:\TBuild\Libraries\opus\win32\VS2010\opus.sln** > One-way upgrade **OK**
* Build Debug configuration
* Build Release configuration
* Open in VS2013 **D:\TBuild\Libraries\opusfile\win32\VS2010\opusfile.sln** > One-way upgrade **OK**
* For **Debug** and **Release** configurations
* opusfile > C/C++ > General > Additional include directories > Add **../../../libogg-1.3.2/include;**
* Build Debug configuration
* Build Release configuration
####Qt 5.3.1, slightly patched
http://download.qt-project.org/official_releases/qt/5.3/5.3.1/single/qt-everywhere-opensource-src-5.3.1.zip
@@ -86,8 +137,7 @@ There go to Qt directory
and after that run configure
configure -debug-and-release -opensource -static -opengl desktop -mp -nomake examples -platform win32-msvc2013
y
configure -debug-and-release -opensource -confirm-license -static -I "D:\TBuild\Libraries\OpenSSL-Win32\include" -L "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib" -l Gdi32 -opengl desktop -openssl-linked OPENSSL_LIBS_DEBUG="D:\TBuild\Libraries\OpenSSL-Win32\lib\VC\static\ssleay32MTd.lib D:\TBuild\Libraries\OpenSSL-Win32\lib\VC\static\libeay32MTd.lib" OPENSSL_LIBS_RELEASE="D:\TBuild\Libraries\OpenSSL-Win32\lib\VC\static\ssleay32MT.lib D:\TBuild\Libraries\OpenSSL-Win32\lib\VC\static\libeay32MT.lib" -mp -nomake examples -platform win32-msvc2013
to configure Qt build. After configuration is complete run

View File

@@ -32,6 +32,53 @@ Install dev libraries
sudo apt-get install libexif-dev liblzma-dev libz-dev libssl-dev
Install audio libraries
####libogg-1.3.2
[Download libogg-1.3.2 sources](http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.xz) from http://xiph.org/downloads, extract to **/home/user/TBuild/Libraries**, go to **/home/user/TBuild/Libraries/libogg-1.3.2** and run
./configure
make
sudo make install
####Opus codec 1.1
[Download opus-1.1 sources](http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz) from http://www.opus-codec.org/downloads, extract to **/home/user/TBuild/Libraries**, go to **/home/user/TBuild/Libraries/opus-1.1** and run
./configure
make
sudo make install
####opusfile-0.6
[Download opusfile-0.6 sources](http://downloads.xiph.org/releases/opus/opusfile-0.6.tar.gz) from http://www.opus-codec.org/downloads, extract to **/home/user/TBuild/Libraries**, go to **/home/user/TBuild/Libraries/opusfile-0.6** and run
./configure
make
sudo make install
####PortAudio 19
[Download portaudio sources](http://www.portaudio.com/archives/pa_stable_v19_20140130.tgz) from **http://www.portaudio.com/download.html**, extract to **/home/user/TBuild/Libraries**, go to **/home/user/TBuild/Libraries/portaudio** and run
./configure
make
sudo make install
####OpenAL Soft
In Terminal go to **/home/user/TBuild/Libraries** and run
git clone git://repo.or.cz/openal-soft.git
then go to **/home/user/TBuild/Libraries/openal-soft/build** and run
sudo apt-get install cmake
cmake -D LIBTYPE:STRING=STATIC ..
make
sudo make install
####Qt 5.3.1, slightly patched
http://download.qt-project.org/official_releases/qt/5.3/5.3.1/single/qt-everywhere-opensource-src-5.3.1.tar.gz
@@ -49,7 +96,6 @@ Install some packages for Qt (see **/home/user/TBuild/Libraries/QtStatic/qtbase/
In Terminal go to **/home/user/TBuild/Libraries/QtStatic** and there run
./configure -release -opensource -confirm-license -qt-xcb -no-opengl -static -nomake examples -skip qtquick1 -skip qtdeclarative
y
make
sudo make install

View File

@@ -26,6 +26,9 @@ Source code is published under GPL v3, license is available [here](https://githu
* libexif 0.6.20 ([LGPL](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html))
* LZMA SDK 9.20 ([public domain](http://www.7-zip.org/sdk.html))
* liblzma ([public domain](http://tukaani.org/xz/))
* OpenAL Soft ([LGPL](http://kcat.strangesoft.net/openal.html))
* Opus codec, opusfile ([BSD license](http://www.opus-codec.org/license/))
* libogg ([BSD license](http://www.xiph.org/downloads/))
* Open Sans font ([Apache License](http://www.apache.org/licenses/LICENSE-2.0.html))
* DejaVu Sans font ([Free license](http://dejavu-fonts.org/wiki/License))

16
Telegram/DeployLinux.sh Executable file
View File

@@ -0,0 +1,16 @@
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ ! -f "./../Linux/Release/deploy/$AppVersionStr/tlinuxupd$AppVersion" ]; then
echo "tlinuxupd$AppVersion not found!";
exit 1
fi
if [ ! -f "./../Linux/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.tar.xz" ]; then
echo "tsetup.$AppVersionStr.tar.xz not found!"
exit 1
fi
scp ./../Linux/Release/deploy/$AppVersionStr/tlinuxupd$AppVersion tupdates:tdesktop/static/tlinux/
scp ./../Linux/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.tar.xz tupdates:tdesktop/static/tlinux/

16
Telegram/DeployLinux32.sh Executable file
View File

@@ -0,0 +1,16 @@
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ ! -f "./../Linux/Release/deploy/$AppVersionStr/tlinux32upd$AppVersion" ]; then
echo "tlinux32upd$AppVersion not found!"
exit 1
fi
if [ ! -f "./../Linux/Release/deploy/$AppVersionStr/tsetup32.$AppVersionStr.tar.xz" ]; then
echo "tsetup32.$AppVersionStr.zip not found!"
exit 1
fi
scp ./../Linux/Release/deploy/$AppVersionStr/tlinux32upd$AppVersion tupdates:tdesktop/static/tlinux32/
scp ./../Linux/Release/deploy/$AppVersionStr/tsetup32.$AppVersionStr.tar.xz tupdates:tdesktop/static/tlinux32/

34
Telegram/DeployMacWin.sh Executable file
View File

@@ -0,0 +1,34 @@
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ ! -f "./../Mac/Release/deploy/$AppVersionStr/tmacupd$AppVersion" ]; then
echo "tmacupd$AppVersion not found!"
exit 1
fi
if [ ! -f "./../Mac/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.dmg" ]; then
echo "tsetup.$AppVersionStr.dmg not found!"
exit 1
fi
if [ ! -f "./../../tother/tsetup/tupdate$AppVersion" ]; then
echo "tupdate$AppVersion not found!"
exit 1
fi
if [ ! -f "./../../tother/tsetup/tportable.$AppVersionStr.zip" ]; then
echo "tportable.$AppVersionStr.zip not found!"
exit 1
fi
if [ ! -f "./../../tother/tsetup/tsetup.$AppVersionStr.exe" ]; then
echo "tsetup.$AppVersionStr.exe not found!"
exit 1
fi
scp ./../Mac/Release/deploy/$AppVersionStr/tmacupd$AppVersion tupdates:tdesktop/static/tmac/
scp ./../Mac/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.dmg tupdates:tdesktop/static/tmac/
scp ./../../tother/tsetup/tupdate$AppVersion tupdates:tdesktop/static/tsetup/
scp ./../../tother/tsetup/tportable.$AppVersionStr.zip tupdates:tdesktop/static/tsetup/
scp ./../../tother/tsetup/tsetup.$AppVersionStr.exe tupdates:tdesktop/static/tsetup/

21
Telegram/DeployWin.sh Normal file
View File

@@ -0,0 +1,21 @@
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ ! -f "./../Win32/Deploy/deploy/$AppVersionStr/tupdate$AppVersion" ]; then
echo "tupdate$AppVersion not found!"
exit 1
fi
if [ ! -f "./../Win32/Deploy/deploy/$AppVersionStr/tportable.$AppVersionStr.zip" ]; then
echo "tportable.$AppVersionStr.zip not found!"
exit 1
fi
if [ ! -f "./../Win32/Deploy/deploy/$AppVersionStr/tsetup.$AppVersionStr.exe" ]; then
echo "tsetup.$AppVersionStr.exe not found!"
exit 1
fi
cp -v ./../Win32/Deploy/deploy/$AppVersionStr/tupdate$AppVersion /z/TBuild/tother/tsetup/
cp -v ./../Win32/Deploy/deploy/$AppVersionStr/tportable.$AppVersionStr.zip /z/TBuild/tother/tsetup/
cp -v ./../Win32/Deploy/deploy/$AppVersionStr/tsetup.$AppVersionStr.exe /z/TBuild/tother/tsetup/

View File

@@ -14,4 +14,7 @@ sed -i 's/\-lssl/\/usr\/lib\/x86_64\-linux\-gnu\/libssl\.a/g' Makefile
sed -i 's/\-lcrypto/\/usr\/lib\/x86_64\-linux\-gnu\/libcrypto\.a/g' Makefile
sed -i 's/\-lexif/\/usr\/lib\/x86_64\-linux\-gnu\/libexif\.a/g' Makefile
sed -i 's/\-lglib\-2\.0/\/usr\/lib\/x86_64\-linux\-gnu\/libglib\-2\.0\.a/g' Makefile
sed -i 's/\-lopusfile/\/usr\/local\/lib\/libopusfile\.a/g' Makefile
sed -i 's/\-lopus/\/usr\/local\/lib\/libopus\.a/g' Makefile
sed -i 's/\-lopenal/\/usr\/local\/lib\/libopenal\.a/g' Makefile
sed -i 's/\-logg/\/usr\/local\/lib\/libogg\.a/g' Makefile

View File

@@ -14,4 +14,7 @@ sed -i 's/\-lssl/\/usr\/lib\/i386\-linux\-gnu\/libssl\.a/g' Makefile
sed -i 's/\-lcrypto/\/usr\/lib\/i386\-linux\-gnu\/libcrypto\.a/g' Makefile
sed -i 's/\-lexif/\/usr\/lib\/i386\-linux\-gnu\/libexif\.a/g' Makefile
sed -i 's/\-lglib\-2\.0/\/usr\/lib\/i386\-linux\-gnu\/libglib\-2\.0\.a/g' Makefile
sed -i 's/\-lopusfile/\/usr\/local\/lib\/libopusfile\.a/g' Makefile
sed -i 's/\-lopus/\/usr\/local\/lib\/libopus\.a/g' Makefile
sed -i 's/\-lopenal/\/usr\/local\/lib\/libopenal\.a/g' Makefile
sed -i 's/\-logg/\/usr\/local\/lib\/libogg\.a/g' Makefile

View File

@@ -515,7 +515,7 @@
6DB9C3763D02B1415CD9D565 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0610;
};
buildConfigurationList = DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "MetaEmoji" */;
compatibilityVersion = "Xcode 3.2";
@@ -575,25 +575,27 @@
isa = XCBuildConfiguration;
buildSettings = {
CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_BOOL_CONVERSION = NO;
CLANG_WARN_CONSTANT_CONVERSION = NO;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = NO;
CLANG_WARN_INT_CONVERSION = NO;
CLANG_WARN_UNREACHABLE_CODE = NO;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Emoji$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = YES;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GCC_WARN_UNUSED_FUNCTION = NO;
GCC_WARN_UNUSED_VARIABLE = NO;
HEADER_SEARCH_PATHS = (
../../Libraries/QtStatic/qtbase/include/QtGui/5.3.1/QtGui,
../../Libraries/QtStatic/qtbase/include/QtCore/5.3.1/QtCore,
@@ -660,27 +662,29 @@
isa = XCBuildConfiguration;
buildSettings = {
CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_BOOL_CONVERSION = NO;
CLANG_WARN_CONSTANT_CONVERSION = NO;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = NO;
CLANG_WARN_INT_CONVERSION = NO;
CLANG_WARN_UNREACHABLE_CODE = NO;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Emoji$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GCC_WARN_UNUSED_FUNCTION = NO;
GCC_WARN_UNUSED_VARIABLE = NO;
HEADER_SEARCH_PATHS = (
../../Libraries/QtStatic/qtbase/include/QtGui/5.3.1/QtGui,
../../Libraries/QtStatic/qtbase/include/QtCore/5.3.1/QtCore,

View File

@@ -516,7 +516,7 @@
6DB9C3763D02B1415CD9D565 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0610;
};
buildConfigurationList = DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "MetaLang" */;
compatibilityVersion = "Xcode 3.2";
@@ -594,11 +594,13 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Lang$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = YES;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
@@ -679,12 +681,14 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Lang$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;

View File

@@ -516,7 +516,7 @@
6DB9C3763D02B1415CD9D565 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0610;
};
buildConfigurationList = DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "MetaStyle" */;
compatibilityVersion = "Xcode 3.2";
@@ -594,11 +594,13 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Style$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = YES;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
@@ -679,12 +681,14 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)Style$(EFFECTIVE_PLATFORM_NAME)";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;

View File

@@ -483,7 +483,7 @@
6DB9C3763D02B1415CD9D565 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0610;
};
buildConfigurationList = DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "Packer" */;
compatibilityVersion = "Xcode 3.2";
@@ -546,10 +546,12 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
@@ -634,11 +636,13 @@
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_COMPATIBILITY_VERSION = 1.0;
DYLIB_CURRENT_VERSION = 1.0.0;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;

View File

@@ -1,5 +1,5 @@
AppVersionStr=0.5.14
AppVersion=5014
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ -d "./../Linux/Release/deploy/$AppVersionStr" ]; then
echo "Deploy folder for version $AppVersionStr already exists!"

View File

@@ -1,5 +1,5 @@
AppVersionStr=0.5.14
AppVersion=5014
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
if [ -d "./../Linux/Release/deploy/$AppVersionStr" ]; then
echo "Deploy folder for version $AppVersionStr already exists!"

View File

@@ -1,5 +1,9 @@
AppVersionStr=0.5.14
AppVersion=5014
AppVersion=`./Version.sh | awk -F " " '{print $1}'`
AppVersionStr=`./Version.sh | awk -F " " '{print $2}'`
echo ""
echo "Preparing version $AppVersionStr.."
echo ""
if [ -d "./../Mac/Release/deploy/$AppVersionStr" ]; then
echo "Deploy folder for version $AppVersionStr already exists!"
@@ -31,18 +35,26 @@ if [ ! -f "./../Mac/Release/Telegram.app/Contents/Frameworks/Updater" ]; then
exit 1
fi
if [ ! -f "./../Mac/Release/Telegram.app.dmg" ]; then
echo "Telegram.app.dmg not found!"
cd ./../Mac/Release && codesign --force --deep --sign "Developer ID Application: John Preston" Telegram.app && cd ./../../Telegram
if [ ! -d "./../Mac/Release/Telegram.app/Contents/_CodeSignature" ]; then
echo "Telegram signature not found!"
exit 1
fi
echo "Preparing version $AppVersionStr, executing Packer.."
cd ./../Mac/Release
temppath=`hdiutil attach -readwrite tsetup.dmg | awk -F "\t" 'END {print $3}'`
cp -R ./Telegram.app "$temppath/"
bless --folder "$temppath/" --openfolder "$temppath/"
hdiutil detach "$temppath"
hdiutil convert tsetup.dmg -format UDZO -imagekey zlib-level=9 -ov -o tsetup.$AppVersionStr.dmg
cd ./../../Telegram
cd ./../Mac/Release && ./Packer.app/Contents/MacOS/Packer -path Telegram.app -version $AppVersion && cd ./../../Telegram
echo "Packer done!"
if [ ! -d "./../Mac/Release/deploy/" ]; then
mkdir "./../Mac/Release/deploy"
fi
echo "Copying Telegram.app and tmacupd$AppVersion to deploy/$AppVersionStr..";
mkdir "./../Mac/Release/deploy/$AppVersionStr"
mkdir "./../Mac/Release/deploy/$AppVersionStr/Telegram"
@@ -50,6 +62,6 @@ cp -r ./../Mac/Release/Telegram.app ./../Mac/Release/deploy/$AppVersionStr/Teleg
rm ./../Mac/Release/Telegram.app/Contents/MacOS/Telegram
rm ./../Mac/Release/Telegram.app/Contents/Frameworks/Updater
mv ./../Mac/Release/tmacupd$AppVersion ./../Mac/Release/deploy/$AppVersionStr/
mv ./../Mac/Release/Telegram.app.dmg ./../Mac/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.dmg
mv ./../Mac/Release/tsetup.$AppVersionStr.dmg ./../Mac/Release/deploy/$AppVersionStr/tsetup.$AppVersionStr.dmg
echo "Version $AppVersionStr prepared!";

View File

@@ -1,3 +1,49 @@
@echo OFF
set "AppVersionStrSmall=0.6.14"
set "AppVersionStr=0.6.14"
set "AppVersionStrFull=0.6.14.0"
echo.
echo Preparing version %AppVersionStr%..
echo.
set "PATH=%PATH%;C:\Program Files\7-Zip;C:\Program Files (x86)\Inno Setup 5"
cd ..\Win32\Deploy
Prepare.exe -path Telegram.exe -path Updater.exe
call ..\..\..\TelegramPrivate\Sign.bat Telegram.exe
if %errorlevel% neq 0 goto error1
call ..\..\..\TelegramPrivate\Sign.bat Updater.exe
if %errorlevel% neq 0 goto error1
iscc /dMyAppVersion=%AppVersionStrSmall% /dMyAppVersionZero=%AppVersionStr% /dMyAppFullVersion=%AppVersionStrFull% ..\..\Telegram\Setup.iss
if %errorlevel% neq 0 goto error1
call ..\..\..\TelegramPrivate\Sign.bat tsetup.%AppVersionStr%.exe
if %errorlevel% neq 0 goto error1
call Prepare.exe -path Telegram.exe -path Updater.exe
if %errorlevel% neq 0 goto error1
cd deploy\%AppVersionStr%
mkdir Telegram
move Telegram.exe Telegram\
7z a -mx9 tportable.%AppVersionStr%.zip Telegram\
if %errorlevel% neq 0 goto error2
echo .
echo Version %AppVersionStr% is ready for deploy!
echo .
cd ..\..\..\..\Telegram
goto eof
:error2
cd ..\..
:error1
cd ..\..\Telegram
echo ERROR occured!
exit /b %errorlevel%
:eof

View File

@@ -22,8 +22,10 @@ lng_maintitle: "Telegram D";
lng_menu_contacts: "Contacts";
lng_menu_settings: "Settings";
lng_menu_about: "About";
lng_menu_update: "Update";
lng_open_from_tray: "Open Telegram";
lng_minimize_to_tray: "Minimize to tray";
lng_quit_from_tray: "Quit Telegram";
lng_tray_icon_text: "Telegram is still running here,
you can change this from settings page.
@@ -56,11 +58,15 @@ lng_month_day: "{month} {day}";
lng_cancel: "Cancel";
lng_continue: "Continue";
lng_connecting: "Connecting...";
lng_reconnecting: "Reconnect in %1 s...";
lng_connecting: "Connecting..";
lng_reconnecting: "Reconnect in %1 s..";
lng_reconnecting_try_now: "Try now";
lng_status_offline: "offline";
lng_status_service_notifications: "service notifications";
lng_status_offline: "last seen a long time ago";
lng_status_recently: "last seen recently";
lng_status_last_week: "last seen within a week";
lng_status_last_month: "last seen within a month";
lng_status_invisible: "invisible";
lng_status_lastseen: "last seen {when}";
lng_status_lastseen_now: "just now";
@@ -73,6 +79,7 @@ lng_status_lastseen_yesterday: "yesterday at {time}";
lng_status_lastseen_date: "{date}";
lng_status_lastseen_date_time: "{date} at {time}";
lng_status_online: "online";
lng_status_connecting: "connecting..";
lng_chat_no_members: "Group is unaccessible";
lng_chat_members: "%1 members";
@@ -108,7 +115,7 @@ lng_code_ph: "Your code";
lng_code_desc: "We have sent you an SMS with activation
code to your phone. Please enter it below.";
lng_code_call: "Telegram will dial your number in %1:%2";
lng_code_calling: "Requesting a call from Telegram...";
lng_code_calling: "Requesting a call from Telegram..";
lng_code_called: "Telegram dialed your number";
lng_bad_phone: "Invalid phone number. Please try again.";
@@ -135,7 +142,25 @@ lng_settings_cancel: "Cancel";
lng_settings_upload: "Set Profile Photo";
lng_settings_badsize: "This image has bad size, please try other.";
lng_settings_crop_profile: "Select square area for your profile photo";
lng_settings_uploading_photo: "Uploading photo...";
lng_settings_uploading_photo: "Uploading photo..";
lng_username_title: "Change username";
lng_username_about: "You can choose a username on Telegram.
If you do, other people will be able to find
you by this username and contact you
without knowing your phone number.
You can use a-z, 0-9 and underscores.
Minimum length is 5 characters.";
lng_username_invalid: "This name is invalid.";
lng_username_occupied: "This name is already occupied.";
lng_username_too_short: "This name is too short.";
lng_settings_section_contact_info: "Contact info";
lng_settings_phone_number: "Phone number:";
lng_settings_username: "Username:";
lng_settings_choose_username: "choose username";
lng_settings_change_username: "Change";
lng_settings_section_notify: "Notifications";
lng_settings_desktop_notify: "Desktop notifications";
@@ -150,9 +175,9 @@ lng_settings_section_general: "General";
lng_settings_auto_update: "Update automatically";
lng_settings_current_version: "Version {version}";
lng_settings_check_now: "Check for updates";
lng_settings_update_checking: "Checking for updates...";
lng_settings_update_checking: "Checking for updates..";
lng_settings_latest_installed: "Latest version is installed";
lng_settings_downloading: "Downloading update {ready} / {total} Mb...";
lng_settings_downloading: "Downloading update {ready} / {total} Mb..";
lng_settings_update_ready: "New version is ready";
lng_settings_update_now: "Restart Now";
lng_settings_update_fail: "Update check failed :(";
@@ -176,8 +201,10 @@ lng_settings_cats_and_dogs: "Allow cats and dogs";
lng_download_path_dont_ask: "Don't ask download path for each file";
lng_download_path_label: "Download path: ";
lng_download_path_temp: "temp folder";
lng_download_path_default: "default folder";
lng_download_path_clear: "Clear All";
lng_download_path_header: "Choose download path";
lng_download_path_default_radio: "Telegram folder in system «Downloads»";
lng_download_path_temp_radio: "Temp folder, cleared on logout or uninstall";
lng_download_path_dir_radio: "Custom folder, cleared only manually";
lng_download_path_choose: "Choose download path";
@@ -189,10 +216,19 @@ lng_download_path_settings: "Go to Settings";
lng_download_finish_failed: "File download could not be finished.
Would you like to try again?";
lng_download_path_clearing: "Clearing...";
lng_download_path_clearing: "Clearing..";
lng_download_path_cleared: "Cleared!";
lng_download_path_clear_failed: "Clear failed :(";
lng_settings_section_cache: "Local storage";
lng_settings_no_images_cached: "No cached images found!";
lng_settings_image_cached: "Cached: {count} image, {size}";
lng_settings_images_cached: "Cached: {count} images, {size}";
lng_local_images_clear: "Clear All";
lng_local_images_clearing: "Clearing..";
lng_local_images_cleared: "Cleared!";
lng_local_images_clear_failed: "Clear failed :(";
lng_settings_section_advanced: "Advanced";
lng_connection_type: "Connection type:";
lng_connection_auto_connecting: "Default (connecting..)";
@@ -211,6 +247,7 @@ lng_connection_save: "Save";
lng_settings_reset: "Reset other sessions";
lng_settings_reset_done: "Sessions reset done";
lng_settings_logout: "Log Out";
lng_sure_logout: "Are you sure you want to log out?";
lng_settings_need_restart: "You need to restart for applying
some of the new settings. Restart now?";
@@ -235,7 +272,23 @@ lng_profile_add_participant: "Add Member";
lng_profile_delete_and_exit: "Leave";
lng_profile_kick: "Kick";
lng_profile_sure_kick: "Kick {user} from the group?";
lng_profile_loading: "Loading...";
lng_profile_loading: "Loading..";
lng_profile_shared_media: "Shared media";
lng_profile_no_media: "No media in this conversation.";
lng_profile_photo: "{count} photo »";
lng_profile_photos: "{count} photos »";
lng_profile_photos_header: "Photos overview";
lng_profile_video: "{count} video file »";
lng_profile_videos: "{count} video files »";
lng_profile_videos_header: "Video files overview";
lng_profile_document: "{count} document »";
lng_profile_documents: "{count} documents »";
lng_profile_documents_header: "Documents overview";
lng_profile_audio: "{count} voice message »";
lng_profile_audios: "{count} voice messages »";
lng_profile_audios_header: "Voice messages overview";
lng_profile_show_all_types: "Show all types";
lng_profile_copy_phone: "Copy phone number";
lng_participant_filter: "Search";
lng_participant_invite: "Invite";
@@ -273,24 +326,30 @@ lng_action_checked_in: "{from} checked in";
lng_forwarded_from: "Forwarded from ";
lng_attach_failed: "Failed";
lng_attach_file: "File";
lng_attach_file: "Document";
lng_attach_photo: "Photo";
lng_media_type: "Media type";
lng_media_type_photos: "Photos";
lng_media_type_videos: "Video files";
lng_media_type_documents: "Documents";
lng_media_type_audios: "Voice messages";
lng_media_open_with: "Open With";
lng_media_download: "Download";
lng_media_cancel: "Cancel";
lng_media_video: "Video";
lng_media_audio: "Audio";
lng_media_video: "Video file";
lng_media_audio: "Voice message";
lng_in_dlg_photo: "Photo";
lng_in_dlg_video: "Video";
lng_in_dlg_geo: "Map";
lng_in_dlg_contact: "Contact";
lng_in_dlg_audio: "Audio";
lng_in_dlg_document: "File";
lng_in_dlg_document: "Document";
lng_send_button: "Send";
lng_message_ph: "Write a message...";
lng_message_ph: "Write a message..";
lng_empty_history: "";
lng_willbe_history: "Please select chat to start messaging";
lng_message_with_from: "[c]{from}:[/c] {message}";
@@ -318,7 +377,7 @@ lng_context_copy_email: "Copy email address";
lng_context_open_hashtag: "Search by hashtag";
lng_context_copy_hashtag: "Copy hashtag";
lng_context_open_image: "Open Image";
lng_context_save_image: "Save Image As...";
lng_context_save_image: "Save Image As..";
lng_context_forward_image: "Forward Image";
lng_context_delete_image: "Delete Image";
lng_context_copy_image: "Copy Image";
@@ -327,23 +386,30 @@ lng_context_cancel_download: "Cancel Download";
lng_context_show_in_folder: "Show in Folder";
lng_context_show_in_finder: "Show in Finder";
lng_context_open_video: "Open Video";
lng_context_save_video: "Save Video As...";
lng_context_save_video: "Save Video As..";
lng_context_open_audio: "Open Audio";
lng_context_save_audio: "Save Audio As...";
lng_context_save_audio: "Save Audio As..";
lng_context_open_document: "Open File";
lng_context_save_document: "Save File As...";
lng_context_save_document: "Save File As..";
lng_context_forward_file: "Forward File";
lng_context_delete_file: "Delete File";
lng_context_close_file: "Close File";
lng_context_copy_text: "Copy Message Text";
lng_context_to_msg: "Go To Message";
lng_context_forward_msg: "Forward Message";
lng_context_delete_msg: "Delete Message";
lng_context_select_msg: "Select Message";
lng_context_cancel_upload: "Cancel Upload";
lng_context_copy_selected: "Copy Selected Text";
lng_context_forward_selected: "Forward Selected";
lng_context_delete_selected: "Delete Selected";
lng_context_clear_selection: "Clear Selection";
lng_really_send_image: "Do you want to send this image?";
lng_really_send_file: "Do you want to send this file?";
lng_really_share_contact: "Do you want to share this contact?";
lng_send_image_compressed: "Send compressed image";
lng_forward_choose: "Choose recipient...";
lng_forward_choose: "Choose recipient..";
lng_forward_confirm: "Forward to {recipient}?";
lng_forward_share_contact: "Share contact to {recipient}?";
lng_forward_send_file_confirm: "Send «{name}» to {recipient}?";
@@ -398,15 +464,18 @@ lng_about_done: "Done";
lng_search_no_results: "No messages found";
lng_search_one_result: "Found {count} message";
lng_search_n_results: "Found {count} messages";
lng_search_global_results: "Global search results";
lng_mediaview_close: "Close";
lng_mediaview_save: "Save as";
lng_mediaview_save: "Download";
lng_mediaview_forward: "Forward";
lng_mediaview_delete: "Delete";
lng_mediaview_single_photo: "Single Photo";
lng_mediaview_group_photo: "Group Photo";
lng_mediaview_profile_photo: "Profile Photo";
lng_mediaview_n_of_count: "{n} of {count}";
lng_mediaview_n_of_count: "Photo {n} of {count}";
lng_mediaview_doc_image: "Document";
lng_mediaview_saved: "Image was saved to your [c]Downloads[/c] folder";
// Mac specific
@@ -419,5 +488,21 @@ lng_mac_always_open_with: "Always Open With";
lng_mac_this_app_can_open: "This application can open \"{file}\".";
lng_mac_not_known_app: "It's not known if this application can open \"{file}\".";
// Keys finished
lng_mac_menu_about: "About Telegram";
lng_mac_menu_preferences: "Preferences...";
lng_mac_menu_file: "File";
lng_mac_menu_logout: "Log Out";
lng_mac_menu_edit: "Edit";
lng_mac_menu_undo: "Undo";
lng_mac_menu_redo: "Redo";
lng_mac_menu_cut: "Cut";
lng_mac_menu_copy: "Copy";
lng_mac_menu_paste: "Paste";
lng_mac_menu_delete: "Delete";
lng_mac_menu_select_all: "Select All";
lng_mac_menu_window: "Window";
lng_mac_menu_contacts: "Contacts";
lng_mac_menu_new_group: "New Group";
lng_mac_menu_show: "Show Telegram";
// Keys finished

View File

@@ -20,15 +20,16 @@ semibold: 'Open Sans Semibold';
fsize: 13px;
spriteFile: ':/gui/art/sprite.png' / 2:':/gui/art/sprite_125x.png' / 3:':/gui/art/sprite_150x.png' / 4:':/gui/art/sprite_200x.png'; // exceptional value for retina
emojisFile: ':/gui/art/emoji.png' / 2:':/gui/art/emoji_125x.png' / 3:':/gui/art/emoji_150x.png' / 4:':/gui/art/emoji_200x.png'; // exceptional value for retina
emojiImgSize: 16px; // exceptional value for retina
emojiSize: 16px;
emojiPadding: 1px;
spriteFile: ':/gui/art/sprite.png' / 2:':/gui/art/sprite_125x.png' / 3:':/gui/art/sprite_150x.png' / 4:':/gui/art/sprite_200x.png';
emojisFile: ':/gui/art/emoji.png' / 2:':/gui/art/emoji_125x.png' / 3:':/gui/art/emoji_150x.png' / 4:':/gui/art/emoji_200x.png';
emojiImgSize: 18px; // exceptional value for retina
emojiSize: 18px;
emojiPadding: 0px;
counterBG: #b42f35;
counterMuteBG: #777;
counterBG: #f23c34;
counterMuteBG: #888;
counterColor: #fff;
counterMacInvColor: #ffffff01;
lineWidth: 1px;
@@ -85,6 +86,7 @@ sysUpd: sysButton {
overColor: white;
duration: 150;
}
updateBlinkDuration: 500;
sysMin: sysButton(sysUpd) {
img: sprite(207px, 1px, 19px, 19px);
}
@@ -243,9 +245,9 @@ inpDefFlat: flatInput {
}
inpDefGray: flatInput(inpDefFlat) {
bgColor: #ebebeb;
bgColor: #f2f2f2;
borderWidth: 2px;
borderColor: #ebebeb;
borderColor: #f2f2f2;
borderActive: #80cff9;
borderError: #ed8080;
phColor: #808080;
@@ -373,7 +375,7 @@ introCountry: countryInput {
width: 300px;
height: 41px;
top: 24px;
bgColor: #ebebeb;
bgColor: #f2f2f2;
ptrSize: size(15px, 8px);
textMrg: margins(16px, 5px, 16px, 15px);
font: inpDefFont;
@@ -445,7 +447,7 @@ countryList: countryList {
color: #000;
codeColor: #aaaaaa;//rgb(20, 136, 210);
bgColor: #FFF;
bgHovered: #f1f1f1;
bgHovered: #f5f5f5;
margin: 13px;
codeWidth: 60px;
@@ -483,10 +485,9 @@ setTop: 26px;
setNameLeft: 3px;
setNameTop: 1px;
setNameFont: font(22px);
setPhoneFont: font(16px);
setPhoneColor: #999;
setPhoneTop: 39px;
setPhoneLeft: 1px;
setStatusTop: 39px;
setStatusLeft: 1px;
setStatusFont: font(16px);
setPhotoSize: 120px;
setHeaderFont: font(20px);
setHeaderColor: black;
@@ -753,6 +754,7 @@ msgFont: font(fsize);
msgNameFont: font(fsize semibold);
msgServiceFont: font(fsize semibold);
msgServiceNameFont: font(fsize semibold);
msgServicePhotoWidth: 100px;
msgDateFont: font(13px);
msgMinWidth: 190px;
msgPhotoSize: 30px;
@@ -839,6 +841,10 @@ outTextStyle: textStyle(defaultTextStyle) {
selectBG: msgOutSelectBG;
selectOverlay: msgOutSelectOverlay;
}
medviewSaveAsTextStyle: textStyle(defaultTextStyle) {
lnkColor: #91d9ff;
lnkDownColor: #91d9ff;
}
dlgTextStyle: textStyle(defaultTextStyle) {
lnkColor: dlgSystemColor;
@@ -855,23 +861,29 @@ mediaMaxWidth: 250px;
mediaFont: font(fsize);
mediaPadding: margins(7px, 6px, 11px, 6px);
mediaThumbSize: 48px;
mediaNameTop: 3px;
mediaDetailsShift: 3px;
mediaDocOutImg: sprite(6px, 146px, 48px, 48px);
mediaDocInImg: sprite(56px, 146px, 48px, 48px);
mediaAudioOutImg: sprite(106px, 146px, 48px, 48px);
mediaAudioInImg: sprite(156px, 146px, 48px, 48px);
mediaPlayOutImg: sprite(122px, 341px, 48px, 48px);
mediaPlayInImg: sprite(172px, 341px, 48px, 48px);
mediaPauseOutImg: sprite(222px, 341px, 48px, 48px);
mediaPauseInImg: sprite(272px, 341px, 48px, 48px);
mediaInColor: msgInDateColor;
mediaOutColor: msgOutDateColor;
mediaInSelectColor: msgInSelectDateColor;
mediaOutSelectColor: msgOutSelectDateColor;
mediaSaveDelta: 14px; // between bubble and download
mediaSaveButton: flatButton(btnDefFlat) {
color: btnYesColor;
overColor: btnYesHover;
downColor: btnYesHover;
color: #507da2;
overColor: #507da2;
downColor: #507da2;
bgColor: white;
overBgColor: btnWhiteHover;
downBgColor: btnWhiteHover;
overBgColor: #f5f8fa;
downBgColor: #f5f8fa;
width: -28px;
height: 34px;
@@ -935,7 +947,7 @@ historyScroll: flatScroll(scrollDef) {
barOverColor: #89a0b4bc;
bgOverColor: #89a0b46b;
round: 2px;
round: 0px;
width: 12px;
deltax: 3px;
@@ -1066,7 +1078,7 @@ profileListPhotoSize: 46px;
profileListPadding: size(12px, 6px);
profileListNameTop: 8px;
profileListStatusBottom: 6px;
profileHoverBG: #f1f1f1;
profileHoverBG: #f5f5f5;
profileActiveBG: #6294b9;
profileSubFont: font(fsize);
profileCheckRect: sprite(88px, 108px, 24px, 24px);
@@ -1215,7 +1227,7 @@ contactsClose: flatButton {
overColor: btnYesHover;
downColor: btnYesHover;
bgColor: #fffe;
bgColor: white;
overBgColor: white;
downBgColor: white;
@@ -1303,6 +1315,20 @@ dropdownAttachPhoto: iconedButton(dropdownAttachDocument) {
icon: sprite(113px, 0px, 24px, 24px);
downIcon: sprite(113px, 0px, 24px, 24px);
}
dropdownMediaPhotos: iconedButton(dropdownAttachPhoto) {
width: 200px;
}
dropdownMediaVideos: iconedButton(dropdownMediaPhotos) {
icon: sprite(79px, 348px, 24px, 24px);
downIcon: sprite(79px, 348px, 24px, 24px);
}
dropdownMediaDocuments: iconedButton(dropdownAttachDocument) {
width: 200px;
}
dropdownMediaAudios: iconedButton(dropdownMediaDocuments) {
icon: sprite(49px, 348px, 24px, 24px);
downIcon: sprite(49px, 348px, 24px, 24px);
}
dragFont: font(28px semibold);
dragSubfont: font(20px semibold);
@@ -1441,45 +1467,115 @@ emojiPanDuration: 200;
emojiPanHover: #f0f0f0;
emojiPanRound: 2px;
medviewNavBarWidth: 120px;
medviewTopSkip: 66px;
medviewBottomSkip: 66px;
medviewMainWidth: 600px;
medviewLightOpacity: 0.7;
medviewDarkOpacity: 0.8;
medviewNavBarWidth: 132px;
medviewLightNav: 0.5;
medviewHeaderFont: font(semibold 18px);
medviewDateFont: font(fsize);
medviewNameTop: 3px;
medviewDateTop: 25px;
medviewHeaderColor: #ffffffc0;
medviewNameColor: medviewHeaderColor;
medviewNameOverColor: #fff;
medviewDarkNav: 1;
medviewMinWidth: 600;
medviewLeft: sprite(0px, 340px, 22px, 40px);
medviewRight: sprite(22px, 340px, 22px, 40px);
medviewHeaderFont: font(semibold 18px);
medviewNameFont: font(16px);
medviewDateFont: font(14px);
medviewNameTop: 13px;
medviewDateTop: 39px;
medviewLeft: sprite(340px, 79px, 28px, 48px);
medviewRight: sprite(368px, 79px, 28px, 48px);
medviewDeltaFromLastAction: 5px;
medviewSwipeDistance: 80px;
medviewButton: flatButton(btnDefFlat) {
color: #ffffff80;
overColor: #fff;
downColor: #fff;
medviewSaveMsgCheck: sprite(341px, 174px, 22px, 18px);
medviewSaveMsgFont: font(16px);
medviewSaveMsgPadding: margins(55px, 19px, 29px, 20px);
medviewSaveMsgCheckPos: point(23px, 21px);
medviewSaveMsgRadius: 3px;
medviewSaveMsgShowing: 200;
medviewSaveMsgShown: 2000;
medviewSaveMsgHiding: 2500;
medviewSaveMsg: #000000b2;
medviewOverview: iconedButton(btnDefIconed) {
bgColor: #0000;
overBgColor: #00000055;
downBgColor: #00000055;
width: 100px;
height: 46px;
textTop: 13px;
overTextTop: 13px;
downTextTop: 14px;
overBgColor: #00000040;
font: font(16px);
overFont: font(16px);
opacity: 0.77;
overOpacity: 1;
icon: sprite(340px, 129px, 19px, 19px);
iconPos: point(16px, 14px);
downIcon: sprite(340px, 129px, 19px, 19px);
downIconPos: point(16px, 14px);
width: -69px;
height: 47px;
color: white;
textPos: point(51px, 13px);
downTextPos: point(51px, 14px);
}
medviewForward: iconedButton(medviewOverview) {
icon: sprite(357px, 58px, 22px, 17px);
iconPos: point(16px, 15px);
downIcon: sprite(357px, 58px, 22px, 17px);
downIconPos: point(16px, 15px);
width: -69px;
}
medviewDelete: iconedButton(medviewForward) {
icon: sprite(340px, 58px, 15px, 19px);
iconPos: point(16px, 14px);
downIcon: sprite(340px, 58px, 15px, 19px);
downIconPos: point(16px, 14px);
}
medviewClose: iconedButton(medviewOverview) {
icon: sprite(340px, 0px, 56px, 56px);
iconPos: point(0px, 0px);
downIcon: sprite(340px, 0px, 56px, 56px);
downIconPos: point(0px, 0px);
opacity: 0.6;
width: 56px;
height: 56px;
}
medviewBottomBar: 87px;
medviewBG: #272727D9;
medviewBottomBG: #272727;
medviewNavOpacity: 0.6;
medviewCloseOpacity: 0.6;
medviewNavBGOpacity: 0.4;
medviewNavOverOpacity: 1;
medviewCloseOverOpacity: 1;
medviewNameColor: black;
medviewDateColor: #999;
medviewSaveAs: iconedButton(medviewOverview) {
bgColor: #38abe6;
overBgColor: #299fdc;
opacity: 1;
icon: sprite(361px, 129px, 12px, 19px);
iconPos: point(18px, 15px);
downIcon: sprite(361px, 129px, 12px, 19px);
downIconPos: point(18px, 15px);
width: -62px;
height: 47px;
textPos: point(44px, 13px);
downTextPos: point(44px, 14px);
}
medviewSaveAsDisabledOpacity: 0.8;
medviewPolaroid: margins(17px, 18px, 17px, 72px);
medviewPolaroidMin: size(480px, 360px);
medviewDocumentSprite: sprite(341px, 150px, 20px, 22px);
medviewDocumentSpritePos: point(16px, 13px);
medviewPhotoSprite: sprite(363px, 150px, 23px, 20px);
medviewPhotoSpritePos: point(14px, 14px);
overviewPhotoSkip: 10px;
overviewPhotoMinSize: 100px;
overviewPhotoCheck: sprite(245px, 308px, 32px, 32px);
overviewPhotoChecked: sprite(278px, 308px, 32px, 32px);
overviewPhotoSelectOverlay: #0a7bb03f;
// Mac specific
@@ -1490,3 +1586,61 @@ macSelectorTop: 6;
macAlwaysThisAppTop: 4;
macAppHintTop: 8;
macCautionIconSize: size(16, 16);
btnContext: iconedButton(btnDefIconed) {
bgColor: white;
overBgColor: btnWhiteHover;
font: font(14px);
opacity: 1;
overOpacity: 1;
width: 172px;
height: 36px;
color: black;
textPos: point(16px, 7px);
downTextPos: point(16px, 8px);
}
photoLoader: size(52px, 22px);
photoLoaderBg: #00000054;
photoLoaderCnt: 3;
photoLoaderPoint: size(6px, 6px);
photoLoaderSkip: 6px;
photoLoaderPeriod: 600; // ms full period
photoLoaderDelta: 150; // ms between points
photoLoaderDuration1: 150; // ms fade in
photoLoaderDuration2: 150; // ms fade out
photoLoaderAlphaMin: 0.1; // not less than that
overviewLoader: size(34px, 14px);
overviewLoaderPoint: size(4px, 4px);
overviewLoaderSkip: 4px;
mediaviewLoader: size(78px, 33px);
mediaviewLoaderPoint: size(9px, 9px);
mediaviewLoaderSkip: 9px;
minPhotoWidth: 90px;
minPhotoHeight: 90px;
maxMediaSize: 420px;
usernameFont: font(14px);
usernameColor: #777;
usernameWidth: 336px;
usernameSkip: 32px;
usernameInput: flatInput(inpAddContact) {
bgColor: transparent;
}
usernameDone: flatButton(btnSelectDone) {
width: 168px;
}
usernameCancel: flatButton(btnSelectCancel) {
width: 167px;
}
youtubeIcon: sprite(336px, 221px, 60px, 60px);
vimeoIcon: sprite(336px, 283px, 60px, 60px);
locationSize: size(320, 240);

View File

@@ -2,11 +2,8 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppShortName "Telegram"
#define MyAppName "Telegram Win (Unofficial)"
#define MyAppVersion "0.5.14"
#define MyAppVersionZero "0.5.14"
#define MyAppFullVersion "0.5.14.0"
#define MyAppPublisher "Telegram (Unofficial)"
#define MyAppName "Telegram Desktop"
#define MyAppPublisher "Telegram Messenger LLP"
#define MyAppURL "https://tdesktop.com"
#define MyAppExeName "Telegram.exe"
#define MyAppId "53F49750-6209-4FBF-9CA8-7A333C87D1ED"
@@ -28,7 +25,7 @@ DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=.\..\Win32\Deploy
OutputBaseFilename=tsetup.{#MyAppVersionZero}
SetupIconFile=.\SourceFiles\art\iconround256.ico
SetupIconFile=.\SourceFiles\art\icon256.ico
UninstallDisplayIcon={app}\Telegram.exe
Compression=lzma
SolidCompression=yes

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,7 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
#include "memain.h"
int main(int argc, char *argv[]) {
QString emoji_in("."), emoji_out("emoji_config.cpp"), emoji_png("./SourceFiles/art/emoji");
QString emoji_in("./SourceFiles/art/emojisprite_"), emoji_out("./SourceFiles/gui/emoji_config.cpp"), emoji_png("./SourceFiles/art/emoji");
for (int i = 0; i < argc; ++i) {
if (string("-emoji_in") == argv[i]) {
if (++i < argc) emoji_in = argv[i];

View File

@@ -189,7 +189,7 @@ int main(int argc, char *argv[])
}
for (QFileInfoList::iterator i = files.begin(); i != files.end(); ++i) {
QFileInfo info(*i);
if (info.canonicalFilePath().indexOf(remove) != 0) {
if (!info.canonicalFilePath().startsWith(remove)) {
cout << "Can't find '" << remove.toUtf8().constData() << "' in file '" << info.canonicalFilePath().toUtf8().constData() << "' :(\n";
return -1;
}

View File

@@ -94,6 +94,5 @@ int main(int argc, char *argv[])
}
}
int res = prepare(f, paths);
system("PAUSE");
return res;
}

View File

@@ -271,12 +271,16 @@ void updateRegistry() {
if (GetFullPathName(L".", bufSize, exp, 0) < bufSize) {
wstring installpath = locationStr, mypath = exp;
if (installpath == mypath + L"\\" || true) { // always update reg info, if we found it
WCHAR nameStr[bufSize], dateStr[bufSize];
WCHAR nameStr[bufSize], dateStr[bufSize], publisherStr[bufSize], icongroupStr[bufSize];
SYSTEMTIME stLocalTime;
GetLocalTime(&stLocalTime);
RegSetValueEx(rkey, L"DisplayVersion", 0, REG_SZ, (BYTE*)versionStr, ((versionLen / 2) + 1) * sizeof(WCHAR));
wsprintf(nameStr, L"Telegram Win (Unofficial) version %s", versionStr);
wsprintf(nameStr, L"Telegram Desktop version %s", versionStr);
RegSetValueEx(rkey, L"DisplayName", 0, REG_SZ, (BYTE*)nameStr, (wcslen(nameStr) + 1) * sizeof(WCHAR));
wsprintf(publisherStr, L"Telegram Messenger LLP");
RegSetValueEx(rkey, L"Publisher", 0, REG_SZ, (BYTE*)publisherStr, (wcslen(publisherStr) + 1) * sizeof(WCHAR));
wsprintf(icongroupStr, L"Telegram Desktop");
RegSetValueEx(rkey, L"Inno Setup: Icon Group", 0, REG_SZ, (BYTE*)icongroupStr, (wcslen(icongroupStr) + 1) * sizeof(WCHAR));
wsprintf(dateStr, L"%04d%02d%02d", stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay);
RegSetValueEx(rkey, L"InstallDate", 0, REG_SZ, (BYTE*)dateStr, (wcslen(dateStr) + 1) * sizeof(WCHAR));
@@ -358,7 +362,7 @@ int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdParama
}
#ifdef _NEED_WIN_GENERATE_DUMP
static const WCHAR *_programName = L"Telegram Win (Unofficial)"; // folder in APPDATA, if current path is unavailable for writing
static const WCHAR *_programName = L"Telegram Desktop"; // folder in APPDATA, if current path is unavailable for writing
static const WCHAR *_exeName = L"Updater.exe";
LPTOP_LEVEL_EXCEPTION_FILTER _oldWndExceptionFilter = 0;

View File

@@ -20,12 +20,14 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
#include "app.h"
#include "audio.h"
#include "application.h"
#include "fileuploader.h"
#include "mainwidget.h"
#include <QtMultimedia/QSoundEffect>
#include <libexif/exif-data.h>
#include "localstorage.h"
namespace {
bool quiting = false;
@@ -43,6 +45,9 @@ namespace {
typedef QHash<AudioId, AudioData*> AudiosData;
AudiosData audiosData;
typedef QHash<QString, ImageLinkData*> ImageLinksData;
ImageLinksData imageLinksData;
typedef QHash<DocumentId, DocumentData*> DocumentsData;
DocumentsData documentsData;
@@ -61,7 +66,6 @@ namespace {
HistoryItem *hoveredItem = 0, *pressedItem = 0, *hoveredLinkItem = 0, *pressedLinkItem = 0, *contextItem = 0, *mousedItem = 0;
QSoundEffect *newMsgSound = 0;
QPixmap *sprite = 0, *emojis = 0;
typedef QMap<uint32, QPixmap> EmojisMap;
@@ -112,7 +116,7 @@ namespace App {
bool loggedOut() {
Window *w(wnd());
if (w) {
w->tempDirDelete();
w->tempDirDelete(Local::ClearManagerAll);
w->notifyClearFast();
w->setupIntro(true);
}
@@ -163,6 +167,31 @@ namespace App {
return (peer_id & 0x100000000L) ? int32(peer_id & 0xFFFFFFFFL) : 0;
}
int32 onlineForSort(int32 online, int32 now) {
if (online <= 0) {
switch (online) {
case -2: {
QDate yesterday(date(now).date());
yesterday.addDays(-3);
return int32(QDateTime(yesterday).toTime_t());
} break;
case -3: {
QDate weekago(date(now).date());
weekago.addDays(-7);
return int32(QDateTime(weekago).toTime_t());
} break;
case -4: {
QDate monthago(date(now).date());
monthago.addDays(-30);
return int32(QDateTime(monthago).toTime_t());
} break;
}
}
return online;
}
int32 onlineWillChangeIn(int32 online, int32 now) {
if (online <= 0) return 86400;
if (online > now) {
@@ -180,9 +209,20 @@ namespace App {
return dNow.secsTo(dTomorrow);
}
QString onlineText(int32 online, int32 now, bool precise) {
if (!online) return lang(lng_status_offline);
if (online < 0) return lang(lng_status_invisible);
QString onlineText(UserData *user, int32 now, bool precise) {
if (isServiceUser(user->id)) {
return lang(lng_status_service_notifications);
}
int32 online = user->onlineTill;
if (online <= 0) {
switch (online) {
case 0: return lang(lng_status_offline);
case -2: return lang(lng_status_recently);
case -3: return lang(lng_status_last_week);
case -4: return lang(lng_status_last_month);
}
return lang(lng_status_invisible);
}
if (online > now) {
return lang(lng_status_online);
}
@@ -241,7 +281,7 @@ namespace App {
data = App::user(peer);
data->input = MTP_inputPeerContact(d.vid);
data->inputUser = MTP_inputUserContact(d.vid);
data->setName(lang(lng_deleted), QString(), QString());
data->setName(lang(lng_deleted), QString(), QString(), QString());
data->setPhoto(MTP_userProfilePhotoEmpty());
data->access = 0;
wasContact = (data->contact > 0);
@@ -254,7 +294,7 @@ namespace App {
data = App::user(peer);
data->input = MTP_inputPeerContact(d.vid);
data->inputUser = MTP_inputUserContact(d.vid);
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
data->setPhoto(MTP_userProfilePhotoEmpty());
data->access = 0;
wasContact = (data->contact > 0);
@@ -267,7 +307,7 @@ namespace App {
data = App::user(peer);
data->input = MTP_inputPeerSelf();
data->inputUser = MTP_inputUserSelf();
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
data->setPhoto(d.vphoto);
data->setPhone(qs(d.vphone));
data->access = 0;
@@ -275,7 +315,10 @@ namespace App {
data->contact = -1;
status = &d.vstatus;
::self = data;
if (::self != data) {
::self = data;
if (App::wnd()) App::wnd()->updateGlobalMenu();
}
} break;
case mtpc_userContact: {
const MTPDuserContact &d(user.c_userContact());
@@ -284,7 +327,7 @@ namespace App {
data = App::user(peer);
data->input = MTP_inputPeerContact(d.vid);
data->inputUser = MTP_inputUserContact(d.vid);
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
data->setPhoto(d.vphoto);
data->setPhone(qs(d.vphone));
data->access = d.vaccess_hash.v;
@@ -300,7 +343,7 @@ namespace App {
data->input = MTP_inputPeerForeign(d.vid, d.vaccess_hash);
data->inputUser = MTP_inputUserForeign(d.vid, d.vaccess_hash);
data->setPhone(qs(d.vphone));
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), (data->id != 333000 && !data->phone.isEmpty()) ? formatPhone(data->phone) : QString());
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), (!isServiceUser(data->id) && !data->phone.isEmpty()) ? formatPhone(data->phone) : QString(), textOneLine(qs(d.vusername)));
data->setPhoto(d.vphoto);
data->access = d.vaccess_hash.v;
wasContact = (data->contact > 0);
@@ -314,7 +357,7 @@ namespace App {
data = App::user(peer);
data->input = MTP_inputPeerForeign(d.vid, d.vaccess_hash);
data->inputUser = MTP_inputUserForeign(d.vid, d.vaccess_hash);
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
data->setPhoto(d.vphoto);
data->access = d.vaccess_hash.v;
wasContact = (data->contact > 0);
@@ -327,6 +370,10 @@ namespace App {
data->loaded = true;
if (status) switch (status->type()) {
case mtpc_userStatusEmpty: data->onlineTill = 0; break;
case mtpc_userStatusRecently: data->onlineTill = -2; break;
case mtpc_userStatusLastWeek: data->onlineTill = -3; break;
case mtpc_userStatusLastMonth: data->onlineTill = -4; break;
case mtpc_userStatusOffline: data->onlineTill = status->c_userStatusOffline().vwas_online.v; break;
case mtpc_userStatusOnline: data->onlineTill = status->c_userStatusOnline().vexpires.v; break;
}
@@ -406,7 +453,7 @@ namespace App {
if (!data) continue;
data->loaded = true;
data->updateName(title.trimmed(), QString());
data->updateName(title.trimmed(), QString(), QString());
if (App::main()) App::main()->peerUpdated(data);
}
@@ -532,7 +579,7 @@ namespace App {
const MTPDphotoSize &d(size.c_photoSize());
if (d.vlocation.type() == mtpc_fileLocation) {
const MTPDfileLocation &l(d.vlocation.c_fileLocation());
return ImagePtr(d.vw.v, d.vh.v, l.vdc_id.v, l.vvolume_id.v, l.vlocal_id.v, l.vsecret.v);
return ImagePtr(d.vw.v, d.vh.v, l.vdc_id.v, l.vvolume_id.v, l.vlocal_id.v, l.vsecret.v, d.vsize.v);
}
} break;
case mtpc_photoCachedSize: {
@@ -562,20 +609,27 @@ namespace App {
}
void feedWereDeleted(const QVector<MTPint> &msgsIds) {
bool resized = false;
for (QVector<MTPint>::const_iterator i = msgsIds.cbegin(), e = msgsIds.cend(); i != e; ++i) {
MsgsData::const_iterator j = msgsData.constFind(i->v);
if (j != msgsData.cend()) {
History *h = (*j)->history();
(*j)->destroy();
if (App::main() && h->peer == App::main()->peer()) {
resized = true;
}
}
}
if (resized) {
App::main()->itemResized(0);
}
}
void feedUserLinks(const MTPVector<MTPcontacts_Link> &links) {
const QVector<MTPcontacts_Link> &v(links.c_vector().v);
for (QVector<MTPcontacts_Link>::const_iterator i = v.cbegin(), e = v.cend(); i != e; ++i) {
const MTPDcontacts_link &dv(i->c_contacts_link());
feedUsers(MTP_vector<MTPUser>(QVector<MTPUser>(1, dv.vuser)));
feedUsers(MTP_vector<MTPUser>(1, dv.vuser));
MTPint userId(MTP_int(0));
switch (dv.vuser.type()) {
case mtpc_userEmpty: userId = dv.vuser.c_userEmpty().vid; break;
@@ -635,7 +689,7 @@ namespace App {
App::main()->removeContact(user);
}
}
user->setName(textOneLine(user->firstName), textOneLine(user->lastName), (user->contact || user->id == 333000 || user->phone.isEmpty()) ? QString() : App::formatPhone(user->phone));
user->setName(textOneLine(user->firstName), textOneLine(user->lastName), (user->contact || isServiceUser(user->id) || user->phone.isEmpty()) ? QString() : App::formatPhone(user->phone), textOneLine(user->username));
if (App::main()) App::main()->peerUpdated(user);
}
}
@@ -667,40 +721,44 @@ namespace App {
}
PhotoData *feedPhoto(const MTPPhoto &photo, const PreparedPhotoThumbs &thumbs) {
const QPixmap *thumb = 0, *full = 0;
int32 thumbLevel = -1, fullLevel = -1;
const QPixmap *thumb = 0, *medium = 0, *full = 0;
int32 thumbLevel = -1, mediumLevel = -1, fullLevel = -1;
for (PreparedPhotoThumbs::const_iterator i = thumbs.cbegin(), e = thumbs.cend(); i != e; ++i) {
int32 newThumbLevel = -1, newFullLevel = -1;
int32 newThumbLevel = -1, newMediumLevel = -1, newFullLevel = -1;
switch (i.key()) {
case 's': newThumbLevel = 0; newFullLevel = 4; break; // box 100x100
case 'm': newThumbLevel = 2; newFullLevel = 3; break; // box 320x320
case 'x': newThumbLevel = 5; newFullLevel = 0; break; // box 800x800
case 'y': newThumbLevel = 6; newFullLevel = 1; break; // box 1280x1280
case 'w': newThumbLevel = 8; newFullLevel = 2; break; // box 2560x2560
case 'a': newThumbLevel = 1; newFullLevel = 8; break; // crop 160x160
case 'b': newThumbLevel = 3; newFullLevel = 7; break; // crop 320x320
case 'c': newThumbLevel = 4; newFullLevel = 6; break; // crop 640x640
case 'd': newThumbLevel = 7; newFullLevel = 5; break; // crop 1280x1280
case 's': newThumbLevel = 0; newMediumLevel = 5; newFullLevel = 4; break; // box 100x100
case 'm': newThumbLevel = 2; newMediumLevel = 0; newFullLevel = 3; break; // box 320x320
case 'x': newThumbLevel = 5; newMediumLevel = 3; newFullLevel = 0; break; // box 800x800
case 'y': newThumbLevel = 6; newMediumLevel = 6; newFullLevel = 1; break; // box 1280x1280
case 'w': newThumbLevel = 8; newMediumLevel = 8; newFullLevel = 2; break; // box 2560x2560
case 'a': newThumbLevel = 1; newMediumLevel = 4; newFullLevel = 8; break; // crop 160x160
case 'b': newThumbLevel = 3; newMediumLevel = 1; newFullLevel = 7; break; // crop 320x320
case 'c': newThumbLevel = 4; newMediumLevel = 2; newFullLevel = 6; break; // crop 640x640
case 'd': newThumbLevel = 7; newMediumLevel = 7; newFullLevel = 5; break; // crop 1280x1280
}
if (newThumbLevel < 0 || newFullLevel < 0) {
if (newThumbLevel < 0 || newMediumLevel < 0 || newFullLevel < 0) {
continue;
}
if (thumbLevel < 0 || newThumbLevel < thumbLevel) {
thumbLevel = newThumbLevel;
thumb = &i.value();
}
if (mediumLevel < 0 || newMediumLevel < mediumLevel) {
mediumLevel = newMediumLevel;
medium = &i.value();
}
if (fullLevel < 0 || newFullLevel < fullLevel) {
fullLevel = newFullLevel;
full = &i.value();
}
}
if (!thumb || !full) {
if (!thumb || !medium || !full) {
return App::photo(0);
}
switch (photo.type()) {
case mtpc_photo: {
const MTPDphoto &ph(photo.c_photo());
return App::photo(ph.vid.v, 0, ph.vaccess_hash.v, ph.vuser_id.v, ph.vdate.v, ImagePtr(*thumb, "JPG"), ImagePtr(*full, "JPG"));
return App::photo(ph.vid.v, 0, ph.vaccess_hash.v, ph.vuser_id.v, ph.vdate.v, ImagePtr(*thumb, "JPG"), ImagePtr(*medium, "JPG"), ImagePtr(*full, "JPG"));
} break;
case mtpc_photoEmpty: return App::photo(photo.c_photoEmpty().vid.v);
}
@@ -709,8 +767,8 @@ namespace App {
PhotoData *feedPhoto(const MTPDphoto &photo, PhotoData *convert) {
const QVector<MTPPhotoSize> &sizes(photo.vsizes.c_vector().v);
const MTPPhotoSize *thumb = 0, *full = 0;
int32 thumbLevel = -1, fullLevel = -1;
const MTPPhotoSize *thumb = 0, *medium = 0, *full = 0;
int32 thumbLevel = -1, mediumLevel = -1, fullLevel = -1;
for (QVector<MTPPhotoSize>::const_iterator i = sizes.cbegin(), e = sizes.cend(); i != e; ++i) {
char size = 0;
switch (i->type()) {
@@ -726,32 +784,36 @@ namespace App {
}
if (!size) continue;
int32 newThumbLevel = -1, newFullLevel = -1;
int32 newThumbLevel = -1, newMediumLevel = -1, newFullLevel = -1;
switch (size) {
case 's': newThumbLevel = 0; newFullLevel = 4; break; // box 100x100
case 'm': newThumbLevel = 2; newFullLevel = 3; break; // box 320x320
case 'x': newThumbLevel = 5; newFullLevel = 0; break; // box 800x800
case 'y': newThumbLevel = 6; newFullLevel = 1; break; // box 1280x1280
case 'w': newThumbLevel = 8; newFullLevel = 2; break; // box 2560x2560
case 'a': newThumbLevel = 1; newFullLevel = 8; break; // crop 160x160
case 'b': newThumbLevel = 3; newFullLevel = 7; break; // crop 320x320
case 'c': newThumbLevel = 4; newFullLevel = 6; break; // crop 640x640
case 'd': newThumbLevel = 7; newFullLevel = 5; break; // crop 1280x1280
case 's': newThumbLevel = 0; newMediumLevel = 5; newFullLevel = 4; break; // box 100x100
case 'm': newThumbLevel = 2; newMediumLevel = 0; newFullLevel = 3; break; // box 320x320
case 'x': newThumbLevel = 5; newMediumLevel = 3; newFullLevel = 0; break; // box 800x800
case 'y': newThumbLevel = 6; newMediumLevel = 6; newFullLevel = 1; break; // box 1280x1280
case 'w': newThumbLevel = 8; newMediumLevel = 8; newFullLevel = 2; break; // box 2560x2560
case 'a': newThumbLevel = 1; newMediumLevel = 4; newFullLevel = 8; break; // crop 160x160
case 'b': newThumbLevel = 3; newMediumLevel = 1; newFullLevel = 7; break; // crop 320x320
case 'c': newThumbLevel = 4; newMediumLevel = 2; newFullLevel = 6; break; // crop 640x640
case 'd': newThumbLevel = 7; newMediumLevel = 7; newFullLevel = 5; break; // crop 1280x1280
}
if (newThumbLevel < 0 || newFullLevel < 0) {
if (newThumbLevel < 0 || newMediumLevel < 0 || newFullLevel < 0) {
continue;
}
if (thumbLevel < 0 || newThumbLevel < thumbLevel) {
thumbLevel = newThumbLevel;
thumb = &(*i);
}
if (mediumLevel < 0 || newMediumLevel < mediumLevel) {
mediumLevel = newMediumLevel;
medium = &(*i);
}
if (fullLevel < 0 || newFullLevel < fullLevel) {
fullLevel = newFullLevel;
full = &(*i);
}
}
if (thumb && full) {
return App::photo(photo.vid.v, convert, photo.vaccess_hash.v, photo.vuser_id.v, photo.vdate.v, App::image(*thumb), App::image(*full));
if (thumb && medium && full) {
return App::photo(photo.vid.v, convert, photo.vaccess_hash.v, photo.vuser_id.v, photo.vdate.v, App::image(*thumb), App::image(*medium), App::image(*full));
}
return App::photo(photo.vid.v, convert);
}
@@ -850,7 +912,7 @@ namespace App {
return App::peer(App::peerFromChat(chat))->asChat();
}
PhotoData *photo(const PhotoId &photo, PhotoData *convert, const uint64 &access, int32 user, int32 date, const ImagePtr &thumb, const ImagePtr &full) {
PhotoData *photo(const PhotoId &photo, PhotoData *convert, const uint64 &access, int32 user, int32 date, const ImagePtr &thumb, const ImagePtr &medium, const ImagePtr &full) {
if (convert) {
if (convert->id != photo) {
PhotosData::iterator i = photosData.find(convert->id);
@@ -864,6 +926,7 @@ namespace App {
convert->user = user;
convert->date = date;
convert->thumb = thumb;
convert->medium = medium;
convert->full = full;
}
}
@@ -874,7 +937,7 @@ namespace App {
if (convert) {
result = convert;
} else {
result = new PhotoData(photo, access, user, date, thumb, full);
result = new PhotoData(photo, access, user, date, thumb, medium, full);
}
photosData.insert(photo, result);
} else {
@@ -884,6 +947,7 @@ namespace App {
result->user = user;
result->date = date;
result->thumb = thumb;
result->medium = medium;
result->full = full;
}
inLastIter = lastPhotosMap.find(result);
@@ -902,14 +966,6 @@ namespace App {
return result;
}
void forgetPhotos() {
lastPhotos.clear();
lastPhotosMap.clear();
for (PhotosData::const_iterator i = photosData.cbegin(), e = photosData.cend(); i != e; ++i) {
i.value()->forget();
}
}
VideoData *video(const VideoId &video, VideoData *convert, const uint64 &access, int32 user, int32 date, int32 duration, int32 w, int32 h, const ImagePtr &thumb, int32 dc, int32 size) {
if (convert) {
if (convert->id != video) {
@@ -958,12 +1014,6 @@ namespace App {
return result;
}
void forgetVideos() {
for (VideosData::const_iterator i = videosData.cbegin(), e = videosData.cend(); i != e; ++i) {
i.value()->forget();
}
}
AudioData *audio(const AudioId &audio, AudioData *convert, const uint64 &access, int32 user, int32 date, int32 duration, int32 dc, int32 size) {
if (convert) {
if (convert->id != audio) {
@@ -1006,12 +1056,6 @@ namespace App {
return result;
}
void forgetAudios() {
for (AudiosData::const_iterator i = audiosData.cbegin(), e = audiosData.cend(); i != e; ++i) {
i.value()->forget();
}
}
DocumentData *document(const DocumentId &document, DocumentData *convert, const uint64 &access, int32 user, int32 date, const QString &name, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) {
if (convert) {
if (convert->id != document) {
@@ -1058,10 +1102,37 @@ namespace App {
return result;
}
void forgetDocuments() {
ImageLinkData *imageLink(const QString &imageLink, ImageLinkType type, const QString &url) {
ImageLinksData::const_iterator i = imageLinksData.constFind(imageLink);
ImageLinkData *result;
if (i == imageLinksData.cend()) {
result = new ImageLinkData(imageLink);
imageLinksData.insert(imageLink, result);
result->type = type;
} else {
result = i.value();
}
return result;
}
void forgetMedia() {
lastPhotos.clear();
lastPhotosMap.clear();
for (PhotosData::const_iterator i = photosData.cbegin(), e = photosData.cend(); i != e; ++i) {
i.value()->forget();
}
for (VideosData::const_iterator i = videosData.cbegin(), e = videosData.cend(); i != e; ++i) {
i.value()->forget();
}
for (AudiosData::const_iterator i = audiosData.cbegin(), e = audiosData.cend(); i != e; ++i) {
i.value()->forget();
}
for (DocumentsData::const_iterator i = documentsData.cbegin(), e = documentsData.cend(); i != e; ++i) {
i.value()->forget();
}
for (ImageLinksData::const_iterator i = imageLinksData.cbegin(), e = imageLinksData.cend(); i != e; ++i) {
i.value()->thumb->forget();
}
}
MTPPhoto photoFromUserPhoto(MTPint userId, MTPint date, const MTPUserProfilePhoto &photo) {
@@ -1107,6 +1178,17 @@ namespace App {
return 0;
}
void itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) {
newItem->history()->itemReplaced(oldItem, newItem);
if (App::main()) App::main()->itemReplaced(oldItem, newItem);
if (App::hoveredItem() == oldItem) App::hoveredItem(newItem);
if (App::pressedItem() == oldItem) App::pressedItem(newItem);
if (App::hoveredLinkItem() == oldItem) App::hoveredLinkItem(newItem);
if (App::pressedLinkItem() == oldItem) App::pressedLinkItem(newItem);
if (App::contextItem() == oldItem) App::contextItem(newItem);
if (App::mousedItem() == oldItem) App::mousedItem(newItem);
}
HistoryItem *historyRegItem(HistoryItem *item) {
MsgsData::const_iterator i = msgsData.constFind(item->id);
if (i == msgsData.cend()) {
@@ -1115,10 +1197,7 @@ namespace App {
return 0;
}
if (i.value() != item && !i.value()->block() && item->block()) { // replace search item
item->history()->itemReplaced(i.value(), item);
if (App::main()) {
emit App::main()->historyItemReplaced(i.value(), item);
}
itemReplaced(i.value(), item);
delete i.value();
msgsData.insert(item->id, item);
return 0;
@@ -1158,8 +1237,8 @@ namespace App {
}
}
historyItemDetached(item);
if (App::main()) {
emit App::main()->historyItemDeleted(item);
if (App::main() && !App::quiting()) {
App::main()->itemRemoved(item);
}
}
@@ -1207,6 +1286,7 @@ namespace App {
lastPhotos.clear();
lastPhotosMap.clear();
::self = 0;
if (App::wnd()) App::wnd()->updateGlobalMenu();
}
/* // don't delete history without deleting its' peerdata
void deleteHistory(const PeerId &peer) {
@@ -1235,11 +1315,7 @@ namespace App {
void initMedia() {
deinitMedia(false);
if (!newMsgSound) {
newMsgSound = new QSoundEffect();
newMsgSound->setSource(QUrl::fromLocalFile(st::newMsgSound));
newMsgSound->setVolume(1);
}
audioInit();
if (!::sprite) {
::sprite = new QPixmap(st::spriteFile);
@@ -1256,17 +1332,10 @@ namespace App {
textlnkOver(TextLinkPtr());
textlnkDown(TextLinkPtr());
if (completely && App::main()) {
App::main()->disconnect(SIGNAL(historyItemDeleted(HistoryItem *)));
}
histories().clear();
if (completely) {
LOG(("Deleting sound.."));
delete newMsgSound;
LOG(("Sound deleted!"));
newMsgSound = 0;
audioFinish();
delete ::sprite;
::sprite = 0;
@@ -1357,7 +1426,7 @@ namespace App {
}
void playSound() {
if (cSoundNotify() && newMsgSound) newMsgSound->play();
if (cSoundNotify()) audioPlayNotify();
}
void writeConfig() {
@@ -1563,6 +1632,7 @@ namespace App {
stream << quint32(dbiNotifyView) << qint32(cNotifyView());
stream << quint32(dbiAskDownloadPath) << qint32(cAskDownloadPath());
stream << quint32(dbiDownloadPath) << (cAskDownloadPath() ? QString() : cDownloadPath());
stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage());
stream << quint32(dbiEmojiTab) << qint32(cEmojiTab());
RecentEmojiPreload v;
@@ -1590,7 +1660,7 @@ namespace App {
}
QByteArray encrypted(16 + fullSize, Qt::Uninitialized); // 128bit of sha1 - key128, sizeof(data), data
hashSha1(toEncrypt.constData(), toEncrypt.size(), encrypted.data());
aesEncryptLocal(toEncrypt.constData(), encrypted.data() + 16, fullSize, &MTP::localKey(), encrypted.constData());
aesEncryptLocal(toEncrypt.constData(), encrypted.data() + 16, fullSize, &Local::oldKey(), encrypted.constData());
DEBUG_LOG(("App Info: writing user config file"));
QDataStream configStream(&configFile);
@@ -1641,7 +1711,7 @@ namespace App {
}
cSetLocalSalt(salt);
MTP::createLocalKey(QByteArray(), &salt);
Local::createOldKey(&salt);
if (data.size() <= 16 || (data.size() & 0x0F)) {
LOG(("App Error: bad encrypted part size: %1").arg(data.size()));
@@ -1650,7 +1720,7 @@ namespace App {
uint32 fullDataLen = data.size() - 16;
decrypted.resize(fullDataLen);
const char *dataKey = data.constData(), *encrypted = data.constData() + 16;
aesDecryptLocal(encrypted, decrypted.data(), fullDataLen, &MTP::localKey(), dataKey);
aesDecryptLocal(encrypted, decrypted.data(), fullDataLen, &Local::oldKey(), dataKey);
uchar sha1Buffer[20];
if (memcmp(hashSha1(decrypted.constData(), decrypted.size(), sha1Buffer), dataKey, 16)) {
LOG(("App Error: bad decrypt key, data from user-config not decrypted"));
@@ -1731,7 +1801,7 @@ namespace App {
case dbinvShowName: cSetNotifyView(dbinvShowName); break;
default: cSetNotifyView(dbinvShowPreview); break;
}
}
} break;
case dbiAskDownloadPath: {
qint32 v;
@@ -1745,6 +1815,12 @@ namespace App {
cSetDownloadPath(v);
} break;
case dbiCompressPastedImage: {
qint32 v;
stream >> v;
cSetCompressPastedImage(v == 1);
} break;
case dbiEmojiTab: {
qint32 v;
stream >> v;
@@ -1841,17 +1917,14 @@ namespace App {
void checkImageCacheSize() {
int64 nowImageCacheSize = imageCacheSize();
if (nowImageCacheSize > serviceImageCacheSize + MemoryForImageCache) {
App::forgetPhotos();
App::forgetVideos();
App::forgetAudios();
App::forgetDocuments();
App::forgetMedia();
serviceImageCacheSize = imageCacheSize();
}
}
bool isValidPhone(QString phone) {
phone = phone.replace(QRegularExpression(qsl("[^\\d]")), QString());
return phone.length() >= 8 || phone == qsl("777") || phone == qsl("333") || phone == qsl("42") || phone == qsl("111");
return phone.length() >= 8 || phone == qsl("777") || phone == qsl("333") || phone == qsl("111") || (phone.startsWith(qsl("42")) && (phone.length() == 2 || phone.length() == 5 || phone == qsl("4242")));
}
void quit() {
@@ -1874,7 +1947,6 @@ namespace App {
::quiting = true;
}
QImage readImage(QByteArray data, QByteArray *format) {
QByteArray tmpFormat;
QImage result;

View File

@@ -63,8 +63,9 @@ namespace App {
int32 userFromPeer(const PeerId &peer_id);
int32 chatFromPeer(const PeerId &peer_id);
int32 onlineForSort(int32 online, int32 now);
int32 onlineWillChangeIn(int32 onlineOnServer, int32 nowOnServer);
QString onlineText(int32 onlineOnServer, int32 nowOnServer, bool precise = false);
QString onlineText(UserData *user, int32 nowOnServer, bool precise = false);
void feedUsers(const MTPVector<MTPUser> &users);
void feedChats(const MTPVector<MTPChat> &chats);
@@ -101,14 +102,12 @@ namespace App {
ChatData *chat(const PeerId &peer);
ChatData *chat(int32 chat);
QString peerName(const PeerData *peer, bool forDialogs = false);
PhotoData *photo(const PhotoId &photo, PhotoData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, const ImagePtr &thumb = ImagePtr(), const ImagePtr &full = ImagePtr());
void forgetPhotos();
PhotoData *photo(const PhotoId &photo, PhotoData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, const ImagePtr &thumb = ImagePtr(), const ImagePtr &medium = ImagePtr(), const ImagePtr &full = ImagePtr());
VideoData *video(const VideoId &video, VideoData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, int32 duration = 0, int32 w = 0, int32 h = 0, const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0);
void forgetVideos();
AudioData *audio(const AudioId &audio, AudioData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, int32 duration = 0, int32 dc = 0, int32 size = 0);
void forgetAudios();
DocumentData *document(const DocumentId &document, DocumentData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, const QString &name = QString(), const QString &mime = QString(), const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0);
void forgetDocuments();
ImageLinkData *imageLink(const QString &imageLink, ImageLinkType type = InvalidImageLink, const QString &url = QString());
void forgetMedia();
MTPPhoto photoFromUserPhoto(MTPint userId, MTPint date, const MTPUserProfilePhoto &photo);

View File

@@ -28,6 +28,8 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
#include "boxes/confirmbox.h"
#include "langloaderplain.h"
#include "localstorage.h"
namespace {
Application *mainApp = 0;
FileUploader *uploader = 0;
@@ -61,6 +63,13 @@ namespace {
case 3: if (ev->key() == Qt::Key_F11) _debugState = 4; else if (ev->key() != Qt::Key_F10) _debugState = 0; break;
case 4: if (ev->key() == Qt::Key_F12) offerDebug(); if (ev->key() != Qt::Key_F11) _debugState = 0; break;
}
if (cPlatform() == dbipMac && ev->key() == Qt::Key_W && (ev->modifiers() & (Qt::MetaModifier | Qt::ControlModifier))) {
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
App::wnd()->minimizeToTray();
return true;
}
}
}
return QObject::eventFilter(o, e);
}
@@ -124,6 +133,7 @@ Application::Application(int &argc, char **argv) : PsApplication(argc, argv),
}
}
Local::start();
style::startManager();
anim::startManager();
historyInit();
@@ -132,8 +142,6 @@ Application::Application(int &argc, char **argv) : PsApplication(argc, argv),
psInstallEventFilter();
updateCheckTimer.setSingleShot(true);
connect(&socket, SIGNAL(connected()), this, SLOT(socketConnected()));
connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
connect(&socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(socketError(QLocalSocket::LocalSocketError)));
@@ -144,9 +152,12 @@ Application::Application(int &argc, char **argv) : PsApplication(argc, argv),
connect(&updateCheckTimer, SIGNAL(timeout()), this, SLOT(startUpdateCheck()));
connect(this, SIGNAL(updateFailed()), this, SLOT(onUpdateFailed()));
connect(this, SIGNAL(updateReady()), this, SLOT(onUpdateReady()));
connect(this, SIGNAL(applicationStateChanged(Qt::ApplicationState)), this, SLOT(onAppStateChanged(Qt::ApplicationState)));
connect(&writeUserConfigTimer, SIGNAL(timeout()), this, SLOT(onWriteUserConfig()));
writeUserConfigTimer.setSingleShot(true);
connect(&killDownloadSessionsTimer, SIGNAL(timeout()), this, SLOT(killDownloadSessions()));
if (cManyInstance()) {
startApp();
} else {
@@ -319,10 +330,54 @@ void Application::writeUserConfigIn(uint64 ms) {
}
}
void Application::killDownloadSessionsStart(int32 dc) {
if (killDownloadSessionTimes.constFind(dc) == killDownloadSessionTimes.cend()) {
killDownloadSessionTimes.insert(dc, getms() + MTPAckSendWaiting + MTPKillFileSessionTimeout);
}
if (!killDownloadSessionsTimer.isActive()) {
killDownloadSessionsTimer.start(MTPAckSendWaiting + MTPKillFileSessionTimeout + 5);
}
}
void Application::killDownloadSessionsStop(int32 dc) {
killDownloadSessionTimes.remove(dc);
if (killDownloadSessionTimes.isEmpty() && killDownloadSessionsTimer.isActive()) {
killDownloadSessionsTimer.stop();
}
}
void Application::checkLocalTime() {
if (App::main()) App::main()->checkLastUpdate(checkms());
}
void Application::onWriteUserConfig() {
App::writeUserConfig();
}
void Application::onAppStateChanged(Qt::ApplicationState state) {
checkLocalTime();
}
void Application::killDownloadSessions() {
uint64 ms = getms(), left = MTPAckSendWaiting + MTPKillFileSessionTimeout;
for (QMap<int32, uint64>::iterator i = killDownloadSessionTimes.begin(); i != killDownloadSessionTimes.end(); ) {
if (i.value() <= ms) {
for (int j = 1; j < MTPDownloadSessionsCount; ++j) {
MTP::killSession(MTP::dld[j] + i.key());
}
i = killDownloadSessionTimes.erase(i);
} else {
if (i.value() - ms < left) {
left = i.value() - ms;
}
++i;
}
}
if (!killDownloadSessionTimes.isEmpty()) {
killDownloadSessionsTimer.start(left);
}
}
void Application::photoUpdated(MsgId msgId, const MTPInputFile &file) {
if (!App::self()) return;
@@ -332,7 +387,8 @@ void Application::photoUpdated(MsgId msgId, const MTPInputFile &file) {
if (peer == App::self()->id) {
MTP::send(MTPphotos_UploadProfilePhoto(file, MTP_string(""), MTP_inputGeoPointEmpty(), MTP_inputPhotoCrop(MTP_double(0), MTP_double(0), MTP_double(100))), rpcDone(&Application::selfPhotoDone), rpcFail(&Application::peerPhotoFail, peer));
} else {
MTP::send(MTPmessages_EditChatPhoto(MTP_int(peer & 0xFFFFFFFF), MTP_inputChatUploadedPhoto(file, MTP_inputPhotoCrop(MTP_double(0), MTP_double(0), MTP_double(100)))), rpcDone(&Application::chatPhotoDone, peer), rpcFail(&Application::peerPhotoFail, peer));
History *hist = App::history(peer);
hist->sendRequestId = MTP::send(MTPmessages_EditChatPhoto(MTP_int(peer & 0xFFFFFFFF), MTP_inputChatUploadedPhoto(file, MTP_inputPhotoCrop(MTP_double(0), MTP_double(0), MTP_double(100)))), rpcDone(&Application::chatPhotoDone, peer), rpcFail(&Application::peerPhotoFail, peer), 0, 0, hist->sendRequestId);
}
}
}
@@ -341,6 +397,11 @@ void Application::onEnableDebugMode() {
if (!cDebug()) {
logsInitDebug();
cSetDebug(true);
QFile f(cWorkingDir() + qsl("tdata/withdebug"));
if (f.open(QIODevice::WriteOnly)) {
f.write("1");
f.close();
}
}
App::wnd()->hideLayer();
}
@@ -374,6 +435,10 @@ void Application::uploadProfilePhoto(const QImage &tosend, const PeerId &peerId)
photoThumbs.insert('a', thumb);
photoSizes.push_back(MTP_photoSize(MTP_string("a"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(thumb.width()), MTP_int(thumb.height()), MTP_int(0)));
QPixmap medium = QPixmap::fromImage(tosend.scaled(320, 320, Qt::KeepAspectRatio, Qt::SmoothTransformation));
photoThumbs.insert('b', medium);
photoSizes.push_back(MTP_photoSize(MTP_string("b"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(medium.width()), MTP_int(medium.height()), MTP_int(0)));
QPixmap full = QPixmap::fromImage(tosend);
photoThumbs.insert('c', full);
photoSizes.push_back(MTP_photoSize(MTP_string("c"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(full.width()), MTP_int(full.height()), MTP_int(0)));
@@ -390,7 +455,7 @@ void Application::uploadProfilePhoto(const QImage &tosend, const PeerId &peerId)
int32 filesize = 0;
QByteArray data;
ReadyLocalMedia ready(ToPreparePhoto, file, filename, filesize, data, id, id, peerId, photo, photoThumbs, MTP_documentEmpty(MTP_long(0)), jpeg);
ReadyLocalMedia ready(ToPreparePhoto, file, filename, filesize, data, id, id, peerId, photo, photoThumbs, MTP_documentEmpty(MTP_long(0)), jpeg, false);
connect(App::uploader(), SIGNAL(photoReady(MsgId, const MTPInputFile &)), App::app(), SLOT(photoUpdated(MsgId, const MTPInputFile &)), Qt::UniqueConnection);
@@ -555,9 +620,11 @@ void Application::socketError(QLocalSocket::LocalSocketError e) {
}
void Application::startApp() {
Local::ReadMapState state = Local::readMap(QByteArray());
App::readUserConfig();
if (!MTP::localKey().created()) {
MTP::createLocalKey(QByteArray());
if (!Local::oldKey().created()) {
Local::createOldKey();
cSetNeedConfigResave(true);
}
if (cNeedConfigResave()) {
@@ -571,12 +638,12 @@ void Application::startApp() {
readSupportTemplates();
MTP::setLayer(mtpLayerMax);
MTP::start();
MTP::setStateChangedHandler(mtpStateChanged);
MTP::setSessionResetHandler(mtpSessionReset);
initImageLinkManager();
App::initMedia();
if (MTP::authedId()) {
@@ -585,7 +652,7 @@ void Application::startApp() {
window->setupIntro(false);
}
window->psFirstShow();
window->firstShow();
if (cStartToSettings()) {
window->showSettings();
@@ -619,11 +686,11 @@ void Application::readClients() {
int32 from = 0, l = cmds.length();
for (int32 to = cmds.indexOf(QChar(';'), from); to >= from; to = (from < l) ? cmds.indexOf(QChar(';'), from) : -1) {
QStringRef cmd(&cmds, from, to - from);
if (cmd.indexOf("CMD:") == 0) {
if (cmd.startsWith(qsl("CMD:"))) {
execExternal(cmds.mid(from + 4, to - from - 4));
QByteArray response(QString("RES:%1;").arg(QCoreApplication::applicationPid()).toUtf8());
QByteArray response(qsl("RES:%1;").arg(QCoreApplication::applicationPid()).toUtf8());
i->first->write(response.data(), response.size());
} else if (cmd.indexOf("SEND:") == 0) {
} else if (cmd.startsWith(qsl("SEND:"))) {
if (cSendPaths().isEmpty()) {
toSend.append(_escapeFrom7bit(cmds.mid(from + 5, to - from - 5)));
}
@@ -690,6 +757,7 @@ Application::~Application() {
socket.close();
closeApplication();
App::deinitMedia();
deinitImageLinkManager();
mainApp = 0;
delete updateReply;
delete ::uploader;
@@ -702,6 +770,7 @@ Application::~Application() {
delete window;
style::stopManager();
Local::stop();
}
Application *Application::app() {

View File

@@ -70,11 +70,18 @@ public:
void writeUserConfigIn(uint64 ms);
void killDownloadSessionsStart(int32 dc);
void killDownloadSessionsStop(int32 dc);
void checkLocalTime();
signals:
void peerPhotoDone(PeerId peer);
void peerPhotoFail(PeerId peer);
void adjustSingleTimers();
public slots:
void startUpdateCheck(bool forceWait = false);
@@ -100,10 +107,16 @@ public slots:
void onEnableDebugMode();
void onWriteUserConfig();
void killDownloadSessions();
void onAppStateChanged(Qt::ApplicationState state);
private:
QMap<MsgId, PeerId> photoUpdates;
QMap<int32, uint64> killDownloadSessionTimes;
SingleTimer killDownloadSessionsTimer;
void startApp();
typedef QPair<QLocalSocket*, QByteArray> ClientSocket;
@@ -123,10 +136,10 @@ private:
mtpRequestId updateRequestId;
QNetworkAccessManager updateManager;
QNetworkReply *updateReply;
QTimer updateCheckTimer;
SingleTimer updateCheckTimer;
QThread *updateThread;
PsUpdateDownloader *updateDownloader;
QTimer writeUserConfigTimer;
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 856 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

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