--- /dev/null
+/**\r
+ * @file RTSPRequest.cpp\r
+ *\r
+ */\r
+\r
+#define DBG_LEVEL 3\r
+#include <Raym/Log.h>\r
+#include "net/RTSPRequest.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+RTSPRequest::RTSPRequest()\r
+{\r
+}\r
+\r
+RTSPRequest::~RTSPRequest()\r
+{\r
+}\r
+\r
+RTSPRequest *RTSPRequest::requestWithSocket(SOCKET sock)\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+\r
+ char buf[16384];\r
+ int offset = 0;\r
+ while (offset < sizeof(buf) - 1)\r
+ {\r
+ int len = recv(sock, &buf[offset], 1, 0);\r
+ if (len == 0)\r
+ {\r
+ break;\r
+ }\r
+ if (offset > 0)\r
+ {\r
+ if ((buf[offset - 1] == '\r') && (buf[offset] == '\n'))\r
+ {\r
+ ++offset;\r
+ break;\r
+ }\r
+ }\r
+ ++offset;\r
+ }\r
+ buf[offset] = '\0';\r
+\r
+ DebugLog2("request line: %s", buf);\r
+\r
+ RTSPRequest *result = NULL;\r
+\r
+ String *method = NULL;\r
+ String *uri = NULL;\r
+ String *version = NULL;\r
+ if (strchr(buf, ' ') != NULL)\r
+ {\r
+ char *p = strchr(buf, ' ');\r
+ *p++ = '\0';\r
+ if ((buf[strlen(buf) - 2] == '\r') && (buf[strlen(buf) - 1] == '\n'))\r
+ {\r
+ buf[strlen(buf) - 2] = '\0';\r
+ }\r
+ method = String::alloc()->initWithUTF8String(&buf[0]);\r
+ while (*p == ' ')\r
+ {\r
+ ++p;\r
+ }\r
+ if (strchr(p, ' ') != NULL)\r
+ {\r
+ char *p2 = strchr(p, ' ');\r
+ *p2++ = '\0';\r
+ if ((p[strlen(p) - 2] == '\r') && (p[strlen(p) - 1] == '\n'))\r
+ {\r
+ p[strlen(p) - 2] = '\0';\r
+ }\r
+ uri = String::alloc()->initWithUTF8String(p);\r
+ while (*p2 == ' ')\r
+ {\r
+ ++p2;\r
+ }\r
+ if (strchr(p2, ' ') == NULL)\r
+ {\r
+ if ((p2[strlen(p2) - 2] == '\r') && (p2[strlen(p2) - 1] == '\n'))\r
+ {\r
+ p2[strlen(p2) - 2] = '\0';\r
+ }\r
+ version = String::alloc()->initWithUTF8String(p2);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (method != NULL)\r
+ {\r
+ DebugLog3("method: %s", method->cString());\r
+ }\r
+ if (uri != NULL)\r
+ {\r
+ DebugLog3("uri: %s", uri->cString());\r
+ }\r
+ if (version != NULL)\r
+ {\r
+ DebugLog3("version: %s", version->cString());\r
+ }\r
+\r
+ if (version != NULL)\r
+ {\r
+ if (version->isMatch("^(HTTP/1.[01]|RTSP/1.0)$"))\r
+ {\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->initWithSocket(sock);\r
+ if (header != NULL)\r
+ {\r
+ InternetTextMessageBody *body = NULL;\r
+ /*\r
+ if (header->fieldBodyForName("Transfer-Encoding") != NULL)\r
+ {\r
+ DebugLog3("has Transfer-Encoding\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Length") != NULL)\r
+ {\r
+ DebugLog3("has Content-Length\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Type") != NULL)\r
+ {\r
+ DebugLog3("has Content-Type\n");\r
+ abort();\r
+ }\r
+ */\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+\r
+ result = new RTSPRequest();\r
+ result->setMethod(method);\r
+ result->setURI(uri);\r
+ result->setVersion(version);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+\r
+ RELEASE(message);\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: InternetTextMessageHeader::headerWithSocket()\n");\r
+ }\r
+ }\r
+ }\r
+\r
+ RELEASE(method);\r
+ RELEASE(uri);\r
+ RELEASE(version);\r
+\r
+ return result;\r
+}\r
+\r
+const char *RTSPRequest::className()\r
+{\r
+ return "RTSPRequest";\r
+}\r
+\r
+} // NET\r