]> git.tdb.fi Git - libs/net.git/blobdiff - source/http/client.h
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / http / client.h
index ee10f8c1cb5a0e389d860c6b9c59ee6a45aeb9a4..b1f097d8852a4517c501a7d996ee077a97e753fc 100644 (file)
@@ -1,9 +1,12 @@
 #ifndef MSP_HTTP_CLIENT_H_
 #define MSP_HTTP_CLIENT_H_
 
+#include <memory>
 #include <string>
 #include <sigc++/signal.h>
 #include <msp/io/eventdispatcher.h>
+#include <msp/net/mspnet_api.h>
+#include <msp/net/resolve.h>
 #include <msp/net/streamsocket.h>
 
 namespace Msp {
@@ -12,36 +15,49 @@ namespace Http {
 class Request;
 class Response;
 
-class Client
+class MSPNET_API Client
 {
 public:
        sigc::signal<void, const Response &> signal_response_complete;
-       sigc::signal<void, const std::exception *> signal_socket_error;
+       sigc::signal<void, const std::exception &> signal_socket_error;
 
 private:
-       Net::StreamSocket *sock;
-       IO::EventDispatcher *event_disp;
-       std::string user_agent;
-       Request *request;
-       Response *response;
+       struct ResolveListener: public sigc::trackable
+       {
+               Client &client;
+
+               ResolveListener(Client &);
+
+               void address_resolved(unsigned, const Net::SockAddr &);
+               void resolve_failed(unsigned, const std::exception &);
+       };
+
+       std::unique_ptr<Net::StreamSocket> sock;
+       IO::EventDispatcher *event_disp = nullptr;
+       Net::Resolver *resolver = nullptr;
+       std::unique_ptr<ResolveListener> resolve_listener;
+       unsigned resolve_tag = 0;
+       std::string user_agent = "libmspnet/1.0";
+       std::unique_ptr<Request> request;
+       std::unique_ptr<Response> response;
        std::string in_buf;
 
-       Client(const Client &);
-       Client &operator=(const Client &);
 public:
-       Client();
        ~Client();
 
        void use_event_dispatcher(IO::EventDispatcher *);
+       void use_resolver(Net::Resolver *);
        void set_user_agent(const std::string &);
        void start_request(const Request &);
        const Response *get_url(const std::string &);
        void tick();
        void wait_response();
        void abort();
-       const Request *get_request() const { return request; }
-       const Response *get_response() const { return response; }
+       const Request *get_request() const { return request.get(); }
+       const Response *get_response() const { return response.get(); }
 private:
+       void address_resolved(unsigned, const Net::SockAddr &);
+       void resolve_failed(unsigned, const std::exception &);
        void connect_finished(const std::exception *);
        void data_available();
 };