From e1ec72eab6d00b3ba38e5932bc88920f103b6e4a Mon Sep 17 00:00:00 2001 From: aunsane Date: Fri, 27 Apr 2018 21:33:17 +0300 Subject: Telegram: initial commit - tdlib moved to telegram dir --- libs/tdlib/td/example/cpp/.gitignore | 1 - libs/tdlib/td/example/cpp/CMakeLists.txt | 13 - libs/tdlib/td/example/cpp/README.md | 24 - libs/tdlib/td/example/cpp/td_example.cpp | 308 ------------ libs/tdlib/td/example/cpp/tdjson_example.cpp | 33 -- libs/tdlib/td/example/csharp/.gitignore | 5 - libs/tdlib/td/example/csharp/README.md | 32 -- libs/tdlib/td/example/csharp/TdExample.cs | 270 ----------- libs/tdlib/td/example/csharp/TdExample.csproj | 85 ---- libs/tdlib/td/example/go/main.go | 26 - libs/tdlib/td/example/ios/README.md | 41 -- libs/tdlib/td/example/ios/build-openssl.sh | 22 - libs/tdlib/td/example/ios/build.sh | 74 --- libs/tdlib/td/example/java/.gitignore | 5 - libs/tdlib/td/example/java/CMakeLists.txt | 68 --- libs/tdlib/td/example/java/README.md | 39 -- .../example/java/org/drinkless/tdlib/Client.java | 285 ----------- .../td/example/java/org/drinkless/tdlib/Log.java | 75 --- .../java/org/drinkless/tdlib/example/Example.java | 533 --------------------- libs/tdlib/td/example/java/td_jni.cpp | 158 ------ libs/tdlib/td/example/python/README.md | 11 - libs/tdlib/td/example/python/tdjson_example.py | 106 ---- libs/tdlib/td/example/ruby/Gemfile | 3 - libs/tdlib/td/example/ruby/Gemfile.lock | 17 - libs/tdlib/td/example/ruby/example.rb | 61 --- libs/tdlib/td/example/swift/.gitignore | 3 - libs/tdlib/td/example/swift/README.md | 15 - libs/tdlib/td/example/swift/src/main.swift | 178 ------- .../td/example/swift/src/td-Bridging-Header.h | 15 - .../td/example/swift/td.xcodeproj/project.pbxproj | 310 ------------ libs/tdlib/td/example/uwp/LICENSE_1_0.txt | 23 - libs/tdlib/td/example/uwp/README.md | 28 -- libs/tdlib/td/example/uwp/SDKManifest.xml | 12 - libs/tdlib/td/example/uwp/[Content_Types].xml | 14 - libs/tdlib/td/example/uwp/app/.gitignore | 5 - libs/tdlib/td/example/uwp/app/App.xaml | 7 - libs/tdlib/td/example/uwp/app/App.xaml.cs | 104 ---- .../td/example/uwp/app/ApplicationInsights.config | 3 - .../uwp/app/Assets/LockScreenLogo.scale-200.png | Bin 1430 -> 0 bytes .../uwp/app/Assets/SplashScreen.scale-200.png | Bin 7700 -> 0 bytes .../uwp/app/Assets/Square150x150Logo.scale-200.png | Bin 2937 -> 0 bytes .../uwp/app/Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 0 bytes ...are44x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 0 bytes libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png | Bin 1451 -> 0 bytes .../uwp/app/Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 0 bytes libs/tdlib/td/example/uwp/app/MainPage.xaml | 29 -- libs/tdlib/td/example/uwp/app/MainPage.xaml.cs | 171 ------- libs/tdlib/td/example/uwp/app/Package.appxmanifest | 28 -- .../td/example/uwp/app/Properties/AssemblyInfo.cs | 29 -- .../td/example/uwp/app/Properties/Default.rd.xml | 31 -- libs/tdlib/td/example/uwp/app/TdApp.csproj | 151 ------ .../td/example/uwp/app/TdApp_TemporaryKey.pfx | Bin 2456 -> 0 bytes libs/tdlib/td/example/uwp/app/project.json | 19 - libs/tdlib/td/example/uwp/build.ps1 | 142 ------ libs/tdlib/td/example/uwp/extension.vsixmanifest | 17 - 55 files changed, 3629 deletions(-) delete mode 100644 libs/tdlib/td/example/cpp/.gitignore delete mode 100644 libs/tdlib/td/example/cpp/CMakeLists.txt delete mode 100644 libs/tdlib/td/example/cpp/README.md delete mode 100644 libs/tdlib/td/example/cpp/td_example.cpp delete mode 100644 libs/tdlib/td/example/cpp/tdjson_example.cpp delete mode 100644 libs/tdlib/td/example/csharp/.gitignore delete mode 100644 libs/tdlib/td/example/csharp/README.md delete mode 100644 libs/tdlib/td/example/csharp/TdExample.cs delete mode 100644 libs/tdlib/td/example/csharp/TdExample.csproj delete mode 100644 libs/tdlib/td/example/go/main.go delete mode 100644 libs/tdlib/td/example/ios/README.md delete mode 100644 libs/tdlib/td/example/ios/build-openssl.sh delete mode 100644 libs/tdlib/td/example/ios/build.sh delete mode 100644 libs/tdlib/td/example/java/.gitignore delete mode 100644 libs/tdlib/td/example/java/CMakeLists.txt delete mode 100644 libs/tdlib/td/example/java/README.md delete mode 100644 libs/tdlib/td/example/java/org/drinkless/tdlib/Client.java delete mode 100644 libs/tdlib/td/example/java/org/drinkless/tdlib/Log.java delete mode 100644 libs/tdlib/td/example/java/org/drinkless/tdlib/example/Example.java delete mode 100644 libs/tdlib/td/example/java/td_jni.cpp delete mode 100644 libs/tdlib/td/example/python/README.md delete mode 100644 libs/tdlib/td/example/python/tdjson_example.py delete mode 100644 libs/tdlib/td/example/ruby/Gemfile delete mode 100644 libs/tdlib/td/example/ruby/Gemfile.lock delete mode 100644 libs/tdlib/td/example/ruby/example.rb delete mode 100644 libs/tdlib/td/example/swift/.gitignore delete mode 100644 libs/tdlib/td/example/swift/README.md delete mode 100644 libs/tdlib/td/example/swift/src/main.swift delete mode 100644 libs/tdlib/td/example/swift/src/td-Bridging-Header.h delete mode 100644 libs/tdlib/td/example/swift/td.xcodeproj/project.pbxproj delete mode 100644 libs/tdlib/td/example/uwp/LICENSE_1_0.txt delete mode 100644 libs/tdlib/td/example/uwp/README.md delete mode 100644 libs/tdlib/td/example/uwp/SDKManifest.xml delete mode 100644 libs/tdlib/td/example/uwp/[Content_Types].xml delete mode 100644 libs/tdlib/td/example/uwp/app/.gitignore delete mode 100644 libs/tdlib/td/example/uwp/app/App.xaml delete mode 100644 libs/tdlib/td/example/uwp/app/App.xaml.cs delete mode 100644 libs/tdlib/td/example/uwp/app/ApplicationInsights.config delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/LockScreenLogo.scale-200.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/SplashScreen.scale-200.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/Square150x150Logo.scale-200.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.scale-200.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png delete mode 100644 libs/tdlib/td/example/uwp/app/Assets/Wide310x150Logo.scale-200.png delete mode 100644 libs/tdlib/td/example/uwp/app/MainPage.xaml delete mode 100644 libs/tdlib/td/example/uwp/app/MainPage.xaml.cs delete mode 100644 libs/tdlib/td/example/uwp/app/Package.appxmanifest delete mode 100644 libs/tdlib/td/example/uwp/app/Properties/AssemblyInfo.cs delete mode 100644 libs/tdlib/td/example/uwp/app/Properties/Default.rd.xml delete mode 100644 libs/tdlib/td/example/uwp/app/TdApp.csproj delete mode 100644 libs/tdlib/td/example/uwp/app/TdApp_TemporaryKey.pfx delete mode 100644 libs/tdlib/td/example/uwp/app/project.json delete mode 100644 libs/tdlib/td/example/uwp/build.ps1 delete mode 100644 libs/tdlib/td/example/uwp/extension.vsixmanifest (limited to 'libs/tdlib/td/example') diff --git a/libs/tdlib/td/example/cpp/.gitignore b/libs/tdlib/td/example/cpp/.gitignore deleted file mode 100644 index 336dc7d458..0000000000 --- a/libs/tdlib/td/example/cpp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -td/ diff --git a/libs/tdlib/td/example/cpp/CMakeLists.txt b/libs/tdlib/td/example/cpp/CMakeLists.txt deleted file mode 100644 index 3e7794d4fa..0000000000 --- a/libs/tdlib/td/example/cpp/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -cmake_minimum_required(VERSION 3.1 FATAL_ERROR) - -project(TdExample VERSION 1.0 LANGUAGES CXX) - -find_package(Td 1.2.0 REQUIRED) - -add_executable(tdjson_example tdjson_example.cpp) -target_link_libraries(tdjson_example PRIVATE Td::TdJson) -set_property(TARGET tdjson_example PROPERTY CXX_STANDARD 11) - -add_executable(td_example td_example.cpp) -target_link_libraries(td_example PRIVATE Td::TdStatic) -set_property(TARGET td_example PROPERTY CXX_STANDARD 14) diff --git a/libs/tdlib/td/example/cpp/README.md b/libs/tdlib/td/example/cpp/README.md deleted file mode 100644 index 9e5de531ba..0000000000 --- a/libs/tdlib/td/example/cpp/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# TDLib cpp basic usage examples - -TDLib should be prebuilt and installed to local subdirectory `td/`: -``` -cd -mkdir build -cd build -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../example/cpp/td .. -cmake --build . --target install -``` -Also see [building](https://github.com/tdlib/td#building) for additional details on TDLib building. - -Then you can build the examples: -``` -cd /example/cpp -mkdir build -cd build -cmake -DCMAKE_BUILD_TYPE=Release -DTd_DIR=/example/cpp/td/lib/cmake/Td .. -cmake --build . -``` - -Documentation for all available classes and methods can be found at https://core.telegram.org/tdlib/docs. - -To run `tdjson_example` you may need to manually copy a `tdjson` shared library from `td/bin` to a directory containing built binaries. diff --git a/libs/tdlib/td/example/cpp/td_example.cpp b/libs/tdlib/td/example/cpp/td_example.cpp deleted file mode 100644 index 1efbf465b9..0000000000 --- a/libs/tdlib/td/example/cpp/td_example.cpp +++ /dev/null @@ -1,308 +0,0 @@ -// -// 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) -// -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// Simple single-threaded example of TDLib usage. -// Real world programs should use separate thread for the user input. -// Example includes user authentication, receiving updates, getting chat list and sending text messages. - -// overloaded -namespace detail { -template -struct overload; - -template -struct overload : public F { - explicit overload(F f) : F(f) { - } -}; -template -struct overload - : public overload - , overload { - overload(F f, Fs... fs) : overload(f), overload(fs...) { - } - using overload::operator(); - using overload::operator(); -}; -} // namespace detail - -template -auto overloaded(F... f) { - return detail::overload(f...); -} - -namespace td_api = td::td_api; - -class TdExample { - public: - TdExample() { - td::Log::set_verbosity_level(1); - client_ = std::make_unique(); - } - - void loop() { - while (true) { - if (need_restart_) { - restart(); - } else if (!are_authorized_) { - process_response(client_->receive(10)); - } else { - std::cerr << "Enter action [q] quit [u] check for updates and request results [c] show chats [m ] " - "send message [l] logout: " - << std::endl; - std::string line; - std::getline(std::cin, line); - std::istringstream ss(line); - std::string action; - if (!(ss >> action)) { - continue; - } - if (action == "q") { - return; - } - if (action == "u") { - std::cerr << "Checking for updates..." << std::endl; - while (true) { - auto response = client_->receive(0); - if (response.object) { - process_response(std::move(response)); - } else { - break; - } - } - } else if (action == "l") { - std::cerr << "Logging out..." << std::endl; - send_query(td_api::make_object(), {}); - } else if (action == "m") { - std::int64_t chat_id; - ss >> chat_id; - ss.get(); - std::string text; - std::getline(ss, text); - - std::cerr << "Sending message to chat " << chat_id << "..." << std::endl; - auto send_message = td_api::make_object(); - send_message->chat_id_ = chat_id; - auto message_content = td_api::make_object(); - message_content->text_ = td_api::make_object(); - message_content->text_->text_ = std::move(text); - send_message->input_message_content_ = std::move(message_content); - - send_query(std::move(send_message), {}); - } else if (action == "c") { - std::cerr << "Loading chat list..." << std::endl; - send_query(td_api::make_object(std::numeric_limits::max(), 0, 20), - [this](Object object) { - if (object->get_id() == td_api::error::ID) { - return; - } - auto chats = td::move_tl_object_as(object); - for (auto chat_id : chats->chat_ids_) { - std::cerr << "[id:" << chat_id << "] [title:" << chat_title_[chat_id] << "]" << std::endl; - } - }); - } - } - } - } - - private: - using Object = td_api::object_ptr; - std::unique_ptr client_; - - td_api::object_ptr authorization_state_; - bool are_authorized_{false}; - bool need_restart_{false}; - std::uint64_t current_query_id_{0}; - std::uint64_t authentication_query_id_{0}; - - std::map> handlers_; - - std::map> users_; - - std::map chat_title_; - - void restart() { - client_.reset(); - *this = TdExample(); - } - - void send_query(td_api::object_ptr f, std::function handler) { - auto query_id = next_query_id(); - if (handler) { - handlers_.emplace(query_id, std::move(handler)); - } - client_->send({query_id, std::move(f)}); - } - - void process_response(td::Client::Response response) { - if (!response.object) { - return; - } - //std::cerr << response.id << " " << to_string(response.object) << std::endl; - if (response.id == 0) { - return process_update(std::move(response.object)); - } - auto it = handlers_.find(response.id); - if (it != handlers_.end()) { - it->second(std::move(response.object)); - } - } - - std::string get_user_name(std::int32_t user_id) { - auto it = users_.find(user_id); - if (it == users_.end()) { - return "unknown user"; - } - return it->second->first_name_ + " " + it->second->last_name_; - } - - void process_update(td_api::object_ptr update) { - td_api::downcast_call( - *update, overloaded( - [this](td_api::updateAuthorizationState &update_authorization_state) { - authorization_state_ = std::move(update_authorization_state.authorization_state_); - on_authorization_state_update(); - }, - [this](td_api::updateNewChat &update_new_chat) { - chat_title_[update_new_chat.chat_->id_] = update_new_chat.chat_->title_; - }, - [this](td_api::updateChatTitle &update_chat_title) { - chat_title_[update_chat_title.chat_id_] = update_chat_title.title_; - }, - [this](td_api::updateUser &update_user) { - auto user_id = update_user.user_->id_; - users_[user_id] = std::move(update_user.user_); - }, - [this](td_api::updateNewMessage &update_new_message) { - auto chat_id = update_new_message.message_->chat_id_; - auto sender_user_name = get_user_name(update_new_message.message_->sender_user_id_); - std::string text; - if (update_new_message.message_->content_->get_id() == td_api::messageText::ID) { - text = static_cast(*update_new_message.message_->content_).text_->text_; - } - std::cerr << "Got message: [chat_id:" << chat_id << "] [from:" << sender_user_name << "] [" - << text << "]" << std::endl; - }, - [](auto &update) {})); - } - - auto create_authentication_query_handler() { - return [this, id = authentication_query_id_](Object object) { - if (id == authentication_query_id_) { - check_authentication_error(std::move(object)); - } - }; - } - - void on_authorization_state_update() { - authentication_query_id_++; - td_api::downcast_call( - *authorization_state_, - overloaded( - [this](td_api::authorizationStateReady &) { - are_authorized_ = true; - std::cerr << "Got authorization" << std::endl; - }, - [this](td_api::authorizationStateLoggingOut &) { - are_authorized_ = false; - std::cerr << "Logging out" << std::endl; - }, - [this](td_api::authorizationStateClosing &) { std::cerr << "Closing" << std::endl; }, - [this](td_api::authorizationStateClosed &) { - are_authorized_ = false; - need_restart_ = true; - std::cerr << "Terminated" << std::endl; - }, - [this](td_api::authorizationStateWaitCode &wait_code) { - std::string first_name; - std::string last_name; - if (!wait_code.is_registered_) { - std::cerr << "Enter your first name: "; - std::cin >> first_name; - std::cerr << "Enter your last name: "; - std::cin >> last_name; - } - std::cerr << "Enter authentication code: "; - std::string code; - std::cin >> code; - send_query(td_api::make_object(code, first_name, last_name), - create_authentication_query_handler()); - }, - [this](td_api::authorizationStateWaitPassword &) { - std::cerr << "Enter authentication password: "; - std::string password; - std::cin >> password; - send_query(td_api::make_object(password), - create_authentication_query_handler()); - }, - [this](td_api::authorizationStateWaitPhoneNumber &) { - std::cerr << "Enter phone number: "; - std::string phone_number; - std::cin >> phone_number; - send_query(td_api::make_object( - phone_number, false /*allow_flash_calls*/, false /*is_current_phone_number*/), - create_authentication_query_handler()); - }, - [this](td_api::authorizationStateWaitEncryptionKey &) { - std::cerr << "Enter encryption key or DESTROY: "; - std::string key; - std::getline(std::cin, key); - if (key == "DESTROY") { - send_query(td_api::make_object(), create_authentication_query_handler()); - } else { - send_query(td_api::make_object(std::move(key)), - create_authentication_query_handler()); - } - }, - [this](td_api::authorizationStateWaitTdlibParameters &) { - auto parameters = td_api::make_object(); - parameters->database_directory_ = "tdlib"; - parameters->use_message_database_ = true; - parameters->use_secret_chats_ = true; - parameters->api_id_ = 94575; - parameters->api_hash_ = "a3406de8d171bb422bb6ddf3bbd800e2"; - parameters->system_language_code_ = "en"; - parameters->device_model_ = "Desktop"; - parameters->system_version_ = "Unknown"; - parameters->application_version_ = "1.0"; - parameters->enable_storage_optimizer_ = true; - send_query(td_api::make_object(std::move(parameters)), - create_authentication_query_handler()); - })); - } - - void check_authentication_error(Object object) { - if (object->get_id() == td_api::error::ID) { - auto error = td::move_tl_object_as(object); - std::cerr << "Error: " << to_string(error); - on_authorization_state_update(); - } - } - - std::uint64_t next_query_id() { - return ++current_query_id_; - } -}; - -int main() { - TdExample example; - example.loop(); -} diff --git a/libs/tdlib/td/example/cpp/tdjson_example.cpp b/libs/tdlib/td/example/cpp/tdjson_example.cpp deleted file mode 100644 index 6787b37f86..0000000000 --- a/libs/tdlib/td/example/cpp/tdjson_example.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// 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) -// -#include -#include - -// Basic example of TDLib JSON interface usage. -// Native interface should be preferred instead in C++, so here is only an example of -// the main event cycle, which should be essentially the same for all languages. - -int main() { - void *client = td_json_client_create(); - // somehow share the client with other threads, which will be able to send requests via td_json_client_send - - const double WAIT_TIMEOUT = 10.0; // seconds - while (true) { - const char *result = td_json_client_receive(client, WAIT_TIMEOUT); - if (result != nullptr) { - // parse the result as JSON object and process it as an incoming update or an answer to a previously sent request - - // if (result is UpdateAuthorizationState with authorizationStateClosed) { - // break; - // } - - std::cout << result << std::endl; - } - } - - td_json_client_destroy(client); -} diff --git a/libs/tdlib/td/example/csharp/.gitignore b/libs/tdlib/td/example/csharp/.gitignore deleted file mode 100644 index 5266ecccc9..0000000000 --- a/libs/tdlib/td/example/csharp/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.vs/ -bin/ -obj/ -project.lock.json -TdExample.csproj.user diff --git a/libs/tdlib/td/example/csharp/README.md b/libs/tdlib/td/example/csharp/README.md deleted file mode 100644 index 2faa15e12e..0000000000 --- a/libs/tdlib/td/example/csharp/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# TDLib C# example - -This is an example of building TDLib with `C++/CLI` support and an example of TDLib usage from C#. - -## Building TDLib - -* Download and install Microsoft Visual Studio 2015 or later. -* 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 using `vcpkg`: -``` -C:\src\vcpkg> .\vcpkg.exe install openssl:x64-windows openssl:x86-windows zlib:x64-windows zlib:x86-windows -``` -* (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. -* Build `TDLib` with CMake enabling `.NET` support and specifying correct path to `vcpkg` toolchain file: -``` -cd /example/csharp -mkdir build -cd build -cmake -DTD_ENABLE_DOTNET=ON -DCMAKE_TOOLCHAIN_FILE=C:\src\vcpkg\scripts\buildsystems\vcpkg.cmake ../../.. -cmake --build . --config Release -cmake --build . --config Debug -``` - -## Example of usage - -After `TDLib` is built you can open and run TdExample project. -It contains a simple console C# application with implementation of authorization and message sending. -Just open it with Visual Studio 2015 or 2017 and run. - -Also see TdExample.csproj for example of including TDLib in C# project with all native shared library dependencies. diff --git a/libs/tdlib/td/example/csharp/TdExample.cs b/libs/tdlib/td/example/csharp/TdExample.cs deleted file mode 100644 index be98e1a758..0000000000 --- a/libs/tdlib/td/example/csharp/TdExample.cs +++ /dev/null @@ -1,270 +0,0 @@ -// -// 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 Td = Telegram.Td; -using TdApi = Telegram.Td.Api; - -using System; -using System.Threading; - -namespace TdExample -{ - /// - /// Example class for TDLib usage from C#. - /// - class Example - { - private static Td.Client _client = null; - private readonly static Td.ClientResultHandler _defaultHandler = new DefaultHandler(); - - private static TdApi.AuthorizationState _authorizationState = null; - private static volatile bool _haveAuthorization = false; - private static volatile bool _quiting = false; - - private static volatile AutoResetEvent _gotAuthorization = new AutoResetEvent(false); - - private static readonly string _newLine = Environment.NewLine; - private static readonly string _commandsLine = "Enter command (gc - GetChat, me - GetMe, sm - SendMessage, lo - LogOut, q - Quit): "; - private static volatile string _currentPrompt = null; - - private static Td.Client CreateTdClient() - { - Td.Client result = Td.Client.Create(new UpdatesHandler()); - new Thread(() => - { - Thread.CurrentThread.IsBackground = true; - result.Run(); - }).Start(); - return result; - } - - private static void Print(string str) - { - if (_currentPrompt != null) - { - Console.WriteLine(); - } - Console.WriteLine(str); - if (_currentPrompt != null) - { - Console.Write(_currentPrompt); - } - } - - private static string ReadLine(string str) - { - Console.Write(str); - _currentPrompt = str; - var result = Console.ReadLine(); - _currentPrompt = null; - return result; - } - - private static void OnAuthorizationStateUpdated(TdApi.AuthorizationState authorizationState) - { - if (authorizationState != null) - { - _authorizationState = authorizationState; - } - if (_authorizationState is TdApi.AuthorizationStateWaitTdlibParameters) - { - TdApi.TdlibParameters parameters = new TdApi.TdlibParameters(); - parameters.DatabaseDirectory = "tdlib"; - parameters.UseMessageDatabase = true; - parameters.UseSecretChats = true; - parameters.ApiId = 94575; - parameters.ApiHash = "a3406de8d171bb422bb6ddf3bbd800e2"; - parameters.SystemLanguageCode = "en"; - parameters.DeviceModel = "Desktop"; - parameters.SystemVersion = "Unknown"; - parameters.ApplicationVersion = "1.0"; - parameters.EnableStorageOptimizer = true; - - _client.Send(new TdApi.SetTdlibParameters(parameters), new AuthorizationRequestHandler()); - } - else if (_authorizationState is TdApi.AuthorizationStateWaitEncryptionKey) - { - _client.Send(new TdApi.CheckDatabaseEncryptionKey(), new AuthorizationRequestHandler()); - } - else if (_authorizationState is TdApi.AuthorizationStateWaitPhoneNumber) - { - string phoneNumber = ReadLine("Please enter phone number: "); - _client.Send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler()); - } - else if (_authorizationState is TdApi.AuthorizationStateWaitCode) - { - string code = ReadLine("Please enter authentication code: "); - _client.Send(new TdApi.CheckAuthenticationCode(code, "", ""), new AuthorizationRequestHandler()); - } - else if (_authorizationState is TdApi.AuthorizationStateWaitPassword) - { - string password = ReadLine("Please enter password: "); - _client.Send(new TdApi.CheckAuthenticationPassword(password), new AuthorizationRequestHandler()); - } - else if (_authorizationState is TdApi.AuthorizationStateReady) - { - _haveAuthorization = true; - _gotAuthorization.Set(); - } - else if (_authorizationState is TdApi.AuthorizationStateLoggingOut) - { - _haveAuthorization = false; - Print("Logging out"); - } - else if (_authorizationState is TdApi.AuthorizationStateClosing) - { - _haveAuthorization = false; - Print("Closing"); - } - else if (_authorizationState is TdApi.AuthorizationStateClosed) - { - Print("Closed"); - if (!_quiting) - { - _client = CreateTdClient(); // recreate _client after previous has closed - } - } - else - { - Print("Unsupported authorization state:" + _newLine + _authorizationState); - } - } - - private static long GetChatId(string arg) - { - long chatId = 0; - try - { - chatId = Convert.ToInt64(arg); - } - catch (FormatException) - { - } - catch (OverflowException) - { - } - return chatId; - } - - private static void GetCommand() - { - string command = ReadLine(_commandsLine); - string[] commands = command.Split(new char[] { ' ' }, 2); - try - { - switch (commands[0]) - { - case "gc": - _client.Send(new TdApi.GetChat(GetChatId(commands[1])), _defaultHandler); - break; - case "me": - _client.Send(new TdApi.GetMe(), _defaultHandler); - break; - case "sm": - string[] args = commands[1].Split(new char[] { ' ' }, 2); - sendMessage(GetChatId(args[0]), args[1]); - break; - case "lo": - _haveAuthorization = false; - _client.Send(new TdApi.LogOut(), _defaultHandler); - break; - case "q": - _quiting = true; - _haveAuthorization = false; - _client.Send(new TdApi.Close(), _defaultHandler); - break; - default: - Print("Unsupported command: " + command); - break; - } - } - catch (IndexOutOfRangeException) - { - Print("Not enough arguments"); - } - } - - private static void sendMessage(long chatId, string message) - { - // initialize reply markup just for testing - TdApi.InlineKeyboardButton[] row = { new TdApi.InlineKeyboardButton("https://telegram.org?1", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?2", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?3", new TdApi.InlineKeyboardButtonTypeUrl()) }; - TdApi.ReplyMarkup replyMarkup = new TdApi.ReplyMarkupInlineKeyboard(new TdApi.InlineKeyboardButton[][] { row, row, row }); - - TdApi.InputMessageContent content = new TdApi.InputMessageText(new TdApi.FormattedText(message, null), false, true); - _client.Send(new TdApi.SendMessage(chatId, 0, false, false, replyMarkup, content), _defaultHandler); - } - - static void Main() - { - // disable TDLib log - Td.Log.SetVerbosityLevel(0); - if (!Td.Log.SetFilePath("tdlib.log")) - { - throw new System.IO.IOException("Write access to the current directory is required"); - } - - // create Td.Client - _client = CreateTdClient(); - - // test Client.Execute - _defaultHandler.OnResult(_client.Execute(new TdApi.GetTextEntities("@telegram /test_command https://telegram.org telegram.me @gif @test"))); - - // main loop - while (!_quiting) - { - // await authorization - _gotAuthorization.Reset(); - _gotAuthorization.WaitOne(); - - _client.Send(new TdApi.GetChats(Int64.MaxValue, 0, 100), _defaultHandler); // preload chat list - while (_haveAuthorization) - { - GetCommand(); - } - } - } - - private class DefaultHandler : Td.ClientResultHandler - { - void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object) - { - Print(@object.ToString()); - } - } - - private class UpdatesHandler : Td.ClientResultHandler - { - void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object) - { - if (@object is TdApi.UpdateAuthorizationState) - { - OnAuthorizationStateUpdated((@object as TdApi.UpdateAuthorizationState).AuthorizationState); - } - else - { - // Print("Unsupported update: " + @object); - } - } - } - - private class AuthorizationRequestHandler : Td.ClientResultHandler - { - void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object) - { - if (@object is TdApi.Error) - { - Print("Receive an error:" + _newLine + @object); - OnAuthorizationStateUpdated(null); // repeat last action - } - else - { - // result is already received through UpdateAuthorizationState, nothing to do - } - } - } - } -} diff --git a/libs/tdlib/td/example/csharp/TdExample.csproj b/libs/tdlib/td/example/csharp/TdExample.csproj deleted file mode 100644 index ea2ad56532..0000000000 --- a/libs/tdlib/td/example/csharp/TdExample.csproj +++ /dev/null @@ -1,85 +0,0 @@ - - - - Debug - x86 - {3F9A93EA-DC26-4F8B-ACE0-131B33B00CA7} - Exe - false - ConsoleApplication - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - x86 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - x86 - - - TdExample - - - - - - - - - - - False - build\Debug\Telegram.Td.dll - build\Release\Telegram.Td.dll - - - - - - - - LIBEAY32.dll - PreserveNewest - - - SSLEAY32.dll - PreserveNewest - - - zlibd1.dll - PreserveNewest - - - - - LIBEAY32.dll - PreserveNewest - - - SSLEAY32.dll - PreserveNewest - - - zlib1.dll - PreserveNewest - - - - - - - \ No newline at end of file diff --git a/libs/tdlib/td/example/go/main.go b/libs/tdlib/td/example/go/main.go deleted file mode 100644 index 430e067019..0000000000 --- a/libs/tdlib/td/example/go/main.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -// #cgo LDFLAGS: -ltdjson -// #include -import "C" -import ( - "log" - "unsafe" -) - -func td_send(client unsafe.Pointer, query *C.char) { - C.td_json_client_send(client, query) -} - -func td_receive(client unsafe.Pointer) string { - return C.GoString(C.td_json_client_receive(client, 1.0)) -} - -func main() { - var client unsafe.Pointer - client = C.td_json_client_create() - - query := C.CString(`{"@type": "getAuthorizationState"}`) - td_send(client, query) - log.Println(td_receive(client)) -} diff --git a/libs/tdlib/td/example/ios/README.md b/libs/tdlib/td/example/ios/README.md deleted file mode 100644 index 25a1e68fcc..0000000000 --- a/libs/tdlib/td/example/ios/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Build for iOS - -Below are instructions for building TDLib for iOS, watchOS, tvOS, and also macOS. - -If you need only a macOS build, take a look at our build instructions for [macOS](https://github.com/tdlib/td#macos). - -For example of usage take a look at our [Swift example](https://github.com/tdlib/td/tree/master/example/swift). - -To compile `TDLib` you will need to: -* Install the latest Xcode command line tools. -* Install other build dependencies, for example, using [Homebrew](https://brew.sh): -``` -brew install gperf cmake -``` -* If you don't want to build `TDLib` for macOS, you can pregenerate required source code files using CMake prepare_cross_compiling target: -``` -cd -mkdir native-build -cd native-build -cmake .. -cmake --build . --target prepare_cross_compiling -``` -* Build OpenSSL for iOS, watchOS, tvOS and macOS: -``` -cd /example/ios -./build-openssl.sh -``` -Here we use scripts from [Python Apple support](https://github.com/pybee/Python-Apple-support), but any other OpenSSL builds should work too. -Built libraries should be stored in `third_party/openssl/`, because the next script will rely on this location. -* Build TDLib for iOS, watchOS, tvOS and macOS: -``` -cd /example/ios -./build.sh -``` -This may take a while, because TDLib will be built about 10 times. -Resulting library for iOS will work on any architecture (arv7, armv7s, arm64) and even on a simulator. -We use [CMake/iOS.cmake](https://github.com/tdlib/td/blob/master/CMake/iOS.cmake) toolchain, other toolchains may work too. - -Built libraries will be store in `tdjson` directory. - -Documentation for all available classes and methods can be found at https://core.telegram.org/tdlib/docs. diff --git a/libs/tdlib/td/example/ios/build-openssl.sh b/libs/tdlib/td/example/ios/build-openssl.sh deleted file mode 100644 index 2ad9dbcfee..0000000000 --- a/libs/tdlib/td/example/ios/build-openssl.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -git clone https://github.com/pybee/Python-Apple-support -cd Python-Apple-support -git checkout 2.7 -cd .. - -#TODO: change openssl version -platforms="macOS iOS watchOS tvOS" -for platform in $platforms; -do - echo $platform - cd Python-Apple-support - #NB: -j will fail - make OpenSSL-$platform - cd .. - rm -rf third_party/openssl/$platform - mkdir -p third_party/openssl/$platform/lib - cp ./Python-Apple-support/build/$platform/libcrypto.a third_party/openssl/$platform/lib/ - cp ./Python-Apple-support/build/$platform/libssl.a third_party/openssl/$platform/lib/ - cp -r ./Python-Apple-support/build/$platform/Support/OpenSSL/Headers/ third_party/openssl/$platform/include -done diff --git a/libs/tdlib/td/example/ios/build.sh b/libs/tdlib/td/example/ios/build.sh deleted file mode 100644 index 9970008a1c..0000000000 --- a/libs/tdlib/td/example/ios/build.sh +++ /dev/null @@ -1,74 +0,0 @@ -#/bin/sh -td_path=$(realpath ../..) - -rm -rf build -mkdir -p build -cd build - -platforms="macOS iOS watchOS tvOS" -for platform in $platforms; -do - echo "Platform = ${platform} Simulator = ${simulator}" - openssl_path=$(realpath ../third_party/openssl/${platform}) - echo "OpenSSL path = ${openssl_path}" - openssl_crypto_library="${openssl_path}/lib/libcrypto.a" - openssl_ssl_library="${openssl_path}/lib/libssl.a" - options="$options -DOPENSSL_FOUND=1" - options="$options -DOPENSSL_CRYPTO_LIBRARY=${openssl_crypto_library}" - #options="$options -DOPENSSL_SSL_LIBRARY=${openssl_ssl_library}" - options="$options -DOPENSSL_INCLUDE_DIR=${openssl_path}/include" - options="$options -DOPENSSL_LIBRARIES=${openssl_crypto_library};${openssl_ssl_library}" - options="$options -DCMAKE_BUILD_TYPE=Release" - if [[ $platform = "macOS" ]]; then - build="build-${platform}" - install="install-${platform}" - rm -rf $build - mkdir -p $build - mkdir -p $install - cd $build - cmake $td_path $options -DCMAKE_INSTALL_PREFIX=../${install} - make -j3 install || exit - cd .. - mkdir -p $platform - cp $build/libtdjson.dylib $platform/libtdjson.dylib - install_name_tool -id @rpath/libtdjson.dylib $platform/libtdjson.dylib - else - simulators="0 1" - for simulator in $simulators; - do - build="build-${platform}" - install="install-${platform}" - if [[ $simulator = "1" ]]; then - build="${build}-simulator" - install="${install}-simulator" - ios_platform="SIMULATOR" - else - ios_platform="OS" - fi - if [[ $platform = "watchOS" ]]; then - ios_platform="WATCH${ios_platform}" - fi - if [[ $platform = "tvOS" ]]; then - ios_platform="TV${ios_platform}" - fi - echo $ios_platform - rm -rf $build - mkdir -p $build - mkdir -p $install - cd $build - cmake $td_path $options -DIOS_PLATFORM=${ios_platform} -DCMAKE_TOOLCHAIN_FILE=${td_path}/CMake/iOS.cmake -DCMAKE_INSTALL_PREFIX=../${install} - make -j3 install || exit - cd .. - done - lib="install-${platform}/lib/libtdjson.dylib" - lib_simulator="install-${platform}-simulator/lib/libtdjson.dylib" - mkdir -p $platform - lipo -create $lib $lib_simulator -o $platform/libtdjson.dylib - install_name_tool -id @rpath/libtdjson.dylib $platform/libtdjson.dylib - fi - - mkdir -p ../tdjson/$platform/include - rsync --recursive ${install}/include/ ../tdjson/${platform}/include/ - mkdir -p ../tdjson/$platform/lib - cp $platform/libtdjson.dylib ../tdjson/$platform/lib/ -done diff --git a/libs/tdlib/td/example/java/.gitignore b/libs/tdlib/td/example/java/.gitignore deleted file mode 100644 index 8f846b80d9..0000000000 --- a/libs/tdlib/td/example/java/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -**/*build/ -bin/ -docs/ -org/drinkless/tdlib/TdApi.java -td/ diff --git a/libs/tdlib/td/example/java/CMakeLists.txt b/libs/tdlib/td/example/java/CMakeLists.txt deleted file mode 100644 index e8313a68b7..0000000000 --- a/libs/tdlib/td/example/java/CMakeLists.txt +++ /dev/null @@ -1,68 +0,0 @@ -cmake_minimum_required(VERSION 3.1 FATAL_ERROR) - -project(TdJavaExample VERSION 1.0 LANGUAGES CXX) - -find_package(Td REQUIRED) - -if (NOT JNI_FOUND) - find_package(JNI REQUIRED) -endif() -message(STATUS "Found JNI: ${JNI_INCLUDE_DIRS} ${JNI_LIBRARIES}") - -if (NOT Java_FOUND) - find_package(Java 1.6 REQUIRED) -endif() -message(STATUS "Found Java: ${Java_JAVAC_EXECUTABLE} ${Java_JAVADOC_EXECUTABLE}") - -# Generating TdApi.java -find_program(PHP_EXECUTABLE php) - -set(TD_API_JAVA_PACKAGE "org/drinkless/tdlib") -set(TD_API_JAVA_PATH ${CMAKE_CURRENT_SOURCE_DIR}) -set(TD_API_TLO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/td/bin/td/generate/scheme/td_api.tlo) -set(TD_API_TL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/td/bin/td/generate/scheme/td_api.tl) -set(JAVADOC_TL_DOCUMENTATION_GENERATOR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/td/bin/td/generate/JavadocTlDocumentationGenerator.php) -set(GENERATE_JAVA_API_CMD ${CMAKE_CURRENT_SOURCE_DIR}/td/bin/td_generate_java_api TdApi ${TD_API_TLO_PATH} ${TD_API_JAVA_PATH} ${TD_API_JAVA_PACKAGE}) -if (PHP_EXECUTABLE) - set(GENERATE_JAVA_API_CMD ${GENERATE_JAVA_API_CMD} && ${PHP_EXECUTABLE} ${JAVADOC_TL_DOCUMENTATION_GENERATOR_PATH} ${TD_API_TL_PATH} ${TD_API_JAVA_PATH}/${TD_API_JAVA_PACKAGE}/TdApi.java) -endif() - -add_custom_target(td_generate_java_api - COMMAND ${GENERATE_JAVA_API_CMD} - COMMENT "Generating Java TDLib API source files" - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/td/bin/td_generate_java_api ${TD_API_TLO_PATH} ${TD_API_TL_PATH} ${JAVADOC_TL_DOCUMENTATION_GENERATOR_PATH} -) - -set(JAVA_SOURCE_PATH "${TD_API_JAVA_PATH}/${TD_API_JAVA_PACKAGE}") -get_filename_component(JAVA_OUTPUT_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin REALPATH BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") -file(MAKE_DIRECTORY ${JAVA_OUTPUT_DIRECTORY}) -add_custom_target(build_java - COMMAND ${Java_JAVAC_EXECUTABLE} -d ${JAVA_OUTPUT_DIRECTORY} ${JAVA_SOURCE_PATH}/example/Example.java ${JAVA_SOURCE_PATH}/Client.java ${JAVA_SOURCE_PATH}/Log.java ${JAVA_SOURCE_PATH}/TdApi.java - COMMENT "Building Java code" - DEPENDS td_generate_java_api -) - -set(JAVA_SOURCE_PATH "${TD_API_JAVA_PATH}/${TD_API_JAVA_PACKAGE}") -add_custom_target(generate_javadoc - COMMAND ${Java_JAVADOC_EXECUTABLE} -d ${JAVA_OUTPUT_DIRECTORY}/../docs org.drinkless.tdlib - WORKING_DIRECTORY ${TD_API_JAVA_PATH} - COMMENT "Generating Javadoc documentation" - DEPENDS td_generate_java_api -) - -# Building shared library -add_library(tdjni SHARED - td_jni.cpp -) -target_include_directories(tdjni PRIVATE ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) -target_link_libraries(tdjni PRIVATE Td::TdStatic ${JAVA_JVM_LIBRARY}) -target_compile_definitions(tdjni PRIVATE PACKAGE_NAME="${TD_API_JAVA_PACKAGE}") - -set_property(TARGET tdjni PROPERTY CXX_STANDARD 14) - -add_dependencies(tdjni td_generate_java_api build_java generate_javadoc) - -install(TARGETS tdjni - LIBRARY DESTINATION bin - RUNTIME DESTINATION bin -) diff --git a/libs/tdlib/td/example/java/README.md b/libs/tdlib/td/example/java/README.md deleted file mode 100644 index c2b5c43171..0000000000 --- a/libs/tdlib/td/example/java/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# TDLib Java example - -To run this example, you will need installed JDK >= 1.6. -For Javadoc documentation generation PHP is needed. - -TDLib should be prebuilt for using with Java and installed to local subdirectory `td/` as follows: -``` -cd -mkdir jnibuild -cd jnibuild -cmake -DCMAKE_BUILD_TYPE=Release -DTD_ENABLE_JNI=ON -DCMAKE_INSTALL_PREFIX:PATH=../example/java/td .. -cmake --build . --target install -``` -If you want to compile TDLib for 64-bit Java on Windows using MSVC, you will also need to add `-A x64` option to CMake. - -In Windows, use Vcpkg toolchain file by adding parameter -DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/vcpkg.cmake - -Then you can build this example: -``` -cd /example/java -mkdir build -cd build -cmake -DCMAKE_BUILD_TYPE=Release -DTd_DIR=/example/java/td/lib/cmake/Td -DCMAKE_INSTALL_PREFIX:PATH=.. .. -cmake --build . --target install -``` - -Compiled TDLib shared library and Java example after that will be placed in bin/ and Javadoc documentation in `docs/`. - -Now you can run Java example: -``` -cd /example/java/bin -java '-Djava.library.path=.' org/drinkless/tdlib/example/Example -``` - -If you get "Could NOT find JNI ..." error from CMake, you need to specify to CMake path to the installed JDK, for example, "-DJAVA_HOME=/usr/lib/jvm/java-8-oracle/". - -If you get java.lang.UnsatisfiedLinkError with "Can't find dependent libraries", you may also need to copy some dependent shared libraries to `bin/`. - -In case you compiled the example as 32-bit version, you may need to give -d32 parameter to Java. diff --git a/libs/tdlib/td/example/java/org/drinkless/tdlib/Client.java b/libs/tdlib/td/example/java/org/drinkless/tdlib/Client.java deleted file mode 100644 index efb38e9c5a..0000000000 --- a/libs/tdlib/td/example/java/org/drinkless/tdlib/Client.java +++ /dev/null @@ -1,285 +0,0 @@ -// -// 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) -// -package org.drinkless.tdlib; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * Main class for interaction with the TDLib. - */ -public final class Client implements Runnable { - /** - * Interface for handler for results of queries to TDLib and incoming updates from TDLib. - */ - public interface ResultHandler { - /** - * Callback called on result of query to TDLib or incoming update from TDLib. - * - * @param object Result of query or update of type TdApi.Update about new events. - */ - void onResult(TdApi.Object object); - } - - /** - * Interface for handler of exceptions thrown while invoking ResultHandler. - * By default, all such exceptions are ignored. - * All exceptions thrown from ExceptionHandler are ignored. - */ - public interface ExceptionHandler { - /** - * Callback called on exceptions thrown while invoking ResultHandler. - * - * @param e Exception thrown by ResultHandler. - */ - void onException(Throwable e); - } - - /** - * Sends a request to the TDLib. - * - * @param query Object representing a query to the TDLib. - * @param resultHandler Result handler with onResult method which will be called with result - * of the query or with TdApi.Error as parameter. If it is null, nothing - * will be called. - * @param exceptionHandler Exception handler with onException method which will be called on - * exception thrown from resultHandler. If it is null, then - * defaultExceptionHandler will be called. - * @throws NullPointerException if query is null. - */ - public void send(TdApi.Function query, ResultHandler resultHandler, ExceptionHandler exceptionHandler) { - if (query == null) { - throw new NullPointerException("query is null"); - } - - readLock.lock(); - try { - if (isClientDestroyed) { - if (resultHandler != null) { - handleResult(new TdApi.Error(500, "Client is closed"), resultHandler, exceptionHandler); - } - return; - } - - long queryId = currentQueryId.incrementAndGet(); - handlers.put(queryId, new Handler(resultHandler, exceptionHandler)); - nativeClientSend(nativeClientId, queryId, query); - } finally { - readLock.unlock(); - } - } - - /** - * Sends a request to the TDLib with an empty ExceptionHandler. - * - * @param query Object representing a query to the TDLib. - * @param resultHandler Result handler with onResult method which will be called with result - * of the query or with TdApi.Error as parameter. If it is null, then - * defaultExceptionHandler will be called. - * @throws NullPointerException if query is null. - */ - public void send(TdApi.Function query, ResultHandler resultHandler) { - send(query, resultHandler, null); - } - - /** - * Synchronously executes a TDLib request. Only a few marked accordingly requests can be executed synchronously. - * - * @param query Object representing a query to the TDLib. - * @return request result. - * @throws NullPointerException if query is null. - */ - public static TdApi.Object execute(TdApi.Function query) { - if (query == null) { - throw new NullPointerException("query is null"); - } - return nativeClientExecute(query); - } - - /** - * Replaces handler for incoming updates from the TDLib. - * - * @param updatesHandler Handler with onResult method which will be called for every incoming - * update from the TDLib. - * @param exceptionHandler Exception handler with onException method which will be called on - * exception thrown from updatesHandler, if it is null, defaultExceptionHandler will be invoked. - */ - public void setUpdatesHandler(ResultHandler updatesHandler, ExceptionHandler exceptionHandler) { - handlers.put(0L, new Handler(updatesHandler, exceptionHandler)); - } - - /** - * Replaces handler for incoming updates from the TDLib. Sets empty ExceptionHandler. - * - * @param updatesHandler Handler with onResult method which will be called for every incoming - * update from the TDLib. - */ - public void setUpdatesHandler(ResultHandler updatesHandler) { - setUpdatesHandler(updatesHandler, null); - } - - /** - * Replaces default exception handler to be invoked on exceptions thrown from updatesHandler and all other ResultHandler. - * - * @param defaultExceptionHandler Default exception handler. If null Exceptions are ignored. - */ - public void setDefaultExceptionHandler(Client.ExceptionHandler defaultExceptionHandler) { - this.defaultExceptionHandler = defaultExceptionHandler; - } - - /** - * Overridden method from Runnable, do not call it directly. - */ - @Override - public void run() { - while (!stopFlag) { - receiveQueries(300.0 /*seconds*/); - } - } - - /** - * Creates new Client. - * - * @param updatesHandler Handler for incoming updates. - * @param updatesExceptionHandler Handler for exceptions thrown from updatesHandler. If it is null, exceptions will be iggnored. - * @param defaultExceptionHandler Default handler for exceptions thrown from all ResultHandler. If it is null, exceptions will be iggnored. - * @return created Client - */ - public static Client create(ResultHandler updatesHandler, ExceptionHandler updatesExceptionHandler, ExceptionHandler defaultExceptionHandler) { - Client client = new Client(updatesHandler, updatesExceptionHandler, defaultExceptionHandler); - new Thread(client, "TDLib thread").start(); - return client; - } - - /** - * Closes Client. - */ - public void close() { - writeLock.lock(); - try { - if (isClientDestroyed) { - return; - } - if (!stopFlag) { - send(new TdApi.Close(), null); - } - isClientDestroyed = true; - while (!stopFlag) { - Thread.yield(); - } - while (handlers.size() != 1) { - receiveQueries(300.0); - } - destroyNativeClient(nativeClientId); - } finally { - writeLock.unlock(); - } - } - - private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - private final Lock readLock = readWriteLock.readLock(); - private final Lock writeLock = readWriteLock.writeLock(); - - private volatile boolean stopFlag = false; - private volatile boolean isClientDestroyed = false; - private final long nativeClientId; - - private final ConcurrentHashMap handlers = new ConcurrentHashMap(); - private final AtomicLong currentQueryId = new AtomicLong(); - - private volatile ExceptionHandler defaultExceptionHandler = null; - - private static final int MAX_EVENTS = 1000; - private final long[] eventIds = new long[MAX_EVENTS]; - private final TdApi.Object[] events = new TdApi.Object[MAX_EVENTS]; - - private static class Handler { - final ResultHandler resultHandler; - final ExceptionHandler exceptionHandler; - - Handler(ResultHandler resultHandler, ExceptionHandler exceptionHandler) { - this.resultHandler = resultHandler; - this.exceptionHandler = exceptionHandler; - } - } - - private Client(ResultHandler updatesHandler, ExceptionHandler updateExceptionHandler, ExceptionHandler defaultExceptionHandler) { - nativeClientId = createNativeClient(); - handlers.put(0L, new Handler(updatesHandler, updateExceptionHandler)); - this.defaultExceptionHandler = defaultExceptionHandler; - } - - @Override - protected void finalize() throws Throwable { - try { - close(); - } finally { - super.finalize(); - } - } - - private void processResult(long id, TdApi.Object object) { - if (object instanceof TdApi.UpdateAuthorizationState) { - if (((TdApi.UpdateAuthorizationState) object).authorizationState instanceof TdApi.AuthorizationStateClosed) { - stopFlag = true; - } - } - Handler handler; - if (id == 0) { - // update handler stays forever - handler = handlers.get(id); - } else { - handler = handlers.remove(id); - } - if (handler == null) { - return; - } - - handleResult(object, handler.resultHandler, handler.exceptionHandler); - } - - private void handleResult(TdApi.Object object, ResultHandler resultHandler, ExceptionHandler exceptionHandler) { - if (resultHandler == null) { - return; - } - - try { - resultHandler.onResult(object); - } catch (Throwable cause) { - if (exceptionHandler == null) { - exceptionHandler = defaultExceptionHandler; - } - if (exceptionHandler != null) { - try { - exceptionHandler.onException(cause); - } catch (Throwable ignored) { - } - } - } - } - - private void receiveQueries(double timeout) { - int resultN = nativeClientReceive(nativeClientId, eventIds, events, timeout); - for (int i = 0; i < resultN; i++) { - processResult(eventIds[i], events[i]); - events[i] = null; - } - } - - private static native long createNativeClient(); - - private static native void nativeClientSend(long nativeClientId, long eventId, TdApi.Function function); - - private static native int nativeClientReceive(long nativeClientId, long[] eventIds, TdApi.Object[] events, double timeout); - - private static native TdApi.Object nativeClientExecute(TdApi.Function function); - - private static native void destroyNativeClient(long nativeClientId); -} diff --git a/libs/tdlib/td/example/java/org/drinkless/tdlib/Log.java b/libs/tdlib/td/example/java/org/drinkless/tdlib/Log.java deleted file mode 100644 index c81ffbeeb7..0000000000 --- a/libs/tdlib/td/example/java/org/drinkless/tdlib/Log.java +++ /dev/null @@ -1,75 +0,0 @@ -// -// 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) -// -package org.drinkless.tdlib; - -/** - * Class for managing internal TDLib logging. - */ -public final class Log { - /** - * Changes TDLib log verbosity. - * - * @param verbosityLevel New value of log verbosity level. Must be non-negative. - * Value 0 corresponds to fatal errors, - * value 1 corresponds to java.util.logging.Level.SEVERE, - * value 2 corresponds to java.util.logging.Level.WARNING, - * value 3 corresponds to java.util.logging.Level.INFO, - * value 4 corresponds to java.util.logging.Level.FINE, - * value 5 corresponds to java.util.logging.Level.FINER, - * value greater than 5 can be used to enable even more logging. - * Default value of the log verbosity level is 5. - */ - public static native void setVerbosityLevel(int verbosityLevel); - - /** - * Sets file path for writing TDLib internal log. By default TDLib writes logs to the System.err. - * Use this method to write the log to a file instead. - * - * @param filePath Path to a file for writing TDLib internal log. Use an empty path to - * switch back to logging to the System.err. - * @return whether opening the log file succeeded. - */ - public static native boolean setFilePath(String filePath); - - /** - * Changes maximum size of TDLib log file. - * - * @param maxFileSize Maximum size of the file to where the internal TDLib log is written - * before the file will be auto-rotated. Must be positive. Defaults to 10 MB. - */ - public static native void setMaxFileSize(long maxFileSize); - - /** - * This function is called from the JNI when a fatal error happens to provide a better error message. - * The function does not return. - * - * @param errorMessage Error message. - */ - private static void onFatalError(String errorMessage) { - class ThrowError implements Runnable { - private ThrowError(String errorMessage) { - this.errorMessage = errorMessage; - } - - @Override - public void run() { - throw new RuntimeException("TDLib fatal error: " + errorMessage); - } - - private final String errorMessage; - } - - new Thread(new ThrowError(errorMessage), "TDLib fatal error thread").start(); - while (true) { - try { - Thread.sleep(1000); // milliseconds - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } - } - } -} diff --git a/libs/tdlib/td/example/java/org/drinkless/tdlib/example/Example.java b/libs/tdlib/td/example/java/org/drinkless/tdlib/example/Example.java deleted file mode 100644 index 831de88f1d..0000000000 --- a/libs/tdlib/td/example/java/org/drinkless/tdlib/example/Example.java +++ /dev/null @@ -1,533 +0,0 @@ -// -// 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) -// -package org.drinkless.tdlib.example; - -import org.drinkless.tdlib.Client; -import org.drinkless.tdlib.Log; -import org.drinkless.tdlib.TdApi; - -import java.io.IOError; -import java.io.IOException; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.NavigableSet; -import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Example class for TDLib usage from Java. - */ -public final class Example { - private static Client client = null; - - private static TdApi.AuthorizationState authorizationState = null; - private static volatile boolean haveAuthorization = false; - private static volatile boolean quiting = false; - - private static final Client.ResultHandler defaultHandler = new DefaultHandler(); - - private static final Lock authorizationLock = new ReentrantLock(); - private static final Condition gotAuthorization = authorizationLock.newCondition(); - - private static final ConcurrentMap users = new ConcurrentHashMap(); - private static final ConcurrentMap basicGroups = new ConcurrentHashMap(); - private static final ConcurrentMap supergroups = new ConcurrentHashMap(); - private static final ConcurrentMap secretChats = new ConcurrentHashMap(); - - private static final ConcurrentMap chats = new ConcurrentHashMap(); - private static final NavigableSet chatList = new TreeSet(); - private static boolean haveFullChatList = false; - - private static final ConcurrentMap usersFullInfo = new ConcurrentHashMap(); - private static final ConcurrentMap basicGroupsFullInfo = new ConcurrentHashMap(); - private static final ConcurrentMap supergroupsFullInfo = new ConcurrentHashMap(); - - private static final String newLine = System.getProperty("line.separator"); - private static final String commandsLine = "Enter command (gcs - GetChats, gc - GetChat, me - GetMe, sm - SendMessage, lo - LogOut, q - Quit): "; - private static volatile String currentPrompt = null; - - static { - System.loadLibrary("tdjni"); - } - - private static void print(String str) { - if (currentPrompt != null) { - System.out.println(""); - } - System.out.println(str); - if (currentPrompt != null) { - System.out.print(currentPrompt); - } - } - - private static void setChatOrder(TdApi.Chat chat, long order) { - synchronized (chatList) { - if (chat.order != 0) { - boolean isRemoved = chatList.remove(new OrderedChat(chat.order, chat.id)); - assert isRemoved; - } - - chat.order = order; - - if (chat.order != 0) { - boolean isAdded = chatList.add(new OrderedChat(chat.order, chat.id)); - assert isAdded; - } - } - } - - private static void onAuthorizationStateUpdated(TdApi.AuthorizationState authorizationState) { - if (authorizationState != null) { - Example.authorizationState = authorizationState; - } - switch (Example.authorizationState.getConstructor()) { - case TdApi.AuthorizationStateWaitTdlibParameters.CONSTRUCTOR: - TdApi.TdlibParameters parameters = new TdApi.TdlibParameters(); - parameters.databaseDirectory = "tdlib"; - parameters.useMessageDatabase = true; - parameters.useSecretChats = true; - parameters.apiId = 94575; - parameters.apiHash = "a3406de8d171bb422bb6ddf3bbd800e2"; - parameters.systemLanguageCode = "en"; - parameters.deviceModel = "Desktop"; - parameters.systemVersion = "Unknown"; - parameters.applicationVersion = "1.0"; - parameters.enableStorageOptimizer = true; - - client.send(new TdApi.SetTdlibParameters(parameters), new AuthorizationRequestHandler()); - break; - case TdApi.AuthorizationStateWaitEncryptionKey.CONSTRUCTOR: - client.send(new TdApi.CheckDatabaseEncryptionKey(), new AuthorizationRequestHandler()); - break; - case TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: { - String phoneNumber = promptString("Please enter phone number: "); - client.send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler()); - break; - } - case TdApi.AuthorizationStateWaitCode.CONSTRUCTOR: { - String code = promptString("Please enter authentication code: "); - client.send(new TdApi.CheckAuthenticationCode(code, "", ""), new AuthorizationRequestHandler()); - break; - } - case TdApi.AuthorizationStateWaitPassword.CONSTRUCTOR: { - String password = promptString("Please enter password: "); - client.send(new TdApi.CheckAuthenticationPassword(password), new AuthorizationRequestHandler()); - break; - } - case TdApi.AuthorizationStateReady.CONSTRUCTOR: - haveAuthorization = true; - authorizationLock.lock(); - try { - gotAuthorization.signal(); - } finally { - authorizationLock.unlock(); - } - break; - case TdApi.AuthorizationStateLoggingOut.CONSTRUCTOR: - haveAuthorization = false; - print("Logging out"); - break; - case TdApi.AuthorizationStateClosing.CONSTRUCTOR: - haveAuthorization = false; - print("Closing"); - break; - case TdApi.AuthorizationStateClosed.CONSTRUCTOR: - print("Closed"); - if (!quiting) { - client = Client.create(new UpdatesHandler(), null, null); // recreate client after previous has closed - } - break; - default: - System.err.println("Unsupported authorization state:" + newLine + Example.authorizationState); - } - } - - private static int toInt(String arg) { - int result = 0; - try { - result = Integer.parseInt(arg); - } catch (NumberFormatException ignored) { - } - return result; - } - - private static long getChatId(String arg) { - long chatId = 0; - try { - chatId = Long.parseLong(arg); - } catch (NumberFormatException ignored) { - } - return chatId; - } - - private static String promptString(String prompt) { - System.out.print(prompt); - currentPrompt = prompt; - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - String str = ""; - try { - str = reader.readLine(); - } catch (IOException e) { - e.printStackTrace(); - } - currentPrompt = null; - return str; - } - - private static void getCommand() { - String command = promptString(commandsLine); - String[] commands = command.split(" ", 2); - try { - switch (commands[0]) { - case "gcs": { - int limit = 20; - if (commands.length > 1) { - limit = toInt(commands[1]); - } - getChatList(limit); - break; - } - case "gc": - client.send(new TdApi.GetChat(getChatId(commands[1])), defaultHandler); - break; - case "me": - client.send(new TdApi.GetMe(), defaultHandler); - break; - case "sm": { - String[] args = commands[1].split(" ", 2); - sendMessage(getChatId(args[0]), args[1]); - break; - } - case "lo": - haveAuthorization = false; - client.send(new TdApi.LogOut(), defaultHandler); - break; - case "q": - quiting = true; - haveAuthorization = false; - client.send(new TdApi.Close(), defaultHandler); - break; - default: - System.err.println("Unsupported command: " + command); - } - } catch (ArrayIndexOutOfBoundsException e) { - print("Not enough arguments"); - } - } - - private static void getChatList(final int limit) { - synchronized (chatList) { - if (!haveFullChatList && limit > chatList.size()) { - // have enough chats in the chat list or chat list is too small - long offsetOrder = Long.MAX_VALUE; - long offsetChatId = 0; - if (!chatList.isEmpty()) { - OrderedChat last = chatList.last(); - offsetOrder = last.order; - offsetChatId = last.chatId; - } - client.send(new TdApi.GetChats(offsetOrder, offsetChatId, limit - chatList.size()), new Client.ResultHandler() { - @Override - public void onResult(TdApi.Object object) { - switch (object.getConstructor()) { - case TdApi.Error.CONSTRUCTOR: - System.err.println("Receive an error for GetChats:" + newLine + object); - break; - case TdApi.Chats.CONSTRUCTOR: - long[] chatIds = ((TdApi.Chats) object).chatIds; - if (chatIds.length == 0) { - synchronized (chatList) { - haveFullChatList = true; - } - } - // chats had already been received through updates, let's retry request - getChatList(limit); - break; - default: - System.err.println("Receive wrong response from TDLib:" + newLine + object); - } - } - }); - return; - } - - // have enough chats in the chat list to answer request - java.util.Iterator iter = chatList.iterator(); - System.out.println(); - System.out.println("First " + limit + " chat(s) out of " + chatList.size() + " known chat(s):"); - for (int i = 0; i < limit; i++) { - long chatId = iter.next().chatId; - TdApi.Chat chat = chats.get(chatId); - synchronized (chat) { - System.out.println(chatId + ": " + chat.title); - } - } - print(""); - } - } - - private static void sendMessage(long chatId, String message) { - // initialize reply markup just for testing - TdApi.InlineKeyboardButton[] row = {new TdApi.InlineKeyboardButton("https://telegram.org?1", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?2", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?3", new TdApi.InlineKeyboardButtonTypeUrl())}; - TdApi.ReplyMarkup replyMarkup = new TdApi.ReplyMarkupInlineKeyboard(new TdApi.InlineKeyboardButton[][]{row, row, row}); - - TdApi.InputMessageContent content = new TdApi.InputMessageText(new TdApi.FormattedText(message, null), false, true); - client.send(new TdApi.SendMessage(chatId, 0, false, false, replyMarkup, content), defaultHandler); - } - - public static void main(String[] args) throws InterruptedException { - // disable TDLib log - Log.setVerbosityLevel(0); - if (!Log.setFilePath("tdlib.log")) { - throw new IOError(new IOException("Write access to the current directory is required")); - } - - // create client - client = Client.create(new UpdatesHandler(), null, null); - - // test Client.execute - defaultHandler.onResult(Client.execute(new TdApi.GetTextEntities("@telegram /test_command https://telegram.org telegram.me @gif @test"))); - - // main loop - while (!quiting) { - // await authorization - authorizationLock.lock(); - try { - while (!haveAuthorization) { - gotAuthorization.await(); - } - } finally { - authorizationLock.unlock(); - } - - while (haveAuthorization) { - getCommand(); - } - } - } - - private static class OrderedChat implements Comparable { - final long order; - final long chatId; - - OrderedChat(long order, long chatId) { - this.order = order; - this.chatId = chatId; - } - - @Override - public int compareTo(OrderedChat o) { - if (this.order != o.order) { - return o.order < this.order ? -1 : 1; - } - if (this.chatId != o.chatId) { - return o.chatId < this.chatId ? -1 : 1; - } - return 0; - } - - @Override - public boolean equals(Object obj) { - OrderedChat o = (OrderedChat) obj; - return this.order == o.order && this.chatId == o.chatId; - } - } - - private static class DefaultHandler implements Client.ResultHandler { - @Override - public void onResult(TdApi.Object object) { - print(object.toString()); - } - } - - private static class UpdatesHandler implements Client.ResultHandler { - @Override - public void onResult(TdApi.Object object) { - switch (object.getConstructor()) { - case TdApi.UpdateAuthorizationState.CONSTRUCTOR: - onAuthorizationStateUpdated(((TdApi.UpdateAuthorizationState) object).authorizationState); - break; - - case TdApi.UpdateUser.CONSTRUCTOR: - TdApi.UpdateUser updateUser = (TdApi.UpdateUser) object; - users.put(updateUser.user.id, updateUser.user); - break; - case TdApi.UpdateUserStatus.CONSTRUCTOR: { - TdApi.UpdateUserStatus updateUserStatus = (TdApi.UpdateUserStatus) object; - TdApi.User user = users.get(updateUserStatus.userId); - synchronized (user) { - user.status = updateUserStatus.status; - } - break; - } - case TdApi.UpdateBasicGroup.CONSTRUCTOR: - TdApi.UpdateBasicGroup updateBasicGroup = (TdApi.UpdateBasicGroup) object; - basicGroups.put(updateBasicGroup.basicGroup.id, updateBasicGroup.basicGroup); - break; - case TdApi.UpdateSupergroup.CONSTRUCTOR: - TdApi.UpdateSupergroup updateSupergroup = (TdApi.UpdateSupergroup) object; - supergroups.put(updateSupergroup.supergroup.id, updateSupergroup.supergroup); - break; - case TdApi.UpdateSecretChat.CONSTRUCTOR: - TdApi.UpdateSecretChat updateSecretChat = (TdApi.UpdateSecretChat) object; - secretChats.put(updateSecretChat.secretChat.id, updateSecretChat.secretChat); - break; - - case TdApi.UpdateNewChat.CONSTRUCTOR: { - TdApi.UpdateNewChat updateNewChat = (TdApi.UpdateNewChat) object; - TdApi.Chat chat = updateNewChat.chat; - synchronized (chat) { - chats.put(chat.id, chat); - - long order = chat.order; - chat.order = 0; - setChatOrder(chat, order); - } - break; - } - case TdApi.UpdateChatTitle.CONSTRUCTOR: { - TdApi.UpdateChatTitle updateChat = (TdApi.UpdateChatTitle) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.title = updateChat.title; - } - break; - } - case TdApi.UpdateChatPhoto.CONSTRUCTOR: { - TdApi.UpdateChatPhoto updateChat = (TdApi.UpdateChatPhoto) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.photo = updateChat.photo; - } - break; - } - case TdApi.UpdateChatLastMessage.CONSTRUCTOR: { - TdApi.UpdateChatLastMessage updateChat = (TdApi.UpdateChatLastMessage) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.lastMessage = updateChat.lastMessage; - setChatOrder(chat, updateChat.order); - } - break; - } - case TdApi.UpdateChatOrder.CONSTRUCTOR: { - TdApi.UpdateChatOrder updateChat = (TdApi.UpdateChatOrder) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - setChatOrder(chat, updateChat.order); - } - break; - } - case TdApi.UpdateChatIsPinned.CONSTRUCTOR: { - TdApi.UpdateChatIsPinned updateChat = (TdApi.UpdateChatIsPinned) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.isPinned = updateChat.isPinned; - setChatOrder(chat, updateChat.order); - } - break; - } - case TdApi.UpdateChatReadInbox.CONSTRUCTOR: { - TdApi.UpdateChatReadInbox updateChat = (TdApi.UpdateChatReadInbox) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.lastReadInboxMessageId = updateChat.lastReadInboxMessageId; - chat.unreadCount = updateChat.unreadCount; - } - break; - } - case TdApi.UpdateChatReadOutbox.CONSTRUCTOR: { - TdApi.UpdateChatReadOutbox updateChat = (TdApi.UpdateChatReadOutbox) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.lastReadOutboxMessageId = updateChat.lastReadOutboxMessageId; - } - break; - } - case TdApi.UpdateChatUnreadMentionCount.CONSTRUCTOR: { - TdApi.UpdateChatUnreadMentionCount updateChat = (TdApi.UpdateChatUnreadMentionCount) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.unreadMentionCount = updateChat.unreadMentionCount; - } - break; - } - case TdApi.UpdateMessageMentionRead.CONSTRUCTOR: { - TdApi.UpdateMessageMentionRead updateChat = (TdApi.UpdateMessageMentionRead) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.unreadMentionCount = updateChat.unreadMentionCount; - } - break; - } - case TdApi.UpdateChatReplyMarkup.CONSTRUCTOR: { - TdApi.UpdateChatReplyMarkup updateChat = (TdApi.UpdateChatReplyMarkup) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.replyMarkupMessageId = updateChat.replyMarkupMessageId; - } - break; - } - case TdApi.UpdateChatDraftMessage.CONSTRUCTOR: { - TdApi.UpdateChatDraftMessage updateChat = (TdApi.UpdateChatDraftMessage) object; - TdApi.Chat chat = chats.get(updateChat.chatId); - synchronized (chat) { - chat.draftMessage = updateChat.draftMessage; - setChatOrder(chat, updateChat.order); - } - break; - } - case TdApi.UpdateNotificationSettings.CONSTRUCTOR: { - TdApi.UpdateNotificationSettings update = (TdApi.UpdateNotificationSettings) object; - if (update.scope instanceof TdApi.NotificationSettingsScopeChat) { - TdApi.Chat chat = chats.get(((TdApi.NotificationSettingsScopeChat) update.scope).chatId); - synchronized (chat) { - chat.notificationSettings = update.notificationSettings; - } - } - break; - } - - case TdApi.UpdateUserFullInfo.CONSTRUCTOR: - TdApi.UpdateUserFullInfo updateUserFullInfo = (TdApi.UpdateUserFullInfo) object; - usersFullInfo.put(updateUserFullInfo.userId, updateUserFullInfo.userFullInfo); - break; - case TdApi.UpdateBasicGroupFullInfo.CONSTRUCTOR: - TdApi.UpdateBasicGroupFullInfo updateBasicGroupFullInfo = (TdApi.UpdateBasicGroupFullInfo) object; - basicGroupsFullInfo.put(updateBasicGroupFullInfo.basicGroupId, updateBasicGroupFullInfo.basicGroupFullInfo); - break; - case TdApi.UpdateSupergroupFullInfo.CONSTRUCTOR: - TdApi.UpdateSupergroupFullInfo updateSupergroupFullInfo = (TdApi.UpdateSupergroupFullInfo) object; - supergroupsFullInfo.put(updateSupergroupFullInfo.supergroupId, updateSupergroupFullInfo.supergroupFullInfo); - break; - default: - // print("Unsupported update:" + newLine + object); - } - } - } - - private static class AuthorizationRequestHandler implements Client.ResultHandler { - @Override - public void onResult(TdApi.Object object) { - switch (object.getConstructor()) { - case TdApi.Error.CONSTRUCTOR: - System.err.println("Receive an error:" + newLine + object); - onAuthorizationStateUpdated(null); // repeat last action - break; - case TdApi.Ok.CONSTRUCTOR: - // result is already received through UpdateAuthorizationState, nothing to do - break; - default: - System.err.println("Receive wrong response from TDLib:" + newLine + object); - } - } - } -} \ No newline at end of file diff --git a/libs/tdlib/td/example/java/td_jni.cpp b/libs/tdlib/td/example/java/td_jni.cpp deleted file mode 100644 index b9ba74a402..0000000000 --- a/libs/tdlib/td/example/java/td_jni.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// -// 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) -// -#include -#include -#include - -#include - -#include -#include -#include -#include - -namespace td_jni { - -static td::td_api::object_ptr fetch_function(JNIEnv *env, jobject function) { - td::jni::reset_parse_error(); - auto result = td::td_api::Function::fetch(env, function); - if (td::jni::have_parse_error()) { - std::abort(); - } - return result; -} - -static td::Client *get_client(jlong client_id) { - return reinterpret_cast(static_cast(client_id)); -} - -static jlong Client_createNativeClient(JNIEnv *env, jclass clazz) { - return static_cast(reinterpret_cast(new td::Client())); -} - -static void Client_nativeClientSend(JNIEnv *env, jclass clazz, jlong client_id, jlong id, jobject function) { - get_client(client_id)->send({static_cast(id), fetch_function(env, function)}); -} - -static jint Client_nativeClientReceive(JNIEnv *env, jclass clazz, jlong client_id, jlongArray ids, jobjectArray events, - jdouble timeout) { - auto client = get_client(client_id); - jsize events_size = env->GetArrayLength(ids); // ids and events size must be of equal size - jsize result_size = 0; - - auto response = client->receive(timeout); - while (response.object && result_size < events_size) { - jlong result_id = static_cast(response.id); - env->SetLongArrayRegion(ids, result_size, 1, &result_id); - - jobject object; - response.object->store(env, object); - env->SetObjectArrayElement(events, result_size, object); - env->DeleteLocalRef(object); - - result_size++; - response = client->receive(0); - } - return result_size; -} - -static jobject Client_nativeClientExecute(JNIEnv *env, jclass clazz, jobject function) { - jobject result; - td::Client::execute({0, fetch_function(env, function)}).object->store(env, result); - return result; -} - -static void Client_destroyNativeClient(JNIEnv *env, jclass clazz, jlong client_id) { - delete get_client(client_id); -} - -static void Log_setVerbosityLevel(JNIEnv *env, jclass clazz, jint new_log_verbosity_level) { - td::Log::set_verbosity_level(static_cast(new_log_verbosity_level)); -} - -static jboolean Log_setFilePath(JNIEnv *env, jclass clazz, jstring file_path) { - return td::Log::set_file_path(td::jni::from_jstring(env, file_path)) ? JNI_TRUE : JNI_FALSE; -} - -static void Log_setMaxFileSize(JNIEnv *env, jclass clazz, jlong max_file_size) { - td::Log::set_max_file_size(max_file_size); -} - -static jstring Object_toString(JNIEnv *env, jobject object) { - return td::jni::to_jstring(env, to_string(td::td_api::Object::fetch(env, object))); -} - -static jstring Function_toString(JNIEnv *env, jobject object) { - return td::jni::to_jstring(env, to_string(td::td_api::Function::fetch(env, object))); -} - -static constexpr jint JAVA_VERSION = JNI_VERSION_1_6; -static JavaVM *java_vm; -static jclass log_class; - -static void on_fatal_error(const char *error_message) { - auto env = td::jni::get_jni_env(java_vm, JAVA_VERSION); - jmethodID on_fatal_error_method = env->GetStaticMethodID(log_class, "onFatalError", "(Ljava/lang/String;)V"); - if (env && on_fatal_error_method) { - jstring error_str = td::jni::to_jstring(env.get(), error_message); - env->CallStaticVoidMethod(log_class, on_fatal_error_method, error_str); - if (error_str) { - env->DeleteLocalRef(error_str); - } - } -} - -static jint register_native(JavaVM *vm) { - JNIEnv *env; - if (vm->GetEnv(reinterpret_cast(&env), JAVA_VERSION) != JNI_OK) { - return -1; - } - - java_vm = vm; - - auto register_method = [env](jclass clazz, std::string name, std::string signature, auto function_ptr) { - td::jni::register_native_method(env, clazz, std::move(name), std::move(signature), - reinterpret_cast(function_ptr)); - }; - - auto client_class = td::jni::get_jclass(env, PACKAGE_NAME "/Client"); - log_class = td::jni::get_jclass(env, PACKAGE_NAME "/Log"); - auto object_class = td::jni::get_jclass(env, PACKAGE_NAME "/TdApi$Object"); - auto function_class = td::jni::get_jclass(env, PACKAGE_NAME "/TdApi$Function"); - -#define TD_OBJECT "L" PACKAGE_NAME "/TdApi$Object;" -#define TD_FUNCTION "L" PACKAGE_NAME "/TdApi$Function;" - register_method(client_class, "createNativeClient", "()J", Client_createNativeClient); - register_method(client_class, "nativeClientSend", "(JJ" TD_FUNCTION ")V", Client_nativeClientSend); - register_method(client_class, "nativeClientReceive", "(J[J[" TD_OBJECT "D)I", Client_nativeClientReceive); - register_method(client_class, "nativeClientExecute", "(" TD_FUNCTION ")" TD_OBJECT, Client_nativeClientExecute); - register_method(client_class, "destroyNativeClient", "(J)V", Client_destroyNativeClient); - - register_method(log_class, "setVerbosityLevel", "(I)V", Log_setVerbosityLevel); - register_method(log_class, "setFilePath", "(Ljava/lang/String;)Z", Log_setFilePath); - register_method(log_class, "setMaxFileSize", "(J)V", Log_setMaxFileSize); - - register_method(object_class, "toString", "()Ljava/lang/String;", Object_toString); - - register_method(function_class, "toString", "()Ljava/lang/String;", Function_toString); -#undef TD_FUNCTION -#undef TD_OBJECT - - td::jni::init_vars(env, PACKAGE_NAME); - td::td_api::Object::init_jni_vars(env, PACKAGE_NAME); - td::td_api::Function::init_jni_vars(env, PACKAGE_NAME); - td::Log::set_fatal_error_callback(on_fatal_error); - - return JAVA_VERSION; -} - -} // namespace td_jni - -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { - static jint jni_version = td_jni::register_native(vm); // call_once - return jni_version; -} diff --git a/libs/tdlib/td/example/python/README.md b/libs/tdlib/td/example/python/README.md deleted file mode 100644 index c4a4ad3768..0000000000 --- a/libs/tdlib/td/example/python/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# TDLib Python example - -To run this example you need to [build](https://github.com/tdlib/td#building) TDLib and copy built tdjson shared library to this directory. - -Then you can run the example: -``` -python tdjson_example.py -``` - -Description of all available classes and methods can be found at [td_json_client](https://core.telegram.org/tdlib/docs/td__json__client_8h.html), -[td_log](https://core.telegram.org/tdlib/docs/td__log_8h.html) and [td_api](https://core.telegram.org/tdlib/docs/td__api_8h.html) documentation. diff --git a/libs/tdlib/td/example/python/tdjson_example.py b/libs/tdlib/td/example/python/tdjson_example.py deleted file mode 100644 index d7b2e86fbb..0000000000 --- a/libs/tdlib/td/example/python/tdjson_example.py +++ /dev/null @@ -1,106 +0,0 @@ -// -// 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) -// -from ctypes.util import find_library -from ctypes import * -import json -import sys - -# load shared library -tdjson_path = find_library("tdjson") or "tdjson.dll" -if tdjson_path is None: - print('can\'t find tdjson library') - quit() -tdjson = CDLL(tdjson_path) - -# load TDLib functions from shared library -td_json_client_create = tdjson.td_json_client_create -td_json_client_create.restype = c_void_p -td_json_client_create.argtypes = [] - -td_json_client_receive = tdjson.td_json_client_receive -td_json_client_receive.restype = c_char_p -td_json_client_receive.argtypes = [c_void_p, c_double] - -td_json_client_send = tdjson.td_json_client_send -td_json_client_send.restype = None -td_json_client_send.argtypes = [c_void_p, c_char_p] - -td_json_client_execute = tdjson.td_json_client_execute -td_json_client_execute.restype = c_char_p -td_json_client_execute.argtypes = [c_void_p, c_char_p] - -td_json_client_destroy = tdjson.td_json_client_destroy -td_json_client_destroy.restype = None -td_json_client_destroy.argtypes = [c_void_p] - -td_set_log_file_path = tdjson.td_set_log_file_path -td_set_log_file_path.restype = c_int -td_set_log_file_path.argtypes = [c_char_p] - -td_set_log_max_file_size = tdjson.td_set_log_max_file_size -td_set_log_max_file_size.restype = None -td_set_log_max_file_size.argtypes = [c_longlong] - -td_set_log_verbosity_level = tdjson.td_set_log_verbosity_level -td_set_log_verbosity_level.restype = None -td_set_log_verbosity_level.argtypes = [c_int] - -fatal_error_callback_type = CFUNCTYPE(None, c_char_p) - -td_set_log_fatal_error_callback = tdjson.td_set_log_fatal_error_callback -td_set_log_fatal_error_callback.restype = None -td_set_log_fatal_error_callback.argtypes = [fatal_error_callback_type] - -# initialize TDLib log with desired parameters -def on_fatal_error_callback(error_message): - print('TDLib fatal error: ', error_message) - -td_set_log_verbosity_level(2) -c_on_fatal_error_callback = fatal_error_callback_type(on_fatal_error_callback) -td_set_log_fatal_error_callback(c_on_fatal_error_callback) - -# create client -client = td_json_client_create() - -# simple wrappers for client usage -def td_send(query): - query = json.dumps(query).encode('utf-8') - td_json_client_send(client, query) - -def td_receive(): - result = td_json_client_receive(client, 1.0) - if result: - result = json.loads(result.decode('utf-8')) - return result - -def td_execute(query): - query = json.dumps(query).encode('utf-8') - result = td_json_client_execute(client, query) - if result: - result = json.loads(result.decode('utf-8')) - return result - -# testing TDLib execute method -print(td_execute({'@type': 'getTextEntities', 'text': '@telegram /test_command https://telegram.org telegram.me', '@extra': ['5', 7.0]})) - -# testing TDLib send method -td_send({'@type': 'getAuthorizationState', '@extra': 1.01234}) - -# main events cycle -while True: - event = td_receive() - if event: - # if client is closed, we need to destroy it and create new client - if event['@type'] is 'updateAuthorizationState' and event['authorization_state']['@type'] is 'authorizationStateClosed': - break - - # handle an incoming update or an answer to a previously sent request - print(event) - sys.stdout.flush() - -# destroy client when it is closed and isn't needed anymore -td_json_client_destroy(client) diff --git a/libs/tdlib/td/example/ruby/Gemfile b/libs/tdlib/td/example/ruby/Gemfile deleted file mode 100644 index 3a38ffc0a3..0000000000 --- a/libs/tdlib/td/example/ruby/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source 'https://rubygems.org' - -gem 'tdlib-ruby' diff --git a/libs/tdlib/td/example/ruby/Gemfile.lock b/libs/tdlib/td/example/ruby/Gemfile.lock deleted file mode 100644 index 22954eddfb..0000000000 --- a/libs/tdlib/td/example/ruby/Gemfile.lock +++ /dev/null @@ -1,17 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - concurrent-ruby (1.0.5) - dry-configurable (0.7.0) - concurrent-ruby (~> 1.0) - tdlib-ruby (0.2.0) - dry-configurable (~> 0.7) - -PLATFORMS - ruby - -DEPENDENCIES - tdlib-ruby - -BUNDLED WITH - 1.16.1 diff --git a/libs/tdlib/td/example/ruby/example.rb b/libs/tdlib/td/example/ruby/example.rb deleted file mode 100644 index 4b29dfd53a..0000000000 --- a/libs/tdlib/td/example/ruby/example.rb +++ /dev/null @@ -1,61 +0,0 @@ -require 'tdlib-ruby' - -TD.configure do |config| - config.lib_path = 'path/to/dir_containing_lobtdjson' - - # You should obtain your own api_id and api_hash from https://my.telegram.org/apps - config.client.api_id = 12345 - config.client.api_hash = '1234567890abcdefghigklmnopqrstuv' -end - -TD::Api.set_log_verbosity_level(1) - -client = TD::Client.new - -begin - state = nil - - client.on('updateAuthorizationState') do |update| - next unless update.dig('authorization_state', '@type') == 'authorizationStateWaitPhoneNumber' - state = :wait_phone - end - - client.on('updateAuthorizationState') do |update| - next unless update.dig('authorization_state', '@type') == 'authorizationStateWaitCode' - state = :wait_code - end - - client.on('updateAuthorizationState') do |update| - next unless update.dig('authorization_state', '@type') == 'authorizationStateReady' - state = :ready - end - - loop do - case state - when :wait_phone - p 'Please, enter your phone number:' - phone = STDIN.gets.strip - params = { - '@type' => 'setAuthenticationPhoneNumber', - 'phone_number' => phone - } - client.broadcast_and_receive(params) - when :wait_code - p 'Please, enter code from SMS:' - code = STDIN.gets.strip - params = { - '@type' => 'checkAuthenticationCode', - 'code' => code - } - client.broadcast_and_receive(params) - when :ready - @me = client.broadcast_and_receive('@type' => 'getMe') - break - end - end - -ensure - client.close -end - -p @me diff --git a/libs/tdlib/td/example/swift/.gitignore b/libs/tdlib/td/example/swift/.gitignore deleted file mode 100644 index 4737be5996..0000000000 --- a/libs/tdlib/td/example/swift/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -xcuserdata/ -*workspace/ -td/ diff --git a/libs/tdlib/td/example/swift/README.md b/libs/tdlib/td/example/swift/README.md deleted file mode 100644 index 6a333df766..0000000000 --- a/libs/tdlib/td/example/swift/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# TDLib swift MacOS example - -TDLib should be prebuilt and installed to local subdirectory `td/`: -``` -cd -mkdir build -cd build -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../example/swift/td .. -cmake --build . --target install -``` - -Then you can open and build the example with the latest Xcode. - -Description of all available classes and methods can be found at [td_json_client](https://core.telegram.org/tdlib/docs/td__json__client_8h.html), -[td_log](https://core.telegram.org/tdlib/docs/td__log_8h.html) and [td_api](https://core.telegram.org/tdlib/docs/td__api_8h.html) documentation. diff --git a/libs/tdlib/td/example/swift/src/main.swift b/libs/tdlib/td/example/swift/src/main.swift deleted file mode 100644 index ac81c632b8..0000000000 --- a/libs/tdlib/td/example/swift/src/main.swift +++ /dev/null @@ -1,178 +0,0 @@ -// -// 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) -// - -import Foundation - -// TDLib Client Swift binding -class TdClient { - typealias Client = UnsafeMutableRawPointer - var client = td_json_client_create()! - let tdlibMainLoop = DispatchQueue(label: "TDLib") - let tdlibQueryQueue = DispatchQueue(label: "TDLibQuery") - var queryF = Dictionary)->()>() - var updateF: ((Dictionary)->())? - var queryId: Int64 = 0 - - func queryAsync(query: [String: Any], f: ((Dictionary)->())? = nil) { - tdlibQueryQueue.async { - var newQuery = query - - if f != nil { - let nextQueryId = self.queryId + 1 - newQuery["@extra"] = nextQueryId - self.queryF[nextQueryId] = f - self.queryId = nextQueryId - } - td_json_client_send(self.client, to_json(newQuery)) - } - } - - func querySync(query: [String: Any]) -> Dictionary { - let semaphore = DispatchSemaphore(value:0) - var result = Dictionary() - queryAsync(query: query) { - result = $0 - semaphore.signal() - } - semaphore.wait() - return result - } - - init() { - } - - deinit { - td_json_client_destroy(client) - } - - func run(updateHandler: @escaping (Dictionary)->()) { - updateF = updateHandler - tdlibMainLoop.async { [weak self] in - while (true) { - if let s = self { - if let res = td_json_client_receive(s.client, 10) { - let event = String(cString: res) - s.queryResultAsync(event) - } - } else { - break - } - } - } - } - - private func queryResultAsync(_ result: String) { - tdlibQueryQueue.async { - let json = try? JSONSerialization.jsonObject(with: result.data(using: .utf8)!, options:[]) - if let dictionary = json as? [String:Any] { - if let extra = dictionary["@extra"] as? Int64 { - let index = self.queryF.index(forKey: extra)! - self.queryF[index].value(dictionary) - self.queryF.remove(at: index) - } else { - self.updateF!(dictionary) - } - } - } - } -} - -func to_json(_ obj: Any) -> String { - do { - let obj = try JSONSerialization.data(withJSONObject: obj) - return String(data: obj, encoding: .utf8)! - } catch { - return "" - } -} - - -// An example of usage -td_set_log_verbosity_level(1); - -var client = TdClient() - -func myReadLine() -> String { - while (true) { - if let line = readLine() { - return line - } - } -} - -func updateAuthorizationState(authorizationState: Dictionary) { - switch(authorizationState["@type"] as! String) { - case "authorizationStateWaitTdlibParameters": - client.queryAsync(query:[ - "@type":"setTdlibParameters", - "parameters":[ - "database_directory":"tdlib", - "use_message_database":true, - "use_secret_chats":true, - "api_id":94575, - "api_hash":"a3406de8d171bb422bb6ddf3bbd800e2", - "system_language_code":"en", - "device_model":"Desktop", - "system_version":"Unknown", - "application_version":"1.0", - "enable_storage_optimizer":true - ] - ]); - - case "authorizationStateWaitEncryptionKey": - client.queryAsync(query: ["@type":"checkDatabaseEncryptionKey", "key":"cucumber"]) - - case "authorizationStateWaitPhoneNumber": - print("Enter your phone: ") - let phone = myReadLine() - client.queryAsync(query:["@type":"setAuthenticationPhoneNumber", "phone_number":phone], f:checkAuthenticationError) - - case "authorizationStateWaitCode": - var first_name: String = "" - var last_name: String = "" - var code: String = "" - if let is_registered = authorizationState["is_registered"] as? Bool, is_registered { - } else { - print("Enter your first name: ") - first_name = myReadLine() - print("Enter your last name: ") - last_name = myReadLine() - } - print("Enter (SMS) code: ") - code = myReadLine() - client.queryAsync(query:["@type":"checkAuthenticationCode", "code":code, "first_name":first_name, "last_name":last_name], f:checkAuthenticationError) - - case "authorizationStateWaitPassword": - print("Enter password: ") - let password = myReadLine() - client.queryAsync(query:["@type":"checkAuthenticationPassword", "password":password], f:checkAuthenticationError) - - case "authorizationStateReady": - () - - default: - assert(false, "TODO: Unknown authorization state"); - } -} - -func checkAuthenticationError(error: Dictionary) { - if (error["@type"] as! String == "error") { - client.queryAsync(query:["@type":"getAuthorizationState"], f:updateAuthorizationState) - } -} - -client.run { - let update = $0 - print(update) - if update["@type"] as! String == "updateAuthorizationState" { - updateAuthorizationState(authorizationState: update["authorization_state"] as! Dictionary) - } -} - -while true { - sleep(1) -} diff --git a/libs/tdlib/td/example/swift/src/td-Bridging-Header.h b/libs/tdlib/td/example/swift/src/td-Bridging-Header.h deleted file mode 100644 index 434ab2e4a4..0000000000 --- a/libs/tdlib/td/example/swift/src/td-Bridging-Header.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// 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) -// -// -// 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) -// - -#include "td/telegram/td_json_client.h" -#include "td/telegram/td_log.h" diff --git a/libs/tdlib/td/example/swift/td.xcodeproj/project.pbxproj b/libs/tdlib/td/example/swift/td.xcodeproj/project.pbxproj deleted file mode 100644 index 7b774c421c..0000000000 --- a/libs/tdlib/td/example/swift/td.xcodeproj/project.pbxproj +++ /dev/null @@ -1,310 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F65E3A42031BF6A00F79763 /* libtdjson.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F65E3A32031BF6A00F79763 /* libtdjson.dylib */; }; - 1F65E3A92031C0F000F79763 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F65E3A82031C0F000F79763 /* main.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 1FCE2CEF1EC5E1B50061661A /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1F65E3A32031BF6A00F79763 /* libtdjson.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtdjson.dylib; path = td/lib/libtdjson.dylib; sourceTree = ""; }; - 1F65E3A82031C0F000F79763 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = src/main.swift; sourceTree = SOURCE_ROOT; }; - 1F65E3AA2031C14300F79763 /* td-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "td-Bridging-Header.h"; path = "src/td-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; - 1FCE2CF11EC5E1B50061661A /* td */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = td; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1FCE2CEE1EC5E1B50061661A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F65E3A42031BF6A00F79763 /* libtdjson.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1FCE2CE81EC5E1B50061661A = { - isa = PBXGroup; - children = ( - 1FCE2CF31EC5E1B50061661A /* src */, - 1FCE2CF21EC5E1B50061661A /* Products */, - 1FCE2CFB1EC5E1EE0061661A /* Frameworks */, - ); - sourceTree = ""; - }; - 1FCE2CF21EC5E1B50061661A /* Products */ = { - isa = PBXGroup; - children = ( - 1FCE2CF11EC5E1B50061661A /* td */, - ); - name = Products; - sourceTree = ""; - }; - 1FCE2CF31EC5E1B50061661A /* src */ = { - isa = PBXGroup; - children = ( - 1F65E3AA2031C14300F79763 /* td-Bridging-Header.h */, - 1F65E3A82031C0F000F79763 /* main.swift */, - ); - name = src; - path = td; - sourceTree = ""; - }; - 1FCE2CFB1EC5E1EE0061661A /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1F65E3A32031BF6A00F79763 /* libtdjson.dylib */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1FCE2CF01EC5E1B50061661A /* td */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1FCE2CF81EC5E1B50061661A /* Build configuration list for PBXNativeTarget "td" */; - buildPhases = ( - 1FCE2CED1EC5E1B50061661A /* Sources */, - 1FCE2CEE1EC5E1B50061661A /* Frameworks */, - 1FCE2CEF1EC5E1B50061661A /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = td; - productName = td; - productReference = 1FCE2CF11EC5E1B50061661A /* td */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1FCE2CE91EC5E1B50061661A /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Arseny Smirnov "; - TargetAttributes = { - 1FCE2CF01EC5E1B50061661A = { - CreatedOnToolsVersion = 8.3.2; - LastSwiftMigration = 0920; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 1FCE2CEC1EC5E1B50061661A /* Build configuration list for PBXProject "td" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 1FCE2CE81EC5E1B50061661A; - productRefGroup = 1FCE2CF21EC5E1B50061661A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1FCE2CF01EC5E1B50061661A /* td */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 1FCE2CED1EC5E1B50061661A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F65E3A92031C0F000F79763 /* main.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1FCE2CF61EC5E1B50061661A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - }; - name = Debug; - }; - 1FCE2CF71EC5E1B50061661A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - }; - name = Release; - }; - 1FCE2CF91EC5E1B50061661A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(PROJECT_DIR)/lib"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/td/lib", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "src/td-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - USER_HEADER_SEARCH_PATHS = td/include/; - }; - name = Debug; - }; - 1FCE2CFA1EC5E1B50061661A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(PROJECT_DIR)/lib"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/td/lib", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "src/td-Bridging-Header.h"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - USER_HEADER_SEARCH_PATHS = td/include/; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1FCE2CEC1EC5E1B50061661A /* Build configuration list for PBXProject "td" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1FCE2CF61EC5E1B50061661A /* Debug */, - 1FCE2CF71EC5E1B50061661A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1FCE2CF81EC5E1B50061661A /* Build configuration list for PBXNativeTarget "td" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1FCE2CF91EC5E1B50061661A /* Debug */, - 1FCE2CFA1EC5E1B50061661A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1FCE2CE91EC5E1B50061661A /* Project object */; -} diff --git a/libs/tdlib/td/example/uwp/LICENSE_1_0.txt b/libs/tdlib/td/example/uwp/LICENSE_1_0.txt deleted file mode 100644 index 36b7cd93cd..0000000000 --- a/libs/tdlib/td/example/uwp/LICENSE_1_0.txt +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index e7bb9b821b..0000000000 --- a/libs/tdlib/td/example/uwp/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# 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 deleted file mode 100644 index d6896fcb65..0000000000 --- a/libs/tdlib/td/example/uwp/SDKManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/libs/tdlib/td/example/uwp/[Content_Types].xml b/libs/tdlib/td/example/uwp/[Content_Types].xml deleted file mode 100644 index b91d46fa3c..0000000000 --- a/libs/tdlib/td/example/uwp/[Content_Types].xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/libs/tdlib/td/example/uwp/app/.gitignore b/libs/tdlib/td/example/uwp/app/.gitignore deleted file mode 100644 index 37ab08165b..0000000000 --- a/libs/tdlib/td/example/uwp/app/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.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 deleted file mode 100644 index b4256fd441..0000000000 --- a/libs/tdlib/td/example/uwp/app/App.xaml +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/libs/tdlib/td/example/uwp/app/App.xaml.cs b/libs/tdlib/td/example/uwp/app/App.xaml.cs deleted file mode 100644 index 0ed0f96812..0000000000 --- a/libs/tdlib/td/example/uwp/app/App.xaml.cs +++ /dev/null @@ -1,104 +0,0 @@ -// -// 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 -{ - /// - /// Provides application-specific behavior to supplement the default Application class. - /// - sealed partial class App : Application - { - /// - /// 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(). - /// - public App() - { - Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync( - Microsoft.ApplicationInsights.WindowsCollectors.Metadata | - Microsoft.ApplicationInsights.WindowsCollectors.Session); - this.InitializeComponent(); - this.Suspending += OnSuspending; - } - - /// - /// 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. - /// - /// Details about the launch request and process. - 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(); - } - - /// - /// Invoked when Navigation to a certain page fails - /// - /// The Frame which failed navigation - /// Details about the navigation failure - void OnNavigationFailed(object sender, NavigationFailedEventArgs e) - { - throw new Exception("Failed to load Page " + e.SourcePageType.FullName); - } - - /// - /// 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. - /// - /// The source of the suspend request. - /// Details about the suspend request. - 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 deleted file mode 100644 index cb2a232da3..0000000000 --- a/libs/tdlib/td/example/uwp/app/ApplicationInsights.config +++ /dev/null @@ -1,3 +0,0 @@ - - - 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 deleted file mode 100644 index 735f57adb5..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/LockScreenLogo.scale-200.png and /dev/null differ 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 deleted file mode 100644 index 023e7f1fed..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/SplashScreen.scale-200.png and /dev/null differ 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 deleted file mode 100644 index af49fec1a5..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/Square150x150Logo.scale-200.png and /dev/null differ 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 deleted file mode 100644 index ce342a2ec8..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.scale-200.png and /dev/null differ 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 deleted file mode 100644 index f6c02ce97e..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/Square44x44Logo.targetsize-24_altform-unplated.png and /dev/null differ diff --git a/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png b/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png deleted file mode 100644 index 7385b56c0e..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/StoreLogo.png and /dev/null differ 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 deleted file mode 100644 index 288995b397..0000000000 Binary files a/libs/tdlib/td/example/uwp/app/Assets/Wide310x150Logo.scale-200.png and /dev/null differ diff --git a/libs/tdlib/td/example/uwp/app/MainPage.xaml b/libs/tdlib/td/example/uwp/app/MainPage.xaml deleted file mode 100644 index cdff97d9f3..0000000000 --- a/libs/tdlib/td/example/uwp/app/MainPage.xaml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - -