SVN commit 437380 by wheeler: Continuing going through my pile-o-patches: Make it possible to save files using the save() with a tag mask without stripping the tags that do not fit the mask. I still need to do a little testing on this to make sure that the offsets are still computed correctly. BUG:96460 M +13 -7 mpegfile.cpp M +12 -0 mpegfile.h --- trunk/kdesupport/taglib/mpeg/mpegfile.cpp #437379:437380 @@ -263,12 +263,17 @@ bool MPEG::File::save(int tags) { - if(tags == NoTags) + return save(tags, true); +} + +bool MPEG::File::save(int tags, bool stripOthers) +{ + if(tags == NoTags && stripOthers) return strip(AllTags); if(!d->ID3v2Tag && !d->ID3v1Tag && !d->APETag) { - if(d->hasID3v1 || d->hasID3v2 || d->hasAPE) + if((d->hasID3v1 || d->hasID3v2 || d->hasAPE) && stripOthers) return strip(AllTags); return true; @@ -299,10 +304,10 @@ insert(d->ID3v2Tag->render(), d->ID3v2Location, d->ID3v2OriginalSize); } - else + else if(stripOthers) success = strip(ID3v2, false) && success; } - else if(d->hasID3v2) + else if(d->hasID3v2 && stripOthers) success = strip(ID3v2) && success; if(ID3v1 & tags) { @@ -311,13 +316,14 @@ seek(offset, End); writeBlock(d->ID3v1Tag->render()); } - else + else if(stripOthers) success = strip(ID3v1) && success; } - else if(d->hasID3v1) + else if(d->hasID3v1 && stripOthers) success = strip(ID3v1, false) && success; // Dont save an APE-tag unless one has been created + if((APE & tags) && d->APETag) { if(d->hasAPE) insert(d->APETag->render(), d->APELocation, d->APEOriginalSize); @@ -338,7 +344,7 @@ } } } - else if(d->hasAPE) + else if(d->hasAPE && stripOthers) success = strip(APE, false) && success; return success; --- trunk/kdesupport/taglib/mpeg/mpegfile.h #437379:437380 @@ -145,6 +145,18 @@ bool save(int tags); /*! + * Save the file. This will attempt to save all of the tag types that are + * specified by OR-ing together TagTypes values. The save() method above + * uses AllTags. This returns true if saving was successful. + * + * If \a stripOthers is true this strips all tags not included in the mask, + * but does not modify them in memory, so later calls to save() which make + * use of these tags will remain valid. This also strips empty tags. + */ + // BIC: combine with the above method + bool save(int tags, bool stripOthers); + + /*! * Returns a pointer to the ID3v2 tag of the file. * * If \a create is false (the default) this will return a null pointer