summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/Client.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/Client.h')
-rw-r--r--protocols/Telegram/tdlib/td/td/telegram/Client.h171
1 files changed, 163 insertions, 8 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/Client.h b/protocols/Telegram/tdlib/td/td/telegram/Client.h
index ccd891b009..01dc8ac020 100644
--- a/protocols/Telegram/tdlib/td/td/telegram/Client.h
+++ b/protocols/Telegram/tdlib/td/td/telegram/Client.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// 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)
@@ -17,15 +17,170 @@
namespace td {
/**
- * Native C++ interface for interaction with TDLib.
+ * The native C++ interface for interaction with TDLib.
+ *
+ * A TDLib client instance can be created through the method ClientManager::create_client_id.
+ * Requests can be sent using the method ClientManager::send from any thread.
+ * New updates and responses to requests can be received using the method ClientManager::receive from any thread after
+ * the first request has been sent to the client instance. ClientManager::receive must not be called simultaneously from
+ * two different threads. Also note that all updates and responses to requests should be applied in the same order as
+ * they were received, to ensure consistency.
+ * Some TDLib requests can be executed synchronously from any thread using the method ClientManager::execute.
+ *
+ * General pattern of usage:
+ * \code
+ * td::ClientManager manager;
+ * auto client_id = manager.create_client_id();
+ * // somehow share the manager and the client_id with other threads,
+ * // which will be able to send requests via manager.send(client_id, ...)
+ *
+ * // send some dummy requests to the new instance to activate it
+ * manager.send(client_id, ...);
+ *
+ * const double WAIT_TIMEOUT = 10.0; // seconds
+ * while (true) {
+ * auto response = manager.receive(WAIT_TIMEOUT);
+ * if (response.object == nullptr) {
+ * continue;
+ * }
+ *
+ * if (response.request_id == 0) {
+ * // process response.object as an incoming update of the type td_api::Update for the client response.client_id
+ * } else {
+ * // process response.object as an answer to a request response.request_id for the client response.client_id
+ * }
+ * }
+ * \endcode
+ */
+class ClientManager final {
+ public:
+ /**
+ * Creates a new TDLib client manager.
+ */
+ ClientManager();
+
+ /**
+ * Opaque TDLib client instance identifier.
+ */
+ using ClientId = std::int32_t;
+
+ /**
+ * Request identifier.
+ * Responses to TDLib requests will have the same request id as the corresponding request.
+ * Updates from TDLib will have the request_id == 0, incoming requests are thus not allowed to have request_id == 0.
+ */
+ using RequestId = std::uint64_t;
+
+ /**
+ * Returns an opaque identifier of a new TDLib instance.
+ * The TDLib instance will not send updates until the first request is sent to it.
+ * \return Opaque identifier of a new TDLib instance.
+ */
+ ClientId create_client_id();
+
+ /**
+ * Sends request to TDLib. May be called from any thread.
+ * \param[in] client_id TDLib client instance identifier.
+ * \param[in] request_id Request identifier. Must be non-zero.
+ * \param[in] request Request to TDLib.
+ */
+ void send(ClientId client_id, RequestId request_id, td_api::object_ptr<td_api::Function> &&request);
+
+ /**
+ * A response to a request, or an incoming update from TDLib.
+ */
+ struct Response {
+ /**
+ * TDLib client instance identifier, for which the response was received.
+ */
+ ClientId client_id;
+
+ /**
+ * Request identifier to which the response corresponds, or 0 for incoming updates from TDLib.
+ */
+ RequestId request_id;
+
+ /**
+ * TDLib API object representing a response to a TDLib request or an incoming update.
+ */
+ td_api::object_ptr<td_api::Object> object;
+ };
+
+ /**
+ * Receives incoming updates and responses to requests from TDLib. May be called from any thread, but must not be
+ * called simultaneously from two different threads.
+ * \param[in] timeout The maximum number of seconds allowed for this function to wait for new data.
+ * \return An incoming update or response to a request. The object returned in the response may be a nullptr
+ * if the timeout expires.
+ */
+ Response receive(double timeout);
+
+ /**
+ * Synchronously executes a TDLib request.
+ * A request can be executed synchronously, only if it is documented with "Can be called synchronously".
+ * \param[in] request Request to the TDLib.
+ * \return The request response.
+ */
+ static td_api::object_ptr<td_api::Object> execute(td_api::object_ptr<td_api::Function> &&request);
+
+ /**
+ * A type of callback function that will be called when a message is added to the internal TDLib log.
+ *
+ * \param verbosity_level Log verbosity level with which the message was added from -1 up to 1024.
+ * If 0, then TDLib will crash as soon as the callback returns.
+ * None of the TDLib methods can be called from the callback.
+ * \param message Null-terminated UTF-8-encoded string with the message added to the log.
+ */
+ using LogMessageCallbackPtr = void (*)(int verbosity_level, const char *message);
+
+ /**
+ * Sets the callback that will be called when a message is added to the internal TDLib log.
+ * None of the TDLib methods can be called from the callback.
+ * By default the callback is not set.
+ *
+ * \param[in] max_verbosity_level The maximum verbosity level of messages for which the callback will be called.
+ * \param[in] callback Callback that will be called when a message is added to the internal TDLib log.
+ * Pass nullptr to remove the callback.
+ */
+ static void set_log_message_callback(int max_verbosity_level, LogMessageCallbackPtr callback);
+
+ /**
+ * Destroys the client manager and all TDLib client instances managed by it.
+ */
+ ~ClientManager();
+
+ /**
+ * Move constructor.
+ */
+ ClientManager(ClientManager &&other) noexcept;
+
+ /**
+ * Move assignment operator.
+ */
+ ClientManager &operator=(ClientManager &&other) noexcept;
+
+ /**
+ * Returns a pointer to a singleton ClientManager instance.
+ * \return A unique singleton ClientManager instance.
+ */
+ static ClientManager *get_manager_singleton();
+
+ private:
+ friend class Client;
+ class Impl;
+ std::unique_ptr<Impl> impl_;
+};
+
+/**
+ * Old native C++ interface for interaction with TDLib to be removed in TDLib 2.0.0.
*
* The TDLib instance is created for the lifetime of the Client object.
* Requests to TDLib can be sent using the Client::send method from any thread.
* New updates and responses to requests can be received using the Client::receive method from any thread,
- * this function shouldn't be called simultaneously from two different threads. Also note that all updates and
+ * this function must not be called simultaneously from two different threads. Also note that all updates and
* responses to requests should be applied in the same order as they were received, to ensure consistency.
* Given this information, it's advisable to call this function from a dedicated thread.
- * Some service TDLib requests can be executed synchronously from any thread by using the Client::execute method.
+ * Some service TDLib requests can be executed synchronously from any thread using the Client::execute method.
*
* General pattern of usage:
* \code
@@ -84,7 +239,7 @@ class Client final {
*/
struct Response {
/**
- * TDLib request identifier, which corresponds to the response or 0 for incoming updates from TDLib.
+ * TDLib request identifier, which corresponds to the response, or 0 for incoming updates from TDLib.
*/
std::uint64_t id;
@@ -97,7 +252,7 @@ class Client final {
/**
* Receives incoming updates and request responses from TDLib. May be called from any thread, but shouldn't be
* called simultaneously from two different threads.
- * \param[in] timeout Maximum number of seconds allowed for this function to wait for new data.
+ * \param[in] timeout The maximum number of seconds allowed for this function to wait for new data.
* \return An incoming update or request response. The object returned in the response may be a nullptr
* if the timeout expires.
*/
@@ -119,12 +274,12 @@ class Client final {
/**
* Move constructor.
*/
- Client(Client &&other);
+ Client(Client &&other) noexcept;
/**
* Move assignment operator.
*/
- Client &operator=(Client &&other);
+ Client &operator=(Client &&other) noexcept;
private:
class Impl;