http.H 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * http.H
  3. *
  4. * Created on: Apr 17, 2013
  5. * Author: xaxaxa
  6. */
  7. #ifndef HTTP_H_
  8. #define HTTP_H_
  9. #include <curl/curl.h>
  10. #include <cpoll/cpoll.H>
  11. #include <functional>
  12. #include <queue>
  13. #include <string>
  14. using std::function;
  15. using std::queue;
  16. using std::string;
  17. namespace curl
  18. {
  19. struct transferInfo;
  20. struct instance
  21. {
  22. CP::Poll* p;
  23. CURLM *m;
  24. CP::Timer timer;
  25. };
  26. void newInstance(instance* inst, CP::Poll* p);
  27. void dispose(instance* inst);
  28. void checkQueue(instance* inst);
  29. void cb_event(int fd, short events, void *userdata);
  30. void addCurlTask(instance* inst, CURL* c, const function<void(CURL*, CURLcode)>& cb);
  31. transferInfo* addTransfer(instance* inst, const char* url,
  32. const function<bool(const void* data, int len, int state)>& cb);
  33. /*-1:failed 1:connected 2:sent 3:recving 4:closed*/
  34. void beginTransfer(instance* inst, transferInfo* t);
  35. class transferManager
  36. {
  37. public:
  38. instance inst;
  39. int itemsProcessing, concurrency;
  40. struct item
  41. {
  42. string url;
  43. bool post;
  44. function<bool(const void* data, int len, int state)> cb;
  45. };
  46. queue<item> q;
  47. transferManager(CP::Poll& p, int concurrency = 3) :
  48. itemsProcessing(0), concurrency(concurrency) {
  49. curl::newInstance(&inst, &p);
  50. }
  51. ~transferManager() {
  52. curl::dispose(&inst);
  53. }
  54. void checkQueue();
  55. void doTransfer(const char* url, bool post,
  56. const function<bool(const void* data, int len, int state)>& cb);
  57. void addTransfer(const char* url, bool post,
  58. const function<bool(const void* data, int len, int state)>& cb);
  59. };
  60. }
  61. #endif /* HTTP_H_ */