mirror of
https://github.com/vale981/tdesktop
synced 2025-03-05 09:41:41 -05:00
Add Calls::Instance. Add libtgvoip as a dependency.
Also move all submodules to Telegram/ThirdParty.
This commit is contained in:
parent
d78523e905
commit
d18164bc51
20 changed files with 399 additions and 73 deletions
13
.gitmodules
vendored
13
.gitmodules
vendored
|
@ -1,6 +1,9 @@
|
||||||
[submodule "third_party/GSL"]
|
[submodule "Telegram/ThirdParty/libtgvoip"]
|
||||||
path = third_party/GSL
|
path = Telegram/ThirdParty/libtgvoip
|
||||||
url = https://github.com/Microsoft/GSL.git
|
url = https://github.com/telegramdesktop/libtgvoip
|
||||||
[submodule "third_party/variant"]
|
[submodule "Telegram/ThirdParty/variant"]
|
||||||
path = third_party/variant
|
path = Telegram/ThirdParty/variant
|
||||||
url = https://github.com/mapbox/variant
|
url = https://github.com/mapbox/variant
|
||||||
|
[submodule "Telegram/ThirdParty/GSL"]
|
||||||
|
path = Telegram/ThirdParty/GSL
|
||||||
|
url = https://github.com/Microsoft/GSL.git
|
||||||
|
|
|
@ -26,6 +26,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
||||||
#include "storage/localstorage.h"
|
#include "storage/localstorage.h"
|
||||||
#include "window/notifications_manager.h"
|
#include "window/notifications_manager.h"
|
||||||
#include "platform/platform_specific.h"
|
#include "platform/platform_specific.h"
|
||||||
|
#include "calls/calls_instance.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -92,6 +93,7 @@ AuthSession::AuthSession(UserId userId)
|
||||||
: _userId(userId)
|
: _userId(userId)
|
||||||
, _autoLockTimer([this] { checkAutoLock(); })
|
, _autoLockTimer([this] { checkAutoLock(); })
|
||||||
, _api(std::make_unique<ApiWrap>())
|
, _api(std::make_unique<ApiWrap>())
|
||||||
|
, _calls(std::make_unique<Calls::Instance>())
|
||||||
, _downloader(std::make_unique<Storage::Downloader>())
|
, _downloader(std::make_unique<Storage::Downloader>())
|
||||||
, _notifications(std::make_unique<Window::Notifications::System>(this)) {
|
, _notifications(std::make_unique<Window::Notifications::System>(this)) {
|
||||||
Expects(_userId != 0);
|
Expects(_userId != 0);
|
||||||
|
|
|
@ -32,6 +32,10 @@ class System;
|
||||||
} // namespace Notifications
|
} // namespace Notifications
|
||||||
} // namespace Window
|
} // namespace Window
|
||||||
|
|
||||||
|
namespace Calls {
|
||||||
|
class Instance;
|
||||||
|
} // namespace Calls
|
||||||
|
|
||||||
class ApiWrap;
|
class ApiWrap;
|
||||||
|
|
||||||
enum class EmojiPanelTab {
|
enum class EmojiPanelTab {
|
||||||
|
@ -144,6 +148,10 @@ public:
|
||||||
return *_api;
|
return *_api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Calls::Instance &calls() {
|
||||||
|
return *_calls;
|
||||||
|
}
|
||||||
|
|
||||||
void checkAutoLock();
|
void checkAutoLock();
|
||||||
void checkAutoLockIn(TimeMs time);
|
void checkAutoLockIn(TimeMs time);
|
||||||
|
|
||||||
|
@ -158,6 +166,7 @@ private:
|
||||||
base::Timer _autoLockTimer;
|
base::Timer _autoLockTimer;
|
||||||
|
|
||||||
const std::unique_ptr<ApiWrap> _api;
|
const std::unique_ptr<ApiWrap> _api;
|
||||||
|
const std::unique_ptr<Calls::Instance> _calls;
|
||||||
const std::unique_ptr<Storage::Downloader> _downloader;
|
const std::unique_ptr<Storage::Downloader> _downloader;
|
||||||
const std::unique_ptr<Window::Notifications::System> _notifications;
|
const std::unique_ptr<Window::Notifications::System> _notifications;
|
||||||
|
|
||||||
|
|
|
@ -86,3 +86,15 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace base
|
} // namespace base
|
||||||
|
|
||||||
|
#ifdef QT_VERSION
|
||||||
|
template <typename Lambda>
|
||||||
|
inline void InvokeQueued(base::enable_weak_from_this *context, Lambda &&lambda) {
|
||||||
|
QObject proxy;
|
||||||
|
QObject::connect(&proxy, &QObject::destroyed, QCoreApplication::instance(), [guard = base::weak_unique_ptr<base::enable_weak_from_this>(context), lambda = std::forward<Lambda>(lambda)] {
|
||||||
|
if (guard) {
|
||||||
|
lambda();
|
||||||
|
}
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
#endif // QT_VERSION
|
||||||
|
|
248
Telegram/SourceFiles/calls/calls_instance.cpp
Normal file
248
Telegram/SourceFiles/calls/calls_instance.cpp
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop version of Telegram messaging app, see https://telegram.org
|
||||||
|
|
||||||
|
Telegram Desktop is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
It is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
In addition, as a special exception, the copyright holders give permission
|
||||||
|
to link the code of portions of this program with the OpenSSL library.
|
||||||
|
|
||||||
|
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
|
||||||
|
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
||||||
|
*/
|
||||||
|
#include "calls/calls_instance.h"
|
||||||
|
|
||||||
|
#include "mtproto/connection.h"
|
||||||
|
#include "auth_session.h"
|
||||||
|
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
|
||||||
|
#ifdef slots
|
||||||
|
#undef slots
|
||||||
|
#define NEED_TO_RESTORE_SLOTS
|
||||||
|
#endif // slots
|
||||||
|
|
||||||
|
#include <VoIPController.h>
|
||||||
|
#include <VoIPServerConfig.h>
|
||||||
|
|
||||||
|
#ifdef NEED_TO_RESTORE_SLOTS
|
||||||
|
#define slots Q_SLOTS
|
||||||
|
#undef NEED_TO_RESTORE_SLOTS
|
||||||
|
#endif // NEED_TO_RESTORE_SLOTS
|
||||||
|
|
||||||
|
namespace Calls {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
constexpr auto kMinLayer = 65;
|
||||||
|
constexpr auto kMaxLayer = 65; // MTP::CurrentLayer?
|
||||||
|
|
||||||
|
using tgvoip::Endpoint;
|
||||||
|
|
||||||
|
void ConvertEndpoint(std::vector<tgvoip::Endpoint> &ep, const MTPDphoneConnection &mtc) {
|
||||||
|
if (mtc.vpeer_tag.v.length() != 16)
|
||||||
|
return;
|
||||||
|
auto ipv4 = tgvoip::IPv4Address(std::string(mtc.vip.v.constData(), mtc.vip.v.size()));
|
||||||
|
auto ipv6 = tgvoip::IPv6Address(std::string(mtc.vipv6.v.constData(), mtc.vipv6.v.size()));
|
||||||
|
ep.push_back(Endpoint((int64_t)mtc.vid.v, (uint16_t)mtc.vport.v, ipv4, ipv6, EP_TYPE_UDP_RELAY, (unsigned char*)mtc.vpeer_tag.v.data()));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
Instance::Instance() = default;
|
||||||
|
|
||||||
|
void Instance::startOutgoingCall(gsl::not_null<UserData*> user) {
|
||||||
|
if (_controller) {
|
||||||
|
return; // Already in a call.
|
||||||
|
}
|
||||||
|
|
||||||
|
_controller = std::make_unique<tgvoip::VoIPController>();
|
||||||
|
request(MTPmessages_GetDhConfig(MTP_int(_dhConfigVersion), MTP_int(256))).done([this, user](const MTPmessages_DhConfig &result) {
|
||||||
|
auto random = QByteArray();
|
||||||
|
switch (result.type()) {
|
||||||
|
case mtpc_messages_dhConfig: {
|
||||||
|
auto &config = result.c_messages_dhConfig();
|
||||||
|
if (!MTP::IsPrimeAndGood(config.vp.v, config.vg.v)) {
|
||||||
|
LOG(("API Error: bad p/g received in dhConfig."));
|
||||||
|
callFailed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_dhConfigG = config.vg.v;
|
||||||
|
_dhConfigP = config.vp.v;
|
||||||
|
random = qba(config.vrandom);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case mtpc_messages_dhConfigNotModified: {
|
||||||
|
auto &config = result.c_messages_dhConfigNotModified();
|
||||||
|
random = qba(config.vrandom);
|
||||||
|
if (!_dhConfigG || _dhConfigP.isEmpty()) {
|
||||||
|
LOG(("API Error: dhConfigNotModified on zero version."));
|
||||||
|
callFailed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
default: Unexpected("Type in messages.getDhConfig");
|
||||||
|
}
|
||||||
|
if (random.size() != kSaltSize) {
|
||||||
|
LOG(("API Error: dhConfig random bytes wrong size: %1").arg(random.size()));
|
||||||
|
callFailed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto randomBytes = reinterpret_cast<const unsigned char*>(random.constData());
|
||||||
|
RAND_bytes(_salt.data(), kSaltSize);
|
||||||
|
for (auto i = 0; i != kSaltSize; i++) {
|
||||||
|
_salt[i] ^= randomBytes[i];
|
||||||
|
}
|
||||||
|
BN_CTX* ctx = BN_CTX_new();
|
||||||
|
BN_CTX_init(ctx);
|
||||||
|
BIGNUM i_g_a;
|
||||||
|
BN_init(&i_g_a);
|
||||||
|
BN_set_word(&i_g_a, _dhConfigG);
|
||||||
|
BIGNUM tmp;
|
||||||
|
BN_init(&tmp);
|
||||||
|
BIGNUM saltBN;
|
||||||
|
BN_init(&saltBN);
|
||||||
|
BN_bin2bn(_salt.data(), kSaltSize, &saltBN);
|
||||||
|
BIGNUM pbytesBN;
|
||||||
|
BN_init(&pbytesBN);
|
||||||
|
BN_bin2bn(reinterpret_cast<const unsigned char*>(_dhConfigP.constData()), _dhConfigP.size(), &pbytesBN);
|
||||||
|
BN_mod_exp(&tmp, &i_g_a, &saltBN, &pbytesBN, ctx);
|
||||||
|
auto g_a_length = BN_num_bytes(&tmp);
|
||||||
|
_g_a = QByteArray(g_a_length, Qt::Uninitialized);
|
||||||
|
BN_bn2bin(&tmp, reinterpret_cast<unsigned char*>(_g_a.data()));
|
||||||
|
constexpr auto kMaxGASize = 256;
|
||||||
|
if (g_a_length > kMaxGASize) {
|
||||||
|
_g_a = _g_a.mid(1, kMaxGASize);
|
||||||
|
}
|
||||||
|
BN_CTX_free(ctx);
|
||||||
|
|
||||||
|
auto randomID = rand_value<int32>();
|
||||||
|
QByteArray g_a_hash;
|
||||||
|
g_a_hash.resize(SHA256_DIGEST_LENGTH);
|
||||||
|
SHA256(reinterpret_cast<const unsigned char*>(_g_a.constData()), _g_a.size(), reinterpret_cast<unsigned char*>(g_a_hash.data()));
|
||||||
|
|
||||||
|
request(MTPphone_RequestCall(user->inputUser, MTP_int(randomID), MTP_bytes(g_a_hash), MTP_phoneCallProtocol(MTP_flags(MTPDphoneCallProtocol::Flag::f_udp_p2p | MTPDphoneCallProtocol::Flag::f_udp_reflector), MTP_int(kMinLayer), MTP_int(kMaxLayer)))).done([this](const MTPphone_PhoneCall &result) {
|
||||||
|
Expects(result.type() == mtpc_phone_phoneCall);
|
||||||
|
auto &call = result.c_phone_phoneCall();
|
||||||
|
App::feedUsers(call.vusers);
|
||||||
|
if (call.vphone_call.type() != mtpc_phoneCallWaiting) {
|
||||||
|
LOG(("API Error: Expected phoneCallWaiting in response to phone.requestCall()"));
|
||||||
|
callFailed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto &phoneCall = call.vphone_call.c_phoneCallWaiting();
|
||||||
|
_callId = phoneCall.vid.v;
|
||||||
|
_accessHash = phoneCall.vaccess_hash.v;
|
||||||
|
}).fail([this](const RPCError &error) {
|
||||||
|
callFailed();
|
||||||
|
}).send();
|
||||||
|
}).fail([this](const RPCError &error) {
|
||||||
|
callFailed();
|
||||||
|
}).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::handleUpdate(const MTPDupdatePhoneCall& update) {
|
||||||
|
// TODO check call id
|
||||||
|
switch (update.vphone_call.type()) {
|
||||||
|
case mtpc_phoneCallAccepted: {
|
||||||
|
// state changed STATE_EXCHANGING_KEYS
|
||||||
|
auto &call = update.vphone_call.c_phoneCallAccepted();
|
||||||
|
// TODO check isGoodGaAndGb
|
||||||
|
|
||||||
|
BN_CTX *ctx = BN_CTX_new();
|
||||||
|
BN_CTX_init(ctx);
|
||||||
|
BIGNUM p;
|
||||||
|
BIGNUM i_authKey;
|
||||||
|
BIGNUM res;
|
||||||
|
BIGNUM salt;
|
||||||
|
BN_init(&p);
|
||||||
|
BN_init(&i_authKey);
|
||||||
|
BN_init(&res);
|
||||||
|
BN_init(&salt);
|
||||||
|
BN_bin2bn(reinterpret_cast<const unsigned char*>(_dhConfigP.constData()), _dhConfigP.size(), &p);
|
||||||
|
BN_bin2bn((const unsigned char*)call.vg_b.v.constData(), call.vg_b.v.length(), &i_authKey);
|
||||||
|
BN_bin2bn(_salt.data(), kSaltSize, &salt);
|
||||||
|
|
||||||
|
BN_mod_exp(&res, &i_authKey, &salt, &p, ctx);
|
||||||
|
BN_CTX_free(ctx);
|
||||||
|
auto realAuthKeyLength = BN_num_bytes(&res);
|
||||||
|
auto realAuthKeyBytes = QByteArray(realAuthKeyLength, Qt::Uninitialized);
|
||||||
|
BN_bn2bin(&res, reinterpret_cast<unsigned char*>(realAuthKeyBytes.data()));
|
||||||
|
|
||||||
|
if (realAuthKeyLength > kAuthKeySize) {
|
||||||
|
memcpy(_authKey.data(), realAuthKeyBytes.constData() + (realAuthKeyLength - kAuthKeySize), kAuthKeySize);
|
||||||
|
} else if (realAuthKeyLength < kAuthKeySize) {
|
||||||
|
memset(_authKey.data(), 0, kAuthKeySize - realAuthKeyLength);
|
||||||
|
memcpy(_authKey.data() + (kAuthKeySize - realAuthKeyLength), realAuthKeyBytes.constData(), realAuthKeyLength);
|
||||||
|
} else {
|
||||||
|
memcpy(_authKey.data(), realAuthKeyBytes.constData(), kAuthKeySize);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char authKeyHash[SHA_DIGEST_LENGTH];
|
||||||
|
SHA1(_authKey.data(), _authKey.size(), authKeyHash);
|
||||||
|
|
||||||
|
_keyFingerprint = ((uint64)authKeyHash[19] << 56)
|
||||||
|
| ((uint64)authKeyHash[18] << 48)
|
||||||
|
| ((uint64)authKeyHash[17] << 40)
|
||||||
|
| ((uint64)authKeyHash[16] << 32)
|
||||||
|
| ((uint64)authKeyHash[15] << 24)
|
||||||
|
| ((uint64)authKeyHash[14] << 16)
|
||||||
|
| ((uint64)authKeyHash[13] << 8)
|
||||||
|
| ((uint64)authKeyHash[12]);
|
||||||
|
|
||||||
|
request(MTPphone_ConfirmCall(MTP_inputPhoneCall(MTP_long(_callId), MTP_long(_accessHash)), MTP_bytes(_g_a), MTP_long(_keyFingerprint), MTP_phoneCallProtocol(MTP_flags(MTPDphoneCallProtocol::Flag::f_udp_p2p | MTPDphoneCallProtocol::Flag::f_udp_reflector), MTP_int(kMinLayer), MTP_int(kMaxLayer)))).done([this](const MTPphone_PhoneCall &result) {
|
||||||
|
auto &call = result.c_phone_phoneCall().vphone_call.c_phoneCall();
|
||||||
|
|
||||||
|
std::vector<Endpoint> endpoints;
|
||||||
|
ConvertEndpoint(endpoints, call.vconnection.c_phoneConnection());
|
||||||
|
for (int i = 0; i < call.valternative_connections.v.length(); i++) {
|
||||||
|
ConvertEndpoint(endpoints, call.valternative_connections.v[i].c_phoneConnection());
|
||||||
|
}
|
||||||
|
_controller->SetRemoteEndpoints(endpoints, true);
|
||||||
|
|
||||||
|
initiateActualCall();
|
||||||
|
}).fail([this](const RPCError &error) {
|
||||||
|
callFailed();
|
||||||
|
}).send();
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::callFailed() {
|
||||||
|
InvokeQueued(this, [this] {
|
||||||
|
_controller.reset();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::initiateActualCall() {
|
||||||
|
voip_config_t config;
|
||||||
|
config.data_saving = DATA_SAVING_NEVER;
|
||||||
|
config.enableAEC = true;
|
||||||
|
config.enableNS = true;
|
||||||
|
config.enableAGC = true;
|
||||||
|
config.init_timeout = 30;
|
||||||
|
config.recv_timeout = 10;
|
||||||
|
_controller->SetConfig(&config);
|
||||||
|
_controller->SetEncryptionKey(reinterpret_cast<char*>(_authKey.data()), true);
|
||||||
|
_controller->Start();
|
||||||
|
_controller->Connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::~Instance() = default;
|
||||||
|
|
||||||
|
Instance &Current() {
|
||||||
|
return AuthSession::Current().calls();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Calls
|
68
Telegram/SourceFiles/calls/calls_instance.h
Normal file
68
Telegram/SourceFiles/calls/calls_instance.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop version of Telegram messaging app, see https://telegram.org
|
||||||
|
|
||||||
|
Telegram Desktop is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
It is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
In addition, as a special exception, the copyright holders give permission
|
||||||
|
to link the code of portions of this program with the OpenSSL library.
|
||||||
|
|
||||||
|
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
|
||||||
|
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "mtproto/sender.h"
|
||||||
|
#include "base/weak_unique_ptr.h"
|
||||||
|
|
||||||
|
class AuthSession;
|
||||||
|
|
||||||
|
namespace tgvoip {
|
||||||
|
class VoIPController;
|
||||||
|
} // namespace tgvoip
|
||||||
|
|
||||||
|
namespace Calls {
|
||||||
|
|
||||||
|
class Instance : public base::enable_weak_from_this, private MTP::Sender {
|
||||||
|
public:
|
||||||
|
Instance();
|
||||||
|
|
||||||
|
void startOutgoingCall(gsl::not_null<UserData*> user);
|
||||||
|
|
||||||
|
void handleUpdate(const MTPDupdatePhoneCall &update);
|
||||||
|
|
||||||
|
~Instance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initiateActualCall();
|
||||||
|
void callFailed();
|
||||||
|
|
||||||
|
static constexpr auto kSaltSize = 256;
|
||||||
|
static constexpr auto kAuthKeySize = 256;
|
||||||
|
|
||||||
|
int32 _dhConfigVersion = 0;
|
||||||
|
int32 _dhConfigG = 0;
|
||||||
|
QByteArray _dhConfigP;
|
||||||
|
|
||||||
|
QByteArray _g_a;
|
||||||
|
std::array<unsigned char, kSaltSize> _salt;
|
||||||
|
std::array<unsigned char, kAuthKeySize> _authKey;
|
||||||
|
uint64 _callId = 0;
|
||||||
|
uint64 _accessHash = 0;
|
||||||
|
uint64 _keyFingerprint = 0;
|
||||||
|
|
||||||
|
std::unique_ptr<tgvoip::VoIPController> _controller;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Instance &Current();
|
||||||
|
|
||||||
|
} // namespace Calls
|
|
@ -67,6 +67,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
||||||
#include "auth_session.h"
|
#include "auth_session.h"
|
||||||
#include "window/notifications_manager.h"
|
#include "window/notifications_manager.h"
|
||||||
#include "window/window_controller.h"
|
#include "window/window_controller.h"
|
||||||
|
#include "calls/calls_instance.h"
|
||||||
|
|
||||||
StackItemSection::StackItemSection(std::unique_ptr<Window::SectionMemento> &&memento) : StackItem(nullptr)
|
StackItemSection::StackItemSection(std::unique_ptr<Window::SectionMemento> &&memento) : StackItem(nullptr)
|
||||||
, _memento(std::move(memento)) {
|
, _memento(std::move(memento)) {
|
||||||
|
@ -4854,7 +4855,7 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case mtpc_updatePhoneCall: {
|
case mtpc_updatePhoneCall: {
|
||||||
auto &d = update.c_updatePhoneCall();
|
Calls::Current().handleUpdate(update.c_updatePhoneCall());
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case mtpc_updateUserBlocked: {
|
case mtpc_updateUserBlocked: {
|
||||||
|
|
1
Telegram/ThirdParty/GSL
vendored
Submodule
1
Telegram/ThirdParty/GSL
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit c5851a8161938798c5594a66420cb814fea92711
|
1
Telegram/ThirdParty/libtgvoip
vendored
Submodule
1
Telegram/ThirdParty/libtgvoip
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ccf715b626246990bf57068102bc04014f4ac385
|
1
Telegram/ThirdParty/variant
vendored
Submodule
1
Telegram/ThirdParty/variant
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 550ac2f159ca883d360c196149b466955c77a573
|
|
@ -30,10 +30,9 @@
|
||||||
'libs_loc': '<(libs_loc)',
|
'libs_loc': '<(libs_loc)',
|
||||||
'src_loc': '../SourceFiles',
|
'src_loc': '../SourceFiles',
|
||||||
'res_loc': '../Resources',
|
'res_loc': '../Resources',
|
||||||
'submodules_loc': '../../third_party',
|
'submodules_loc': '../ThirdParty',
|
||||||
'third_party_loc': '../ThirdParty',
|
'minizip_loc': '<(submodules_loc)/minizip',
|
||||||
'minizip_loc': '<(third_party_loc)/minizip',
|
'sp_media_key_tap_loc': '<(submodules_loc)/SPMediaKeyTap',
|
||||||
'sp_media_key_tap_loc': '<(third_party_loc)/SPMediaKeyTap',
|
|
||||||
'style_files': [
|
'style_files': [
|
||||||
'<(res_loc)/colors.palette',
|
'<(res_loc)/colors.palette',
|
||||||
'<(res_loc)/basic.style',
|
'<(res_loc)/basic.style',
|
||||||
|
@ -79,10 +78,12 @@
|
||||||
'codegen.gyp:codegen_numbers',
|
'codegen.gyp:codegen_numbers',
|
||||||
'codegen.gyp:codegen_style',
|
'codegen.gyp:codegen_style',
|
||||||
'utils.gyp:Updater',
|
'utils.gyp:Updater',
|
||||||
|
'../ThirdParty/libtgvoip/libtgvoip.gyp:libtgvoip',
|
||||||
],
|
],
|
||||||
|
|
||||||
'defines': [
|
'defines': [
|
||||||
'AL_LIBTYPE_STATIC',
|
'AL_LIBTYPE_STATIC',
|
||||||
|
'TGVOIP_USE_CXX11_LIB',
|
||||||
'<!@(python -c "for s in \'<(build_defines)\'.split(\',\'): print(s)")',
|
'<!@(python -c "for s in \'<(build_defines)\'.split(\',\'): print(s)")',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
@ -95,6 +96,7 @@
|
||||||
'<(libs_loc)/zlib-1.2.8',
|
'<(libs_loc)/zlib-1.2.8',
|
||||||
'<(libs_loc)/ffmpeg',
|
'<(libs_loc)/ffmpeg',
|
||||||
'<(libs_loc)/openal-soft/include',
|
'<(libs_loc)/openal-soft/include',
|
||||||
|
'<(libs_loc)/opus/include',
|
||||||
'<(minizip_loc)',
|
'<(minizip_loc)',
|
||||||
'<(sp_media_key_tap_loc)',
|
'<(sp_media_key_tap_loc)',
|
||||||
'<(submodules_loc)/GSL/include',
|
'<(submodules_loc)/GSL/include',
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
'build_mac%': '<(build_mac)',
|
'build_mac%': '<(build_mac)',
|
||||||
'build_linux%': '<(build_linux)',
|
'build_linux%': '<(build_linux)',
|
||||||
|
|
||||||
'official_build_target%': '<!(python <(DEPTH)/official.py --read-target)',
|
'official_build_target%': '',
|
||||||
},
|
},
|
||||||
'build_os%': '<(build_os)',
|
'build_os%': '<(build_os)',
|
||||||
'build_win%': '<(build_win)',
|
'build_win%': '<(build_win)',
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
'''
|
|
||||||
This file is part of Telegram Desktop,
|
|
||||||
the official desktop version of Telegram messaging app, see https://telegram.org
|
|
||||||
|
|
||||||
Telegram Desktop is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
It is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
In addition, as a special exception, the copyright holders give permission
|
|
||||||
to link the code of portions of this program with the OpenSSL library.
|
|
||||||
|
|
||||||
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
|
|
||||||
Copyright (c) 2014 John Preston, https://desktop.telegram.org
|
|
||||||
'''
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
|
|
||||||
my_path = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/')
|
|
||||||
|
|
||||||
if len(sys.argv) > 1 and sys.argv[1] == '--read-target':
|
|
||||||
target_path = my_path + '/../build/target'
|
|
||||||
if os.path.isfile(target_path):
|
|
||||||
with open(target_path) as f:
|
|
||||||
for line in f:
|
|
||||||
cleanline = re.sub(r'^\s*|\s*$', '', line);
|
|
||||||
if cleanline != '':
|
|
||||||
print(cleanline);
|
|
||||||
else:
|
|
||||||
print('This is a helper script, it should not be called directly.')
|
|
|
@ -130,7 +130,7 @@
|
||||||
'qt_version%': '<(qt_version)',
|
'qt_version%': '<(qt_version)',
|
||||||
'conditions': [
|
'conditions': [
|
||||||
[ 'build_win', {
|
[ 'build_win', {
|
||||||
'qt_loc': '../../../Libraries/qt<(qt_version_loc)/qtbase',
|
'qt_loc': '<(DEPTH)/../../../Libraries/qt<(qt_version_loc)/qtbase',
|
||||||
}, {
|
}, {
|
||||||
'qt_loc': '<(qt_loc_unix)',
|
'qt_loc': '<(qt_loc_unix)',
|
||||||
}],
|
}],
|
||||||
|
|
|
@ -6,6 +6,12 @@ set "FullExecPath=%cd%"
|
||||||
set "Silence=>nul"
|
set "Silence=>nul"
|
||||||
if "%1" == "-v" set "Silence="
|
if "%1" == "-v" set "Silence="
|
||||||
|
|
||||||
|
if exist "%FullScriptPath%..\build\target" (
|
||||||
|
FOR /F "tokens=1* delims= " %%i in (%FullScriptPath%..\build\target) do set "BuildTarget=%%i"
|
||||||
|
) else (
|
||||||
|
set "BuildTarget="
|
||||||
|
)
|
||||||
|
|
||||||
rem strangely linking of Release Telegram build complains about the absence of lib.pdb
|
rem strangely linking of Release Telegram build complains about the absence of lib.pdb
|
||||||
if exist "%FullScriptPath%..\..\..\Libraries\openssl\tmp32\lib.pdb" (
|
if exist "%FullScriptPath%..\..\..\Libraries\openssl\tmp32\lib.pdb" (
|
||||||
if not exist "%FullScriptPath%..\..\..\Libraries\openssl\Release\lib\lib.pdb" (
|
if not exist "%FullScriptPath%..\..\..\Libraries\openssl\Release\lib\lib.pdb" (
|
||||||
|
@ -22,9 +28,9 @@ if not "%TDESKTOP_BUILD_DEFINES%" == "" (
|
||||||
set GYP_MSVS_VERSION=2015
|
set GYP_MSVS_VERSION=2015
|
||||||
|
|
||||||
cd "%FullScriptPath%"
|
cd "%FullScriptPath%"
|
||||||
call gyp --depth=. --generator-output=../.. -Goutput_dir=out !BUILD_DEFINES! Telegram.gyp --format=ninja
|
call gyp --depth=. --generator-output=../.. -Goutput_dir=out !BUILD_DEFINES! -Dofficial_build_target=%BuildTarget% Telegram.gyp --format=ninja
|
||||||
if %errorlevel% neq 0 goto error
|
if %errorlevel% neq 0 goto error
|
||||||
call gyp --depth=. --generator-output=../.. -Goutput_dir=out !BUILD_DEFINES! Telegram.gyp --format=msvs-ninja
|
call gyp --depth=. --generator-output=../.. -Goutput_dir=out !BUILD_DEFINES! -Dofficial_build_target=%BuildTarget% Telegram.gyp --format=msvs-ninja
|
||||||
if %errorlevel% neq 0 goto error
|
if %errorlevel% neq 0 goto error
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,19 @@ pushd `dirname $0` > /dev/null
|
||||||
FullScriptPath=`pwd`
|
FullScriptPath=`pwd`
|
||||||
popd > /dev/null
|
popd > /dev/null
|
||||||
|
|
||||||
|
if [ -f "$FullScriptPath/../build/target" ]; then
|
||||||
|
while IFS='' read -r line || [[ -n "$line" ]]; do
|
||||||
|
BuildTarget="$line"
|
||||||
|
done < "$FullScriptPath/../build/target"
|
||||||
|
else
|
||||||
|
BuildTarget=""
|
||||||
|
fi
|
||||||
|
|
||||||
MySystem=`uname -s`
|
MySystem=`uname -s`
|
||||||
cd $FullScriptPath
|
cd $FullScriptPath
|
||||||
|
|
||||||
if [ "$MySystem" == "Linux" ]; then
|
if [ "$MySystem" == "Linux" ]; then
|
||||||
../../../Libraries/gyp/gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp --format=cmake
|
../../../Libraries/gyp/gyp --depth=. --generator-output=../.. -Goutput_dir=out -Dofficial_build_target=$BuildTarget Telegram.gyp --format=cmake
|
||||||
cd ../../out/Debug
|
cd ../../out/Debug
|
||||||
../../../Libraries/cmake-3.6.2/bin/cmake .
|
../../../Libraries/cmake-3.6.2/bin/cmake .
|
||||||
cd ../Release
|
cd ../Release
|
||||||
|
@ -20,7 +28,7 @@ else
|
||||||
#gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp --format=xcode-ninja
|
#gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp --format=xcode-ninja
|
||||||
#gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp --format=xcode
|
#gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp --format=xcode
|
||||||
# use patched gyp with Xcode project generator
|
# use patched gyp with Xcode project generator
|
||||||
../../../Libraries/gyp/gyp --depth=. --generator-output=../.. -Goutput_dir=out Telegram.gyp -Gxcode_upgrade_check_project_version=830 --format=xcode
|
../../../Libraries/gyp/gyp --depth=. --generator-output=../.. -Goutput_dir=out -Gxcode_upgrade_check_project_version=830 -Dofficial_build_target=$BuildTarget Telegram.gyp --format=xcode
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
|
@ -55,25 +55,25 @@
|
||||||
'$(ProjectName)',
|
'$(ProjectName)',
|
||||||
],
|
],
|
||||||
'libraries': [
|
'libraries': [
|
||||||
'winmm',
|
'-lwinmm',
|
||||||
'imm32',
|
'-limm32',
|
||||||
'ws2_32',
|
'-lws2_32',
|
||||||
'kernel32',
|
'-lkernel32',
|
||||||
'user32',
|
'-luser32',
|
||||||
'gdi32',
|
'-lgdi32',
|
||||||
'winspool',
|
'-lwinspool',
|
||||||
'comdlg32',
|
'-lcomdlg32',
|
||||||
'advapi32',
|
'-ladvapi32',
|
||||||
'shell32',
|
'-lshell32',
|
||||||
'ole32',
|
'-lole32',
|
||||||
'oleaut32',
|
'-loleaut32',
|
||||||
'uuid',
|
'-luuid',
|
||||||
'odbc32',
|
'-lodbc32',
|
||||||
'odbccp32',
|
'-lodbccp32',
|
||||||
'Shlwapi',
|
'-lShlwapi',
|
||||||
'Iphlpapi',
|
'-lIphlpapi',
|
||||||
'Gdiplus',
|
'-lGdiplus',
|
||||||
'Strmiids',
|
'-lStrmiids',
|
||||||
],
|
],
|
||||||
|
|
||||||
'configurations': {
|
'configurations': {
|
||||||
|
|
|
@ -79,6 +79,8 @@
|
||||||
<(src_loc)/boxes/stickers_box.h
|
<(src_loc)/boxes/stickers_box.h
|
||||||
<(src_loc)/boxes/username_box.cpp
|
<(src_loc)/boxes/username_box.cpp
|
||||||
<(src_loc)/boxes/username_box.h
|
<(src_loc)/boxes/username_box.h
|
||||||
|
<(src_loc)/calls/calls_instance.cpp
|
||||||
|
<(src_loc)/calls/calls_instance.h
|
||||||
<(src_loc)/chat_helpers/bot_keyboard.cpp
|
<(src_loc)/chat_helpers/bot_keyboard.cpp
|
||||||
<(src_loc)/chat_helpers/bot_keyboard.h
|
<(src_loc)/chat_helpers/bot_keyboard.h
|
||||||
<(src_loc)/chat_helpers/emoji_list_widget.cpp
|
<(src_loc)/chat_helpers/emoji_list_widget.cpp
|
||||||
|
|
1
third_party/GSL
vendored
1
third_party/GSL
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit f9c47dd63fe25cc216294fbe7e2fbe4f9a302ca3
|
|
1
third_party/variant
vendored
1
third_party/variant
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 916139a2e51e125816efce6e19d428385601273f
|
|
Loading…
Add table
Reference in a new issue