QDomElement lastfm::Track::toDomElement( QDomDocument& xml ) const { QDomElement item = xml.createElement( "track" ); #define makeElement( tagname, getter ) { \ QString v = getter; \ if (!v.isEmpty()) \ { \ QDomElement e = xml.createElement( tagname ); \ e.appendChild( xml.createTextNode( v ) ); \ item.appendChild( e ); \ } \ } makeElement( "artist", d->artist ); makeElement( "albumArtist", d->albumArtist ); makeElement( "album", d->album ); makeElement( "track", d->title ); makeElement( "correctedArtist", d->correctedArtist ); makeElement( "correctedAlbumArtist", d->correctedAlbumArtist ); makeElement( "correctedAlbum", d->correctedAlbum ); makeElement( "correctedTrack", d->correctedTitle ); makeElement( "duration", QString::number( d->duration ) ); makeElement( "timestamp", QString::number( d->time.toTime_t() ) ); makeElement( "url", d->url.toString() ); makeElement( "source", QString::number( d->source ) ); makeElement( "rating", QString::number(d->rating) ); makeElement( "fpId", QString::number(d->fpid) ); makeElement( "mbId", mbid() ); makeElement( "loved", QString::number( isLoved() ) ); makeElement( "scrobbleStatus", QString::number( scrobbleStatus() ) ); makeElement( "scrobbleError", QString::number( scrobbleError() ) ); // put the images urls in the dom QMapIterator<lastfm::ImageSize, QUrl> imageIter( d->m_images ); while (imageIter.hasNext()) { QDomElement e = xml.createElement( "image" ); e.appendChild( xml.createTextNode( imageIter.next().value().toString() ) ); e.setAttribute( "size", imageIter.key() ); item.appendChild( e ); } // add the extras to the dom QDomElement extras = xml.createElement( "extras" ); QMapIterator<QString, QString> extrasIter( d->extras ); while (extrasIter.hasNext()) { QDomElement e = xml.createElement( extrasIter.next().key() ); e.appendChild( xml.createTextNode( extrasIter.value() ) ); extras.appendChild( e ); } item.appendChild( extras ); return item; }
// // First characters in scripts. // Create a UVector whose contents are pointers to UnicodeStrings for the First Characters in each script. // The vector is sorted according to this index's collation. // // This code is too slow to use, so for now hard code the data. // Hard coded implementation is follows. // UVector *AlphabeticIndex::firstStringsInScript(Collator *ruleBasedCollator, UErrorCode &status) { if (U_FAILURE(status)) { return NULL; } UnicodeString results[USCRIPT_CODE_LIMIT]; UnicodeString LOWER_A = UNICODE_STRING_SIMPLE("a"); UnicodeSetIterator siter(*TO_TRY); while (siter.next()) { const UnicodeString ¤t = siter.getString(); Collator::EComparisonResult r = ruleBasedCollator->compare(current, LOWER_A); if (r < 0) { // TODO fix; we only want "real" script characters, not // symbols. continue; } int script = uscript_getScript(current.char32At(0), &status); if (results[script].length() == 0) { results[script] = current; } else if (ruleBasedCollator->compare(current, results[script]) < 0) { results[script] = current; } } UnicodeSet extras; UnicodeSet expansions; RuleBasedCollator *rbc = dynamic_cast<RuleBasedCollator *>(ruleBasedCollator); const UCollator *uRuleBasedCollator = rbc->getUCollator(); ucol_getContractionsAndExpansions(uRuleBasedCollator, extras.toUSet(), expansions.toUSet(), true, &status); extras.addAll(expansions).removeAll(*TO_TRY); if (extras.size() != 0) { const Normalizer2 *normalizer = Normalizer2::getNFKCInstance(status); UnicodeSetIterator extrasIter(extras); while (extrasIter.next()) { const UnicodeString ¤t = extrasIter.next(); if (!TO_TRY->containsAll(current)) continue; if (!normalizer->isNormalized(current, status) || ruleBasedCollator->compare(current, LOWER_A) < 0) { continue; } int script = uscript_getScript(current.char32At(0), &status); if (results[script].length() == 0) { results[script] = current; } else if (ruleBasedCollator->compare(current, results[script]) < 0) { results[script] = current; } } } UVector *dest = new UVector(status); dest->setDeleter(uprv_deleteUObject); for (uint32_t i = 0; i < sizeof(results) / sizeof(results[0]); ++i) { if (results[i].length() > 0) { dest->addElement(results[i].clone(), status); } } dest->sortWithUComparator(sortCollateComparator, ruleBasedCollator, status); return dest; }