diff options
Diffstat (limited to 'libs/tdlib/td/example/uwp')
25 files changed, 813 insertions, 0 deletions
diff --git a/libs/tdlib/td/example/uwp/LICENSE_1_0.txt b/libs/tdlib/td/example/uwp/LICENSE_1_0.txt new file mode 100644 index 0000000000..36b7cd93cd --- /dev/null +++ b/libs/tdlib/td/example/uwp/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/libs/tdlib/td/example/uwp/README.md b/libs/tdlib/td/example/uwp/README.md new file mode 100644 index 0000000000..e7bb9b821b --- /dev/null +++ b/libs/tdlib/td/example/uwp/README.md @@ -0,0 +1,28 @@ +# TDLib Universal Windows Platform example + +This is an example of building TDLib SDK for Universal Windows Platform and an example of its usage from C#. + +## Building SDK + +* Download and install Microsoft Visual Studio 2015+ with Windows 10 SDK. We recommend to use the latest available versions of Microsoft Visual Studio and Windows 10 SDK. +* Download and install [CMake](https://cmake.org/download/). +* Install [vcpkg](https://github.com/Microsoft/vcpkg#quick-start) or update it to the latest version using `vcpkg update` and following received instructions. +* Install `zlib` and `openssl` for all UWP architectures using `vcpkg`: +``` +C:\src\vcpkg> .\vcpkg.exe install openssl:arm-uwp openssl:x64-uwp openssl:x86-uwp zlib:arm-uwp zlib:x64-uwp zlib:x86-uwp +``` +* (Optional. For XML documentation generation.) Download [PHP](https://windows.php.net/download#php-7.2). Add the path to php.exe to the PATH environment variable. +* Download and install [gperf](https://sourceforge.net/projects/gnuwin32/files/gperf/3.0.1/). Add the path to gperf.exe to the PATH environment variable. +* Download and install [7-Zip](http://www.7-zip.org/download.html) archiver, which is used by the `build.ps1` script to create a Telegram.Td.UWP Visual Studio Extension. Add the path to 7z.exe to the PATH environment variable. + Alternatively `build.ps1` supports compressing using [WinRAR](https://en.wikipedia.org/wiki/WinRAR) with option `-compress winrar` and compressing using [zip](http://gnuwin32.sourceforge.net/packages/zip.htm) with `-compress zip`. +* Build `TDLib` using provided `build.ps1` script (TDLib should be built 6 times for multiple platforms in Debug and Release configurations, so it make take few hours). Pass path to vcpkg.exe as `-vcpkg-root` argument: +``` +powershell -ExecutionPolicy ByPass .\build.ps1 -vcpkg_root C:\src\vcpkg +``` +If you need to restart the build from scratch, call `.\build.ps1 -mode clean` first. +* Install Visual Studio Extension "TDLib for Universal Windows Platform" located at `build-uwp\vsix\tdlib.vsix`, which was created on the previous step by `build.ps1` script. + +Now `TDLib` can be freely used from any UWP project, built in Visual Studio. + +## Example of usage +The `app/` directory contains a simple example of a C# application for Universal Windows Platform. Just open it with Visual Studio 2015 or 2017 and run. diff --git a/libs/tdlib/td/example/uwp/SDKManifest.xml b/libs/tdlib/td/example/uwp/SDKManifest.xml new file mode 100644 index 0000000000..d6896fcb65 --- /dev/null +++ b/libs/tdlib/td/example/uwp/SDKManifest.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" ?> +<FileList + DisplayName="TDLib for Universal Windows Platform" + ProductFamilyName="Telegram.Td.UWP" + MoreInfo="https://core.telegram.org/tdlib" + MinVSVersion="14.0" + AppliesTo="WindowsAppContainer" + DependsOn="Microsoft.VCLibs, version=14.0" + SupportsMultipleVersions="Error" + SupportedArchitectures="x86;x64;ARM"> + <File Reference="Telegram.Td.winmd" Implementation="Telegram.Td.dll" /> +</FileList> diff --git a/libs/tdlib/td/example/uwp/[Content_Types].xml b/libs/tdlib/td/example/uwp/[Content_Types].xml new file mode 100644 index 0000000000..b91d46fa3c --- /dev/null +++ b/libs/tdlib/td/example/uwp/[Content_Types].xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> + <Default Extension="winmd" ContentType="application/octet-stream" /> + <Default Extension="pri" ContentType="application/octet-stream" /> + <Default Extension="dll" ContentType="application/octet-stream" /> + <Default Extension="h" ContentType="application/octet-stream" /> + <Default Extension="lib" ContentType="application/octet-stream" /> + <Default Extension="pdb" ContentType="application/octet-stream" /> + <Default Extension="png" ContentType="application/octet-stream" /> + <Default Extension="props" ContentType="application/octet-stream" /> + <Default Extension="txt" ContentType="text/plain" /> + <Default Extension="vsixmanifest" ContentType="text/xml" /> + <Default Extension="xml" ContentType="text/xml" /> +</Types> diff --git a/libs/tdlib/td/example/uwp/app/.gitignore b/libs/tdlib/td/example/uwp/app/.gitignore new file mode 100644 index 0000000000..37ab08165b --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/.gitignore @@ -0,0 +1,5 @@ +.vs/ +bin/ +obj/ +project.lock.json +TdApp.csproj.user diff --git a/libs/tdlib/td/example/uwp/app/App.xaml b/libs/tdlib/td/example/uwp/app/App.xaml new file mode 100644 index 0000000000..b4256fd441 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/App.xaml @@ -0,0 +1,7 @@ +<Application + x:Class="TdApp.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="using:TdApp" + RequestedTheme="Light"> +</Application> diff --git a/libs/tdlib/td/example/uwp/app/App.xaml.cs b/libs/tdlib/td/example/uwp/app/App.xaml.cs new file mode 100644 index 0000000000..0ed0f96812 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/App.xaml.cs @@ -0,0 +1,104 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +using System; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace TdApp +{ + /// <summary> + /// Provides application-specific behavior to supplement the default Application class. + /// </summary> + sealed partial class App : Application + { + /// <summary> + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// </summary> + public App() + { + Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync( + Microsoft.ApplicationInsights.WindowsCollectors.Metadata | + Microsoft.ApplicationInsights.WindowsCollectors.Session); + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + /// <summary> + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// </summary> + /// <param name="e">Details about the launch request and process.</param> + protected override void OnLaunched(LaunchActivatedEventArgs e) + { + +#if DEBUG + if (System.Diagnostics.Debugger.IsAttached) + { + this.DebugSettings.EnableFrameRateCounter = true; + } +#endif + + Frame rootFrame = Window.Current.Content as Frame; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + rootFrame.NavigationFailed += OnNavigationFailed; + + if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) + { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (rootFrame.Content == null) + { + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(MainPage), e.Arguments); + } + // Ensure the current window is active + Window.Current.Activate(); + } + + /// <summary> + /// Invoked when Navigation to a certain page fails + /// </summary> + /// <param name="sender">The Frame which failed navigation</param> + /// <param name="e">Details about the navigation failure</param> + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + } + + /// <summary> + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// </summary> + /// <param name="sender">The source of the suspend request.</param> + /// <param name="e">Details about the suspend request.</param> + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/libs/tdlib/td/example/uwp/app/ApplicationInsights.config b/libs/tdlib/td/example/uwp/app/ApplicationInsights.config new file mode 100644 index 0000000000..cb2a232da3 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/ApplicationInsights.config @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<ApplicationInsights xmlns = "http://schemas.microsoft.com/ApplicationInsights/2013/Settings"> +</ApplicationInsights> diff --git a/libs/tdlib/td/example/uwp/app/Assets/LockScreenLogo.scale-200.png b/libs/tdlib/td/example/uwp/app/Assets/LockScreenLogo.scale-200.png Binary files differnew file mode 100644 index 0000000000..735f57adb5 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/LockScreenLogo.scale-200.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/SplashScreen.scale-200.png b/libs/tdlib/td/example/uwp/app/Assets/SplashScreen.scale-200.png Binary files differnew file mode 100644 index 0000000000..023e7f1fed --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/SplashScreen.scale-200.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/Square150x150Logo.scale-200.png b/libs/tdlib/td/example/uwp/app/Assets/Square150x150Logo.scale-200.png Binary files differnew file mode 100644 index 0000000000..af49fec1a5 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/Square150x150Logo.scale-200.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.scale-200.png b/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.scale-200.png Binary files differnew file mode 100644 index 0000000000..ce342a2ec8 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.scale-200.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.targetsize-24_altform-unplated.png Binary files differnew file mode 100644 index 0000000000..f6c02ce97e --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.targetsize-24_altform-unplated.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png b/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png Binary files differnew file mode 100644 index 0000000000..7385b56c0e --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png diff --git a/libs/tdlib/td/example/uwp/app/Assets/Wide310x150Logo.scale-200.png b/libs/tdlib/td/example/uwp/app/Assets/Wide310x150Logo.scale-200.png Binary files differnew file mode 100644 index 0000000000..288995b397 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Assets/Wide310x150Logo.scale-200.png diff --git a/libs/tdlib/td/example/uwp/app/MainPage.xaml b/libs/tdlib/td/example/uwp/app/MainPage.xaml new file mode 100644 index 0000000000..cdff97d9f3 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/MainPage.xaml @@ -0,0 +1,29 @@ +<Page + x:Class="TdApp.MainPage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="using:TdApp" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + mc:Ignorable="d" + x:Name="Self"> + + <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="*"/> + </Grid.RowDefinitions> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="*"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <TextBox x:Name="Input"/> + <Button Grid.Column="1" x:Name="Send" Content="send" Click="Button_Click"/> + </Grid> + <ListBox Grid.Row="1" x:Name="ItemsControl" ItemsSource="{Binding Items, ElementName=Self}"> + + </ListBox> + <!--<Button Content="Test" Click="Button_Click"/>--> + </Grid> +</Page> diff --git a/libs/tdlib/td/example/uwp/app/MainPage.xaml.cs b/libs/tdlib/td/example/uwp/app/MainPage.xaml.cs new file mode 100644 index 0000000000..9bdf5070ee --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/MainPage.xaml.cs @@ -0,0 +1,171 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +using System; +using System.IO; +using Td = Telegram.Td; +using TdApi = Telegram.Td.Api; +using Windows.UI.Core; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace TdApp +{ + public sealed partial class MainPage : Page + { + public System.Collections.ObjectModel.ObservableCollection<string> Items { get; set; } + + private static MyClientResultHandler _handler; + + public MainPage() + { + InitializeComponent(); + + Items = new System.Collections.ObjectModel.ObservableCollection<string>(); + _handler = new MyClientResultHandler(this); + + System.Threading.Tasks.Task.Run(() => + { + try + { + Td.Log.SetFilePath(Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "log")); + _client = Td.Client.Create(_handler); + var parameters = new TdApi.TdlibParameters(); + parameters.DatabaseDirectory = Windows.Storage.ApplicationData.Current.LocalFolder.Path; + parameters.UseSecretChats = true; + parameters.UseMessageDatabase = true; + parameters.ApiId = 94575; + parameters.ApiHash = "a3406de8d171bb422bb6ddf3bbd800e2"; + parameters.SystemLanguageCode = "en"; + parameters.DeviceModel = "en"; + parameters.SystemVersion = "en"; + parameters.ApplicationVersion = "1.0.0"; + _client.Send(new TdApi.SetTdlibParameters(parameters), null); + _client.Send(new TdApi.CheckDatabaseEncryptionKey(), null); + _client.Run(); + } + catch (Exception ex) + { + Print(ex.ToString()); + } + }); + } + + public void Print(String str) + { + var delayTask = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => + { + Items.Insert(0, str.Substring(0, Math.Min(1024, str.Length))); + }); + } + + private static Td.Client _client; + + private void AcceptCommand(String command) + { + Input.Text = string.Empty; + Items.Insert(0, string.Format(">>{0}", command)); + } + private void Button_Click(object sender, RoutedEventArgs e) + { + var command = Input.Text; + + if (command.StartsWith("DESTROY")) + { + AcceptCommand("Destroy"); + _client.Send(new TdApi.Destroy(), _handler); + } + else if (command.StartsWith("lo")) + { + AcceptCommand("LogOut"); + _client.Send(new TdApi.LogOut(), _handler); + } + else if (command.StartsWith("gas")) + { + AcceptCommand(command); + _client.Send(new TdApi.GetAuthorizationState(), _handler); + } + else if (command.StartsWith("sap")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + _client.Send(new TdApi.SetAuthenticationPhoneNumber(args[1], false, false), _handler); + } + else if (command.StartsWith("cac")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + _client.Send(new TdApi.CheckAuthenticationCode(args[1], String.Empty, String.Empty), _handler); + } + else if (command.StartsWith("cap")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + _client.Send(new TdApi.CheckAuthenticationPassword(args[1]), _handler); + } + else if (command.StartsWith("gco")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + _client.Send(new TdApi.SearchContacts(), _handler); + } + else if (command.StartsWith("df")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + _client.Send(new TdApi.DownloadFile(Int32.Parse(args[1]), 1), _handler); + } + else if (command.StartsWith("bench")) + { + var args = command.Split(" ".ToCharArray(), 2); + AcceptCommand(command); + var cnt = Int32.Parse(args[1]); + var handler = new BenchSimpleHandler(this, cnt); + for (int i = 0; i < cnt; i++) + { + _client.Send(new TdApi.TestSquareInt(123), handler); + } + } + } + } + + class MyClientResultHandler : Td.ClientResultHandler + { + private MainPage _page; + + public MyClientResultHandler(MainPage page) + { + _page = page; + } + + public void OnResult(TdApi.BaseObject obj) + { + var str = obj.ToString(); + _page.Print(str); + } + } + + class BenchSimpleHandler : Td.ClientResultHandler + { + private MainPage _page; + private int _cnt; + + public BenchSimpleHandler(MainPage page, int cnt) + { + _page = page; + _cnt = cnt; + } + + public void OnResult(TdApi.BaseObject obj) + { + _cnt--; + if (_cnt == 0) + { + _page.Print("DONE"); + } + } + } +} diff --git a/libs/tdlib/td/example/uwp/app/Package.appxmanifest b/libs/tdlib/td/example/uwp/app/Package.appxmanifest new file mode 100644 index 0000000000..ca1235ffa7 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Package.appxmanifest @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp"> + <Identity Name="1c9ba6de-23cf-4aef-803b-91fcc451b69a" Publisher="CN=arseny30" Version="1.0.0.0" /> + <mp:PhoneIdentity PhoneProductId="1c9ba6de-23cf-4aef-803b-91fcc451b69a" PhonePublisherId="00000000-0000-0000-0000-000000000000" /> + <Properties> + <DisplayName>TdApp</DisplayName> + <PublisherDisplayName>arseny30</PublisherDisplayName> + <Logo>Assets\StoreLogo.png</Logo> + </Properties> + <Dependencies> + <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" /> + </Dependencies> + <Resources> + <Resource Language="x-generate" /> + </Resources> + <Applications> + <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="TdApp.App"> + <uap:VisualElements DisplayName="TdApp" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="TdApp" BackgroundColor="transparent"> + <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"> + </uap:DefaultTile> + <uap:SplashScreen Image="Assets\SplashScreen.png" /> + </uap:VisualElements> + </Application> + </Applications> + <Capabilities> + <Capability Name="internetClient" /> + </Capabilities> +</Package>
\ No newline at end of file diff --git a/libs/tdlib/td/example/uwp/app/Properties/AssemblyInfo.cs b/libs/tdlib/td/example/uwp/app/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..99e2b83bea --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("App2")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("App2")] +[assembly: AssemblyCopyright("Copyright © 2015-2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)]
\ No newline at end of file diff --git a/libs/tdlib/td/example/uwp/app/Properties/Default.rd.xml b/libs/tdlib/td/example/uwp/app/Properties/Default.rd.xml new file mode 100644 index 0000000000..479eb7669d --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/Properties/Default.rd.xml @@ -0,0 +1,31 @@ +<!-- + This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most + developers. However, you can modify these parameters to modify the behavior of the .NET Native + optimizer. + + Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919 + + To fully enable reflection for App1.MyClass and all of its public/private members + <Type Name="App1.MyClass" Dynamic="Required All"/> + + To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32 + <TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" /> + + Using the Namespace directive to apply reflection policy to all the types in a particular namespace + <Namespace Name="DataClasses.ViewModels" Seralize="All" /> +--> + +<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> + <Application> + <!-- + An Assembly element with Name="*Application*" applies to all assemblies in + the application package. The asterisks are not wildcards. + --> + <Assembly Name="*Application*" Dynamic="Required All" /> + + + <!-- Add your application specific runtime directives here. --> + + + </Application> +</Directives>
\ No newline at end of file diff --git a/libs/tdlib/td/example/uwp/app/TdApp.csproj b/libs/tdlib/td/example/uwp/app/TdApp.csproj new file mode 100644 index 0000000000..b3d1d944d1 --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/TdApp.csproj @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">x86</Platform> + <ProjectGuid>{0B971A4C-EC00-4FED-BCC2-FCD03B78D644}</ProjectGuid> + <OutputType>AppContainerExe</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>TdApp</RootNamespace> + <AssemblyName>TdApp</AssemblyName> + <DefaultLanguage>en-US</DefaultLanguage> + <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier> + <TargetPlatformVersion>10.0.10586.0</TargetPlatformVersion> + <TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion> + <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <PackageCertificateKeyFile>TdApp_TemporaryKey.pfx</PackageCertificateKeyFile> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\x86\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <NoWarn>;2008</NoWarn> + <DebugType>full</DebugType> + <PlatformTarget>x86</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> + <OutputPath>bin\x86\Release\</OutputPath> + <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <Optimize>true</Optimize> + <NoWarn>;2008</NoWarn> + <DebugType>pdbonly</DebugType> + <PlatformTarget>x86</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\ARM\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <NoWarn>;2008</NoWarn> + <DebugType>full</DebugType> + <PlatformTarget>ARM</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'"> + <OutputPath>bin\ARM\Release\</OutputPath> + <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <Optimize>true</Optimize> + <NoWarn>;2008</NoWarn> + <DebugType>pdbonly</DebugType> + <PlatformTarget>ARM</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\x64\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <NoWarn>;2008</NoWarn> + <DebugType>full</DebugType> + <PlatformTarget>x64</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> + <OutputPath>bin\x64\Release\</OutputPath> + <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> + <Optimize>true</Optimize> + <NoWarn>;2008</NoWarn> + <DebugType>pdbonly</DebugType> + <PlatformTarget>x64</PlatformTarget> + <UseVSHostingProcess>false</UseVSHostingProcess> + <ErrorReport>prompt</ErrorReport> + <Prefer32Bit>true</Prefer32Bit> + <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain> + </PropertyGroup> + <ItemGroup> + <!-- A reference to the entire .Net Framework and Windows SDK are automatically included --> + <Content Include="ApplicationInsights.config"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <None Include="project.json" /> + </ItemGroup> + <ItemGroup> + <Compile Include="App.xaml.cs"> + <DependentUpon>App.xaml</DependentUpon> + </Compile> + <Compile Include="MainPage.xaml.cs"> + <DependentUpon>MainPage.xaml</DependentUpon> + </Compile> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <AppxManifest Include="Package.appxmanifest"> + <SubType>Designer</SubType> + </AppxManifest> + <None Include="TdApp_TemporaryKey.pfx" /> + </ItemGroup> + <ItemGroup> + <Content Include="Properties\Default.rd.xml" /> + <Content Include="Assets\LockScreenLogo.scale-200.png" /> + <Content Include="Assets\SplashScreen.scale-200.png" /> + <Content Include="Assets\Square150x150Logo.scale-200.png" /> + <Content Include="Assets\Square44x44Logo.scale-200.png" /> + <Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" /> + <Content Include="Assets\StoreLogo.png" /> + <Content Include="Assets\Wide310x150Logo.scale-200.png" /> + </ItemGroup> + <ItemGroup> + <ApplicationDefinition Include="App.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </ApplicationDefinition> + <Page Include="MainPage.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + </ItemGroup> + <ItemGroup> + <SDKReference Include="Microsoft.VCLibs, Version=14.0"> + <Name>Visual C++ 2015 Runtime for Universal Windows Platform Apps</Name> + </SDKReference> + <SDKReference Include="Telegram.Td.UWP, Version=1.0"> + <Name>TDLib for Universal Windows Platform</Name> + </SDKReference> + </ItemGroup> + <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '14.0' "> + <VisualStudioVersion>14.0</VisualStudioVersion> + </PropertyGroup> + <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project>
\ No newline at end of file diff --git a/libs/tdlib/td/example/uwp/app/TdApp_TemporaryKey.pfx b/libs/tdlib/td/example/uwp/app/TdApp_TemporaryKey.pfx Binary files differnew file mode 100644 index 0000000000..05ffbcabbc --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/TdApp_TemporaryKey.pfx diff --git a/libs/tdlib/td/example/uwp/app/project.json b/libs/tdlib/td/example/uwp/app/project.json new file mode 100644 index 0000000000..e3b2dba25f --- /dev/null +++ b/libs/tdlib/td/example/uwp/app/project.json @@ -0,0 +1,19 @@ +{ + "dependencies": { + "Microsoft.ApplicationInsights": "1.0.0", + "Microsoft.ApplicationInsights.PersistenceChannel": "1.0.0", + "Microsoft.ApplicationInsights.WindowsApps": "1.0.0", + "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" + }, + "frameworks": { + "uap10.0": {} + }, + "runtimes": { + "win10-arm": {}, + "win10-arm-aot": {}, + "win10-x86": {}, + "win10-x86-aot": {}, + "win10-x64": {}, + "win10-x64-aot": {} + } +}
\ No newline at end of file diff --git a/libs/tdlib/td/example/uwp/build.ps1 b/libs/tdlib/td/example/uwp/build.ps1 new file mode 100644 index 0000000000..71156b0a2d --- /dev/null +++ b/libs/tdlib/td/example/uwp/build.ps1 @@ -0,0 +1,142 @@ +param ( + [string]$vcpkg_root = $(throw "-vcpkg_root=<path to vcpkg> is required"), + [string]$arch = "", + [string]$mode = "all", + [string]$compress = "7z" +) +$ErrorActionPreference = "Stop" + +$vcpkg_root = Resolve-Path $vcpkg_root + +$vcpkg_cmake="${vcpkg_root}\scripts\buildsystems\vcpkg.cmake" +$arch_list = @( "x86", "x64", "arm" ) +if ($arch) { + $arch_list = @(, $arch) +} + +$td_root = Resolve-Path "../.." + +function CheckLastExitCode { + if ($LastExitCode -ne 0) { + $msg = @" +EXE RETURNED EXIT CODE $LastExitCode +CALLSTACK:$(Get-PSCallStack | Out-String) +"@ + throw $msg + } +} + +function clean { + Remove-Item build-* -Force -Recurse -ErrorAction SilentlyContinue +} + +function prepare { + New-Item -ItemType Directory -Force -Path build-native + + cd build-native + + cmake $td_root -DCMAKE_TOOLCHAIN_FILE="$vcpkg_cmake" -DTD_ENABLE_DOTNET=1 + CheckLastExitCode + cmake --build . --target prepare_cross_compiling + CheckLastExitCode + + cd .. +} + +function config { + New-Item -ItemType Directory -Force -Path build-uwp + cd build-uwp + + ForEach($arch in $arch_list) { + echo "Config Arch = [$arch]" + New-Item -ItemType Directory -Force -Path $arch + cd $arch + echo "${td_root}" + $fixed_arch = $arch + if ($arch -eq "x86") { + $fixed_arch = "win32" + } + cmake "$td_root" -A $fixed_arch -DCMAKE_SYSTEM_VERSION="10.0" -DCMAKE_SYSTEM_NAME="WindowsStore" -DCMAKE_TOOLCHAIN_FILE="$vcpkg_cmake" -DTD_ENABLE_DOTNET=1 + CheckLastExitCode + cd .. + } + echo "done" + cd .. +} + +function build { + cd build-uwp + ForEach($arch in $arch_list) { + echo "Build Arch = [$arch]" + cd $arch + cmake --build . --config Release --target tddotnet + cmake --build . --config Debug --target tddotnet + cd .. + } + cd .. +} + +function export { + cd build-uwp + Remove-Item vsix -Force -Recurse -ErrorAction SilentlyContinue + New-Item -ItemType Directory -Force -Path vsix + cp ../SDKManifest.xml vsix + cp ../extension.vsixmanifest vsix + cp '../`[Content_Types`].xml' vsix + cp ../LICENSE_1_0.txt vsix + + ForEach($arch in $arch_list) { + New-Item -ItemType Directory -Force -Path vsix/DesignTime/Debug/${arch} + New-Item -ItemType Directory -Force -Path vsix/DesignTime/Retail/${arch} + New-Item -ItemType Directory -Force -Path vsix/Redist/Debug/${arch} + New-Item -ItemType Directory -Force -Path vsix/Redist/Retail/${arch} + New-Item -ItemType Directory -Force -Path vsix/References/CommonConfiguration/${arch} + + cp ${arch}/Debug/* -include "LIBEAY*","SSLEAY*","zlib*" vsix/Redist/Debug/${arch}/ + cp ${arch}/Release/* -include "LIBEAY*","SSLEAY*","zlib*" vsix/Redist/Retail/${arch}/ + + cp ${arch}/Debug/* -filter "Telegram.Td.*" -include "*.lib" vsix/DesignTime/Debug/${arch}/ + cp ${arch}/Release/* -filter "Telegram.Td.*" -include "*.lib" vsix/DesignTime/Retail/${arch}/ + + cp ${arch}/Debug/* -filter "Telegram.Td.*" -include "*.pdb","*.dll" vsix/Redist/Debug/${arch}/ + cp ${arch}/Release/* -filter "Telegram.Td.*" -include "*.pdb","*.dll" vsix/Redist/Retail/${arch}/ + + cp ${arch}/Release/* -filter "Telegram.Td.*" -include "*.pri","*.winmd","*.xml" vsix/References/CommonConfiguration/${arch}/ + } + + cd vsix + + if ($compress -eq "zip") { + zip -r tdlib.vsix * + } elseif ($compress -eq "winrar") { + WinRAR.exe a -afzip -r -ep1 tdlib.vsix * + } else { + 7z.exe a -tzip -r tdlib.vsix * + } + cd .. +} + +function run { + Push-Location + Try { + if ($mode -eq "clean") { + clean + } + if (($mode -eq "prepare") -or ($mode -eq "all")) { + prepare + } + if (($mode -eq "config") -or ( $mode -eq "all")) { + config + } + if (($mode -eq "build") -or ($mode -eq "all")) { + build + } + if (($mode -eq "export") -or ($mode -eq "all")) { + export + } + } Finally { + Pop-Location + } +} + +run diff --git a/libs/tdlib/td/example/uwp/extension.vsixmanifest b/libs/tdlib/td/example/uwp/extension.vsixmanifest new file mode 100644 index 0000000000..cfcfdb57af --- /dev/null +++ b/libs/tdlib/td/example/uwp/extension.vsixmanifest @@ -0,0 +1,17 @@ +<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011"> + <Metadata> + <Identity Id="Telegram.Td.UWP" Version="1.2.0" Language="en-US" Publisher="Telegram LLC" /> + <DisplayName>TDLib for Universal Windows Platform</DisplayName> + <Description>TDLib is a library for building Telegram clients</Description> + <MoreInfo>https://core.telegram.org/tdlib</MoreInfo> + <Tags>Telegram, TDLib, library, client, API</Tags> + <License>LICENSE_1_0.txt</License> + <ReleaseNotes>https://github.com/tdlib/td/blob/master/CHANGELOG.md</ReleaseNotes> + </Metadata> + <Installation Scope="Global"> + <InstallationTarget Id="Microsoft.ExtensionSDK" TargetPlatformIdentifier="UAP" TargetPlatformVersion="v0.8.0.0" SdkName="Telegram.Td.UWP" SdkVersion="1.0" /> + </Installation> + <Assets> + <Asset Type="Microsoft.ExtensionSDK" Path="SDKManifest.xml" /> + </Assets> +</PackageManifest> |