mirror of https://github.com/procxx/kepka.git
				
				
				
			Isolate lib_base library. Use crl::time in getms.
This commit is contained in:
		
							parent
							
								
									cb371f09ac
								
							
						
					
					
						commit
						64b8adb3d0
					
				|  | @ -25,3 +25,14 @@ inline constexpr size_t array_size(const Type(&)[Size]) { | |||
| } | ||||
| 
 | ||||
| } // namespace base
 | ||||
| 
 | ||||
| template <typename T> | ||||
| inline void accumulate_max(T &a, const T &b) { if (a < b) a = b; } | ||||
| 
 | ||||
| template <typename T> | ||||
| inline void accumulate_min(T &a, const T &b) { if (a > b) a = b; } | ||||
| 
 | ||||
| template <size_t Size> | ||||
| QLatin1String qstr(const char(&string)[Size]) { | ||||
| 	return QLatin1String(string, Size - 1); | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,9 @@ | |||
| /*
 | ||||
| This file is part of Telegram Desktop, | ||||
| the official desktop application for the Telegram messaging service. | ||||
| 
 | ||||
| For license and copyright information please follow this link: | ||||
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | ||||
| */ | ||||
| #include "base/base_pch.h" | ||||
| 
 | ||||
|  | @ -0,0 +1,30 @@ | |||
| /*
 | ||||
| This file is part of Telegram Desktop, | ||||
| the official desktop application for the Telegram messaging service. | ||||
| 
 | ||||
| For license and copyright information please follow this link: | ||||
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | ||||
| */ | ||||
| 
 | ||||
| #include <QtCore/QByteArray> | ||||
| #include <QtCore/QString> | ||||
| #include <QtCore/QUrl> | ||||
| #include <QtCore/QMutex> | ||||
| #include <QtCore/QRegularExpression> | ||||
| 
 | ||||
| #include <crl/crl.h> | ||||
| #include <rpl/rpl.h> | ||||
| 
 | ||||
| #include <vector> | ||||
| #include <unordered_map> | ||||
| #include <set> | ||||
| 
 | ||||
| #include <range/v3/all.hpp> | ||||
| #ifdef Q_OS_WIN | ||||
| #include "platform/win/windows_range_v3_helpers.h" | ||||
| #endif // Q_OS_WIN
 | ||||
| 
 | ||||
| #include "base/flat_map.h" | ||||
| #include "base/flat_set.h" | ||||
| #include "base/optional.h" | ||||
| #include "base/openssl_help.h" | ||||
|  | @ -21,6 +21,7 @@ public: | |||
| 	~binary_guard(); | ||||
| 
 | ||||
| 	bool alive() const; | ||||
| 	void kill(); | ||||
| 
 | ||||
| private: | ||||
| 	void destroy(); | ||||
|  | @ -51,6 +52,10 @@ inline bool binary_guard::alive() const { | |||
| 	return _bothAlive && _bothAlive->load(); | ||||
| } | ||||
| 
 | ||||
| inline void binary_guard::kill() { | ||||
| 	destroy(); | ||||
| } | ||||
| 
 | ||||
| inline void binary_guard::destroy() { | ||||
| 	if (_bothAlive) { | ||||
| 		auto old = true; | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ namespace internal { | |||
| namespace { | ||||
| 
 | ||||
| bool CantUseObservables = false; | ||||
| void (*HandleDelayedMethod)() = nullptr; | ||||
| 
 | ||||
| struct ObservableListWrap { | ||||
| 	~ObservableListWrap() { | ||||
|  | @ -35,7 +36,9 @@ ObservableListWrap &ActiveObservables() { | |||
| void RegisterPendingObservable(ObservableCallHandlers *handlers) { | ||||
| 	if (CantUseObservables) return; | ||||
| 	PendingObservables().list.insert(handlers); | ||||
| 	Global::RefHandleObservables().call(); | ||||
| 	if (HandleDelayedMethod) { | ||||
| 		HandleDelayedMethod(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void UnregisterActiveObservable(ObservableCallHandlers *handlers) { | ||||
|  | @ -51,6 +54,10 @@ void UnregisterObservable(ObservableCallHandlers *handlers) { | |||
| 
 | ||||
| } // namespace internal
 | ||||
| 
 | ||||
| void InitObservables(void(*HandleDelayed)()) { | ||||
| 	internal::HandleDelayedMethod = HandleDelayed; | ||||
| } | ||||
| 
 | ||||
| void HandleObservables() { | ||||
| 	if (internal::CantUseObservables) return; | ||||
| 	auto &active = internal::ActiveObservables().list; | ||||
|  |  | |||
|  | @ -452,6 +452,7 @@ private: | |||
| 
 | ||||
| }; | ||||
| 
 | ||||
| void InitObservables(void(*HandleDelayed)()); | ||||
| void HandleObservables(); | ||||
| 
 | ||||
| template < | ||||
|  |  | |||
|  | @ -10,11 +10,26 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| namespace qthelp { | ||||
| namespace { | ||||
| 
 | ||||
| QRegularExpression RegExpProtocol() { | ||||
| 	static const auto result = QRegularExpression("^([a-zA-Z]+)://"); | ||||
| QRegularExpression CreateRegExp(const QString &expression) { | ||||
| 	auto result = QRegularExpression( | ||||
| 		expression, | ||||
| 		QRegularExpression::UseUnicodePropertiesOption); | ||||
| #ifndef OS_MAC_OLD | ||||
| 	result.optimize(); | ||||
| #endif // OS_MAC_OLD
 | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| QString ExpressionDomain() { | ||||
| 	// Matches any domain name, containing at least one '.', including "file.txt".
 | ||||
| 	return QString::fromUtf8("(?<![\\w\\$\\-\\_%=\\.])(?:([a-zA-Z]+)://)?((?:[A-Za-z" "\xD0\x90-\xD0\xAF\xD0\x81" "\xD0\xB0-\xD1\x8F\xD1\x91" "0-9\\-\\_]+\\.){1,10}([A-Za-z" "\xD1\x80\xD1\x84" "\\-\\d]{2,22})(\\:\\d+)?)"); | ||||
| } | ||||
| 
 | ||||
| QString ExpressionDomainExplicit() { | ||||
| 	// Matches any domain name, containing a protocol, including "test://localhost".
 | ||||
| 	return QString::fromUtf8("(?<![\\w\\$\\-\\_%=\\.])(?:([a-zA-Z]+)://)((?:[A-Za-z" "\xD0\x90-\xD0\xAF\xD0\x81" "\xD0\xB0-\xD1\x8F\xD1\x91" "0-9\\-\\_]+\\.){0,10}([A-Za-z" "\xD1\x80\xD1\x84" "\\-\\d]{2,22})(\\:\\d+)?)"); | ||||
| } | ||||
| 
 | ||||
| bool IsGoodProtocol(const QString &protocol) { | ||||
| 	const auto equals = [&](QLatin1String string) { | ||||
| 		return protocol.compare(string, Qt::CaseInsensitive) == 0; | ||||
|  | @ -26,6 +41,21 @@ bool IsGoodProtocol(const QString &protocol) { | |||
| 
 | ||||
| } // namespace
 | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomain() { | ||||
| 	static const auto result = CreateRegExp(ExpressionDomain()); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomainExplicit() { | ||||
| 	static const auto result = CreateRegExp(ExpressionDomainExplicit()); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| QRegularExpression RegExpProtocol() { | ||||
| 	static const auto result = CreateRegExp("^([a-zA-Z]+)://"); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| QMap<QString, QString> url_parse_params( | ||||
| 		const QString ¶ms, | ||||
| 		UrlParamNameTransform transform) { | ||||
|  | @ -77,9 +107,9 @@ QString validate_url(const QString &value) { | |||
| 	if (trimmed.isEmpty()) { | ||||
| 		return QString(); | ||||
| 	} | ||||
| 	const auto match = TextUtilities::RegExpDomainExplicit().match(trimmed); | ||||
| 	const auto match = RegExpDomainExplicit().match(trimmed); | ||||
| 	if (!match.hasMatch()) { | ||||
| 		const auto domain = TextUtilities::RegExpDomain().match(trimmed); | ||||
| 		const auto domain = RegExpDomain().match(trimmed); | ||||
| 		if (!domain.hasMatch() || domain.capturedStart() != 0) { | ||||
| 			return QString(); | ||||
| 		} | ||||
|  |  | |||
|  | @ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| 
 | ||||
| namespace qthelp { | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomain(); | ||||
| const QRegularExpression &RegExpDomainExplicit(); | ||||
| QRegularExpression RegExpProtocol(); | ||||
| 
 | ||||
| inline QString url_encode(const QString &part) { | ||||
| 	return QString::fromLatin1(QUrl::toPercentEncoding(part)); | ||||
| } | ||||
|  |  | |||
|  | @ -8,27 +8,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "base/runtime_composer.h" | ||||
| 
 | ||||
| struct RuntimeComposerMetadatasMap { | ||||
| 	QMap<uint64, RuntimeComposerMetadata*> data; | ||||
| 	~RuntimeComposerMetadatasMap() { | ||||
| 		for_const (const RuntimeComposerMetadata *p, data) { | ||||
| 			delete p; | ||||
| 		} | ||||
| 	} | ||||
| 	std::map<uint64, std::unique_ptr<RuntimeComposerMetadata>> data; | ||||
| 	QMutex mutex; | ||||
| }; | ||||
| 
 | ||||
| const RuntimeComposerMetadata *GetRuntimeComposerMetadata(uint64 mask) { | ||||
| 	static RuntimeComposerMetadatasMap RuntimeComposerMetadatas; | ||||
| 	static QMutex RuntimeComposerMetadatasMutex; | ||||
| 
 | ||||
| 	QMutexLocker lock(&RuntimeComposerMetadatasMutex); | ||||
| 	auto i = RuntimeComposerMetadatas.data.constFind(mask); | ||||
| 	if (i == RuntimeComposerMetadatas.data.cend()) { | ||||
| 		RuntimeComposerMetadata *meta = new RuntimeComposerMetadata(mask); | ||||
| 		Assert(meta != nullptr); | ||||
| 
 | ||||
| 		i = RuntimeComposerMetadatas.data.insert(mask, meta); | ||||
| 	QMutexLocker lock(&RuntimeComposerMetadatas.mutex); | ||||
| 	auto i = RuntimeComposerMetadatas.data.find(mask); | ||||
| 	if (i == end(RuntimeComposerMetadatas.data)) { | ||||
| 		i = RuntimeComposerMetadatas.data.emplace( | ||||
| 			mask, | ||||
| 			std::make_unique<RuntimeComposerMetadata>(mask)).first; | ||||
| 	} | ||||
| 	return i.value(); | ||||
| 	return i->second.get(); | ||||
| } | ||||
| 
 | ||||
| const RuntimeComposerMetadata *RuntimeComposerBase::ZeroRuntimeComposerMetadata = GetRuntimeComposerMetadata(0); | ||||
|  |  | |||
|  | @ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| */ | ||||
| #include "base/timer.h" | ||||
| 
 | ||||
| #include <QtCore/QTimerEvent> | ||||
| 
 | ||||
| namespace base { | ||||
| namespace { | ||||
| 
 | ||||
|  | @ -48,7 +50,7 @@ void Timer::start(TimeMs timeout, Qt::TimerType type, Repeat repeat) { | |||
| 	setTimeout(timeout); | ||||
| 	_timerId = startTimer(_timeout, _type); | ||||
| 	if (_timerId) { | ||||
| 		_next = getms(true) + _timeout; | ||||
| 		_next = crl::time() + _timeout; | ||||
| 	} else { | ||||
| 		_next = 0; | ||||
| 	} | ||||
|  | @ -64,7 +66,7 @@ TimeMs Timer::remainingTime() const { | |||
| 	if (!isActive()) { | ||||
| 		return -1; | ||||
| 	} | ||||
| 	auto now = getms(true); | ||||
| 	auto now = crl::time(); | ||||
| 	return (_next > now) ? (_next - now) : TimeMs(0); | ||||
| } | ||||
| 
 | ||||
|  | @ -101,7 +103,7 @@ void Timer::timerEvent(QTimerEvent *e) { | |||
| 		if (_adjusted) { | ||||
| 			start(_timeout, _type, repeat()); | ||||
| 		} else { | ||||
| 			_next = getms(true) + _timeout; | ||||
| 			_next = crl::time() + _timeout; | ||||
| 		} | ||||
| 	} else { | ||||
| 		cancel(); | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ private: | |||
| }; | ||||
| 
 | ||||
| //bool ValidateUrl(const QString &value) {
 | ||||
| //	const auto match = TextUtilities::RegExpDomain().match(value);
 | ||||
| //	const auto match = qthelp::RegExpDomain().match(value);
 | ||||
| //	if (!match.hasMatch() || match.capturedStart() != 0) {
 | ||||
| //		return false;
 | ||||
| //	}
 | ||||
|  | @ -596,7 +596,7 @@ void MessageLinksParser::parse() { | |||
| 	const auto len = text.size(); | ||||
| 	const QChar *start = text.unicode(), *end = start + text.size(); | ||||
| 	for (auto offset = 0, matchOffset = offset; offset < len;) { | ||||
| 		auto m = TextUtilities::RegExpDomain().match(text, matchOffset); | ||||
| 		auto m = qthelp::RegExpDomain().match(text, matchOffset); | ||||
| 		if (!m.hasMatch()) break; | ||||
| 
 | ||||
| 		auto domainOffset = m.capturedStart(); | ||||
|  |  | |||
|  | @ -47,11 +47,17 @@ void ProcessMainQueue(void (*callable)(void*), void *argument) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void ProcessObservables() { | ||||
| 	Global::RefHandleObservables().call(); | ||||
| } | ||||
| 
 | ||||
| } // namespace
 | ||||
| 
 | ||||
| MainQueueProcessor::MainQueueProcessor() { | ||||
| 	acquire(); | ||||
| 	crl::init_main_queue(ProcessMainQueue); | ||||
| 
 | ||||
| 	base::InitObservables(ProcessObservables); | ||||
| } | ||||
| 
 | ||||
| bool MainQueueProcessor::event(QEvent *event) { | ||||
|  |  | |||
|  | @ -194,52 +194,34 @@ namespace { | |||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	float64 _msFreq; | ||||
| 	float64 _msgIdCoef; | ||||
| 	TimeMs _msStart = 0, _msAddToMsStart = 0, _msAddToUnixtime = 0; | ||||
| 	int32 _timeStart = 0; | ||||
| 
 | ||||
| 	class _MsInitializer { | ||||
| 	class _MsStarter { | ||||
| 	public: | ||||
| 		_MsInitializer() { | ||||
| 		_MsStarter() { | ||||
| #ifdef Q_OS_WIN | ||||
| 			LARGE_INTEGER li; | ||||
| 			QueryPerformanceFrequency(&li); | ||||
|             _msFreq = 1000. / float64(li.QuadPart); | ||||
| 
 | ||||
| 			// 0xFFFF0000L istead of 0x100000000L to make msgId grow slightly slower, than unixtime and we had time to reconfigure
 | ||||
| 			_msgIdCoef = float64(0xFFFF0000L) / float64(li.QuadPart); | ||||
| 
 | ||||
| 			QueryPerformanceCounter(&li); | ||||
| 			_msStart = li.QuadPart; | ||||
| 			const auto seed = li.QuadPart; | ||||
| #elif defined Q_OS_MAC | ||||
|             mach_timebase_info_data_t tb = { 0, 0 }; | ||||
|             mach_timebase_info(&tb); | ||||
|             _msFreq = (float64(tb.numer) / tb.denom) / 1000000.; | ||||
|             const auto freq = (float64(tb.numer) / tb.denom) / 1000000.; | ||||
|             _msgIdCoef = freq * (float64(0xFFFF0000L) / 1000.); | ||||
| 
 | ||||
|             _msgIdCoef = _msFreq * (float64(0xFFFF0000L) / 1000.); | ||||
| 
 | ||||
|             _msStart = mach_absolute_time(); | ||||
|             const auto seed = mach_absolute_time(); | ||||
| #else | ||||
|             timespec ts; | ||||
|             clock_gettime(CLOCK_MONOTONIC, &ts); | ||||
|             //_msFreq = 1 / 1000000.;
 | ||||
|             _msgIdCoef = float64(0xFFFF0000L) / 1000000000.; | ||||
|             _msStart = 1000LL * static_cast<TimeMs>(ts.tv_sec) + (static_cast<TimeMs>(ts.tv_nsec) / 1000000LL); | ||||
| 			_msgIdCoef = float64(0xFFFF0000L) / 1000000000.; | ||||
| 
 | ||||
| 			timespec ts; | ||||
| 			clock_gettime(CLOCK_MONOTONIC, &ts); | ||||
| 			const auto seed = 1000LL * static_cast<TimeMs>(ts.tv_sec) + (static_cast<TimeMs>(ts.tv_nsec) / 1000000LL); | ||||
| #endif | ||||
| 			_timeStart = LocalUnixtime(); | ||||
| 			srand((uint32)(_msStart & 0xFFFFFFFFL)); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	void _msInitialize() { | ||||
| 		static _MsInitializer _msInitializer; | ||||
| 	} | ||||
| 
 | ||||
| 	class _MsStarter { | ||||
| 	public: | ||||
| 		_MsStarter() { | ||||
| 			getms(); | ||||
| 			srand((uint32)(seed & 0xFFFFFFFFL)); | ||||
| 		} | ||||
| 	}; | ||||
| 	_MsStarter _msStarter; | ||||
|  | @ -365,11 +347,25 @@ namespace ThirdParty { | |||
| 		Platform::ThirdParty::start(); | ||||
| 
 | ||||
| 		if (!RAND_status()) { // should be always inited in all modern OS
 | ||||
| 			char buf[16]; | ||||
| 			memcpy(buf, &_msStart, 8); | ||||
| 			memcpy(buf + 8, &_msFreq, 8); | ||||
| 			uchar sha256Buffer[32]; | ||||
| 			RAND_seed(hashSha256(buf, 16, sha256Buffer), 32); | ||||
| 			const auto FeedSeed = [](auto value) { | ||||
| 				RAND_seed(&value, sizeof(value)); | ||||
| 			}; | ||||
| #ifdef Q_OS_WIN | ||||
| 			LARGE_INTEGER li; | ||||
| 			QueryPerformanceFrequency(&li); | ||||
| 			FeedSeed(li.QuadPart); | ||||
| 			QueryPerformanceCounter(&li); | ||||
| 			FeedSeed(li.QuadPart); | ||||
| #elif defined Q_OS_MAC | ||||
| 			mach_timebase_info_data_t tb = { 0 }; | ||||
| 			mach_timebase_info(&tb); | ||||
| 			FeedSeed(tb); | ||||
| 			FeedSeed(mach_absolute_time()); | ||||
| #else | ||||
| 			timespec ts = { 0 }; | ||||
| 			clock_gettime(CLOCK_MONOTONIC, &ts); | ||||
| 			FeedSeed(ts); | ||||
| #endif | ||||
| 			if (!RAND_status()) { | ||||
| 				LOG(("MTP Error: Could not init OpenSSL rand, RAND_status() is 0...")); | ||||
| 			} | ||||
|  | @ -429,12 +425,7 @@ namespace ThirdParty { | |||
| } | ||||
| 
 | ||||
| bool checkms() { | ||||
| 	auto unixms = (LocalUnixtime() - _timeStart) * 1000LL + _msAddToUnixtime; | ||||
| 	auto ms = getms(true); | ||||
| 	if (ms > unixms + 1000LL) { | ||||
| 		_msAddToUnixtime = ((ms - unixms) / 1000LL) * 1000LL; | ||||
| 	} else if (unixms > ms + 1000LL) { | ||||
| 		_msAddToMsStart += ((unixms - ms) / 1000LL) * 1000LL; | ||||
| 	if (crl::adjust_time()) { | ||||
| 		Sandbox::adjustSingleTimers(); | ||||
| 		return true; | ||||
| 	} | ||||
|  | @ -442,24 +433,7 @@ bool checkms() { | |||
| } | ||||
| 
 | ||||
| TimeMs getms(bool checked) { | ||||
|     _msInitialize(); | ||||
| #ifdef Q_OS_WIN | ||||
|     LARGE_INTEGER li; | ||||
|     QueryPerformanceCounter(&li); | ||||
| 	return ((li.QuadPart - _msStart) * _msFreq) + (checked ? _msAddToMsStart : 0LL); | ||||
| #elif defined Q_OS_MAC | ||||
| 	auto msCount = static_cast<TimeMs>(mach_absolute_time()); | ||||
| 	return ((msCount - _msStart) * _msFreq) + (checked ? _msAddToMsStart : 0LL); | ||||
| #else | ||||
|     timespec ts; | ||||
|     auto res = clock_gettime(CLOCK_MONOTONIC, &ts); | ||||
|     if (res != 0) { | ||||
|         LOG(("Bad clock_gettime result: %1").arg(res)); | ||||
|         return 0; | ||||
|     } | ||||
|     auto msCount = 1000LL * static_cast<TimeMs>(ts.tv_sec) + (static_cast<TimeMs>(ts.tv_nsec) / 1000000LL); | ||||
|     return (msCount - _msStart) + (checked ? _msAddToMsStart : 0LL); | ||||
| #endif | ||||
| 	return crl::time(); | ||||
| } | ||||
| 
 | ||||
| uint64 msgid() { | ||||
|  |  | |||
|  | @ -22,7 +22,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include <set> | ||||
| 
 | ||||
| #define qsl(s) QStringLiteral(s) | ||||
| #define qstr(s) QLatin1String((s), sizeof(s) - 1) | ||||
| 
 | ||||
| // Define specializations for QByteArray for Qt 5.3.2, because
 | ||||
| // QByteArray in Qt 5.3.2 doesn't declare "pointer" subtype.
 | ||||
|  | @ -186,12 +185,6 @@ inline QByteArray str_const_toByteArray(const str_const &str) { | |||
| 	return QByteArray::fromRawData(str.c_str(), str.size()); | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| inline void accumulate_max(T &a, const T &b) { if (a < b) a = b; } | ||||
| 
 | ||||
| template <typename T> | ||||
| inline void accumulate_min(T &a, const T &b) { if (a > b) a = b; } | ||||
| 
 | ||||
| void unixtimeInit(); | ||||
| void unixtimeSet(TimeId serverTime, bool force = false); | ||||
| TimeId unixtime(); | ||||
|  |  | |||
|  | @ -668,7 +668,8 @@ void Messenger::forceLogOut(const TextWithEntities &explanation) { | |||
| } | ||||
| 
 | ||||
| void Messenger::checkLocalTime() { | ||||
| 	if (App::main()) App::main()->checkLastUpdate(checkms()); | ||||
| 	const auto updated = checkms(); | ||||
| 	if (App::main()) App::main()->checkLastUpdate(updated); | ||||
| } | ||||
| 
 | ||||
| void Messenger::onAppStateChanged(Qt::ApplicationState state) { | ||||
|  |  | |||
|  | @ -9,20 +9,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| 
 | ||||
| #include "auth_session.h" | ||||
| #include "lang/lang_tag.h" | ||||
| #include "base/qthelp_url.h" | ||||
| 
 | ||||
| namespace TextUtilities { | ||||
| namespace { | ||||
| 
 | ||||
| QString ExpressionDomain() { | ||||
| 	// Matches any domain name, containing at least one '.', including "file.txt".
 | ||||
| 	return QString::fromUtf8("(?<![\\w\\$\\-\\_%=\\.])(?:([a-zA-Z]+)://)?((?:[A-Za-z" "\xD0\x90-\xD0\xAF\xD0\x81" "\xD0\xB0-\xD1\x8F\xD1\x91" "0-9\\-\\_]+\\.){1,10}([A-Za-z" "\xD1\x80\xD1\x84" "\\-\\d]{2,22})(\\:\\d+)?)"); | ||||
| } | ||||
| 
 | ||||
| QString ExpressionDomainExplicit() { | ||||
| 	// Matches any domain name, containing a protocol, including "test://localhost".
 | ||||
| 	return QString::fromUtf8("(?<![\\w\\$\\-\\_%=\\.])(?:([a-zA-Z]+)://)((?:[A-Za-z" "\xD0\x90-\xD0\xAF\xD0\x81" "\xD0\xB0-\xD1\x8F\xD1\x91" "0-9\\-\\_]+\\.){0,10}([A-Za-z" "\xD1\x80\xD1\x84" "\\-\\d]{2,22})(\\:\\d+)?)"); | ||||
| } | ||||
| 
 | ||||
| QString ExpressionMailNameAtEnd() { | ||||
| 	// Matches email first part (before '@') at the end of the string.
 | ||||
| 	// First we find a domain without protocol (like "gmail.com"), then
 | ||||
|  | @ -1138,16 +1129,6 @@ const QRegularExpression &RegExpWordSplit() { | |||
| 
 | ||||
| } // namespace
 | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomain() { | ||||
| 	static const auto result = CreateRegExp(ExpressionDomain()); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomainExplicit() { | ||||
| 	static const auto result = CreateRegExp(ExpressionDomainExplicit()); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| const QRegularExpression &RegExpMailNameAtEnd() { | ||||
| 	static const auto result = CreateRegExp(ExpressionMailNameAtEnd()); | ||||
| 	return result; | ||||
|  | @ -1604,8 +1585,8 @@ void ParseEntities(TextWithEntities &result, int32 flags, bool rich) { | |||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		auto mDomain = RegExpDomain().match(result.text, matchOffset); | ||||
| 		auto mExplicitDomain = RegExpDomainExplicit().match(result.text, matchOffset); | ||||
| 		auto mDomain = qthelp::RegExpDomain().match(result.text, matchOffset); | ||||
| 		auto mExplicitDomain = qthelp::RegExpDomainExplicit().match(result.text, matchOffset); | ||||
| 		auto mHashtag = withHashtags ? RegExpHashtag().match(result.text, matchOffset) : QRegularExpressionMatch(); | ||||
| 		auto mMention = withMentions ? RegExpMention().match(result.text, qMax(mentionSkip, matchOffset)) : QRegularExpressionMatch(); | ||||
| 		auto mBotCommand = withBotCommands ? RegExpBotCommand().match(result.text, matchOffset) : QRegularExpressionMatch(); | ||||
|  |  | |||
|  | @ -157,8 +157,6 @@ namespace TextUtilities { | |||
| bool IsValidProtocol(const QString &protocol); | ||||
| bool IsValidTopDomain(const QString &domain); | ||||
| 
 | ||||
| const QRegularExpression &RegExpDomain(); | ||||
| const QRegularExpression &RegExpDomainExplicit(); | ||||
| const QRegularExpression &RegExpMailNameAtEnd(); | ||||
| const QRegularExpression &RegExpHashtag(); | ||||
| const QRegularExpression &RegExpHashtagExclude(); | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| Subproject commit 527ad273b683d52c5adf5b45b73c6466aa0d0cf0 | ||||
| Subproject commit 2cab11076d84a9db7d86f165eb2cfb4c6ebcc8f4 | ||||
|  | @ -78,6 +78,7 @@ | |||
|       'utils.gyp:Updater', | ||||
|       '../ThirdParty/libtgvoip/libtgvoip.gyp:libtgvoip', | ||||
|       'crl.gyp:crl', | ||||
|       'lib_base.gyp:lib_base', | ||||
|       'lib_export.gyp:lib_export', | ||||
|       'lib_storage.gyp:lib_storage', | ||||
|     ], | ||||
|  |  | |||
|  | @ -53,6 +53,8 @@ | |||
|       '<(crl_src_loc)/dispatch/crl_dispatch_queue.h', | ||||
|       '<(crl_src_loc)/dispatch/crl_dispatch_semaphore.cpp', | ||||
|       '<(crl_src_loc)/dispatch/crl_dispatch_semaphore.h', | ||||
|       '<(crl_src_loc)/mac/crl_mac_time.cpp', | ||||
|       '<(crl_src_loc)/linux/crl_linux_time.cpp', | ||||
|       '<(crl_src_loc)/qt/crl_qt_async.cpp', | ||||
|       '<(crl_src_loc)/qt/crl_qt_async.h', | ||||
|       '<(crl_src_loc)/qt/crl_qt_semaphore.cpp', | ||||
|  | @ -64,12 +66,15 @@ | |||
|       '<(crl_src_loc)/winapi/crl_winapi_list.h', | ||||
|       '<(crl_src_loc)/winapi/crl_winapi_semaphore.cpp', | ||||
|       '<(crl_src_loc)/winapi/crl_winapi_semaphore.h', | ||||
|       '<(crl_src_loc)/winapi/crl_winapi_time.cpp', | ||||
|       '<(crl_src_loc)/crl.h', | ||||
|       '<(crl_src_loc)/crl_async.h', | ||||
|       '<(crl_src_loc)/crl_object_on_queue.h', | ||||
|       '<(crl_src_loc)/crl_on_main.h', | ||||
|       '<(crl_src_loc)/crl_queue.h', | ||||
|       '<(crl_src_loc)/crl_semaphore.h', | ||||
|       '<(crl_src_loc)/crl_time.cpp', | ||||
|       '<(crl_src_loc)/crl_time.h', | ||||
|     ], | ||||
|   }], | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,95 @@ | |||
| # This file is part of Telegram Desktop, | ||||
| # the official desktop application for the Telegram messaging service. | ||||
| # | ||||
| # For license and copyright information please follow this link: | ||||
| # https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||
| 
 | ||||
| { | ||||
|   'includes': [ | ||||
|     'common.gypi', | ||||
|   ], | ||||
|   'targets': [{ | ||||
|     'target_name': 'lib_base', | ||||
|     'type': 'static_library', | ||||
|     'includes': [ | ||||
|       'common.gypi', | ||||
| 	  'openssl.gypi', | ||||
|       'qt.gypi', | ||||
|       'telegram_win.gypi', | ||||
|       'telegram_mac.gypi', | ||||
|       'telegram_linux.gypi', | ||||
|       'pch.gypi', | ||||
|     ], | ||||
|     'variables': { | ||||
|       'src_loc': '../SourceFiles', | ||||
|       'res_loc': '../Resources', | ||||
|       'libs_loc': '../../../Libraries', | ||||
|       'official_build_target%': '', | ||||
|       'submodules_loc': '../ThirdParty', | ||||
|       'pch_source': '<(src_loc)/base/base_pch.cpp', | ||||
|       'pch_header': '<(src_loc)/base/base_pch.h', | ||||
|     }, | ||||
|     'defines': [ | ||||
|       'XXH_INLINE_ALL', | ||||
|     ], | ||||
|     'dependencies': [ | ||||
|       'crl.gyp:crl', | ||||
|     ], | ||||
|     'include_dirs': [ | ||||
|       '<(src_loc)', | ||||
|       '<(SHARED_INTERMEDIATE_DIR)', | ||||
|       '<(libs_loc)/range-v3/include', | ||||
|       '<(submodules_loc)/GSL/include', | ||||
|       '<(submodules_loc)/variant/include', | ||||
|       '<(submodules_loc)/crl/src', | ||||
|       '<(submodules_loc)/xxHash', | ||||
|     ], | ||||
|     'sources': [ | ||||
|       '<(src_loc)/base/algorithm.h', | ||||
|       '<(src_loc)/base/assertion.h', | ||||
|       '<(src_loc)/base/basic_types.h', | ||||
|       '<(src_loc)/base/binary_guard.h', | ||||
|       '<(src_loc)/base/build_config.h', | ||||
|       '<(src_loc)/base/bytes.h', | ||||
|       '<(src_loc)/base/flags.h', | ||||
|       '<(src_loc)/base/enum_mask.h', | ||||
|       '<(src_loc)/base/flat_map.h', | ||||
|       '<(src_loc)/base/flat_set.h', | ||||
|       '<(src_loc)/base/functors.h', | ||||
|       '<(src_loc)/base/index_based_iterator.h', | ||||
|       '<(src_loc)/base/match_method.h', | ||||
|       '<(src_loc)/base/observer.cpp', | ||||
|       '<(src_loc)/base/observer.h', | ||||
|       '<(src_loc)/base/ordered_set.h', | ||||
|       '<(src_loc)/base/openssl_help.h', | ||||
|       '<(src_loc)/base/optional.h', | ||||
|       '<(src_loc)/base/overload.h', | ||||
|       '<(src_loc)/base/parse_helper.cpp', | ||||
|       '<(src_loc)/base/parse_helper.h', | ||||
|       '<(src_loc)/base/qthelp_regex.h', | ||||
|       '<(src_loc)/base/qthelp_url.cpp', | ||||
|       '<(src_loc)/base/qthelp_url.h', | ||||
|       '<(src_loc)/base/runtime_composer.cpp', | ||||
|       '<(src_loc)/base/runtime_composer.h', | ||||
|       '<(src_loc)/base/timer.cpp', | ||||
|       '<(src_loc)/base/timer.h', | ||||
|       '<(src_loc)/base/type_traits.h', | ||||
|       '<(src_loc)/base/unique_any.h', | ||||
|       '<(src_loc)/base/unique_function.h', | ||||
|       '<(src_loc)/base/unique_qptr.h', | ||||
|       '<(src_loc)/base/value_ordering.h', | ||||
|       '<(src_loc)/base/variant.h', | ||||
|       '<(src_loc)/base/virtual_method.h', | ||||
|       '<(src_loc)/base/weak_ptr.h', | ||||
|       '<(src_loc)/base/zlib_help.h', | ||||
|     ], | ||||
|     'conditions': [[ 'build_macold', { | ||||
|       'xcode_settings': { | ||||
|         'OTHER_CPLUSPLUSFLAGS': [ '-nostdinc++' ], | ||||
|       }, | ||||
|       'include_dirs': [ | ||||
|         '/usr/local/macold/include/c++/v1', | ||||
|       ], | ||||
|     }]], | ||||
|   }], | ||||
| } | ||||
|  | @ -1,40 +1,3 @@ | |||
| <(src_loc)/base/algorithm.h | ||||
| <(src_loc)/base/assertion.h | ||||
| <(src_loc)/base/basic_types.h | ||||
| <(src_loc)/base/binary_guard.h | ||||
| <(src_loc)/base/build_config.h | ||||
| <(src_loc)/base/bytes.h | ||||
| <(src_loc)/base/flags.h | ||||
| <(src_loc)/base/enum_mask.h | ||||
| <(src_loc)/base/flat_map.h | ||||
| <(src_loc)/base/flat_set.h | ||||
| <(src_loc)/base/functors.h | ||||
| <(src_loc)/base/index_based_iterator.h | ||||
| <(src_loc)/base/match_method.h | ||||
| <(src_loc)/base/observer.cpp | ||||
| <(src_loc)/base/observer.h | ||||
| <(src_loc)/base/ordered_set.h | ||||
| <(src_loc)/base/openssl_help.h | ||||
| <(src_loc)/base/optional.h | ||||
| <(src_loc)/base/overload.h | ||||
| <(src_loc)/base/parse_helper.cpp | ||||
| <(src_loc)/base/parse_helper.h | ||||
| <(src_loc)/base/qthelp_regex.h | ||||
| <(src_loc)/base/qthelp_url.cpp | ||||
| <(src_loc)/base/qthelp_url.h | ||||
| <(src_loc)/base/runtime_composer.cpp | ||||
| <(src_loc)/base/runtime_composer.h | ||||
| <(src_loc)/base/timer.cpp | ||||
| <(src_loc)/base/timer.h | ||||
| <(src_loc)/base/type_traits.h | ||||
| <(src_loc)/base/unique_any.h | ||||
| <(src_loc)/base/unique_function.h | ||||
| <(src_loc)/base/unique_qptr.h | ||||
| <(src_loc)/base/value_ordering.h | ||||
| <(src_loc)/base/variant.h | ||||
| <(src_loc)/base/virtual_method.h | ||||
| <(src_loc)/base/weak_ptr.h | ||||
| <(src_loc)/base/zlib_help.h | ||||
| <(src_loc)/boxes/peers/edit_peer_info_box.cpp | ||||
| <(src_loc)/boxes/peers/edit_peer_info_box.h | ||||
| <(src_loc)/boxes/peers/manage_peer_box.cpp | ||||
|  | @ -811,6 +774,9 @@ platforms: !win | |||
| <(minizip_loc)/unzip.c | ||||
| <(minizip_loc)/unzip.h | ||||
| 
 | ||||
| platforms: win | ||||
| <(res_loc)/winrc/Telegram.rc | ||||
| 
 | ||||
| platforms: mac | ||||
| <(sp_media_key_tap_loc)/SPMediaKeyTap.m | ||||
| <(sp_media_key_tap_loc)/SPMediaKeyTap.h | ||||
|  |  | |||
|  | @ -7,9 +7,6 @@ | |||
| { | ||||
|   'conditions': [[ 'build_win', { | ||||
|     'msbuild_toolset': 'v141', | ||||
|     'sources': [ | ||||
|       '<(res_loc)/winrc/Telegram.rc', | ||||
|     ], | ||||
|     'library_dirs': [ | ||||
|       '<(libs_loc)/ffmpeg', | ||||
|     ], | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue