2014-05-30 08:53:19 +00:00
|
|
|
|
/*
|
|
|
|
|
This file is part of Telegram Desktop,
|
2018-01-03 10:23:14 +00:00
|
|
|
|
the official desktop application for the Telegram messaging service.
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
2018-01-03 10:23:14 +00:00
|
|
|
|
For license and copyright information please follow this link:
|
|
|
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
2014-05-30 08:53:19 +00:00
|
|
|
|
*/
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2016-04-27 12:02:17 +00:00
|
|
|
|
#include "core/version.h"
|
|
|
|
|
#include "settings.h"
|
2014-09-30 22:50:35 +00:00
|
|
|
|
|
2016-05-04 10:41:41 +00:00
|
|
|
|
constexpr str_const AppNameOld = "Telegram Win (Unofficial)";
|
|
|
|
|
constexpr str_const AppName = "Telegram Desktop";
|
2014-09-30 22:50:35 +00:00
|
|
|
|
|
2016-05-04 10:41:41 +00:00
|
|
|
|
constexpr str_const AppId = "{53F49750-6209-4FBF-9CA8-7A333C87D1ED}"; // used in updater.cpp and Setup.iss for Windows
|
|
|
|
|
constexpr str_const AppFile = "Telegram";
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
MTPIdsBufferSize = 400, // received msgIds and wereAcked msgIds count stored
|
2014-10-30 16:23:44 +00:00
|
|
|
|
MTPCheckResendTimeout = 10000, // how much time passed from send till we resend request or check it's state, in ms
|
2014-05-30 08:53:19 +00:00
|
|
|
|
MTPCheckResendWaiting = 1000, // how much time to wait for some more requests, when resending request or checking it's state, in ms
|
2014-11-05 17:43:32 +00:00
|
|
|
|
MTPAckSendWaiting = 10000, // how much time to wait for some more requests, when sending msg acks
|
2014-05-30 08:53:19 +00:00
|
|
|
|
MTPResendThreshold = 1, // how much ints should message contain for us not to resend, but to check it's state
|
|
|
|
|
MTPContainerLives = 600, // container lives 10 minutes in haveSent map
|
|
|
|
|
|
2014-10-30 16:23:44 +00:00
|
|
|
|
MTPKillFileSessionTimeout = 5000, // how much time without upload / download causes additional session kill
|
|
|
|
|
|
2014-10-20 22:49:37 +00:00
|
|
|
|
MTPDebugBufferSize = 1024 * 1024, // 1 mb start size
|
|
|
|
|
|
2015-12-06 15:50:02 +00:00
|
|
|
|
MaxUsersPerInvite = 100, // max users in one super group invite request
|
|
|
|
|
|
2015-09-13 08:41:27 +00:00
|
|
|
|
MTPChannelGetDifferenceLimit = 100,
|
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
|
MaxSelectedItems = 100,
|
|
|
|
|
|
2015-10-11 08:37:24 +00:00
|
|
|
|
MaxPhoneCodeLength = 4, // max length of country phone code
|
2015-12-03 18:16:34 +00:00
|
|
|
|
MaxPhoneTailLength = 32, // rest of the phone number, without country code (seen 12 at least), need more for service numbers
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
MaxScrollSpeed = 37, // 37px per 15ms while select-by-drag
|
|
|
|
|
FingerAccuracyThreshold = 3, // touch flick ignore 3px
|
|
|
|
|
MaxScrollAccelerated = 4000, // 4000px per second
|
|
|
|
|
MaxScrollFlick = 2500, // 2500px per second
|
|
|
|
|
|
|
|
|
|
LocalEncryptIterCount = 4000, // key derivation iteration count
|
|
|
|
|
LocalEncryptNoPwdIterCount = 4, // key derivation iteration count without pwd (not secure anyway)
|
|
|
|
|
LocalEncryptSaltSize = 32, // 256 bit
|
|
|
|
|
|
2014-07-04 11:12:54 +00:00
|
|
|
|
AnimationTimerDelta = 7,
|
2015-12-30 08:36:04 +00:00
|
|
|
|
ClipThreadsCount = 8,
|
2015-12-16 13:35:15 +00:00
|
|
|
|
AverageGifSize = 320 * 240,
|
2015-12-16 14:39:26 +00:00
|
|
|
|
WaitBeforeGifPause = 200, // wait 200ms for gif draw before pausing it
|
2016-01-01 14:48:32 +00:00
|
|
|
|
RecentInlineBotsLimit = 10,
|
2014-07-04 11:12:54 +00:00
|
|
|
|
|
2015-12-17 17:31:28 +00:00
|
|
|
|
AVBlockSize = 4096, // 4Kb for ffmpeg blocksize
|
|
|
|
|
|
2014-07-16 05:03:01 +00:00
|
|
|
|
SaveWindowPositionTimeout = 1000, // 1 sec
|
2014-07-04 11:12:54 +00:00
|
|
|
|
|
2014-07-13 09:50:38 +00:00
|
|
|
|
AutoSearchTimeout = 900, // 0.9 secs
|
2014-07-04 11:12:54 +00:00
|
|
|
|
SearchPerPage = 50,
|
2014-08-15 11:19:32 +00:00
|
|
|
|
SearchManyPerPage = 100,
|
2015-08-28 15:15:56 +00:00
|
|
|
|
LinksOverviewPerPage = 12,
|
2014-08-11 09:03:45 +00:00
|
|
|
|
MediaOverviewStartPerPage = 5,
|
2014-09-04 07:33:44 +00:00
|
|
|
|
|
2015-05-29 18:52:43 +00:00
|
|
|
|
AudioVoiceMsgMaxLength = 100 * 60, // 100 minutes
|
|
|
|
|
AudioVoiceMsgUpdateView = 100, // 100ms
|
2014-09-04 07:33:44 +00:00
|
|
|
|
AudioVoiceMsgChannels = 2, // stereo
|
2016-07-05 17:44:02 +00:00
|
|
|
|
AudioVoiceMsgBufferSize = 256 * 1024, // 256 Kb buffers (1.3 - 3.0 secs)
|
2015-01-05 20:17:33 +00:00
|
|
|
|
|
2015-01-10 13:08:30 +00:00
|
|
|
|
StickerMaxSize = 2048, // 2048x2048 is a max image size for sticker
|
2014-10-07 17:57:57 +00:00
|
|
|
|
|
|
|
|
|
MaxZoomLevel = 7, // x8
|
2014-12-15 15:55:45 +00:00
|
|
|
|
ZoomToScreenLevel = 1024, // just constant
|
2014-10-08 07:42:36 +00:00
|
|
|
|
|
2016-02-27 19:39:51 +00:00
|
|
|
|
ShortcutsCountLimit = 256, // how many shortcuts can be in json file
|
|
|
|
|
|
2014-10-08 07:42:36 +00:00
|
|
|
|
PreloadHeightsCount = 3, // when 3 screens to scroll left make a preload request
|
2014-10-22 18:39:03 +00:00
|
|
|
|
|
|
|
|
|
SearchPeopleLimit = 5,
|
|
|
|
|
UsernameCheckTimeout = 200,
|
2014-11-05 17:43:32 +00:00
|
|
|
|
|
2016-02-26 14:41:09 +00:00
|
|
|
|
MaxPhotoCaption = 200,
|
2015-09-16 21:15:13 +00:00
|
|
|
|
|
2014-11-05 17:43:32 +00:00
|
|
|
|
MaxMessageSize = 4096,
|
2014-11-22 09:45:04 +00:00
|
|
|
|
|
|
|
|
|
WriteMapTimeout = 1000,
|
|
|
|
|
SaveDraftTimeout = 1000, // save draft after 1 secs of not changing text
|
|
|
|
|
SaveDraftAnywayTimeout = 5000, // or save anyway each 5 secs
|
2016-06-07 19:59:39 +00:00
|
|
|
|
SaveCloudDraftIdleTimeout = 14000, // save draft to the cloud after 14 more seconds
|
2014-12-12 16:27:03 +00:00
|
|
|
|
|
2015-06-10 12:48:26 +00:00
|
|
|
|
SetOnlineAfterActivity = 30, // user with hidden last seen stays online for such amount of seconds in the interface
|
2015-01-23 09:48:21 +00:00
|
|
|
|
|
2014-12-12 16:27:03 +00:00
|
|
|
|
ServiceUserId = 777000,
|
2015-04-04 20:01:34 +00:00
|
|
|
|
WebPageUserId = 701000,
|
2015-02-03 15:02:46 +00:00
|
|
|
|
|
|
|
|
|
CacheBackgroundTimeout = 3000, // cache background scaled image after 3s
|
|
|
|
|
BackgroundsInRow = 3,
|
2015-02-09 13:26:59 +00:00
|
|
|
|
|
|
|
|
|
UpdateDelayConstPart = 8 * 3600, // 8 hour min time between update check requests
|
|
|
|
|
UpdateDelayRandPart = 8 * 3600, // 8 hour max - min time between update check requests
|
2015-03-02 12:34:16 +00:00
|
|
|
|
|
|
|
|
|
WrongPasscodeTimeout = 1500,
|
2015-04-02 10:33:19 +00:00
|
|
|
|
SessionsShortPollTimeout = 60000,
|
2015-06-26 09:07:59 +00:00
|
|
|
|
|
|
|
|
|
ChoosePeerByDragTimeout = 1000, // 1 second mouse not moved to choose dialog when dragging a file
|
2014-05-30 08:53:19 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-08-12 18:01:32 +00:00
|
|
|
|
inline bool isNotificationsUser(uint64 id) {
|
2014-12-12 16:27:03 +00:00
|
|
|
|
return (id == 333000) || (id == ServiceUserId);
|
2014-11-22 09:45:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-08-12 18:01:32 +00:00
|
|
|
|
inline bool isServiceUser(uint64 id) {
|
|
|
|
|
return !(id % 1000);// (id == 333000) || (id == ServiceUserId);
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
inline const GUID &cGUID() {
|
2016-08-31 17:58:46 +00:00
|
|
|
|
#ifndef OS_MAC_STORE
|
2014-05-30 08:53:19 +00:00
|
|
|
|
static const GUID gGuid = { 0x87a94ab0, 0xe370, 0x4cde, { 0x98, 0xd3, 0xac, 0xc1, 0x10, 0xc5, 0x96, 0x7d } };
|
2016-08-31 17:58:46 +00:00
|
|
|
|
#else // OS_MAC_STORE
|
|
|
|
|
static const GUID gGuid = { 0xe51fb841, 0x8c0b, 0x4ef9, { 0x9e, 0x9e, 0x5a, 0x0, 0x78, 0x56, 0x76, 0x27 } };
|
|
|
|
|
#endif // OS_MAC_STORE
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
return gGuid;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
inline const char *cGUIDStr() {
|
2016-08-31 17:58:46 +00:00
|
|
|
|
#ifndef OS_MAC_STORE
|
2014-05-30 08:53:19 +00:00
|
|
|
|
static const char *gGuidStr = "{87A94AB0-E370-4cde-98D3-ACC110C5967D}";
|
2016-08-31 17:58:46 +00:00
|
|
|
|
#else // OS_MAC_STORE
|
|
|
|
|
static const char *gGuidStr = "{E51FB841-8C0B-4EF9-9E9E-5A0078567627}";
|
|
|
|
|
#endif // OS_MAC_STORE
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
return gGuidStr;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-01 18:49:43 +00:00
|
|
|
|
struct BuiltInDc {
|
|
|
|
|
int id;
|
|
|
|
|
const char *ip;
|
|
|
|
|
int port;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const BuiltInDc _builtInDcs[] = {
|
2014-11-25 20:33:11 +00:00
|
|
|
|
{ 1, "149.154.175.50", 443 },
|
|
|
|
|
{ 2, "149.154.167.51", 443 },
|
2015-02-10 12:46:38 +00:00
|
|
|
|
{ 3, "149.154.175.100", 443 },
|
2014-11-25 20:33:11 +00:00
|
|
|
|
{ 4, "149.154.167.91", 443 },
|
|
|
|
|
{ 5, "149.154.171.5", 443 }
|
2014-08-01 18:49:43 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-06-10 12:48:26 +00:00
|
|
|
|
static const BuiltInDc _builtInDcsIPv6[] = {
|
2018-04-25 09:24:48 +00:00
|
|
|
|
{ 1, "2001:0b28:f23d:f001:0000:0000:0000:000a", 443 },
|
|
|
|
|
{ 2, "2001:067c:04e8:f002:0000:0000:0000:000a", 443 },
|
|
|
|
|
{ 3, "2001:0b28:f23d:f003:0000:0000:0000:000a", 443 },
|
|
|
|
|
{ 4, "2001:067c:04e8:f004:0000:0000:0000:000a", 443 },
|
|
|
|
|
{ 5, "2001:0b28:f23f:f005:0000:0000:0000:000a", 443 }
|
2015-06-10 12:48:26 +00:00
|
|
|
|
};
|
|
|
|
|
|
2014-08-01 18:49:43 +00:00
|
|
|
|
static const BuiltInDc _builtInTestDcs[] = {
|
2015-01-23 15:24:36 +00:00
|
|
|
|
{ 1, "149.154.175.10", 443 },
|
2014-12-13 14:26:08 +00:00
|
|
|
|
{ 2, "149.154.167.40", 443 },
|
2015-06-10 12:48:26 +00:00
|
|
|
|
{ 3, "149.154.175.117", 443 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const BuiltInDc _builtInTestDcsIPv6[] = {
|
2018-04-25 09:24:48 +00:00
|
|
|
|
{ 1, "2001:0b28:f23d:f001:0000:0000:0000:000e", 443 },
|
|
|
|
|
{ 2, "2001:067c:04e8:f002:0000:0000:0000:000e", 443 },
|
|
|
|
|
{ 3, "2001:0b28:f23d:f003:0000:0000:0000:000e", 443 }
|
2014-08-01 18:49:43 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline const BuiltInDc *builtInDcs() {
|
|
|
|
|
return cTestMode() ? _builtInTestDcs : _builtInDcs;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-01 18:49:43 +00:00
|
|
|
|
inline int builtInDcsCount() {
|
|
|
|
|
return (cTestMode() ? sizeof(_builtInTestDcs) : sizeof(_builtInDcs)) / sizeof(BuiltInDc);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-10 12:48:26 +00:00
|
|
|
|
inline const BuiltInDc *builtInDcsIPv6() {
|
|
|
|
|
return cTestMode() ? _builtInTestDcsIPv6 : _builtInDcsIPv6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline int builtInDcsCountIPv6() {
|
|
|
|
|
return (cTestMode() ? sizeof(_builtInTestDcsIPv6) : sizeof(_builtInDcsIPv6)) / sizeof(BuiltInDc);
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
|
static const char *UpdatesPublicKey = "\
|
|
|
|
|
-----BEGIN RSA PUBLIC KEY-----\n\
|
|
|
|
|
MIGJAoGBAMA4ViQrjkPZ9xj0lrer3r23JvxOnrtE8nI69XLGSr+sRERz9YnUptnU\n\
|
|
|
|
|
BZpkIfKaRcl6XzNJiN28cVwO1Ui5JSa814UAiDHzWUqCaXUiUEQ6NmNTneiGx2sQ\n\
|
|
|
|
|
+9PKKlb8mmr3BB9A45ZNwLT6G9AK3+qkZLHojeSA+m84/a6GP4svAgMBAAE=\n\
|
|
|
|
|
-----END RSA PUBLIC KEY-----\
|
|
|
|
|
";
|
|
|
|
|
|
2016-04-27 12:02:17 +00:00
|
|
|
|
static const char *UpdatesPublicAlphaKey = "\
|
2015-02-05 14:49:50 +00:00
|
|
|
|
-----BEGIN RSA PUBLIC KEY-----\n\
|
|
|
|
|
MIGJAoGBALWu9GGs0HED7KG7BM73CFZ6o0xufKBRQsdnq3lwA8nFQEvmdu+g/I1j\n\
|
|
|
|
|
0LQ+0IQO7GW4jAgzF/4+soPDb6uHQeNFrlVx1JS9DZGhhjZ5rf65yg11nTCIHZCG\n\
|
|
|
|
|
w/CVnbwQOw0g5GBwwFV3r0uTTvy44xx8XXxk+Qknu4eBCsmrAFNnAgMBAAE=\n\
|
|
|
|
|
-----END RSA PUBLIC KEY-----\
|
|
|
|
|
";
|
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
|
#ifdef CUSTOM_API_ID
|
|
|
|
|
#include "../../../TelegramPrivate/custom_api_id.h" // Custom API id and API hash
|
|
|
|
|
#else
|
|
|
|
|
static const int32 ApiId = 17349;
|
|
|
|
|
static const char *ApiHash = "344583e45741c457fe1862106095a5eb";
|
|
|
|
|
#endif
|
|
|
|
|
|
2016-10-03 08:56:03 +00:00
|
|
|
|
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
|
|
|
|
|
#error "Only little endian is supported!"
|
|
|
|
|
#endif // Q_BYTE_ORDER == Q_BIG_ENDIAN
|
|
|
|
|
|
2016-04-27 12:02:17 +00:00
|
|
|
|
#ifndef BETA_VERSION_MACRO
|
|
|
|
|
#error "Beta version macro is not defined."
|
2015-12-03 18:16:34 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2016-04-27 12:02:17 +00:00
|
|
|
|
#if (defined CUSTOM_API_ID) && (BETA_VERSION_MACRO > 0ULL)
|
2015-12-03 18:16:34 +00:00
|
|
|
|
#include "../../../TelegramPrivate/beta_private.h" // private key for downloading closed betas
|
|
|
|
|
#else
|
|
|
|
|
static const char *BetaPrivateKey = "";
|
|
|
|
|
#endif
|
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
|
inline const char *cApiDeviceModel() {
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#ifdef Q_OS_WIN
|
2015-04-06 22:15:29 +00:00
|
|
|
|
return "PC";
|
|
|
|
|
#elif defined Q_OS_MAC
|
|
|
|
|
return "Mac";
|
|
|
|
|
#elif defined Q_OS_LINUX
|
|
|
|
|
return "PC";
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#endif
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
inline const char *cApiSystemVersion() {
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#ifdef Q_OS_WIN
|
2015-04-06 22:15:29 +00:00
|
|
|
|
return "Windows";
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#elif defined Q_OS_MAC
|
2015-04-06 22:15:29 +00:00
|
|
|
|
return "OS X";
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#elif defined Q_OS_LINUX
|
2015-04-06 22:15:29 +00:00
|
|
|
|
return "Linux";
|
2014-07-13 09:50:38 +00:00
|
|
|
|
#endif
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern QString gKeyFile;
|
|
|
|
|
inline const QString &cDataFile() {
|
|
|
|
|
if (!gKeyFile.isEmpty()) return gKeyFile;
|
2015-04-02 10:33:19 +00:00
|
|
|
|
static const QString res(qsl("data"));
|
2014-05-30 08:53:19 +00:00
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline const QString &cTempDir() {
|
|
|
|
|
static const QString res = cWorkingDir() + qsl("tdata/tdld/");
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
DialogsFirstLoad = 20, // first dialogs part size requested
|
2015-09-06 10:17:09 +00:00
|
|
|
|
DialogsPerPage = 500, // next dialogs part size
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
UseBigFilesFrom = 10 * 1024 * 1024, // mtp big files methods used for files greater than 10mb
|
|
|
|
|
|
|
|
|
|
UploadPartSize = 32 * 1024, // 32kb for photo
|
|
|
|
|
DocumentMaxPartsCount = 3000, // no more than 3000 parts
|
|
|
|
|
DocumentUploadPartSize0 = 32 * 1024, // 32kb for tiny document ( < 1mb )
|
|
|
|
|
DocumentUploadPartSize1 = 64 * 1024, // 64kb for little document ( <= 32mb )
|
|
|
|
|
DocumentUploadPartSize2 = 128 * 1024, // 128kb for small document ( <= 375mb )
|
|
|
|
|
DocumentUploadPartSize3 = 256 * 1024, // 256kb for medium document ( <= 750mb )
|
|
|
|
|
DocumentUploadPartSize4 = 512 * 1024, // 512kb for large document ( <= 1500mb )
|
|
|
|
|
UploadRequestInterval = 500, // one part each half second, if not uploaded faster
|
|
|
|
|
|
|
|
|
|
MaxPhotosInMemory = 50, // try to clear some memory after 50 photos are created
|
2015-04-16 14:59:42 +00:00
|
|
|
|
NoUpdatesTimeout = 60 * 1000, // if nothing is received in 1 min we ping
|
|
|
|
|
NoUpdatesAfterSleepTimeout = 60 * 1000, // if nothing is received in 1 min when was a sleepmode we ping
|
2015-03-13 13:01:25 +00:00
|
|
|
|
WaitForSkippedTimeout = 1000, // 1s wait for skipped seq or pts in updates
|
2015-09-20 08:55:41 +00:00
|
|
|
|
WaitForChannelGetDifference = 1000, // 1s wait after show channel history before sending getChannelDifference
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
|
|
MemoryForImageCache = 64 * 1024 * 1024, // after 64mb of unpacked images we try to clear some memory
|
|
|
|
|
NotifySettingSaveTimeout = 1000, // wait 1 second before saving notify setting to server
|
|
|
|
|
IdleMsecs = 60 * 1000, // after 60secs without user input we think we are idle
|
|
|
|
|
|
2015-09-21 20:57:42 +00:00
|
|
|
|
SendViewsTimeout = 1000, // send views each second
|
|
|
|
|
|
2015-04-02 10:33:19 +00:00
|
|
|
|
ForwardOnAdd = 100, // how many messages from chat history server should forward to user, that was added to this chat
|
2014-05-30 08:53:19 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline const QRegularExpression &cRussianLetters() {
|
|
|
|
|
static QRegularExpression regexp(QString::fromUtf8("[а-яА-ЯёЁ]"));
|
|
|
|
|
return regexp;
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-08 14:08:54 +00:00
|
|
|
|
inline const QStringList &cImgExtensions() {
|
|
|
|
|
static QStringList result;
|
|
|
|
|
if (result.isEmpty()) {
|
|
|
|
|
result.reserve(4);
|
|
|
|
|
result.push_back(qsl(".jpg"));
|
|
|
|
|
result.push_back(qsl(".jpeg"));
|
|
|
|
|
result.push_back(qsl(".png"));
|
|
|
|
|
result.push_back(qsl(".gif"));
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
2016-12-08 14:08:54 +00:00
|
|
|
|
return result;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-08 14:08:54 +00:00
|
|
|
|
inline const QStringList &cExtensionsForCompress() {
|
|
|
|
|
static QStringList result;
|
|
|
|
|
if (result.isEmpty()) {
|
|
|
|
|
result.push_back(qsl(".jpg"));
|
|
|
|
|
result.push_back(qsl(".jpeg"));
|
|
|
|
|
result.push_back(qsl(".png"));
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|
2016-12-08 14:08:54 +00:00
|
|
|
|
return result;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
}
|