1 // PHZ
2 // 2018-6-8
3 
4 #ifndef XOP_RTSP_MESSAGE_H
5 #define XOP_RTSP_MESSAGE_H
6 
7 #include <utility>
8 #include <unordered_map>
9 #include <string>
10 #include <cstring>
11 #include "rtp.h"
12 #include "media.h"
13 #include "net/BufferReader.h"
14 
15 namespace xop
16 {
17 
18 class RtspRequest
19 {
20 public:
21 	enum Method
22 	{
23 		OPTIONS=0, DESCRIBE, SETUP, PLAY, TEARDOWN, GET_PARAMETER,
24 		RTCP, NONE,
25 	};
26 
27 	const char* MethodToString[8] =
28 	{
29 		"OPTIONS", "DESCRIBE", "SETUP", "PLAY", "TEARDOWN", "GET_PARAMETER",
30 		"RTCP", "NONE"
31 	};
32 
33 	enum RtspRequestParseState
34 	{
35 		kParseRequestLine,
36 		kParseHeadersLine,
37 		//kParseBody,
38 		kGotAll,
39 	};
40 
41 	bool ParseRequest(xop::BufferReader *buffer);
42 
GotAll()43 	bool GotAll() const
44 	{ return state_ == kGotAll; }
45 
Reset()46 	void Reset()
47 	{
48 		state_ = kParseRequestLine;
49 		request_line_param_.clear();
50 		header_line_param_.clear();
51 	}
52 
GetMethod()53 	Method GetMethod() const
54 	{ return method_; }
55 
56 	uint32_t GetCSeq() const;
57 
58 	std::string GetRtspUrl() const;
59 
60 	std::string GetRtspUrlSuffix() const;
61 	std::string GetRtspUrlSession() const;
62 	std::string GetRtspUrlQueryString() const;
63 
64 	std::string GetIp() const;
65 
66 	std::string GetAuthResponse() const;
67 
GetTransportMode()68 	TransportMode GetTransportMode() const
69 	{ return transport_; }
70 
GetChannelId()71 	MediaChannelId GetChannelId() const
72 	{ return channel_id_; }
73 
74 	uint8_t  GetRtpChannel() const;
75 	uint8_t  GetRtcpChannel() const;
76 	uint16_t GetRtpPort() const;
77 	uint16_t GetRtcpPort() const;
78 
79 	int BuildOptionRes(const char* buf, int buf_size);
80 	int BuildDescribeRes(const char* buf, int buf_size, const char* sdp);
81 	int BuildSetupMulticastRes(const char* buf, int buf_size, const char* multicast_ip, uint16_t port, uint32_t session_id);
82 	int BuildSetupTcpRes(const char* buf, int buf_size, uint16_t rtp_chn, uint16_t rtcp_chn, uint32_t session_id);
83 	int BuildSetupUdpRes(const char* buf, int buf_size, uint16_t rtp_chn, uint16_t rtcp_chn, uint32_t session_id);
84 	int BuildPlayRes(const char* buf, int buf_size, const char* rtp_info, uint32_t session_id);
85 	int BuildTeardownRes(const char* buf, int buf_size, uint32_t session_id);
86 	int BuildGetParamterRes(const char* buf, int buf_size, uint32_t session_id);
87 	int BuildNotFoundRes(const char* buf, int buf_size);
88 	int BuildServerErrorRes(const char* buf, int buf_size);
89 	int BuildUnsupportedRes(const char* buf, int buf_size);
90 	size_t BuildUnauthorizedRes(const char* buf, size_t buf_size);
91 	size_t BuildUnauthorizedRes(const char* buf, size_t buf_size, const char* realm, const char* nonce);
92 
93 private:
94 	bool ParseRequestLine(const char* begin, const char* end);
95 	bool ParseHeadersLine(const char* begin, const char* end);
96 	bool ParseCSeq(std::string& message);
97 	bool ParseAccept(std::string& message);
98 	bool ParseTransport(std::string& message);
99 	bool ParseSessionId(std::string& message);
100 	bool ParseMediaChannel(std::string& message);
101 	bool ParseAuthorization(std::string& message);
102 
103 	Method method_;
104 	MediaChannelId channel_id_;
105 	TransportMode transport_;
106 	std::string auth_response_;
107 	std::unordered_map<std::string, std::pair<std::string, uint32_t>> request_line_param_;
108 	std::unordered_map<std::string, std::pair<std::string, uint32_t>> header_line_param_;
109 
110 	RtspRequestParseState state_ = kParseRequestLine;
111 };
112 
113 class RtspResponse
114 {
115 public:
116 	enum Method
117 	{
118 		OPTIONS=0, DESCRIBE, ANNOUNCE, SETUP, RECORD, RTCP,
119 		NONE,
120 	};
121 
122 	bool ParseResponse(xop::BufferReader *buffer);
123 
GetMethod()124 	Method GetMethod() const
125 	{ return method_; }
126 
GetCSeq()127 	uint32_t GetCSeq() const
128 	{ return cseq_;  }
129 
GetSession()130 	std::string GetSession() const
131 	{ return session_; }
132 
SetUserAgent(const char * user_agent)133 	void SetUserAgent(const char *user_agent)
134 	{ user_agent_ = std::string(user_agent); }
135 
SetRtspUrl(const char * url)136 	void SetRtspUrl(const char *url)
137 	{ rtsp_url_ = std::string(url); }
138 
139 	int BuildOptionReq(const char* buf, int buf_size);
140 	int BuildDescribeReq(const char* buf, int buf_size);
141 	int BuildAnnounceReq(const char* buf, int buf_size, const char *sdp);
142 	int BuildSetupTcpReq(const char* buf, int buf_size, int channel);
143 	int BuildRecordReq(const char* buf, int buf_size);
144 
145 private:
146 	Method method_;
147 	uint32_t cseq_ = 0;
148 	std::string user_agent_;
149 	std::string rtsp_url_;
150 	std::string session_;
151 };
152 
153 }
154 
155 #endif
156