📄 xmlesc.cpp
字号:
* to be referenced to. * This contains the absolute url if that is needed, or it * is used in the call to GetParameter(...). * pQueue A pointer to a CBigByteGrowingQueue that is used for queuing up * the output. * cEndQuote - the character to end the quote (either ' or ") * * DESCRIPTION: * This Method pushes HREF onto the output queue. It must build the * Url from the m_pServerUrl and the parameter (GetParameter). * * * RETURNS: * void *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/BOOLCEscapeXMLtoHTML::PushOpenningHREF(const UCHAR* pPositionPointer, CBigByteGrowingQueue* pQueue, char cEndQuote){ // if relative path // TODO: else we need to take care of full paths - // pPositionPointer or if m_pOurPath has a protocol as well. const char* pszQuote = strchr((const char*) pPositionPointer, cEndQuote); if (pszQuote) { UINT32 ulLen = ((const UCHAR*) pszQuote) - pPositionPointer; if ( strncmp((const char*)pPositionPointer, "rtsp://", 7) == 0 ) { const char* p = (const char*)pPositionPointer; const char* pEnd = p + ulLen; p += 7; // move p to the end of server name find the first : or / while ( *p != ':' && *p != '/' && ++p != pEnd) {} ; pQueue->EnQueue(m_pEscapeStrings[BeginHREF]); // replacing rtsp with http //XXXJHUG -- If the server in m_pServerUrl is the same as the // server we are about queue we will use m_pServerUrl // instead of the default port and mountpoint. // mover past http:// char* pBeginServer = m_pServerUrl + 7; UINT32 ulServerLen = 0; char* pServerPort = strchr(pBeginServer, ':'); // m_pServerURL will always have a port. HX_ASSERT(pServerPort); if ( pServerPort ) { ulServerLen = pServerPort - pBeginServer; } // 7 for rtsp:// UINT32 ulXMLServerLen = p - (const char*)pPositionPointer - 7; if ( ulServerLen == ulXMLServerLen && strncmp(pBeginServer, (const char*)pPositionPointer + 7, ulServerLen) == 0 ) { // use m_pServerURL pQueue->EnQueue(m_pServerUrl); } else { // use the Default Port pQueue->EnQueue("http"); pQueue->EnQueue((void*)(pPositionPointer + 4), p - (const char*)pPositionPointer - 4); pQueue->EnQueue(m_pDefaultView); } while ( *p != '/' && ++p != pEnd) {} ; UCHAR* pParam = GetParameter((const UCHAR*)p, pEnd - p); pQueue->EnQueue("?"); pQueue->EnQueue((const char*)pParam); HX_VECTOR_DELETE(pParam); pQueue->EnQueue("\">"); } else if ( strnchr((const char*)pPositionPointer, ':', min(6, ulLen)) ) { if ( strncmp((const char*)pPositionPointer, "pnm://", 6) != 0 && (strncmp(m_pServerUrl, "http://localhost", sizeof("http://localhost") - 1) == 0 || strncmp(m_pServerUrl, "http://127.0.0.1", sizeof("http://127.0.0.1") - 1) == 0) ) { pQueue->EnQueue(m_pEscapeStrings[BeginHREF]); pQueue->EnQueue(m_pServerUrl); pQueue->EnQueue("?"); UCHAR* pParam = GetParameter(pPositionPointer, ulLen, TRUE); pQueue->EnQueue((const char*)pParam); HX_VECTOR_DELETE(pParam); pQueue->EnQueue("\">"); } else { return FALSE; } } else { pQueue->EnQueue(m_pEscapeStrings[BeginHREF]); pQueue->EnQueue(m_pServerUrl); pQueue->EnQueue("?"); UCHAR* pParam = GetParameter(pPositionPointer, ulLen); pQueue->EnQueue((const char*)pParam); HX_VECTOR_DELETE(pParam); pQueue->EnQueue("\">"); } } return TRUE;}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * PushEndingHREF(pQueue) * * PARAMETERS: * pQueue A pointer to a CBigByteGrowingQueue that is used for queuing up * the parsered output. * * DESCRIPTION: * Pushes end of HREF onto the output queue. * * RETURNS * void *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/voidCEscapeXMLtoHTML::PushEndingHREF(CBigByteGrowingQueue* pQueue){ pQueue->EnQueue(m_pEscapeStrings[EndHREF]);}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * GetParameter(pPositionPointer, ulNameLen) * * PARAMETERS: * pPositionPointer Pointer to a character string. It is positioned * inside a quote right infront of the path or file to * to be referenced to. * ulNameLen The length of the name. It is not zero terminated. * * DESCRIPTION: * This method builds a relative path and paramiterizes it. Then the * parameter is encrypted with a call to EncryptParameter(). A string * is allocated to be returned * * RETURNS * a pointer to a new string that is to be used after the ? for an * option in a url *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/UCHAR*CEscapeXMLtoHTML::GetParameter(const UCHAR* pPositionPointer, UINT32 ulNameLen, BOOL bFullPath){ // allocate longest possible string char* pReturnBuffer = new char[(strlen(m_pOurPath) + ulNameLen) + 10]; // 2 for a possible starting '/' and a null terminator // 4 for the starting src= // 4 for extra bytes in case we have to pad the buffer when we encypt it. strcpy(pReturnBuffer, "src="); /* Flawfinder: ignore */ char* pLinkPath = pReturnBuffer + 4; // if it starts with '/' then it is a full path if ( *pPositionPointer == '/' || bFullPath ) { strncpy(pLinkPath, (const char*)pPositionPointer, ulNameLen); /* Flawfinder: ignore */ pLinkPath[ulNameLen] = '\0'; } // if it is alpha it is simply a file name else if ( isalnum(*pPositionPointer) ) { // 1 for "/" UINT32 len = strlen(m_pOurPath) + ulNameLen + 1; strcpy(pLinkPath, m_pOurPath); /* Flawfinder: ignore */ strcat(pLinkPath, "/"); /* Flawfinder: ignore */ strncat(pLinkPath, (const char*)pPositionPointer, ulNameLen); /* Flawfinder: ignore */ pLinkPath[len] = '\0'; } else if ( !strncmp((const char*)pPositionPointer, "./", 2) ) { // -1 for . UINT32 len = strlen(m_pOurPath) + ulNameLen - 1; strcpy(pLinkPath, m_pOurPath); /* Flawfinder: ignore */ pPositionPointer += 1; strncat(pLinkPath, (const char*)pPositionPointer, ulNameLen - 1); /* Flawfinder: ignore */ pLinkPath[len] = '\0'; } else if ( !strncmp((const char*)pPositionPointer, "../", 3 ) ) { int count = 0; // copy m_pOurPath into pLinkPath ourselves cause we need to be at // the end anyway. const char* pSrc = m_pOurPath; char* pCurrentEndOfPath = pLinkPath; const char* pRelativePath = (const char*)pPositionPointer; // Walk to take care of any ../ that might be in the path... char* pDest = pCurrentEndOfPath; while ( *pSrc ) { while ( *pSrc == '.' && *(pSrc + 1) == '.' && *(pSrc + 2) == '/' ) { --pDest; while ( *(pDest-1) != '/' && (pDest-1) >= pLinkPath ) { --pDest; } pSrc += 3; } *pDest = *pSrc; ++pDest; ++pSrc; } *pDest = '\0'; pCurrentEndOfPath += strlen(pCurrentEndOfPath); // back up a directory off of the file path for // every ../ we find while (!strncmp((const char*)pRelativePath, "../", 3 )) { // we found a ../ so back up a directory on the path, // walk backwards to the previous / and set it to null while (*pCurrentEndOfPath != '/' && pCurrentEndOfPath >= pLinkPath) { pCurrentEndOfPath--; } // watch to make sure we don't have more ../ than directories if ( pCurrentEndOfPath < pLinkPath) { ++pCurrentEndOfPath; } *pCurrentEndOfPath = '\0'; pRelativePath +=3; } UINT32 len = (pCurrentEndOfPath - pLinkPath) + ulNameLen - (pRelativePath - (const char*)pPositionPointer) + 1; // back 1 off of pRelativePath so we get the / that's there. strncat(pLinkPath, (const char*)pRelativePath - 1, /* Flawfinder: ignore */ ulNameLen - (pRelativePath - (const char*)pPositionPointer) + 1); pLinkPath[len] = '\0'; } else { HX_ASSERT(FALSE); pLinkPath = '\0'; } char* pParam = EncryptParameter(pReturnBuffer); HX_VECTOR_DELETE(pReturnBuffer); return (UCHAR*)pParam;}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * EncryptParameter(pPath) * * PARAMETERS: * pPath Pointer to a string to be parameterized and encrypted. * * DESCRIPTION: * First it is assigned to a variable (src), and then the parameter is * encrypted * * RETURNS * a pointer to a new string that is to be used after the ? for an * option in a url *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/char*CEscapeXMLtoHTML::EncryptParameter(char* pPath){ UINT32 FinalLen; // length of encoded data UINT32 Offset = strlen(pPath); UINT32 nAlign = Offset % sizeof(ULONG32); if (nAlign > 0) { for (; nAlign < sizeof(ULONG32); nAlign++) { pPath[Offset++] = 0; } } FinalLen = (Offset) * Perplex_PER_ULONG32 / sizeof(ULONG32); // calc size of the outout (Perplexed) buffer. // alloc mem for final perplexed buffer // Add one to length 'cause low level perplex adds // a '\0' to the resulting string char* output = new char[FinalLen+1]; CHXPerplex::DumpToPerplex((char*)output,FinalLen+1,(UCHAR*) pPath, Offset); return output;}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * CheckTag (pObj) * * PARAMETERS: * pObj current state * * DESCRIPTION: * This method pushes the begging of a color tag onto the queue * * RETURNS * void *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/BOOLCEscapeXMLtoHTML::CheckTag(DataObject* pObj){ if ( m_pHotTags ) { for ( INT32 i = 0; m_pHotTags[i]; i++ ) { if ( !strcmp(pObj->tag, m_pHotTags[i]) ) { return TRUE; } } } return FALSE;}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * BeginColorTag (CBigByteGrowingQueue* qu, DataObject *pObj) * * PARAMETERS: * qu queue to output to * pObj current state * DESCRIPTION: * This method pushes the begging of a color tag onto the queue * RETURNS * void *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/voidCEscapeXMLtoHTML::BeginColorTag (CBigByteGrowingQueue* qu, DataObject *pObj){ qu->EnQueue(m_pEscapeStrings[BeginTagMarkup]); qu->EnQueue("<"); qu->EnQueue(m_pEscapeStrings[BeginTagNameMarkup]); pObj->state = ABOUT_TO_BEGIN_TAG; pObj->bPushChar = FALSE;}/*___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * EndColorTag (CBigByteGrowingQueue* qu, DataObject *pObj) * * PARAMETERS: * qu queue to output to * pObj current state * * DESCRIPTION: * This method pushes the end of a color tag onto the queue * * RETURNS * void *___________________________________________________________________________ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/voidCEscapeXMLtoHTML::EndColorTag (CBigByteGrowingQueue* qu, DataObject *pObj){ if ( pObj->bInBrokenXML ) { qu->EnQueue(m_pEscapeStrings[EndBrokenAttributeMarkup]); pObj->bInBrokenXML = FALSE; } if ( pObj->bInProcessingInstructions ) { qu->EnQueue(m_pEscapeStrings[EndProcessingInstructions]); qu->EnQueue(m_pEscapeStrings[BeginTagMarkup]); qu->EnQueue(">"); qu->EnQueue(m_pEscapeStrings[EndTagMarkup]); pObj->bInProcessingInstructions = FALSE; } else { qu->EnQueue(">"); qu->EnQueue(m_pEscapeStrings[EndTagMarkup]); } pObj->state = IN_CONTENT; pObj->bPushChar = FALSE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -