void ConfigManager::parseFile(QString fname){ tok.init(); tok.seterrorhandler(&tokerrorhandler); tok.settokens(tokens); tok.setcommentlinesequence("#"); // read the entire file! QFile file(fname); if(!file.open(QIODevice::ReadOnly)) throw Exception().set("could not open config file"); QByteArray b = file.readAll(); if(b.isNull() || b.isEmpty()) throw Exception().set("could not read config file"); b.append((char)0); file.close(); const char *data = b.constData(); tok.reset(data); bool done = false; while(!done){ // at the top level we parse frames and // variables int t = tok.getnext(); switch(t){ case T_VAR: parseVars(); break; case T_WINDOW: parseWindow(); break; case T_END: done=true; break; case T_PORT: port = tok.getnextint(); break; case T_SENDPORT: udpSendPort = tok.getnextint(); break; // the UDP client now sets its address from the first packet received // but this will override it case T_SENDADDR: tok.getnextstring(udpSendAddr); UDPClient::getInstance()->setAddress(udpSendAddr); break; case T_VALIDTIME: DataManager::dataValidInterval = tok.getnextfloat(); break; case T_SENDINTERVAL: sendInterval = tok.getnextfloat(); break; case T_UPDATEINTERVAL: graphicalUpdateInterval = tok.getnextfloat()*1000; break; case T_AUDIO: parseAudio(); break; case T_WAYPOINT: parseWaypoint(); break; default: throw UnexpException(&tok,"'var', 'frame', config data or end of file"); } } }
HRESULT TsubtitlePGSParser::parse(REFERENCE_TIME Istart, REFERENCE_TIME Istop, const unsigned char *data, size_t datalen) { HRESULT hr = S_OK; REFERENCE_TIME rtStart = Istart, rtStop = Istop; // Append the input buffer into global buffer //m_data.reserve(m_data.size()+datalen); m_data.append(data, datalen); while (m_data.size() > 0) { m_bitdata = Tbitdata(&m_data[0], m_data.size()); if (m_nCurSegment == NO_SEGMENT) { // 3 bytes HDMV_SEGMENT_TYPE nSegType = (HDMV_SEGMENT_TYPE)m_bitdata.readByte(); USHORT nUnitSize = m_bitdata.readShort(); // Not enough data for this segment but this is a bug (segments are truncated somewhere or nUnitSize is not reliable) if (m_data.size() < (size_t)nUnitSize + 3) { //nUnitSize = m_data.size()-3; return S_OK; } switch (nSegType) { case PALETTE : case OBJECT : case PRESENTATION_SEG : case DISPLAY : case WINDOW_DEF: m_nCurSegment = nSegType; m_nSegSize = nUnitSize; break; default : // Delete unknown segment if (nUnitSize + 3 <= (USHORT)m_data.size()) { m_data.erase(m_data.begin(), m_data.begin() + nUnitSize + 3); } else { m_data.clear(); } continue; } } // Seeking occurred, we need a presentation segment first if (m_pCurrentObject == NULL && m_nCurSegment != PRESENTATION_SEG) { if (m_data.size() < (unsigned int)m_nSegSize + 3) { m_data.clear(); return S_OK; } m_data.erase(m_data.begin(), m_data.begin() + m_nSegSize + 3); continue; } if (m_pCurrentObject == NULL) { m_pCurrentObject = new TcompositionObject(); m_compositionObjects.push_back(m_pCurrentObject); } int i = 0; switch (m_nCurSegment) { case PALETTE: #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse PALETTE rtStart=%I64i, rtStop=%I64i"), rtStart, rtStop); #endif if (m_nSegSize != 2) { parsePalette(m_bitdata, m_nSegSize); } else { m_pCurrentObject->m_bEmptySubtitles = true; } break; case OBJECT: #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse OBJECT rtStart=%I64i, rtStop=%I64i"), rtStart, rtStop); #endif parseObject(m_bitdata, m_nSegSize); break; case PRESENTATION_SEG: #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse PRESENTATION_SEG rtStart=%I64i, rtStop=%I64i (size=%d)"), rtStart, rtStop, m_nSegSize); #endif parsePresentationSegment(m_bitdata, rtStart); break; case WINDOW_DEF: #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse WINDOW_DEF rtStart=%I64i, rtStop=%I64i"), rtStart, rtStop); #endif parseWindow(m_bitdata, m_nSegSize); break; case DISPLAY: for (TcompositionObjects::iterator c = m_compositionObjects.begin(); c != m_compositionObjects.end(); c++) { if ((*c)->isReady()) { (*c)->m_bReady = true; if ((*c) == m_pCurrentObject) { m_pCurrentObject = NULL; } } } if (m_pCurrentObject != NULL && m_pCurrentObject->isEmpty()) { m_pCurrentObject->m_bEmptySubtitles = true; } #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse DISPLAY rtStart=%I64i, rtStop=%I64i (size=%d)"), rtStart, rtStop, m_nSegSize); #endif break; default: #if DEBUG_PGS_PARSER DPRINTF(_l("TsubtitlePGSParser::parse UNKNOWN Seg %d rtStart=%I64i"), m_nCurSegment, rtStart); #endif break; } m_nCurSegment = NO_SEGMENT; if (m_nSegSize + 3 <= (USHORT)m_data.size()) { m_data.erase(m_data.begin(), m_data.begin() + m_nSegSize + 3); } else { m_data.clear(); } } return hr; }