From 40bcb2ba72db8ded0eb7925f6c4a95b78928fbcb Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 25 Sep 2011 22:44:55 +0200 Subject: [PATCH] Epoll removal tested and found working! :D --- Connector_HTTP/main.cpp | 18 +++++++++++------- Connector_RTMP/main.cpp | 5 ++++- util/socket.cpp | 24 ++++++++++++++++++++++++ util/socket.h | 2 ++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index b11c7db9..770219b7 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -237,7 +237,7 @@ namespace Connector_HTTP{ break; case 0: break;//not ready yet default: - if (tag.SockLoader(ss)){//able to read a full packet?f + if (tag.SockLoader(ss)){//able to read a full packet? if (handler == HANDLER_FLASH){ if (tag.tagTime() > 0){ if (Flash_StartTime == 0){ @@ -269,14 +269,18 @@ namespace Connector_HTTP{ FlashFirstVideo = true; FlashFirstAudio = true; } - if (FlashFirstVideo && (tag.data[0] == 0x09) && (Video_Init.len > 0)){ - Video_Init.tagTime(tag.tagTime()); - FlashBuf.append(Video_Init.data, Video_Init.len); + if (FlashFirstVideo && (tag.data[0] == 0x09) && (!tag.needsInitData() || (Video_Init.len > 0))){ + if (tag.needsInitData()){ + Video_Init.tagTime(tag.tagTime()); + FlashBuf.append(Video_Init.data, Video_Init.len); + } FlashFirstVideo = false; } - if (FlashFirstAudio && (tag.data[0] == 0x08) && (Audio_Init.len > 0)){ - Audio_Init.tagTime(tag.tagTime()); - FlashBuf.append(Audio_Init.data, Audio_Init.len); + if (FlashFirstAudio && (tag.data[0] == 0x08) && (!tag.needsInitData() || (Audio_Init.len > 0))){ + if (tag.needsInitData()){ + Audio_Init.tagTime(tag.tagTime()); + FlashBuf.append(Audio_Init.data, Audio_Init.len); + } FlashFirstAudio = false; } #if DEBUG >= 5 diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index b7fba9a0..ae256923 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -121,7 +121,10 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){ break; } //not gotten init yet? cancel this tag - if (viddata.len == 0 || auddata.len == 0){break;} + if (tag.needsInitData()){ + if ((tag.data[0] == 0x09) && (viddata.len == 0)){break;} + if ((tag.data[0] == 0x08) && (auddata.len == 0)){break;} + } //send tag normally Socket.write(RTMPStream::SendMedia(tag)); #if DEBUG >= 8 diff --git a/util/socket.cpp b/util/socket.cpp index b0046d02..425d2a70 100644 --- a/util/socket.cpp +++ b/util/socket.cpp @@ -495,3 +495,27 @@ bool Socket::Server::connected(){ /// Returns internal socket number. int Socket::Server::getSocket(){return sock;} + +/// Unescapes URLencoded C-strings to a std::string. +/// This function *will* destroy the incoming data! +std::string Socket::Connection::urlunescape(char *s){ + char *p; + for (p = s; *s != '\0'; ++s){ + if (*s == '%'){ + if (*++s != '\0'){ + *p = unhex(*s) << 4; + } + if (*++s != '\0'){ + *p++ += unhex(*s); + } + } else { + if (*s == '+'){*p++ = ' ';}else{*p++ = *s;} + } + } + *p = '\0'; + return std::string(s); +} + +int Socket::Connection::unhex(char c){ + return( c >= '0' && c <= '9' ? c - '0' : c >= 'A' && c <= 'F' ? c - 'A' + 10 : c - 'a' + 10 ); +} diff --git a/util/socket.h b/util/socket.h index 57aca183..456a162f 100644 --- a/util/socket.h +++ b/util/socket.h @@ -23,6 +23,7 @@ namespace Socket{ private: int sock; ///< Internally saved socket number. std::string remotehost; ///< Stores remote host address. + int unhex(char c); ///< Helper function for urlunescape. public: Connection(); ///< Create a new disconnected base socket. Connection(int sockNo); ///< Create a new base socket. @@ -44,6 +45,7 @@ namespace Socket{ bool swrite(std::string & buffer); ///< Read call that is compatible with std::string. bool iread(std::string & buffer); ///< Incremental write call that is compatible with std::string. bool iwrite(std::string & buffer); ///< Write call that is compatible with std::string. + std::string urlunescape(char *s); ///< Unescapes URLencoded C-strings to a std::string. void close(); ///< Close connection. std::string getHost(); ///< Gets hostname for connection, if available. int getSocket(); ///< Returns internal socket number.