ConnectionsManager.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * This is the source code of tgnet library v. 1.1
  3. * It is licensed under GNU GPL v. 2 or later.
  4. * You should have received a copy of the license in this archive (see LICENSE).
  5. *
  6. * Copyright Nikolai Kudashov, 2015-2018.
  7. */
  8. #ifndef CONNECTIONSMANAGER_H
  9. #define CONNECTIONSMANAGER_H
  10. #include <pthread.h>
  11. #include <queue>
  12. #include <functional>
  13. #include <sys/epoll.h>
  14. #include <map>
  15. #include <atomic>
  16. #include "Defines.h"
  17. #ifdef ANDROID
  18. #include <jni.h>
  19. #endif
  20. class NativeByteBuffer;
  21. class Connection;
  22. class Datacenter;
  23. class Request;
  24. class DatacenterHandshake;
  25. class TLObject;
  26. class ConnectionSocket;
  27. class TL_auth_exportedAuthorization;
  28. class ByteArray;
  29. class TL_config;
  30. class EventObject;
  31. class Config;
  32. class ProxyCheckInfo;
  33. class ConnectionsManager {
  34. public:
  35. ConnectionsManager(int32_t instance);
  36. ~ConnectionsManager();
  37. static ConnectionsManager &getInstance(int32_t instanceNum);
  38. int64_t getCurrentTimeMillis();
  39. int64_t getCurrentTimeMonotonicMillis();
  40. int32_t getCurrentTime();
  41. uint32_t getCurrentDatacenterId();
  42. bool isTestBackend();
  43. int32_t getTimeDifference();
  44. int32_t sendRequest(TLObject *object, onCompleteFunc onComplete, onQuickAckFunc onQuickAck, uint32_t flags, uint32_t datacenterId, ConnectionType connetionType, bool immediate);
  45. int32_t sendRequest(TLObject *object, onCompleteFunc onComplete, onQuickAckFunc onQuickAck, uint32_t flags, uint32_t datacenterId, ConnectionType connetionType, bool immediate, int32_t requestToken);
  46. void cancelRequest(int32_t token, bool notifyServer);
  47. void cleanUp(bool resetKeys, int32_t datacenterId);
  48. void cancelRequestsForGuid(int32_t guid);
  49. void bindRequestToGuid(int32_t requestToken, int32_t guid);
  50. void applyDatacenterAddress(uint32_t datacenterId, std::string ipAddress, uint32_t port);
  51. void setDelegate(ConnectiosManagerDelegate *connectiosManagerDelegate);
  52. ConnectionState getConnectionState();
  53. void setUserId(int64_t userId);
  54. void switchBackend(bool restart);
  55. void resumeNetwork(bool partial);
  56. void pauseNetwork();
  57. void setNetworkAvailable(bool value, int32_t type, bool slow);
  58. void setIpStrategy(uint8_t value);
  59. void init(uint32_t version, int32_t layer, int32_t apiId, std::string deviceModel, std::string systemVersion, std::string appVersion, std::string langCode, std::string systemLangCode, std::string configPath, std::string logPath, std::string regId, std::string cFingerprint, std::string installerId, std::string packageId, int32_t timezoneOffset, int64_t userId, bool isPaused, bool enablePushConnection, bool hasNetwork, int32_t networkType);
  60. void setProxySettings(std::string address, uint16_t port, std::string username, std::string password, std::string secret);
  61. void setLangCode(std::string langCode);
  62. void setRegId(std::string regId);
  63. void setSystemLangCode(std::string langCode);
  64. void updateDcSettings(uint32_t datacenterId, bool workaround);
  65. void setPushConnectionEnabled(bool value);
  66. void applyDnsConfig(NativeByteBuffer *buffer, std::string phone, int32_t date);
  67. int64_t checkProxy(std::string address, uint16_t port, std::string username, std::string password, std::string secret, onRequestTimeFunc requestTimeFunc, jobject ptr1);
  68. #ifdef ANDROID
  69. void sendRequest(TLObject *object, onCompleteFunc onComplete, onQuickAckFunc onQuickAck, onWriteToSocketFunc onWriteToSocket, uint32_t flags, uint32_t datacenterId, ConnectionType connetionType, bool immediate, int32_t requestToken, jobject ptr1, jobject ptr2, jobject ptr3);
  70. static void useJavaVM(JavaVM *vm, bool useJavaByteBuffers);
  71. #endif
  72. private:
  73. static void *ThreadProc(void *data);
  74. void initDatacenters();
  75. void loadConfig();
  76. void saveConfig();
  77. void saveConfigInternal(NativeByteBuffer *buffer);
  78. void select();
  79. void wakeup();
  80. void processServerResponse(TLObject *message, int64_t messageId, int32_t messageSeqNo, int64_t messageSalt, Connection *connection, int64_t innerMsgId, int64_t containerMessageId);
  81. void sendPing(Datacenter *datacenter, bool usePushConnection);
  82. void sendMessagesToConnection(std::vector<std::unique_ptr<NetworkMessage>> &messages, Connection *connection, bool reportAck);
  83. void sendMessagesToConnectionWithConfirmation(std::vector<std::unique_ptr<NetworkMessage>> &messages, Connection *connection, bool reportAck);
  84. void requestSaltsForDatacenter(Datacenter *datacenter, bool media, bool useTempConnection);
  85. void clearRequestsForDatacenter(Datacenter *datacenter, HandshakeType type);
  86. void registerForInternalPushUpdates();
  87. void processRequestQueue(uint32_t connectionType, uint32_t datacenterId);
  88. void moveToDatacenter(uint32_t datacenterId);
  89. void authorizeOnMovingDatacenter();
  90. void authorizedOnMovingDatacenter();
  91. Datacenter *getDatacenterWithId(uint32_t datacenterId);
  92. std::unique_ptr<TLObject> wrapInLayer(TLObject *object, Datacenter *datacenter, Request *baseRequest);
  93. void removeRequestFromGuid(int32_t requestToken);
  94. bool cancelRequestInternal(int32_t token, int64_t messageId, bool notifyServer, bool removeFromClass);
  95. int callEvents(int64_t now);
  96. int32_t sendRequestInternal(TLObject *object, onCompleteFunc onComplete, onQuickAckFunc onQuickAck, uint32_t flags, uint32_t datacenterId, ConnectionType connetionType, bool immediate);
  97. void checkPendingTasks();
  98. void scheduleTask(std::function<void()> task);
  99. void scheduleEvent(EventObject *eventObject, uint32_t time);
  100. void removeEvent(EventObject *eventObject);
  101. void onConnectionClosed(Connection *connection, int reason);
  102. void onConnectionConnected(Connection *connection);
  103. void onConnectionQuickAckReceived(Connection *connection, int32_t ack);
  104. void onConnectionDataReceived(Connection *connection, NativeByteBuffer *data, uint32_t length);
  105. bool hasPendingRequestsForConnection(Connection *connection);
  106. void attachConnection(ConnectionSocket *connection);
  107. void detachConnection(ConnectionSocket *connection);
  108. TLObject *TLdeserialize(TLObject *request, uint32_t bytes, NativeByteBuffer *data);
  109. TLObject *getRequestWithMessageId(int64_t messageId);
  110. void onDatacenterHandshakeComplete(Datacenter *datacenter, HandshakeType type, int32_t timeDiff);
  111. void onDatacenterExportAuthorizationComplete(Datacenter *datacenter);
  112. int64_t generateMessageId();
  113. uint8_t getIpStratagy();
  114. bool isNetworkAvailable();
  115. void scheduleCheckProxyInternal(ProxyCheckInfo *proxyCheckInfo);
  116. void checkProxyInternal(ProxyCheckInfo *proxyCheckInfo);
  117. int32_t instanceNum = 0;
  118. uint32_t configVersion = 5;
  119. Config *config = nullptr;
  120. std::list<EventObject *> events;
  121. std::map<uint32_t, Datacenter *> datacenters;
  122. std::map<int32_t, std::vector<std::int32_t>> quickAckIdToRequestIds;
  123. int32_t pingTime;
  124. bool testBackend = false;
  125. bool clientBlocked = true;
  126. std::string lastInitSystemLangcode = "";
  127. std::atomic<uint32_t> lastRequestToken{50000000};
  128. uint32_t currentDatacenterId = 0;
  129. uint32_t movingToDatacenterId = DEFAULT_DATACENTER_ID;
  130. int64_t pushSessionId = 0;
  131. int32_t currentPingTime = 0;
  132. bool registeringForPush = false;
  133. int64_t lastPushPingTime = 0;
  134. int32_t nextPingTimeOffset = 60000 * 3;
  135. bool sendingPushPing = false;
  136. bool sendingPing = false;
  137. bool updatingDcSettings = false;
  138. bool updatingDcSettingsWorkaround = false;
  139. int32_t disconnectTimeoutAmount = 0;
  140. bool requestingSecondAddressByTlsHashMismatch = false;
  141. int32_t requestingSecondAddress = 0;
  142. int32_t updatingDcStartTime = 0;
  143. int32_t lastDcUpdateTime = 0;
  144. int64_t lastPingTime = getCurrentTimeMonotonicMillis();
  145. bool networkPaused = false;
  146. int32_t nextSleepTimeout = CONNECTION_BACKGROUND_KEEP_TIME;
  147. int64_t lastPauseTime = 0;
  148. int64_t lastMonotonicPauseTime = 0;
  149. int32_t lastSystemPauseTime = 0;
  150. ConnectionState connectionState = ConnectionStateConnecting;
  151. std::unique_ptr<ByteArray> movingAuthorization;
  152. std::vector<int64_t> sessionsToDestroy;
  153. int32_t lastDestroySessionRequestTime;
  154. std::map<int32_t, std::vector<int32_t>> requestsByGuids;
  155. std::map<int32_t, int32_t> guidsByRequests;
  156. std::map<int64_t, int64_t> resendRequests;
  157. Datacenter *deserializingDatacenter;
  158. std::string proxyUser = "";
  159. std::string proxyPassword = "";
  160. std::string proxyAddress = "";
  161. std::string proxySecret = "";
  162. uint16_t proxyPort = 1080;
  163. int32_t lastPingProxyId = 2000000;
  164. std::vector<std::unique_ptr<ProxyCheckInfo>> proxyCheckQueue;
  165. std::vector<std::unique_ptr<ProxyCheckInfo>> proxyActiveChecks;
  166. pthread_t networkThread;
  167. pthread_mutex_t mutex;
  168. std::queue<std::function<void()>> pendingTasks;
  169. struct epoll_event *epollEvents;
  170. timespec timeSpec;
  171. timespec timeSpecMonotonic;
  172. int32_t timeDifference = 0;
  173. int64_t lastOutgoingMessageId = 0;
  174. bool networkAvailable = true;
  175. bool networkSlow = false;
  176. uint8_t ipStrategy = USE_IPV4_ONLY;
  177. bool lastProtocolIsIpv6 = false;
  178. bool lastProtocolUsefullData = false;
  179. std::vector<ConnectionSocket *> activeConnections;
  180. std::vector<ConnectionSocket *> activeConnectionsCopy;
  181. int epolFd;
  182. int eventFd;
  183. int *pipeFd = nullptr;
  184. NativeByteBuffer *networkBuffer;
  185. requestsList requestsQueue;
  186. requestsList runningRequests;
  187. std::vector<uint32_t> requestingSaltsForDc;
  188. int32_t lastPingId = 0;
  189. int64_t lastInvokeAfterMessageId = 0;
  190. int32_t currentNetworkType = NETWORK_TYPE_WIFI;
  191. uint32_t currentVersion = 1;
  192. int32_t currentLayer = 34;
  193. int32_t currentApiId = 6;
  194. std::string currentDeviceModel;
  195. std::string currentSystemVersion;
  196. std::string currentAppVersion;
  197. std::string currentLangCode;
  198. std::string currentRegId;
  199. std::string certFingerprint;
  200. std::string installer;
  201. std::string package;
  202. int32_t currentDeviceTimezone = 0;
  203. std::string currentSystemLangCode;
  204. std::string currentConfigPath;
  205. std::string currentLogPath;
  206. int64_t currentUserId = 0;
  207. bool registeredForInternalPush = false;
  208. bool pushConnectionEnabled = true;
  209. std::map<uint32_t, std::vector<std::unique_ptr<NetworkMessage>>> genericMessagesToDatacenters;
  210. std::map<uint32_t, std::vector<std::unique_ptr<NetworkMessage>>> genericMediaMessagesToDatacenters;
  211. std::map<uint32_t, std::vector<std::unique_ptr<NetworkMessage>>> tempMessagesToDatacenters;
  212. std::vector<uint32_t> unknownDatacenterIds;
  213. std::vector<std::pair<Datacenter *, ConnectionType>> neededDatacenters;
  214. std::map<uint32_t, uint32_t> downloadRunningRequestCount;
  215. std::vector<Datacenter *> unauthorizedDatacenters;
  216. NativeByteBuffer *sizeCalculator;
  217. ConnectiosManagerDelegate *delegate;
  218. friend class ConnectionSocket;
  219. friend class ConnectionSession;
  220. friend class Connection;
  221. friend class Timer;
  222. friend class Datacenter;
  223. friend class TL_message;
  224. friend class TL_rpc_result;
  225. friend class Config;
  226. friend class FileLog;
  227. friend class Handshake;
  228. };
  229. #ifdef ANDROID
  230. extern JavaVM *javaVm;
  231. extern JNIEnv *jniEnv[MAX_ACCOUNT_COUNT];
  232. extern jclass jclass_ByteBuffer;
  233. extern jmethodID jclass_ByteBuffer_allocateDirect;
  234. #endif
  235. #endif