150 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| 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
 | |
| */
 | |
| #pragma once
 | |
| 
 | |
| #include "mtproto/sender.h"
 | |
| #include "calls/calls_call.h"
 | |
| #include "calls/calls_group_call.h"
 | |
| 
 | |
| namespace Platform {
 | |
| enum class PermissionType;
 | |
| } // namespace Platform
 | |
| 
 | |
| namespace Media {
 | |
| namespace Audio {
 | |
| class Track;
 | |
| } // namespace Audio
 | |
| } // namespace Media
 | |
| 
 | |
| namespace Main {
 | |
| class Session;
 | |
| } // namespace Main
 | |
| 
 | |
| namespace Calls {
 | |
| 
 | |
| class Panel;
 | |
| class GroupPanel;
 | |
| 
 | |
| class Instance
 | |
| 	: private Call::Delegate
 | |
| 	, private GroupCall::Delegate
 | |
| 	, private base::Subscriber
 | |
| 	, public base::has_weak_ptr {
 | |
| public:
 | |
| 	Instance();
 | |
| 	~Instance();
 | |
| 
 | |
| 	void startOutgoingCall(not_null<UserData*> user, bool video);
 | |
| 	void startOrJoinGroupCall(not_null<PeerData*> peer);
 | |
| 	void handleUpdate(
 | |
| 		not_null<Main::Session*> session,
 | |
| 		const MTPUpdate &update);
 | |
| 	void showInfoPanel(not_null<Call*> call);
 | |
| 	void showInfoPanel(not_null<GroupCall*> call);
 | |
| 	[[nodiscard]] Call *currentCall() const;
 | |
| 	[[nodiscard]] rpl::producer<Call*> currentCallValue() const;
 | |
| 	[[nodiscard]] GroupCall *currentGroupCall() const;
 | |
| 	[[nodiscard]] rpl::producer<GroupCall*> currentGroupCallValue() const;
 | |
| 	[[nodiscard]] bool inCall() const;
 | |
| 	[[nodiscard]] bool inGroupCall() const;
 | |
| 	[[nodiscard]] bool hasActivePanel(
 | |
| 		not_null<Main::Session*> session) const;
 | |
| 	bool activateCurrentCall();
 | |
| 	bool minimizeCurrentActiveCall();
 | |
| 	bool closeCurrentActiveCall();
 | |
| 	auto getVideoCapture()
 | |
| 		-> std::shared_ptr<tgcalls::VideoCaptureInterface> override;
 | |
| 	void requestPermissionsOrFail(Fn<void()> onSuccess, bool video = true);
 | |
| 
 | |
| 	void setCurrentAudioDevice(bool input, const QString &deviceId);
 | |
| 
 | |
| 	[[nodiscard]] bool isQuitPrevent();
 | |
| 
 | |
| private:
 | |
| 	using CallSound = Call::Delegate::CallSound;
 | |
| 	using GroupCallSound = GroupCall::Delegate::GroupCallSound;
 | |
| 
 | |
| 	[[nodiscard]] not_null<Call::Delegate*> getCallDelegate() {
 | |
| 		return static_cast<Call::Delegate*>(this);
 | |
| 	}
 | |
| 	[[nodiscard]] not_null<GroupCall::Delegate*> getGroupCallDelegate() {
 | |
| 		return static_cast<GroupCall::Delegate*>(this);
 | |
| 	}
 | |
| 	[[nodiscard]] DhConfig getDhConfig() const override {
 | |
| 		return _dhConfig;
 | |
| 	}
 | |
| 
 | |
| 	not_null<Media::Audio::Track*> ensureSoundLoaded(const QString &key);
 | |
| 	void playSoundOnce(const QString &key);
 | |
| 
 | |
| 	void callFinished(not_null<Call*> call) override;
 | |
| 	void callFailed(not_null<Call*> call) override;
 | |
| 	void callRedial(not_null<Call*> call) override;
 | |
| 	void callRequestPermissionsOrFail(
 | |
| 			Fn<void()> onSuccess,
 | |
| 			bool video) override {
 | |
| 		requestPermissionsOrFail(std::move(onSuccess), video);
 | |
| 	}
 | |
| 	void callPlaySound(CallSound sound) override;
 | |
| 
 | |
| 	void groupCallFinished(not_null<GroupCall*> call) override;
 | |
| 	void groupCallFailed(not_null<GroupCall*> call) override;
 | |
| 	void groupCallRequestPermissionsOrFail(Fn<void()> onSuccess) override {
 | |
| 		requestPermissionsOrFail(std::move(onSuccess), false);
 | |
| 	}
 | |
| 	void groupCallPlaySound(GroupCallSound sound) override;
 | |
| 
 | |
| 	void createCall(not_null<UserData*> user, Call::Type type, bool video);
 | |
| 	void destroyCall(not_null<Call*> call);
 | |
| 
 | |
| 	void createGroupCall(
 | |
| 		not_null<PeerData*> peer,
 | |
| 		const MTPInputGroupCall &inputCall);
 | |
| 	void destroyGroupCall(not_null<GroupCall*> call);
 | |
| 
 | |
| 	void requestPermissionOrFail(
 | |
| 		Platform::PermissionType type,
 | |
| 		Fn<void()> onSuccess);
 | |
| 
 | |
| 	void refreshDhConfig();
 | |
| 	void refreshServerConfig(not_null<Main::Session*> session);
 | |
| 	bytes::const_span updateDhConfig(const MTPmessages_DhConfig &data);
 | |
| 
 | |
| 	void destroyCurrentCall();
 | |
| 	void handleCallUpdate(
 | |
| 		not_null<Main::Session*> session,
 | |
| 		const MTPPhoneCall &call);
 | |
| 	void handleSignalingData(
 | |
| 		not_null<Main::Session*> session,
 | |
| 		const MTPDupdatePhoneCallSignalingData &data);
 | |
| 	void handleGroupCallUpdate(
 | |
| 		not_null<Main::Session*> session,
 | |
| 		const MTPGroupCall &call);
 | |
| 	void handleGroupCallUpdate(
 | |
| 		not_null<Main::Session*> session,
 | |
| 		const MTPDupdateGroupCallParticipants &update);
 | |
| 
 | |
| 	DhConfig _dhConfig;
 | |
| 
 | |
| 	crl::time _lastServerConfigUpdateTime = 0;
 | |
| 	base::weak_ptr<Main::Session> _serverConfigRequestSession;
 | |
| 	std::weak_ptr<tgcalls::VideoCaptureInterface> _videoCapture;
 | |
| 
 | |
| 	std::unique_ptr<Call> _currentCall;
 | |
| 	rpl::event_stream<Call*> _currentCallChanges;
 | |
| 	std::unique_ptr<Panel> _currentCallPanel;
 | |
| 
 | |
| 	std::unique_ptr<GroupCall> _currentGroupCall;
 | |
| 	rpl::event_stream<GroupCall*> _currentGroupCallChanges;
 | |
| 	std::unique_ptr<GroupPanel> _currentGroupCallPanel;
 | |
| 
 | |
| 	base::flat_map<QString, std::unique_ptr<Media::Audio::Track>> _tracks;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Calls
 | 
