]> granicus.if.org Git - taglib/commitdiff
a formal change: convert rifffile.cpp to use vector of structs instead of several...
authorNick Shaforostoff <shafff@ukr.net>
Wed, 23 Feb 2011 09:16:25 +0000 (09:16 +0000)
committerNick Shaforostoff <shafff@ukr.net>
Wed, 23 Feb 2011 09:16:25 +0000 (09:16 +0000)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1222376 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

taglib/riff/rifffile.cpp

index 5fa8e21253bd6c55aabb84b337b25a3f155e7a90..2910b5cc71b4a19f564ee35d9ddb141ecb64ab66 100644 (file)
 
 using namespace TagLib;
 
+struct Chunk
+{
+  ByteVector name;
+  uint offset;
+  uint size;
+  char padding;
+};
+
 class RIFF::File::FilePrivate
 {
 public:
@@ -46,10 +54,7 @@ public:
   uint size;
   ByteVector format;
 
-  std::vector<ByteVector> chunkNames;
-  std::vector<uint> chunkOffsets;
-  std::vector<uint> chunkSizes;
-  std::vector<char> chunkPadding;
+  std::vector<Chunk> chunks;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -81,22 +86,22 @@ TagLib::uint RIFF::File::riffSize() const
 
 TagLib::uint RIFF::File::chunkCount() const
 {
-  return d->chunkNames.size();
+  return d->chunks.size();
 }
 
 TagLib::uint RIFF::File::chunkDataSize(uint i) const
 {
-  return d->chunkSizes[i];
+  return d->chunks[i].size;
 }
 
 TagLib::uint RIFF::File::chunkOffset(uint i) const
 {
-  return d->chunkOffsets[i];
+  return d->chunks[i].offset;
 }
 
 TagLib::uint RIFF::File::chunkPadding(uint i) const
 {
-  return d->chunkPadding[i];
+  return d->chunks[i].padding;
 }
 
 ByteVector RIFF::File::chunkName(uint i) const
@@ -104,7 +109,7 @@ ByteVector RIFF::File::chunkName(uint i) const
   if(i >= chunkCount())
     return ByteVector::null;
 
-  return d->chunkNames[i];
+  return d->chunks[i].name;
 }
 
 ByteVector RIFF::File::chunkData(uint i)
@@ -117,39 +122,39 @@ ByteVector RIFF::File::chunkData(uint i)
   long begin = 12 + 8;
 
   for(uint it = 0; it < i; it++)
-    begin += 8 + d->chunkSizes[it] + d->chunkPadding[it];
+    begin += 8 + d->chunks[it].size + d->chunks[it].padding;
 
   seek(begin);
 
-  return readBlock(d->chunkSizes[i]);
+  return readBlock(d->chunks[i].size);
 }
 
 void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data)
 {
-  if(d->chunkNames.size() == 0) {
+  if(d->chunks.size() == 0) {
     debug("RIFF::File::setChunkData - No valid chunks found.");
     return;
   }
 
-  for(uint i = 0; i < d->chunkNames.size(); i++) {
-    if(d->chunkNames[i] == name) {
+  for(uint i = 0; i < d->chunks.size(); i++) {
+    if(d->chunks[i].name == name) {
 
       // First we update the global size
 
-      d->size += ((data.size() + 1) & ~1) - (d->chunkSizes[i] + d->chunkPadding[i]);
+      d->size += ((data.size() + 1) & ~1) - (d->chunks[i].size + d->chunks[i].padding);
       insert(ByteVector::fromUInt(d->size, d->endianness == BigEndian), 4, 4);
 
       // Now update the specific chunk
 
-      writeChunk(name, data, d->chunkOffsets[i] - 8, d->chunkSizes[i] + d->chunkPadding[i] + 8);
+      writeChunk(name, data, d->chunks[i].offset - 8, d->chunks[i].size + d->chunks[i].padding + 8);
 
-      d->chunkSizes[i] = data.size();
-      d->chunkPadding[i] = (data.size() & 0x01) ? 1 : 0;
+      d->chunks[i].size = data.size();
+      d->chunks[i].padding = (data.size() & 0x01) ? 1 : 0;
 
       // Now update the internal offsets
 
-      for(i++; i < d->chunkNames.size(); i++)
-        d->chunkOffsets[i] = d->chunkOffsets[i-1] + 8 + d->chunkSizes[i-1] + d->chunkPadding[i-1];
+      for(i++; i < d->chunks.size(); i++)
+        d->chunks[i].offset = d->chunks[i-1].offset + 8 + d->chunks[i-1].size + d->chunks[i-1].padding;
 
       return;
     }
@@ -157,8 +162,8 @@ void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data)
 
   // Couldn't find an existing chunk, so let's create a new one.
 
-  uint i = d->chunkNames.size() - 1;
-  ulong offset = d->chunkOffsets[i] + d->chunkSizes[i];
+  uint i =  d->chunks.size() - 1;
+  ulong offset = d->chunks[i].offset + d->chunks[i].size;
 
   // First we update the global size
 
@@ -172,13 +177,17 @@ void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data)
   // And update our internal structure
 
   if (offset & 1) {
-    d->chunkPadding[i] = 1;
+    d->chunks[i].padding = 1;
     offset++;
   }
-  d->chunkNames.push_back(name);
-  d->chunkSizes.push_back(data.size());
-  d->chunkOffsets.push_back(offset + 8);
-  d->chunkPadding.push_back((data.size() & 0x01) ? 1 : 0);
+  
+  Chunk chunk;
+  chunk.name = name;
+  chunk.size = data.size();
+  chunk.offset = offset + 8;
+  chunk.padding = (data.size() & 0x01) ? 1 : 0;
+
+  d->chunks.push_back(chunk);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -203,15 +212,15 @@ void RIFF::File::read()
       break;
     }
 
-    d->chunkNames.push_back(chunkName);
-    d->chunkSizes.push_back(chunkSize);
-
-    d->chunkOffsets.push_back(tell());
+    Chunk chunk;
+    chunk.name = readBlock(4);
+    chunk.size = readBlock(4).toUInt(bigEndian);
+    chunk.offset = tell();
 
-    seek(chunkSize, Current);
+    seek(chunk.size, Current);
 
     // check padding
-    char paddingSize = 0;
+    chunk.padding = 0;
     long uPosNotPadded = tell();
     if((uPosNotPadded & 0x01) != 0) {
       ByteVector iByte = readBlock(1);
@@ -220,10 +229,10 @@ void RIFF::File::read()
         seek(uPosNotPadded, Beginning);
       }
       else {
-        paddingSize = 1;
+        chunk.padding = 1;
       }
     }
-    d->chunkPadding.push_back(paddingSize);
+    d->chunks.push_back(chunk);
 
   }
 }