<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to feature-requests</title><link>https://sourceforge.net/p/csid3lib/feature-requests/</link><description>Recent changes to feature-requests</description><atom:link href="https://sourceforge.net/p/csid3lib/feature-requests/feed.rss" rel="self"/><language>en</language><lastBuildDate>Sat, 14 Feb 2015 20:37:30 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/csid3lib/feature-requests/feed.rss" rel="self" type="application/rss+xml"/><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#922d</link><description>&lt;div class="markdown_content"&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;status&lt;/strong&gt;: open --&amp;gt; closed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;assigned_to&lt;/strong&gt;: Andrew Pearmund&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andrew Pearmund</dc:creator><pubDate>Sat, 14 Feb 2015 20:37:30 -0000</pubDate><guid>https://sourceforge.netf36016c9e793b414dbdcf5ce028d9e90d5f58b81</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#b3fd</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Sorry it's taken so long to look at this again. I've put this into svn now. &lt;br /&gt;
NonNtfsReplace got split into 2 separate functions for 'with' and 'without' a permanent backup; it looked clearer that way.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andrew Pearmund</dc:creator><pubDate>Sat, 14 Feb 2015 20:36:41 -0000</pubDate><guid>https://sourceforge.neta5c5d6184309ee6bbd8cee0e4d1292e5efbed0fa</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#17ca</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;After looking a bit closer, I'd suspect that my (new) way is not really "unsafe", since there actually are two files involved (the original and the new .$$$ file). &lt;/p&gt;
&lt;p&gt;Once we reach the call to &lt;code&gt;File.Move()&lt;/code&gt; we can already be certain that the &lt;code&gt;.$$$&lt;/code&gt; file was successfully created in our destination folder.&lt;/p&gt;
&lt;p&gt;And having a look at the doc about &lt;code&gt;File.Move()&lt;/code&gt; all expected exceptions should not harm the original file.&lt;br /&gt;
Only successful calls would do away with the original file - and even if the rename would not succeed we'd still have the &lt;code&gt;.$$$&lt;/code&gt; file.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">ScruffR</dc:creator><pubDate>Tue, 06 Jan 2015 15:24:21 -0000</pubDate><guid>https://sourceforge.net4b857996d4df823761f1780187e40df81bb64983</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#bbcd</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;I'm not sure, which version you looked at, because I also found the &lt;code&gt;null&lt;/code&gt; exception.&lt;br /&gt;
That was one of the reasons why I deleted the original posts and uploaded the files new.&lt;br /&gt;
But as for your the comment about the unsafe name swapping, I'd have to have another look. I only did a quick "fix" and haven't looked as close as I probably should have done ;-)&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">ScruffR</dc:creator><pubDate>Tue, 06 Jan 2015 08:39:38 -0000</pubDate><guid>https://sourceforge.net82b9feb9e40c7d3ff5fa5972a97ba8d693fb7add</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#2b6a/559f</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Having looked at the code, I'm not sure what you're actually trying to achieve.&lt;/p&gt;
&lt;p&gt;Are you trying to do the file name swapping in an unsafe manner, so it doesn't use a temp file at all while swapping a rewritten file over the old one? That's what it looks like the code is doing, There's still problems with a null backupLocation being supplied to the System.IO.File.Replace function, too.&lt;/p&gt;
&lt;p&gt;I suspect what you're really trying to do is make sure there's no backup file left over once the rewrite has completed successfully. If so, it would be much better to let it use a temp backup file as normal, then use a parameter to arrange for it to be deleted when the operation has finished.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andrew Pearmund</dc:creator><pubDate>Mon, 05 Jan 2015 23:56:44 -0000</pubDate><guid>https://sourceforge.net5e7e052424237ce68bccbb64d3df80f654531be0</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#2b6a</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;And here the FileMover.cs&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;static&lt;/span&gt; &lt;span class="nb"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;FileMover&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// Securely moves a file to a new location. Overwrites any&lt;/span&gt;
    &lt;span class="c1"&gt;/// preexisting file at new location (= replacing file).&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// If NTFS is available this is done via File.Replace.&lt;/span&gt;
    &lt;span class="c1"&gt;/// If NTFS is not available it will be moved via deleting&lt;/span&gt;
    &lt;span class="c1"&gt;/// any preexisting file and moving. Do NOT rely on the&lt;/span&gt;
    &lt;span class="c1"&gt;/// backupFile being there - or not - after the move process.&lt;/span&gt;
    &lt;span class="c1"&gt;/// That is not predetermined. This method is clearly&lt;/span&gt;
    &lt;span class="c1"&gt;/// optimized for the case that NTFS is available. Consider NOT&lt;/span&gt;
    &lt;span class="c1"&gt;/// using it on any other filesystem, if performance is an issue!&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="sourceLocation"&amp;gt;The file to be moved.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="targetLocation"&amp;gt;The new resting place of the file.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="backupLocation"&amp;gt;A backup location that is used when replacing.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;static&lt;/span&gt; &lt;span class="bp"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;FileMove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;sourceLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;targetLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;backupLocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetLocation.Exists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;try&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;/////// if backupLocation is null no backup&lt;/span&gt;
          &lt;span class="nx"&gt;File.Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sourceLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="nx"&gt;targetLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PlatformNotSupportedException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Not operating on an NTFS volume&lt;/span&gt;
          &lt;span class="nx"&gt;NonNtfsReplace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sourceLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                         &lt;span class="nx"&gt;targetLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                         &lt;span class="nx"&gt;backupLocation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sourceLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;static&lt;/span&gt; &lt;span class="bp"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;NonNtfsReplace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;sourceLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;targetLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="nx"&gt;backupLocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// a unique name for a temp backup&lt;/span&gt;
      &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="n"&gt;backup2Location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;/////////////////////////////////////////////////////&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;/////////////////////////////////////////////////////&lt;/span&gt;
        &lt;span class="c1"&gt;// make sure there's space for the backup&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation.Exists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// find unique name for backup2&lt;/span&gt;
          &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;backup2Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Path.Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Path.GetDirectoryName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;Path.GetRandomFileName&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
          &lt;span class="n"&gt;backup2Location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backup2Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

          &lt;span class="c1"&gt;// rename the old backup to backup2&lt;/span&gt;
          &lt;span class="c1"&gt;// if this fails we just exit; no permanent changes have been made yet.&lt;/span&gt;
          &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;backup2Location.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;try&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// rename the old target to backup&lt;/span&gt;
          &lt;span class="c1"&gt;// if this fails we need to rename the old backup2 back&lt;/span&gt;
          &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;catch&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backup2Location&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// we've got a backup2 to unwind too&lt;/span&gt;
            &lt;span class="c1"&gt;// we managed to rename it once before, so this will probably work again&lt;/span&gt;
            &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backup2Location.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nb"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;////////////////////////////////&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;////////////////////////////////&lt;/span&gt;

      &lt;span class="nx"&gt;try&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// rename source to target&lt;/span&gt;
        &lt;span class="c1"&gt;// if this fails we need to rename the old target back&lt;/span&gt;
        &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sourceLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;catch&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;/////////////////////////////////////////&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;/////////////////////////////////////////&lt;/span&gt;

          &lt;span class="c1"&gt;// we managed to rename it once before, so this will probably work again&lt;/span&gt;
          &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backup2Location&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// we've got a backup2 to unwind too&lt;/span&gt;
            &lt;span class="nx"&gt;File.Move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backup2Location.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;backupLocation.FullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;////////////////////////&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;////////////////////////&lt;/span&gt;
        &lt;span class="nb"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;/////////////////////////////////////////////&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;backupLocation&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;/////////////////////////////////////////////&lt;/span&gt;

        &lt;span class="c1"&gt;// now finally get rid of the backup2&lt;/span&gt;
        &lt;span class="nx"&gt;try&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;backup2Location.Delete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;catch&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// if this fails we can ignore it, as the main operation has succeeded.&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;/////////////////////////&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;/////////////////////////&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Doh'  I've missed the add attachments, but I'll attach now&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">ScruffR</dc:creator><pubDate>Sun, 04 Jan 2015 20:36:21 -0000</pubDate><guid>https://sourceforge.neta13d8bfb23f747f70b9f3f36c726073be552798f</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#33a2</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Sure, I hope this meets your standards.&lt;/p&gt;
