OSDN Git Service

RTSP試作中
[iptd/iPTd.git] / src / net / RTSPRequest.cpp
1 /**\r
2  * @file RTSPRequest.cpp\r
3  *\r
4  */\r
5 \r
6 #define DBG_LEVEL 3\r
7 #include <Raym/Log.h>\r
8 #include "net/RTSPRequest.h"\r
9 \r
10 using namespace Raym;\r
11 \r
12 namespace NET\r
13 {\r
14 \r
15 RTSPRequest::RTSPRequest()\r
16 {\r
17 }\r
18 \r
19 RTSPRequest::~RTSPRequest()\r
20 {\r
21 }\r
22 \r
23 RTSPRequest *RTSPRequest::requestWithSocket(SOCKET sock)\r
24 {\r
25     DebugLog2("%s", __FUNCTION__);\r
26 \r
27     char buf[16384];\r
28     int offset = 0;\r
29     while (offset < sizeof(buf) - 1)\r
30     {\r
31         int len = recv(sock, &buf[offset], 1, 0);\r
32         if (len == 0)\r
33         {\r
34             break;\r
35         }\r
36         if (offset > 0)\r
37         {\r
38             if ((buf[offset - 1] == '\r') && (buf[offset] == '\n'))\r
39             {\r
40                 ++offset;\r
41                 break;\r
42             }\r
43         }\r
44         ++offset;\r
45     }\r
46     buf[offset] = '\0';\r
47 \r
48     DebugLog2("request line: %s", buf);\r
49 \r
50     RTSPRequest *result = NULL;\r
51 \r
52     String *method  = NULL;\r
53     String *uri     = NULL;\r
54     String *version = NULL;\r
55     if (strchr(buf, ' ') != NULL)\r
56     {\r
57         char *p = strchr(buf, ' ');\r
58         *p++ = '\0';\r
59         if ((buf[strlen(buf) - 2] == '\r') && (buf[strlen(buf) - 1] == '\n'))\r
60         {\r
61             buf[strlen(buf) - 2] = '\0';\r
62         }\r
63         method = String::alloc()->initWithUTF8String(&buf[0]);\r
64         while (*p == ' ')\r
65         {\r
66             ++p;\r
67         }\r
68         if (strchr(p, ' ') != NULL)\r
69         {\r
70             char *p2 = strchr(p, ' ');\r
71             *p2++ = '\0';\r
72             if ((p[strlen(p) - 2] == '\r') && (p[strlen(p) - 1] == '\n'))\r
73             {\r
74                 p[strlen(p) - 2] = '\0';\r
75             }\r
76             uri = String::alloc()->initWithUTF8String(p);\r
77             while (*p2 == ' ')\r
78             {\r
79                 ++p2;\r
80             }\r
81             if (strchr(p2, ' ') == NULL)\r
82             {\r
83                 if ((p2[strlen(p2) - 2] == '\r') && (p2[strlen(p2) - 1] == '\n'))\r
84                 {\r
85                     p2[strlen(p2) - 2] = '\0';\r
86                 }\r
87                 version = String::alloc()->initWithUTF8String(p2);\r
88             }\r
89         }\r
90     }\r
91 \r
92     if (method != NULL)\r
93     {\r
94         DebugLog3("method: %s", method->cString());\r
95     }\r
96     if (uri != NULL)\r
97     {\r
98         DebugLog3("uri: %s", uri->cString());\r
99     }\r
100     if (version != NULL)\r
101     {\r
102         DebugLog3("version: %s", version->cString());\r
103     }\r
104 \r
105     if (version != NULL)\r
106     {\r
107         if (version->isMatch("^(HTTP/1.[01]|RTSP/1.0)$"))\r
108         {\r
109             InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->initWithSocket(sock);\r
110             if (header != NULL)\r
111             {\r
112                 InternetTextMessageBody *body = NULL;\r
113                 /*\r
114                 if (header->fieldBodyForName("Transfer-Encoding") != NULL)\r
115                 {\r
116                     DebugLog3("has Transfer-Encoding\n");\r
117                     abort();\r
118                 }\r
119                 else if (header->fieldBodyForName("Content-Length") != NULL)\r
120                 {\r
121                     DebugLog3("has Content-Length\n");\r
122                     abort();\r
123                 }\r
124                 else if (header->fieldBodyForName("Content-Type") != NULL)\r
125                 {\r
126                     DebugLog3("has Content-Type\n");\r
127                     abort();\r
128                 }\r
129                 */\r
130 \r
131                 InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
132                 RELEASE(header);\r
133                 RELEASE(body);\r
134 \r
135                 result = new RTSPRequest();\r
136                 result->setMethod(method);\r
137                 result->setURI(uri);\r
138                 result->setVersion(version);\r
139                 result->setMessage(message);\r
140                 result->autorelease();\r
141 \r
142                 RELEASE(message);\r
143             }\r
144             else\r
145             {\r
146                 DebugLog3("error: InternetTextMessageHeader::headerWithSocket()\n");\r
147             }\r
148         }\r
149     }\r
150 \r
151     RELEASE(method);\r
152     RELEASE(uri);\r
153     RELEASE(version);\r
154 \r
155     return result;\r
156 }\r
157 \r
158 const char *RTSPRequest::className()\r
159 {\r
160     return "RTSPRequest";\r
161 }\r
162 \r
163 } // NET\r