blob: 3afe46369b16685b20b4761b6d97747c94d39552 (
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
|
#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;
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 */
|