&lt;p&gt;Alterations in Mp3FileData.cs:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;    &lt;span class="vi"&gt;#region&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// Update ID3V2 and V1 tags in-situ if possible, or rewrite the file to add tags if necessary.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;returns&amp;gt;bool true if the MP3FileData object is dirty after this&amp;lt;/returns&amp;gt;&lt;/span&gt;

    &lt;span class="c1"&gt;//////////////////////////////////////////////////////////&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CacheDataState&lt;/span&gt; &lt;span class="nx"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;createBackup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//////////////////////////////////////////////////////////&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;TagModel.IsValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// the standard does not allow an id3v2 tag with no frames in, &lt;/span&gt;
        &lt;span class="c1"&gt;// so we must remove it completely.&lt;/span&gt;

        &lt;span class="c1"&gt;////////////////////////////////////////////////////////&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;UpdateNoV2tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createBackup&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;////////////////////////////////////////////////////////&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;TagModel.UpdateSize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;tagSizeComplete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;TagModel.Header.TagSizeWithHeaderFooter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tagSizeComplete&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;_audioStart&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;_audioReplaced&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;UpdateInSitu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tagSizeComplete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CacheDataState.eClean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// calculate enough padding to round final file to 2k cluster size.&lt;/span&gt;
          &lt;span class="nx"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;minLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tagSizeComplete&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;_audio.NumPayloadBytes&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ID3v1.TagLength&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nx"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;newLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;minLength&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2047&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFFFFF800&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// round up to whole 2k cluster&lt;/span&gt;
          &lt;span class="n"&gt;TagModel.Header.PaddingSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newLength&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;minLength&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

          &lt;span class="c1"&gt;//////////////////////////////////////////////////////////////////////////&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createBackup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;bakName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Path.ChangeExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_sourceFileInfo.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bak"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakFileInfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="c1"&gt;//////////////////////////////////////////////////////////////////////////&lt;/span&gt;

          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CacheDataState.eDirty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// rewrite the file and ID3V2 and V1 tags with no padding.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;returns&amp;gt;bool true if the MP3FileData object is dirty after this&amp;lt;/returns&amp;gt;&lt;/span&gt;

    &lt;span class="c1"&gt;///////////////////////////////////////////////////////////////////////&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CacheDataState&lt;/span&gt; &lt;span class="nx"&gt;UpdatePacked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;createBackup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;///////////////////////////////////////////////////////////////////////&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;TagModel.Count&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// the standard does not allow an id3v2 tag with no frames in, &lt;/span&gt;
        &lt;span class="c1"&gt;// so we must remove it completely.&lt;/span&gt;
        &lt;span class="c1"&gt;// this removes the padding too, of course.&lt;/span&gt;

        &lt;span class="c1"&gt;////////////////////////////////////////////////////&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;UpdateNoV2tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createBackup&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;////////////////////////////////////////////////////&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;TagModel.UpdateSize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;TagModel.Header.PaddingSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;/////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createBackup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;bakName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Path.ChangeExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_sourceFileInfo.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bak"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakFileInfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
          &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;//////////////////////////////////////////////////////////////////////////////&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CacheDataState.eDirty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// Update file and remove ID3V2 tag (if any); &lt;/span&gt;
    &lt;span class="c1"&gt;/// update file in-situ if possible, or rewrite the file to remove tag if necessary.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;returns&amp;gt;bool true if the MP3FileData object is unusable after this&amp;lt;/returns&amp;gt;&lt;/span&gt;

    &lt;span class="c1"&gt;//////////////////////////////////////////////////////////////////////// &lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CacheDataState&lt;/span&gt; &lt;span class="nx"&gt;UpdateNoV2tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;createBackup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;////////////////////////////////////////////////////////////////////////&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_audioStart&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;_audioReplaced&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// no v2 tag to start with; just update v1 tag&lt;/span&gt;
        &lt;span class="nx"&gt;UpdateInSituNoV2tag&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CacheDataState.eClean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createBackup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;FileInfo&lt;/span&gt; &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;bakName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Path.ChangeExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_sourceFileInfo.FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bak"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="n"&gt;bakFileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bakFileInfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
          &lt;span class="nx"&gt;RewriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CacheDataState.eDirty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="vi"&gt;#endregion&lt;/span&gt;

    &lt;span class="vi"&gt;#region&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">ScruffR</dc:creator><pubDate>Sun, 04 Jan 2015 20:27:04 -0000</pubDate><guid>https://sourceforge.netbbc9f743db5d6b5756b98a1263a0fe95daed7af3</guid></item><item><title>provide a nuget package</title><link>https://sourceforge.net/p/csid3lib/feature-requests/5/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;I've been meaning to do this for a while. Would anyone use it?&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andrew Pearmund</dc:creator><pubDate>Sun, 04 Jan 2015 17:24:26 -0000</pubDate><guid>https://sourceforge.netdcdb444f8c775a46320fe779762125e939733864</guid></item><item><title>#4 Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/?limit=25#aa9a</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;That sounds useful. &lt;br /&gt;
Can you send me your code changes, maybe by attaching them here?&lt;br /&gt;
Cheers.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andrew Pearmund</dc:creator><pubDate>Sun, 04 Jan 2015 17:18:52 -0000</pubDate><guid>https://sourceforge.netbc242ed40e7bb467c933cd03bb4042065717963c</guid></item><item><title>Parameter for Update/UpdatePacked/UdateNoV2tag to decide if Backup required (default true)</title><link>https://sourceforge.net/p/csid3lib/feature-requests/4/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;I've added some code to allow to suppress backuo creation when updating tags.&lt;br /&gt;
This would be nice if it found its way into thw official version too.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">ScruffR</dc:creator><pubDate>Sun, 04 Jan 2015 15:47:56 -0000</pubDate><guid>https://sourceforge.net0a5578c025d38ebe9b67443fdbed1b3b88bd1745</guid></item></channel></rss>