forked from linyacool/WebServer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChannel.h
More file actions
executable file
·131 lines (114 loc) · 2.66 KB
/
Copy pathChannel.h
File metadata and controls
executable file
·131 lines (114 loc) · 2.66 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// @Author Lin Ya
// @Email [email protected]
#pragma once
#include "Timer.h"
#include <string>
#include <unordered_map>
#include <memory>
#include <sys/epoll.h>
#include <functional>
#include <sys/epoll.h>
class EventLoop;
class HttpData;
class Channel
{
private:
typedef std::function<void()> CallBack;
EventLoop *loop_;
int fd_;
__uint32_t events_;
__uint32_t revents_;
__uint32_t lastEvents_;
// 方便找到上层持有该Channel的对象
std::weak_ptr<HttpData> holder_;
private:
int parse_URI();
int parse_Headers();
int analysisRequest();
CallBack readHandler_;
CallBack writeHandler_;
CallBack errorHandler_;
CallBack connHandler_;
public:
Channel(EventLoop *loop);
Channel(EventLoop *loop, int fd);
~Channel();
int getFd();
void setFd(int fd);
void setHolder(std::shared_ptr<HttpData> holder)
{
holder_ = holder;
}
std::shared_ptr<HttpData> getHolder()
{
std::shared_ptr<HttpData> ret(holder_.lock());
return ret;
}
void setReadHandler(CallBack &&readHandler)
{
readHandler_ = readHandler;
}
void setWriteHandler(CallBack &&writeHandler)
{
writeHandler_ = writeHandler;
}
void setErrorHandler(CallBack &&errorHandler)
{
errorHandler_ = errorHandler;
}
void setConnHandler(CallBack &&connHandler)
{
connHandler_ = connHandler;
}
void handleEvents()
{
events_ = 0;
if ((revents_ & EPOLLHUP) && !(revents_ & EPOLLIN))
{
events_ = 0;
return;
}
if (revents_ & EPOLLERR)
{
if (errorHandler_) errorHandler_();
events_ = 0;
return;
}
if (revents_ & (EPOLLIN | EPOLLPRI | EPOLLRDHUP))
{
handleRead();
}
if (revents_ & EPOLLOUT)
{
handleWrite();
}
handleConn();
}
void handleRead();
void handleWrite();
void handleError(int fd, int err_num, std::string short_msg);
void handleConn();
void setRevents(__uint32_t ev)
{
revents_ = ev;
}
void setEvents(__uint32_t ev)
{
events_ = ev;
}
__uint32_t& getEvents()
{
return events_;
}
bool EqualAndUpdateLastEvents()
{
bool ret = (lastEvents_ == events_);
lastEvents_ = events_;
return ret;
}
__uint32_t getLastEvents()
{
return lastEvents_;
}
};
typedef std::shared_ptr<Channel> SP_Channel;