smlpkt.cpp
来自「linux下的一款播放器」· C++ 代码 · 共 728 行 · 第 1/2 页
CPP
728 行
CSmilPacketParser::~CSmilPacketParser(){ deleteNode(m_pRootNode);}CSmilPacketParser::SMILPacketParseResultCSmilPacketParser::getAtom(const char*& pBuf, UINT32 len, CSmilPacketTag*& pTag){ CSmilPacketParser::SMILPacketParseResult retCode = SMILUnknown; const char* pEnd; const char* pCur; pTag = 0; pEnd = pBuf + len; pCur = pBuf; if(*pCur == '(') { pCur++; pBuf = pCur; retCode = SMILOpenList; } else if(*pCur == ')') { pCur++; pBuf = pCur; retCode = SMILCloseList; } else { // skip whitespace while(isspace(*pCur) && (pCur < pEnd)) { pCur++; } if(pCur >= pEnd) { pBuf = pCur; retCode = SMILNoValue; } else if(*pCur == ')') { pCur++; pBuf = pCur; retCode = SMILCloseList; } else if(*pCur == '(') { pCur++; pBuf = pCur; retCode = SMILOpenList; } else { char* tmpBuf = new char [MAX_STRING_LEN + 2]; /* Flawfinder: ignore */ // one for null, one for luck char* pTmpBuf = tmpBuf; if(*pCur == '"') { pCur++; int iLen = 0; while((*pCur != '"') && (pCur < pEnd) && (++iLen < MAX_STRING_LEN)) { if(*pCur == '\\') { pCur++; *pTmpBuf++ = *pCur++; } else { *pTmpBuf++ = *pCur++; } } if(*pCur != '"') { pBuf = pCur; retCode = SMILMissingQuote; } else { *pTmpBuf = 0; pCur++; } } else { while((pCur<pEnd) && !isspace(*pCur) && (*pCur != ')') && (*pCur != '(') ) { if(*pCur == '\\') { pCur++; *pTmpBuf++ = *pCur++; } else { *pTmpBuf++ = *pCur++; } } *pTmpBuf = 0; } if( retCode != SMILMissingQuote ) { pTag = new CSmilPacketTag; pTag->m_name = tmpBuf; pBuf = pCur; retCode = SMILString; } HX_VECTOR_DELETE(tmpBuf); } } return retCode;}CSmilPacket*CSmilPacketParser::parse(IHXBuffer* pBuffer, REF(CSmilPacketParser::SMILPacketParseResult) pktPrsRslt){ BOOL bErrorOccurred = FALSE; CSmilPacketTag* pTag = 0; HX_RESULT pnr = HXR_OK; if(m_pRootNode) { deleteNode(m_pRootNode); } m_pRootNode = new Node; Node* pCurNode = m_pRootNode; Node* pCurList = m_pRootNode; CHXStack* pStack = new CHXStack; CBigByteQueue* pQueue = new CBigByteQueue(pBuffer->GetSize()); pQueue->EnQueue((void*)pBuffer->GetBuffer(), pBuffer->GetSize()); BOOL bFirst = TRUE; for(;;) { UINT32 bytesUsed; UINT32 bytesAvail = pQueue->GetQueuedItemCount(); if(bytesAvail <= 0) { break; } BYTE* pBuf = new BYTE[bytesAvail]; BYTE* p = pBuf; pQueue->DeQueue(pBuf, bytesAvail); bytesUsed = bytesAvail; if(pTag) { delete pTag; pTag = 0; } SMILPacketParseResult rc = getAtom((const char*&)p, bytesAvail, pTag); // /Fixes PR 32297 (release-build-only crash): // In case rc is SMILMissingQuote, quit and return an error, // otherwise a 0-sized buffer gets created later on that is the // subject of an access violation: INT32 lSizeToEnqueue = bytesAvail - (p - pBuf); HX_ASSERT(lSizeToEnqueue >= 0); // /If < 0, something is messed up. if (0 == lSizeToEnqueue && SMILMissingQuote == rc) { pktPrsRslt = rc; bErrorOccurred = TRUE; goto cleanup; } pQueue->EnQueue(p, (UINT32)(bytesAvail - (p - pBuf))); switch(rc) { case SMILOpenList: { Node* pNode = new Node; if(pCurNode == m_pRootNode) { pCurNode->car = pNode; } else { pCurNode->cdr = pNode; } pStack->Push(pNode); pCurNode = pNode; } break; case SMILString: { if(bFirst) { bFirst = FALSE; } else { Node* pNode = new Node; if(!pCurNode->m_bIsSymbol) { if(!pCurNode->car) pCurNode->car = pNode; else pCurNode->cdr = pNode; } else { pCurNode->cdr = pNode; } pCurNode = pNode; } pCurNode->m_name = pTag->m_name; pCurNode->m_bIsSymbol = TRUE; } break; case SMILCloseList: { pCurNode = (Node*)pStack->Pop(); } break; default: break; } HX_VECTOR_DELETE(pBuf); } cleanup: if(pTag) { delete pTag; } delete pQueue; delete pStack; if (bErrorOccurred) { return NULL; } return evalNode(getRoot());}voidCSmilPacketParser::deleteNode(Node* pNode){ if(!pNode) { return; } deleteNode(pNode->car); deleteNode(pNode->cdr); delete pNode;}voidCSmilPacketParser::eval(Node* pNode, CSmilPacket* pPacket){ if(!pNode) return; BOOL bFirst = TRUE; const char* pName = 0; const char* pValue[MAX_ARGS] = {0}; int i = 0; while(pNode && i < MAX_ARGS) { if(pNode->m_bIsSymbol) { if(bFirst) { pName = (const char*)pNode->m_name; bFirst = FALSE; i = 0; } else { pValue[i] = (const char*)pNode->m_name; i++; } } else { eval(pNode->car, pPacket); } pNode = pNode->cdr; } if(pName) { pPacket->assign(pName, pValue, i); }}CSmilPacket*CSmilPacketParser::evalNode(Node* pNode){ if(!pNode || !pNode->m_bIsSymbol) { return 0; } CSmilPacket* pPacket = 0; // const char* pID = 0; const char* pName = 0; pName = (const char*)pNode->m_name; pNode = pNode->cdr; if(pNode) {// if(pNode->m_bIsSymbol)// {// pID = (const char*)pNode->m_name;// pNode = pNode->cdr;// }// else// {// pID = "<anonymous>";// } if(strcmp(pName, "smil-document") == 0) { pPacket = new CSmilDocumentPacket; } else if(strcmp(pName, "add-channel") == 0) { pPacket = new CSmilAddChannelPacket; } else if(strcmp(pName, "add-group") == 0) { pPacket = new CSmilAddGroupPacket; } else if(strcmp(pName, "play-group") == 0) { pPacket = new CSmilPlayGroupPacket; } else if(strcmp(pName, "add-source") == 0) { pPacket = new CSmilAddSourcePacket; } else if(strcmp(pName, "source-added") == 0) { pPacket = new CSmilSourceAddedPacket; } else if(strcmp(pName, "end-layout") == 0) { pPacket = new CSmilEndLayoutPacket; } else if(strcmp(pName, "meta") == 0) { pPacket = new CSmilMetaValuesPacket; } if(pPacket) { eval(pNode, pPacket); } return pPacket; } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?