Beispiel #1
0
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");
        }
    }
    
}
Beispiel #2
0
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;
}