summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.h
blob: d07bab55a64ffd56c83b55e49ffceda578870954 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef EVENTIOPROCESSOR_H_2CUY93KU
#define EVENTIOPROCESSOR_H_2CUY93KU

#include "uscxml/concurrency/eventqueue/DelayedEventQueue.h"
#include "uscxml/Interpreter.h"
#include "uscxml/Factory.h"
#ifndef _WIN32
#include <sys/time.h>
#endif

#include <event2/http.h>
#include <event2/http_struct.h>

#ifdef BUILD_AS_PLUGINS
#include "uscxml/plugins/Plugins.h"
#endif

namespace uscxml {

class EventIOServer;

class EventIOProcessor : public IOProcessorImpl {
public:
	struct SendData {
		EventIOProcessor* ioProcessor;
		uscxml::SendRequest req;
	};

	EventIOProcessor();
	virtual ~EventIOProcessor();
	virtual boost::shared_ptr<IOProcessorImpl> create(uscxml::Interpreter* interpreter);

	virtual std::set<std::string> getNames() {
		std::set<std::string> names;
		names.insert("basichttp");
		names.insert("http://www.w3.org/TR/scxml/#SCXMLEventProcessor");
		return names;
	}

	virtual void send(const SendRequest& req);

	Data getDataModelVariables();
	void setURL(const std::string& url) {
		_url = url;
	}

	void start();
	static void run(void* instance);

	static void httpMakeSendReq(void* userdata, std::string eventName);
	static void httpSendReqDone(struct evhttp_request *req, void *cb_arg);
	static void httpRecvReq(struct evhttp_request *req, void *arg);

protected:
	std::map<std::string, SendData> _sendData;

	std::string _url;

	uscxml::DelayedEventQueue _asyncQueue;
	uscxml::Interpreter* _interpreter;
	std::map<std::string, struct evhttp_connection*> _httpConnections;
	std::map<std::string, struct evhttp_request*> _httpRequests;
	struct evdns_base* _dns;

	friend class EventIOServer;
};

class EventIOServer {
private:
	static EventIOServer* getInstance();
	EventIOServer(unsigned short port);
	~EventIOServer();

	void start();
	void stop();
	static void run(void* instance);

	void determineAddress();
	static std::string syncResolve(const std::string& hostname);

	static void registerProcessor(EventIOProcessor* processor);
	static void unregisterProcessor(EventIOProcessor* processor);


	std::map<std::string, EventIOProcessor*> _processors;

	struct event_base* _base;
	struct evhttp* _http;
	struct evhttp_bound_socket* _handle;

	unsigned short _port;
	std::string _address;

	static EventIOServer* _instance;
	static tthread::recursive_mutex _instanceMutex;
	tthread::thread* _thread;
	tthread::recursive_mutex _mutex;
	bool _isRunning;

	friend class EventIOProcessor;
};

#ifdef BUILD_AS_PLUGINS
PLUMA_INHERIT_PROVIDER(EventIOProcessor, IOProcessorImpl);
#endif

}

#endif /* end of include guard: EVENTIOPROCESSOR_H_2CUY93KU */