Request.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. #include <algorithm>
  9. #include "Request.h"
  10. #include "TLObject.h"
  11. #include "MTProtoScheme.h"
  12. #include "ConnectionsManager.h"
  13. #include "Datacenter.h"
  14. #include "Connection.h"
  15. Request::Request(int32_t instance, int32_t token, ConnectionType type, uint32_t flags, uint32_t datacenter, onCompleteFunc completeFunc, onQuickAckFunc quickAckFunc, onWriteToSocketFunc writeToSocketFunc) {
  16. requestToken = token;
  17. connectionType = type;
  18. requestFlags = flags;
  19. datacenterId = datacenter;
  20. onCompleteRequestCallback = completeFunc;
  21. onQuickAckCallback = quickAckFunc;
  22. onWriteToSocketCallback = writeToSocketFunc;
  23. dataType = (uint8_t) (requestFlags >> 24);
  24. instanceNum = instance;
  25. }
  26. Request::~Request() {
  27. #ifdef ANDROID
  28. if (ptr1 != nullptr) {
  29. jniEnv[instanceNum]->DeleteGlobalRef(ptr1);
  30. ptr1 = nullptr;
  31. }
  32. if (ptr2 != nullptr) {
  33. jniEnv[instanceNum]->DeleteGlobalRef(ptr2);
  34. ptr2 = nullptr;
  35. }
  36. if (ptr3 != nullptr) {
  37. jniEnv[instanceNum]->DeleteGlobalRef(ptr3);
  38. ptr3 = nullptr;
  39. }
  40. #endif
  41. }
  42. void Request::addRespondMessageId(int64_t id) {
  43. respondsToMessageIds.push_back(messageId);
  44. }
  45. bool Request::respondsToMessageId(int64_t id) {
  46. return messageId == id || std::find(respondsToMessageIds.begin(), respondsToMessageIds.end(), id) != respondsToMessageIds.end();
  47. }
  48. void Request::clear(bool time) {
  49. messageId = 0;
  50. messageSeqNo = 0;
  51. connectionToken = 0;
  52. if (time) {
  53. startTime = 0;
  54. minStartTime = 0;
  55. }
  56. }
  57. void Request::onComplete(TLObject *result, TL_error *error, int32_t networkType, int64_t responseTime) {
  58. if (onCompleteRequestCallback != nullptr && (result != nullptr || error != nullptr)) {
  59. onCompleteRequestCallback(result, error, networkType, responseTime);
  60. }
  61. }
  62. void Request::onWriteToSocket() {
  63. if (onWriteToSocketCallback != nullptr) {
  64. onWriteToSocketCallback();
  65. }
  66. }
  67. bool Request::hasInitFlag() {
  68. return isInitRequest || isInitMediaRequest;
  69. }
  70. bool Request::isMediaRequest() {
  71. return Connection::isMediaConnectionType(connectionType);
  72. }
  73. bool Request::needInitRequest(Datacenter *datacenter, uint32_t currentVersion) {
  74. bool media = PFS_ENABLED && datacenter != nullptr && isMediaRequest() && datacenter->hasMediaAddress();
  75. return !media && datacenter->lastInitVersion != currentVersion || media && datacenter->lastInitMediaVersion != currentVersion;
  76. }
  77. void Request::onQuickAck() {
  78. if (onQuickAckCallback != nullptr) {
  79. onQuickAckCallback();
  80. }
  81. }
  82. TLObject *Request::getRpcRequest() {
  83. return rpcRequest.get();
  84. }