qtnetwork.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright (C) 2018 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. // @snippet qudpsocket-readdatagram
  4. Shiboken::ArrayPointer<char> data(%ARGUMENT_NAMES);
  5. QHostAddress ha;
  6. quint16 port;
  7. %BEGIN_ALLOW_THREADS
  8. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &ha, &port);
  9. %END_ALLOW_THREADS
  10. QByteArray ba(data, retval);
  11. %PYARG_0 = PyTuple_New(3);
  12. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[QByteArray](ba));
  13. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha));
  14. PyTuple_SetItem(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port));
  15. // @snippet qudpsocket-readdatagram
  16. // @snippet qhostinfo-lookuphost-functor
  17. struct QHostInfoFunctor : public Shiboken::PyObjectHolder
  18. {
  19. public:
  20. using Shiboken::PyObjectHolder::PyObjectHolder;
  21. void operator()(const QHostInfo &hostInfo);
  22. };
  23. void QHostInfoFunctor::operator()(const QHostInfo &hostInfo)
  24. {
  25. Shiboken::GilState state;
  26. Shiboken::AutoDecRef arglist(PyTuple_New(1));
  27. auto *pyHostInfo = %CONVERTTOPYTHON[QHostInfo](hostInfo);
  28. PyTuple_SetItem(arglist.object(), 0, pyHostInfo);
  29. Shiboken::AutoDecRef ret(PyObject_CallObject(object(), arglist));
  30. release(); // single shot
  31. }
  32. // @snippet qhostinfo-lookuphost-functor
  33. // @snippet qhostinfo-lookuphost-callable
  34. %CPPSELF.%FUNCTION_NAME(%1, QHostInfoFunctor(%PYARG_2));
  35. // @snippet qhostinfo-lookuphost-callable
  36. // @snippet qipv6address-len
  37. return 16;
  38. // @snippet qipv6address-len
  39. // @snippet qipv6address-getitem
  40. if (_i >= 16) {
  41. PyErr_SetString(PyExc_IndexError, "index out of bounds");
  42. return nullptr;
  43. }
  44. if (_i < 0)
  45. _i = 16 - qAbs(_i);
  46. uint item = %CPPSELF.c[_i];
  47. return %CONVERTTOPYTHON[uint](item);
  48. // @snippet qipv6address-getitem
  49. // @snippet qipv6address-setitem
  50. if (_i >= 16) {
  51. PyErr_SetString(PyExc_IndexError, "index out of bounds");
  52. return -1;
  53. }
  54. if (_i < 0)
  55. _i = 16 - qAbs(_i);
  56. quint8 item = %CONVERTTOCPP[quint8](_value);
  57. %CPPSELF.c[_i] = item;
  58. return 0;
  59. // @snippet qipv6address-setitem
  60. // @snippet qrestaccessmanager-functor
  61. class QRestFunctor
  62. {
  63. public:
  64. explicit QRestFunctor(PyObject *callable) noexcept : m_callable(callable)
  65. {
  66. Py_INCREF(callable);
  67. }
  68. void operator()(QRestReply &restReply);
  69. private:
  70. PyObject *m_callable;
  71. };
  72. void QRestFunctor::operator()(QRestReply &restReply)
  73. {
  74. Q_ASSERT(m_callable);
  75. Shiboken::GilState state;
  76. Shiboken::AutoDecRef arglist(PyTuple_New(1));
  77. auto *restReplyPtr = &restReply;
  78. auto *pyRestReply = %CONVERTTOPYTHON[QRestReply*](restReplyPtr);
  79. PyTuple_SetItem(arglist.object(), 0, pyRestReply);
  80. Shiboken::AutoDecRef ret(PyObject_CallObject(m_callable, arglist));
  81. Py_DECREF(m_callable);
  82. m_callable = nullptr;
  83. }
  84. // @snippet qrestaccessmanager-functor
  85. // @snippet qrestaccessmanager-callback
  86. auto *networkReply = %CPPSELF.%FUNCTION_NAME(%1, %2, QRestFunctor(%PYARG_3));
  87. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](networkReply);
  88. // @snippet qrestaccessmanager-callback
  89. // @snippet qrestaccessmanager-data-callback
  90. auto *networkReply = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, QRestFunctor(%PYARG_4));
  91. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](networkReply);
  92. // @snippet qrestaccessmanager-data-callback
  93. // @snippet qrestaccessmanager-method-data-callback
  94. auto *networkReply = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, QRestFunctor(%PYARG_5));
  95. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](networkReply);
  96. // @snippet qrestaccessmanager-method-data-callback
  97. // @snippet qrestreply-readjson
  98. QJsonParseError jsonParseError;
  99. std::optional<QJsonDocument> documentOptional = %CPPSELF.%FUNCTION_NAME(&jsonParseError);
  100. PyObject *pyDocument{};
  101. if (documentOptional.has_value()) {
  102. const auto &document = documentOptional.value();
  103. pyDocument = %CONVERTTOPYTHON[QJsonDocument](document);
  104. } else {
  105. pyDocument = Py_None;
  106. Py_INCREF(Py_None);
  107. }
  108. %PYARG_0 = PyTuple_New(2);
  109. PyTuple_SetItem(%PYARG_0, 0, pyDocument);
  110. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[QJsonParseError](jsonParseError));
  111. // @snippet qrestreply-readjson