helpers.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * @file helpers.cpp
  3. * @brief implementation of the restclient helpers
  4. * @author Daniel Schauenberg <d@unwiredcouch.com>
  5. */
  6. #include "restclient-cpp/helpers.h"
  7. #include <cstring>
  8. #include "restclient-cpp/restclient.h"
  9. /**
  10. * @brief write callback function for libcurl
  11. *
  12. * @param data returned data of size (size*nmemb)
  13. * @param size size parameter
  14. * @param nmemb memblock parameter
  15. * @param userdata pointer to user data to save/work with return data
  16. *
  17. * @return (size * nmemb)
  18. */
  19. size_t RestClient::Helpers::write_callback(void *data, size_t size,
  20. size_t nmemb, void *userdata) {
  21. RestClient::Response* r;
  22. r = reinterpret_cast<RestClient::Response*>(userdata);
  23. r->body.append(reinterpret_cast<char*>(data), size*nmemb);
  24. return (size * nmemb);
  25. }
  26. /**
  27. * @brief header callback for libcurl
  28. *
  29. * @param data returned (header line)
  30. * @param size of data
  31. * @param nmemb memblock
  32. * @param userdata pointer to user data object to save headr data
  33. * @return size * nmemb;
  34. */
  35. size_t RestClient::Helpers::header_callback(void *data, size_t size,
  36. size_t nmemb, void *userdata) {
  37. RestClient::Response* r;
  38. r = reinterpret_cast<RestClient::Response*>(userdata);
  39. std::string header(reinterpret_cast<char*>(data), size*nmemb);
  40. size_t seperator = header.find_first_of(':');
  41. if ( std::string::npos == seperator ) {
  42. // roll with non seperated headers...
  43. trim(header);
  44. if (0 == header.length()) {
  45. return (size * nmemb); // blank line;
  46. }
  47. r->headers[header] = "present";
  48. } else {
  49. std::string key = header.substr(0, seperator);
  50. trim(key);
  51. std::string value = header.substr(seperator + 1);
  52. trim(value);
  53. r->headers[key] = value;
  54. }
  55. return (size * nmemb);
  56. }
  57. /**
  58. * @brief read callback function for libcurl
  59. *
  60. * @param data pointer of max size (size*nmemb) to write data to
  61. * @param size size parameter
  62. * @param nmemb memblock parameter
  63. * @param userdata pointer to user data to read data from
  64. *
  65. * @return (size * nmemb)
  66. */
  67. size_t RestClient::Helpers::read_callback(void *data, size_t size,
  68. size_t nmemb, void *userdata) {
  69. /** get upload struct */
  70. RestClient::Helpers::UploadObject* u;
  71. u = reinterpret_cast<RestClient::Helpers::UploadObject*>(userdata);
  72. /** set correct sizes */
  73. size_t curl_size = size * nmemb;
  74. size_t copy_size = (u->length < curl_size) ? u->length : curl_size;
  75. /** copy data to buffer */
  76. std::memcpy(data, u->data, copy_size);
  77. /** decrement length and increment data pointer */
  78. u->length -= copy_size;
  79. u->data += copy_size;
  80. /** return copied size */
  81. return copy_size;
  82. }
  83. size_t RestClient::Helpers::download_callback(void *data, size_t size,
  84. size_t nmemb, void *userdata) {
  85. FILE* stream = (FILE*)userdata;
  86. if (!stream) {
  87. LOGD("!!! No stream\n");
  88. return 0;
  89. }
  90. size_t written = fwrite(/*(FILE*)*/data, size, nmemb, stream);
  91. return written;
  92. }