📄 darwin_ipv6.patch
字号:
+ memcpy(&(fOutputArray[index].fDestAddr.v6), SocketUtils::ConvertStringToAddr6(destAddrStr), sizeof(struct in6_addr));+ fOutputArray[index].family = AF_INET6;+ }+ } } prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "ttl"); if (prefTag != NULL)diff -u --new-file --recursive darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp--- darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp Mon Jun 10 17:32:49 2002+++ darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp Tue Jul 2 15:31:08 2002@@ -78,15 +78,21 @@ RTSPSourceInfo::RTSPSourceInfo(const RTSPSourceInfo& copy) :RCFSourceInfo(copy), - fHostAddr(copy.fHostAddr), fHostPort(copy.fHostPort), fLocalAddr(copy.fLocalAddr),+ fHostPort(copy.fHostPort), fNumSetupsComplete(copy.fNumSetupsComplete), fDescribeComplete(copy.fDescribeComplete), - fAnnounce(copy.fAnnounce), fAnnounceIP(copy.fAnnounceIP), fAnnounceActualIP(copy.fAnnounceIP),fQueueElem(this)+ fAnnounce(copy.fAnnounce), fQueueElem(this) { fSourceURL = RTSPOutputInfo::CopyString(copy.fSourceURL); fUserName = RTSPOutputInfo::CopyString(copy.fUserName); fPassword = RTSPOutputInfo::CopyString(copy.fPassword); fAnnounceURL = RTSPOutputInfo::CopyString(copy.fAnnounceURL); + memcpy(&(fHostAddr.v6), &(copy.fHostAddr.v6), sizeof(struct in6_addr));+ memcpy(&(fLocalAddr.v6), &(copy.fLocalAddr.v6), sizeof(struct in6_addr));++ memcpy(&(fAnnounceIP.v6), &(copy.fAnnounceIP.v6), sizeof(struct in6_addr));+ memcpy(&(fAnnounceActualIP.v6), &(copy.fAnnounceActualIP.v6), sizeof(struct in6_addr));+ fRTSPInfoArray = NEW RTSPOutputInfo[fNumOutputs]; for (UInt32 index=0; index < fNumOutputs; index++) fRTSPInfoArray[index].Copy(copy.fRTSPInfoArray[index]);@@ -155,12 +161,28 @@ if (inLocalAddr != 0) fClientSocket->GetSocket()->Bind(inLocalAddr, 0); }+void RTSPSourceInfo::SetClientInfo(struct in6_addr* inAddr, UInt16 inPort, char* inURL, struct in6_addr* inLocalAddr)+{+ if (fClientSocket != NULL)+ fClientSocket->Set(inAddr, inPort);+ + StrPtrLen inURLPtrLen(inURL);+ + if (fClient != NULL)+ fClient->Set(inURLPtrLen);++ if (inLocalAddr != 0)+ fClientSocket->GetSocket()->Bind(inLocalAddr, 0);+} QTSS_Error RTSPSourceInfo::ParsePrefs(XMLTag* relayTag, Bool16 inAnnounce) { XMLTag* prefTag;- UInt32 localAddr = 0;- UInt32 theHostAddr = 0;+ union {+ UInt32 v4;+ struct in6_addr v6;+ } localAddr, theHostAddr;+ int sFamily = 0; UInt16 theHostPort = 554; char* userName = NULL; char* password = NULL;@@ -177,14 +199,40 @@ { char* inAddrStr = prefTag->GetValue(); if (inAddrStr != NULL)- localAddr = SocketUtils::ConvertStringToAddr(inAddrStr);+ {+ char *ptr = strchr( inAddrStr, ':');+ + if (ptr == NULL) // it's v4 address+ {+ sFamily = AF_INET;+ localAddr.v4 = SocketUtils::ConvertStringToAddr(inAddrStr);+ }+ else // it's v6 address+ {+ sFamily = AF_INET6;+ memcpy(&localAddr.v6, SocketUtils::ConvertStringToAddr6(inAddrStr), sizeof(struct in6_addr));+ }+ } } prefTag = sourceTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "source_addr"); if (prefTag != NULL) { char* destAddrStr = prefTag->GetValue(); if (destAddrStr != NULL)- theHostAddr = SocketUtils::ConvertStringToAddr(destAddrStr);+ {+ char *ptr = strchr( destAddrStr, ':');+ + if (ptr == NULL) // it's v4 address+ {+ sFamily = AF_INET;+ theHostAddr.v4 = SocketUtils::ConvertStringToAddr(destAddrStr);+ }+ else // it's v6 address+ {+ sFamily = AF_INET6;+ memcpy(&theHostAddr.v6, SocketUtils::ConvertStringToAddr6(destAddrStr), sizeof(struct in6_addr));+ }+ } } prefTag = sourceTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "rtsp_port"); if (prefTag != NULL)@@ -215,11 +263,11 @@ if (fAnnounce) { fAnnounceURL = theURL.GetAsCString();- fAnnounceIP = theHostAddr; + memcpy( &fAnnounceIP, &theHostAddr, sizeof(struct in6_addr)); } else {- fHostAddr = theHostAddr;+ memcpy( &fHostAddr, &theHostAddr, sizeof(struct in6_addr)); fHostPort = theHostPort; fSourceURL = theURL.GetAsCString(); fUserName = RTSPOutputInfo::CopyString(userName);@@ -256,8 +304,8 @@ fStreamArray[x].Copy(*theSourceInfo.GetStreamInfo(x)); // Copy all stream info data. Also set fSrcIPAddr to be the host addr- fStreamArray[x].fSrcIPAddr = fClientSocket->GetHostAddr();- fStreamArray[x].fDestIPAddr = fClientSocket->GetLocalAddr();+ fStreamArray[x].fSrcIPAddr.v4 = fClientSocket->GetHostAddr();+ fStreamArray[x].fDestIPAddr.v4 = fClientSocket->GetLocalAddr(); fStreamArray[x].fPort = 0; fStreamArray[x].fTimeToLive = 0; }@@ -406,6 +454,61 @@ return announceSDP; } +char* RTSPSourceInfo::GetAnnounceSDP(struct in6_addr* ipAddr, UInt32* newSDPLen)+{+ char *announceSDP = NEW char[fLocalSDP.Len * 2];+ StringFormatter announceSDPFormatter(announceSDP, fLocalSDP.Len * 2);++ StrPtrLen sdpLine;+ StringParser sdpParser(&fLocalSDP);+ bool added = false;+ + while (sdpParser.GetDataRemaining() > 0)+ {+ //stop when we reach an empty line.+ sdpParser.GetThruEOL(&sdpLine);+ if (sdpLine.Len == 0)+ continue;+ + switch (*sdpLine.Ptr)+ {+ case 'c':+ break; // remove any existing c lines+ case 'm':+ {+ if (!added)+ {+ added = true;+ // add a c line before the first m line+ char ipStr[50];+ char buff[50];+ StrPtrLen temp(buff);+ + SocketUtils::ConvertAddrToString(ipAddr, &temp);+ + ::sprintf(ipStr, "c=IN IP6 %s", buff);+ StrPtrLen tempLine(ipStr);+ announceSDPFormatter.Put(tempLine);+ announceSDPFormatter.PutEOL();+ }++ announceSDPFormatter.Put(sdpLine);+ announceSDPFormatter.PutEOL();+ break;//ignore connection information+ }+ default:+ {+ announceSDPFormatter.Put(sdpLine);+ announceSDPFormatter.PutEOL();+ }+ }+ }+ + *newSDPLen = (UInt32)announceSDPFormatter.GetCurrentOffset();+ announceSDP[*newSDPLen] = 0;+ return announceSDP;+}+ void RTSPSourceInfo::ParseAnnouncedDestination(XMLTag* destTag, UInt32 index) { XMLTag* prefTag;@@ -417,14 +520,14 @@ { char* outAddrStr = prefTag->GetValue(); if (outAddrStr != NULL)- fOutputArray[index].fLocalAddr = SocketUtils::ConvertStringToAddr(outAddrStr);+ fOutputArray[index].fLocalAddr.v4 = SocketUtils::ConvertStringToAddr(outAddrStr); } prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "dest_addr"); if (prefTag != NULL) { char* destAddrStr = prefTag->GetValue(); if (destAddrStr != NULL)- fOutputArray[index].fDestAddr = SocketUtils::ConvertStringToAddr(destAddrStr);+ fOutputArray[index].fDestAddr.v4 = SocketUtils::ConvertStringToAddr(destAddrStr); } prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "rtsp_port"); if (prefTag != NULL)@@ -477,15 +580,23 @@ if (!fAnnounce) { StrPtrLen source(fSourceURL); - if( source.Equal(info->GetSourceURL()) && (fHostAddr == info->GetHostAddr()) + if( source.Equal(info->GetSourceURL()) && (fHostAddr.v4 == info->GetHostAddr()) && (fHostPort == info->GetHostPort()) ) return true; } else { StrPtrLen announceURL(fAnnounceURL);- if ((fAnnounceIP == info->GetAnnounceIP()) && announceURL.Equal(info->GetAnnounceURL()))- return true;+ if (family == AF_INET)+ {+ if ((fAnnounceIP.v4 == info->GetAnnounceIP()) && announceURL.Equal(info->GetAnnounceURL()))+ return true;+ }+ else if (family == AF_INET6)+ {+ if ((memcmp(&fAnnounceIP.v6, info->GetAnnounceIP6(), sizeof(struct in6_addr)) == 0) && announceURL.Equal(info->GetAnnounceURL()))+ return true;+ } } return false;@@ -493,7 +604,14 @@ void RTSPSourceInfo::SetSourceParameters(UInt32 inHostAddr, UInt16 inHostPort, StrPtrLen& inURL) {- fHostAddr = inHostAddr;+ fHostAddr.v4 = inHostAddr;+ fHostPort = inHostPort;+ fSourceURL = inURL.GetAsCString();+}++void RTSPSourceInfo::SetSourceParameters(struct in6_addr* inHostAddr, UInt16 inHostPort, StrPtrLen& inURL)+{+ memcpy(&fHostAddr.v6, inHostAddr, sizeof(struct in6_addr)); fHostPort = inHostPort; fSourceURL = inURL.GetAsCString(); }@@ -501,7 +619,7 @@ void RTSPSourceInfo::StartSessionCreatorTask(OSQueue* inSessionQueue, OSQueue* inSourceQueue) { InitClient(Socket::kNonBlockingSocketType);- SetClientInfo(fHostAddr, fHostPort, fSourceURL, fLocalAddr);+ SetClientInfo(fHostAddr.v4, fHostPort, fSourceURL, fLocalAddr.v4); if (fUserName != NULL) fClient->SetName(fUserName); if (fPassword != NULL)@@ -555,8 +673,8 @@ fStreamArray[x].Copy(*theSourceInfo.GetStreamInfo(x)); // Copy all stream info data. Also set fSrcIPAddr to be the host addr- fStreamArray[x].fSrcIPAddr = fClientSocket->GetHostAddr();- fStreamArray[x].fDestIPAddr = fClientSocket->GetLocalAddr();+ fStreamArray[x].fSrcIPAddr.v4 = fClientSocket->GetHostAddr();+ fStreamArray[x].fDestIPAddr.v4 = fClientSocket->GetLocalAddr(); fStreamArray[x].fPort = 0; fStreamArray[x].fTimeToLive = 0; }diff -u --new-file --recursive darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.h darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.h--- darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.h Mon Jun 10 17:32:49 2002+++ darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.h Tue Jul 2 15:31:08 2002@@ -77,10 +77,8 @@ public: // Specify whether the client should be blocking or non-blocking- RTSPSourceInfo(Bool16 inAnnounce) : fSourceURL(NULL),- fHostAddr(0),+ RTSPSourceInfo(Bool16 inAnnounce) : fSourceURL(NULL), fHostPort(0),- fLocalAddr(0), fUserName(NULL), fPassword(NULL), fRTSPInfoArray(NULL),@@ -89,13 +87,16 @@ fNumSetupsComplete(0), fDescribeComplete(false), fAnnounce(inAnnounce),- fAnnounceURL(NULL),- fAnnounceIP(0),- fAnnounceActualIP(0),+ fAnnounceURL(NULL), fRelaySessionCreatorTask(NULL), fSession(NULL), fSessionQueue(NULL),- fQueueElem(this) {}+ fQueueElem(this) {+ bzero(&(fHostAddr.v6), sizeof(struct in6_addr));+ bzero(&(fLocalAddr.v6), sizeof(struct in6_addr));+ bzero(&(fAnnounceIP.v6), sizeof(struct in6_addr));+ bzero(&(fAnnounceActualIP.v6), sizeof(struct in6_addr));+ } RTSPSourceInfo(const RTSPSourceInfo& copy); // Does copy dynamically allocated data // Doesn't copy fClientSocket and fClient ptrs@@ -106,7 +107,10 @@ void InitClient(UInt32 inSocketType); void SetClientInfo(UInt32 inAddr, UInt16 inPort, char* inURL, UInt32 inLocalAddr = 0);- ++ // IPv6 support. added by Aileen+ void SetClientInfo(struct in6_addr *inAddr, UInt16 inPort, char* inURL, struct in6_addr* inLocalAddr = NULL);+ // Call this immediately after the constructor. This object will parse // the config file and extract the necessary information to connect to an rtsp server. // Specify the config file line index where the "rtsp_source" line resides@@ -135,6 +139,10 @@ // producing an SDP file that appears to be local. virtual char* GetLocalSDP(UInt32* newSDPLen); virtual char* GetAnnounceSDP(UInt32 ipAddr, UInt32* newSDPLen);+ + //IPv6 suppport, added by aileen+ virtual char* GetAnnounceSDP(struct in6_addr* ipAddr, UInt32* newSDPLen);+ virtual StrPtrLen* GetSourceID() { return fClient->GetURL(); } // This object looks for this keyword in the FilePrefsSource, where it@@ -155,20 +163,28 @@ Bool16 IsAnnounce() { return fAnnounce; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -