OSDN Git Service

RTSP試作中
authorosx86_pt1 <rmitachi@ta2.so-net.ne.jp>
Sun, 17 Apr 2016 14:15:03 +0000 (23:15 +0900)
committerosx86_pt1 <rmitachi@ta2.so-net.ne.jp>
Sun, 17 Apr 2016 14:15:03 +0000 (23:15 +0900)
その他

src/net/RTSPRequest.cpp [new file with mode: 0644]
src/net/RTSPRequest.h [new file with mode: 0644]

diff --git a/src/net/RTSPRequest.cpp b/src/net/RTSPRequest.cpp
new file mode 100644 (file)
index 0000000..00ff8d3
--- /dev/null
@@ -0,0 +1,163 @@
+/**\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
diff --git a/src/net/RTSPRequest.h b/src/net/RTSPRequest.h
new file mode 100644 (file)
index 0000000..7302bef
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+ * @file RTSPRequest.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include <Raym/Raym.h>\r
+\r
+#include "net/HTTPRequest.h"\r
+#include "net/InternetTextMessage.h"\r
+\r
+namespace NET\r
+{\r
+\r
+class RTSPRequest : public HTTPRequest\r
+{\r
+private:\r
+\r
+protected:\r
+    RTSPRequest();\r
+    ~RTSPRequest();\r
+\r
+public:\r
+    static RTSPRequest *requestWithSocket(SOCKET sock);\r
+\r
+    virtual const char *className();\r
+};\r
+\r
+} // NET\r