Example #1
0
SongList ASXParser::Load(QIODevice* device, const QString& playlist_path,
                         const QDir& dir) const {
  // We have to load everything first so we can munge the "XML".
  QByteArray data = device->readAll();

  // (thanks Amarok...)
  // ASX looks a lot like xml, but doesn't require tags to be case sensitive,
  // meaning we have to accept things like: <Abstract>...</abstract>
  // We use a dirty way to achieve this: we make all tags lower case
  QRegExp ex("(<[/]?[^>]*[A-Z]+[^>]*>)");
  ex.setCaseSensitivity(Qt::CaseInsensitive);
  int index = 0;
  while ((index = ex.indexIn(data, index)) != -1) {
    data.replace(ex.cap(1).toLocal8Bit(), ex.cap(1).toLower().toLocal8Bit());
    index += ex.matchedLength();
  }

  // Some playlists have unescaped & characters in URLs :(
  ex.setPattern("(href\\s*=\\s*\")([^\"]+)\"");
  index = 0;
  while ((index = ex.indexIn(data, index)) != -1) {
    QString url = ex.cap(2);
    url.replace(QRegExp("&(?!amp;|quot;|apos;|lt;|gt;)"), "&amp;");

    QByteArray replacement = QString(ex.cap(1) + url + "\"").toLocal8Bit();
    data.replace(ex.cap(0).toLocal8Bit(), replacement);
    index += replacement.length();
  }

  QBuffer buffer(&data);
  buffer.open(QIODevice::ReadOnly);

  SongList ret;

  QXmlStreamReader reader(&buffer);
  if (!Utilities::ParseUntilElement(&reader, "asx")) {
    return ret;
  }

  while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "entry")) {
    Song song = ParseTrack(&reader, dir);
    if (song.is_valid()) {
      ret << song;
    }
  }
  return ret;
}
Example #2
0
SongList XSPFParser::Load(QIODevice* device, const QString& playlist_path,
                          const QDir& dir) const {
  SongList ret;

  QXmlStreamReader reader(device);
  if (!Utilities::ParseUntilElement(&reader, "playlist") ||
      !Utilities::ParseUntilElement(&reader, "trackList")) {
    return ret;
  }

  while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "track")) {
    Song song = ParseTrack(&reader, dir);
    if (song.is_valid()) {
      ret << song;
    }
  }
  return ret;
}
Example #3
0
        std::vector<MusicTrack> ParseAllTracks()
        {
            vector<MusicTrack> tracks;
            tracks.reserve( m_song.nbtrks );

            try
            {
                size_t cnttrk = 0;
                if( utils::LibWide().isLogOn() )
                    clog << "\t--- Parsing Tracks ---\n";
                while( m_itread != m_itEoC )
                {
                    //#1 - Find next track chunk
                    m_itread = DSE::FindNextChunk( m_itread, m_itEoC, DSE::eDSEChunks::trk );
                    if( m_itread != m_itEoC )
                    {
                        //Parse Track
                        tracks.push_back( ParseTrack() );
                        if( utils::LibWide().isLogOn() )
                            clog << "\t- Track " <<cnttrk <<", parsed " << tracks.back().size() <<" event(s)\n";
                        ++cnttrk;
                    }
                }

                if( utils::LibWide().isLogOn() )
                    clog << "\n\n";
            }
            catch( std::runtime_error & e )
            {
                stringstream sstr;
                sstr << e.what() << " Caught exception while parsing track # " <<tracks.size() <<"! ";
                throw std::runtime_error( sstr.str() );
            }

            return std::move(tracks);
        }
Example #4
0
KmlPastebufferType Kml::ParsePasteBuffer() {
    if( !wxTheClipboard->IsOpened() )
        if( ! wxTheClipboard->Open() ) return KML_PASTE_INVALID;

    wxTextDataObject data;
    wxTheClipboard->GetData( data );
    kmlText = data.GetText();
    wxTheClipboard->Close();

    if( kmlText.Find( _T("<kml") ) == wxNOT_FOUND ) return KML_PASTE_INVALID;

    TiXmlDocument doc;
    if( ! doc.Parse( kmlText.mb_str( wxConvUTF8 ), 0, TIXML_ENCODING_UTF8 ) ) {
		wxLogError( wxString( doc.ErrorDesc(), wxConvUTF8 ) );
		return KML_PASTE_INVALID;
	}
    if( 0 != strncmp( doc.RootElement()->Value(), "kml", 3 ) ) return KML_PASTE_INVALID;

    TiXmlHandle docHandle( doc.RootElement() );

	// We may or may not have a <document> depending on what the user copied.
    TiXmlElement* placemark = docHandle.FirstChild( "Document" ).FirstChild( "Placemark" ).ToElement();
    if( ! placemark ) {
        placemark = docHandle.FirstChild( "Placemark" ).ToElement();
	}
    if( ! placemark ) {
        wxString msg( _T("KML Parser found no <Placemark> tag in the KML.") );
        wxLogMessage( msg );
        return KML_PASTE_INVALID;
    }

    int pointCounter = 0;
    wxString name;
    for( ; placemark; placemark=placemark->NextSiblingElement() ) {
        TiXmlElement* e = placemark->FirstChildElement( "name" );
        if( e ) name = wxString( e->GetText(),wxConvUTF8 );
        pointCounter++;
    }

    if( pointCounter == 1 ) {

        // Is it a single waypoint?
        TiXmlNode* element = docHandle.FirstChild( "Document" ).FirstChild( "Placemark" ).FirstChild( "Point" ).ToNode();
        if( ! element ) element = docHandle.FirstChild( "Placemark" ).FirstChild( "Point" ).ToNode();
        if( element ) return ParseOnePlacemarkPoint( element, name );

        // Is it a dumb <LineString> track?
        element = docHandle.FirstChild( "Document" ).FirstChild( "Placemark" ).FirstChild( "LineString" ).ToNode();
        if( ! element ) element = docHandle.FirstChild( "Placemark" ).FirstChild( "LineString" ).ToNode();
        if( element ) return ParseTrack( element, name );

        // Is it a smart extended <gx:track> track?
        element = docHandle.FirstChild( "Document" ).FirstChild( "Placemark" ).FirstChild( "gx:Track" ).ToNode();
        if( ! element ) element = docHandle.FirstChild( "Placemark" ).FirstChild( "gx:Track" ).ToNode();
        if( element ) return ParseTrack( element, name );

        wxString msg( _T("KML Parser found a single <Placemark> in the KML, but no useable data in it.") );
        wxLogMessage( msg );
        return KML_PASTE_INVALID;
    }

    // Here we go with a full route.

    parsedRoute = new Route();
    bool foundPoints = false;
    bool foundTrack = false;
    TiXmlElement* element = docHandle.FirstChild( "Document" ).FirstChild( "name" ).ToElement();
    if( element )
        parsedRoute->m_RouteNameString = wxString( element->GetText(), wxConvUTF8 );

    RoutePoint* rp = NULL;
    placemark = docHandle.FirstChild( "Document" ).FirstChild( "Placemark" ).ToElement();
    for( ; placemark; placemark=placemark->NextSiblingElement() ) {

        TiXmlNode* n = placemark->FirstChild( "Point" );
        if( n ) {
            if( ParseOnePlacemarkPoint( n->ToElement(), name ) == KML_PASTE_WAYPOINT ) {
                parsedRoute->AddPoint( new RoutePoint( parsedRoutePoint ) );
                delete parsedRoutePoint;
                parsedRoutePoint = 0;
                foundPoints = true;
            }
        }

        n = placemark->FirstChild( "LineString" );
        if( n ) {
            ParseTrack( n->ToElement(), name );
            foundTrack = true;
        }
        n = placemark->FirstChild( "gx:Track" );
        if( n ) {
            ParseTrack( n->ToElement(), name );
            foundTrack = true;
        }
    }

    if( foundPoints && parsedRoute->GetnPoints() < 2 ) {
        wxString msg( _T("KML Parser did not find enough <Point>s to make a route.") );
        wxLogMessage( msg );
        foundPoints = false;
    }

    if( foundPoints && ! foundTrack ) return KML_PASTE_ROUTE;
    if( foundPoints && foundTrack ) return KML_PASTE_ROUTE_TRACK;
    if( ! foundPoints && foundTrack ) return KML_PASTE_TRACK;
    return KML_PASTE_INVALID;
}
Example #5
0
LoadStatus_t GdbLoader::Load(void)
{
    m_cOrdinal = 0;
    SetProgress(g_hExp, "Loading...", 0);

    size_t cOffset = sizeof(g_pGdbSignature);
    size_t cFileSize = (size_t)GetFileSize();
    do {
        const size_t cEndOffset_tmp = __min(cOffset + sizeof(CGdbRecordHdr), cFileSize);
        const char * const pRecord_tmp = GetFilePart(cOffset, cEndOffset_tmp);
        if (pRecord_tmp == NULL)
            return lsFailed;
        const CGdbRecordHdr * const pHdr_tmp = reinterpret_cast<const CGdbRecordHdr *>(pRecord_tmp);
        size_t cNextOffset = __min(cOffset + sizeof(CGdbRecordHdr) + pHdr_tmp->dwLen, cFileSize);
        const char * const pRecord = GetFilePart (cOffset, cNextOffset);
        if (pRecord == NULL)
            return lsFailed;
        const CGdbRecordHdr * const pHdr = reinterpret_cast<const CGdbRecordHdr *>(pRecord);

        switch (pHdr->btType) {
        case 'D': { // GDB format version.
            const CGdbFormatVersion * const pVer = static_cast<const CGdbFormatVersion *>(pHdr);
            switch (pVer->wdVersion) {
            case 0x6B:
            case 0x6C:
            case 0x6D:
//						AddLog(g_hExp, "GDB Format version %d.", pVer->wdVersion - 0x6B + 1);
                break;
            default:
//						ReportText ("Format version: 0x%02X.", pVer->wdVersion);
                break;
            }
            m_b2ndVersion = pVer->wdVersion == 0x6C;
            m_b3rdVersion = pVer->wdVersion == 0x6D;
            if (pVer->wdVersion > 0x6D)
                AddLog(g_hExp, "File was created with an untested version of MapSource.", NULL);
            break;
        }
        case 'A': { // MapSource version.
            const CGdbMSVersion * const pVer = static_cast<const CGdbMSVersion *> (pHdr);

            const char * const pRecord = GetFilePart (cOffset, cNextOffset + 10);
            if (pRecord == NULL)
                return lsFailed;
            if (::_strnicmp (pRecord + (cNextOffset - cOffset), "MapSource", 10) == 0)
                cNextOffset += 10;
            break;
        }

        case 'W': { // Waypoint.
            const CGdbWaypointHdr * const pWP = static_cast<const CGdbWaypointHdr *> (pHdr);
            ParseWaypoint (pWP, cOffset, cNextOffset);
            break;
        }

        case 'T': { // Track.
            const CGdbTrackHdr * const pTrack = static_cast<const CGdbTrackHdr *> (pHdr);
            ParseTrack (pTrack, cOffset, cNextOffset, cFileSize, false);
            break;
        }

        case 'R': { // Route.
            const CGdbRouteHdr * const pRoute = static_cast<const CGdbRouteHdr *> (pHdr);
            ParseRoute (pRoute, cOffset, cNextOffset);
            break;
        }

        case 'L': { // Map reference.
            const CGdbMapHdr * const pMap = static_cast<const CGdbMapHdr *> (pHdr);
            break;
        }

        case 'V': {	// Tail mark and map set info.
            break;
        }
        }

        cOffset = cNextOffset;

        SetProgress(g_hExp, NULL, ::MulDiv(100, cOffset, cFileSize));
    } while (cOffset < cFileSize);

    return lsOK;
}