111 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.7 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
 | 
						|
*/
 | 
						|
#include "platform/win/windows_autostart_task.h"
 | 
						|
 | 
						|
#include "base/platform/win/base_windows_winrt.h"
 | 
						|
 | 
						|
#include <winrt/Windows.ApplicationModel.h>
 | 
						|
#include <winrt/Windows.Foundation.h>
 | 
						|
#include <winrt/Windows.System.h>
 | 
						|
 | 
						|
namespace Platform::AutostartTask {
 | 
						|
namespace {
 | 
						|
 | 
						|
using namespace winrt::Windows::ApplicationModel;
 | 
						|
using namespace winrt::Windows::System;
 | 
						|
using namespace winrt::Windows::Foundation;
 | 
						|
 | 
						|
[[nodiscard]] bool IsEnabled(StartupTaskState state) {
 | 
						|
	switch (state) {
 | 
						|
	case StartupTaskState::Enabled:
 | 
						|
	case StartupTaskState::EnabledByPolicy:
 | 
						|
		return true;
 | 
						|
	case StartupTaskState::Disabled:
 | 
						|
	case StartupTaskState::DisabledByPolicy:
 | 
						|
	case StartupTaskState::DisabledByUser:
 | 
						|
	default:
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
} // namespace
 | 
						|
 | 
						|
void Toggle(bool enabled, Fn<void(bool)> done) {
 | 
						|
	if (!base::WinRT::Supported()) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	const auto processEnableResult = [=](StartupTaskState state) {
 | 
						|
		LOG(("Startup Task: Enable finished, state: %1").arg(int(state)));
 | 
						|
 | 
						|
		done(IsEnabled(state));
 | 
						|
	};
 | 
						|
	const auto processTask = [=](StartupTask task) {
 | 
						|
		LOG(("Startup Task: Got it, state: %1, requested: %2"
 | 
						|
			).arg(int(task.State())
 | 
						|
			).arg(Logs::b(enabled)));
 | 
						|
 | 
						|
		if (IsEnabled(task.State()) == enabled) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		if (!enabled) {
 | 
						|
			LOG(("Startup Task: Disabling."));
 | 
						|
			task.Disable();
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		LOG(("Startup Task: Requesting enable."));
 | 
						|
		const auto asyncState = task.RequestEnableAsync();
 | 
						|
		if (!done) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		asyncState.Completed([=](
 | 
						|
				IAsyncOperation<StartupTaskState> operation,
 | 
						|
				AsyncStatus status) {
 | 
						|
			base::WinRT::Try([&] {
 | 
						|
				processEnableResult(operation.GetResults());
 | 
						|
			});
 | 
						|
		});
 | 
						|
	};
 | 
						|
	base::WinRT::Try([&] {
 | 
						|
		StartupTask::GetAsync(L"TelegramStartupTask").Completed([=](
 | 
						|
				IAsyncOperation<StartupTask> operation,
 | 
						|
				AsyncStatus status) {
 | 
						|
			base::WinRT::Try([&] {
 | 
						|
				processTask(operation.GetResults());
 | 
						|
			});
 | 
						|
		});
 | 
						|
	});
 | 
						|
}
 | 
						|
 | 
						|
void RequestState(Fn<void(bool)> callback) {
 | 
						|
	Expects(callback != nullptr);
 | 
						|
 | 
						|
	if (!base::WinRT::Supported()) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	const auto processTask = [=](StartupTask task) {
 | 
						|
		DEBUG_LOG(("Startup Task: Got value, state: %1"
 | 
						|
			).arg(int(task.State())));
 | 
						|
 | 
						|
		callback(IsEnabled(task.State()));
 | 
						|
	};
 | 
						|
	base::WinRT::Try([&] {
 | 
						|
		StartupTask::GetAsync(L"TelegramStartupTask").Completed([=](
 | 
						|
				IAsyncOperation<StartupTask> operation,
 | 
						|
				AsyncStatus status) {
 | 
						|
			base::WinRT::Try([&] {
 | 
						|
				processTask(operation.GetResults());
 | 
						|
			});
 | 
						|
		});
 | 
						|
	});
 | 
						|
}
 | 
						|
 | 
						|
void OpenSettings() {
 | 
						|
	Launcher::LaunchUriAsync(Uri(L"ms-settings:startupapps"));
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Platform::AutostartTask
 |