2018-12-31 20:04:05 +01:00
|
|
|
//
|
2020-01-01 02:23:48 +01:00
|
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2020
|
2018-12-31 20:04:05 +01:00
|
|
|
//
|
|
|
|
// 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)
|
|
|
|
//
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
* C interface for interaction with TDLib via JSON-serialized objects.
|
|
|
|
* Can be used to easily integrate TDLib with any programming language which supports calling C functions
|
|
|
|
* and is able to work with JSON.
|
|
|
|
*
|
|
|
|
* The JSON serialization of TDLib API objects is straightforward: all API objects are represented as JSON objects with
|
2019-04-30 00:07:04 +02:00
|
|
|
* the same keys as the API object field names. The object type name is stored in the special field '@type' which is
|
|
|
|
* optional in places where type is uniquely determined by the context.
|
2020-01-31 01:47:28 +01:00
|
|
|
* Fields of Bool type are stored as Boolean, fields of int32, int53, and double types are stored as Number, fields of
|
2019-04-30 00:07:04 +02:00
|
|
|
* int64 and string types are stored as String, fields of bytes type are base64 encoded and then stored as String,
|
|
|
|
* fields of vector type are stored as Array.
|
2018-12-31 20:04:05 +01:00
|
|
|
* The main TDLib interface is asynchronous. To match requests with a corresponding response a field "@extra" can
|
2018-03-04 01:26:29 +01:00
|
|
|
* be added to the request object. The corresponding response will have an "@extra" field with exactly the same value.
|
2018-12-31 20:04:05 +01:00
|
|
|
*
|
2020-10-05 15:08:07 +02:00
|
|
|
* A TDLib client instance can be created through td_json_client_create.
|
2018-12-31 20:04:05 +01:00
|
|
|
* Requests then can be sent using td_json_client_send from any thread.
|
|
|
|
* New updates and request responses can be received through td_json_client_receive from any thread. This function
|
2020-10-05 15:08:07 +02:00
|
|
|
* must not be called simultaneously from two different threads. Also note that all updates and request responses
|
|
|
|
* must be applied in the order they were received to ensure consistency.
|
2018-12-31 20:04:05 +01:00
|
|
|
* 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 td_json_client_execute.
|
|
|
|
* The TDLib client instance can be destroyed via td_json_client_destroy.
|
|
|
|
*
|
|
|
|
* General pattern of usage:
|
|
|
|
* \code
|
|
|
|
* 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
|
|
|
|
* int is_closed = 0; // should be set to 1, when updateAuthorizationState with authorizationStateClosed is received
|
|
|
|
* while (!is_closed) {
|
|
|
|
* const char *result = td_json_client_receive(client, WAIT_TIMEOUT);
|
|
|
|
* if (result) {
|
|
|
|
* // parse the result as JSON object and process it as an incoming update or an answer to a previously sent request
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* td_json_client_destroy(client);
|
|
|
|
* \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "td/telegram/tdjson_export.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a new instance of TDLib.
|
|
|
|
* \return Pointer to the created instance of TDLib.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT void *td_json_client_create();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends request to the TDLib client. May be called from any thread.
|
|
|
|
* \param[in] client The client.
|
|
|
|
* \param[in] request JSON-serialized null-terminated request to TDLib.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT void td_json_client_send(void *client, const char *request);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Receives incoming updates and request responses from the TDLib client. May be called from any thread, but
|
2020-10-05 15:08:07 +02:00
|
|
|
* must not be called simultaneously from two different threads.
|
2018-02-21 01:53:29 +01:00
|
|
|
* Returned pointer will be deallocated by TDLib during next call to td_json_client_receive or td_json_client_execute
|
|
|
|
* in the same thread, so it can't be used after that.
|
2018-12-31 20:04:05 +01:00
|
|
|
* \param[in] client The client.
|
2020-01-06 19:44:09 +01:00
|
|
|
* \param[in] timeout The maximum number of seconds allowed for this function to wait for new data.
|
2018-12-31 20:04:05 +01:00
|
|
|
* \return JSON-serialized null-terminated incoming update or request response. May be NULL if the timeout expires.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT const char *td_json_client_receive(void *client, double timeout);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Synchronously executes TDLib request. May be called from any thread.
|
|
|
|
* Only a few requests can be executed synchronously.
|
2018-02-21 01:53:29 +01:00
|
|
|
* Returned pointer will be deallocated by TDLib during next call to td_json_client_receive or td_json_client_execute
|
|
|
|
* in the same thread, so it can't be used after that.
|
2018-10-31 15:51:07 +01:00
|
|
|
* \param[in] client The client. Currently ignored for all requests, so NULL can be passed.
|
2018-12-31 20:04:05 +01:00
|
|
|
* \param[in] request JSON-serialized null-terminated request to TDLib.
|
2020-10-05 14:48:37 +02:00
|
|
|
* \return JSON-serialized null-terminated request response.
|
2018-12-31 20:04:05 +01:00
|
|
|
*/
|
|
|
|
TDJSON_EXPORT const char *td_json_client_execute(void *client, const char *request);
|
|
|
|
|
|
|
|
/**
|
2020-10-05 15:08:07 +02:00
|
|
|
* Destroys the TDLib client instance. After this is called the client instance must not be used anymore.
|
2018-12-31 20:04:05 +01:00
|
|
|
* \param[in] client The client.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT void td_json_client_destroy(void *client);
|
|
|
|
|
2020-10-05 15:08:07 +02:00
|
|
|
/*
|
|
|
|
* New TDLib JSON interface.
|
|
|
|
*
|
|
|
|
* The main TDLib interface is asynchronous. To match requests with a corresponding response a field "@extra" can
|
|
|
|
* be added to the request object. The corresponding response will have an "@extra" field with exactly the same value.
|
|
|
|
* Each returned object will have an "@client_id" field, containing and identifier of the client for which
|
|
|
|
* a response or an update is received.
|
|
|
|
*
|
|
|
|
* A TDLib client instance can be created through td_create_client.
|
|
|
|
* Requests then can be sent using td_send from any thread and the received client identifier.
|
|
|
|
* New updates and request responses can be received through td_receive from any thread. This function
|
|
|
|
* must not be called simultaneously from two different threads. Also note that all updates and request responses
|
|
|
|
* must be applied in the order they were received to ensure consistency.
|
|
|
|
* Some TDLib requests can be executed synchronously from any thread by using td_execute.
|
|
|
|
* The TDLib client instances are destroyed automatically after they are closed.
|
|
|
|
*
|
|
|
|
* General pattern of usage:
|
|
|
|
* \code
|
|
|
|
* int client_id = td_create_client();
|
|
|
|
* // share the client_id with other threads, which will be able to send requests via td_send
|
|
|
|
*
|
|
|
|
* const double WAIT_TIMEOUT = 10.0; // seconds
|
|
|
|
* while (true) {
|
|
|
|
* const char *result = td_receive(WAIT_TIMEOUT);
|
|
|
|
* if (result) {
|
|
|
|
* // parse the result as JSON object and process it as an incoming update or an answer to a previously sent request
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a new instance of TDLib.
|
|
|
|
* \return Opaque indentifier of the created TDLib client.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT int td_create_client();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends request to the TDLib client. May be called from any thread.
|
|
|
|
* \param[in] client_id The TDLib client identifier.
|
|
|
|
* \param[in] request JSON-serialized null-terminated request to TDLib.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT void td_send(int client_id, const char *request);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Receives incoming updates and request responses. Must not be called simultaneously from two different threads.
|
|
|
|
* Returned pointer will be deallocated by TDLib during next call to td_receive or td_execute
|
|
|
|
* in the same thread, so it can't be used after that.
|
|
|
|
* \param[in] timeout The maximum number of seconds allowed for this function to wait for new data.
|
|
|
|
* \return JSON-serialized null-terminated incoming update or request response. May be NULL if the timeout expires.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT const char *td_receive(double timeout);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Synchronously executes TDLib request. May be called from any thread.
|
|
|
|
* Only a few requests can be executed synchronously.
|
|
|
|
* Returned pointer will be deallocated by TDLib during next call to td_receive or td_execute
|
|
|
|
* in the same thread, so it can't be used after that.
|
|
|
|
* \param[in] request JSON-serialized null-terminated request to TDLib.
|
|
|
|
* \return JSON-serialized null-terminated request response.
|
|
|
|
*/
|
|
|
|
TDJSON_EXPORT const char *td_execute(const char *request);
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
} // extern "C"
|
|
|
|
#endif
|