kwave  18.07.70
RIFFParser.h
Go to the documentation of this file.
1 /*************************************************************************
2  RIFFParser.h - parser for the RIFF format
3  -------------------
4  begin : Tue Mar 20 2002
5  copyright : (C) 2002 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef RIFF_PARSER_H
19 #define RIFF_PARSER_H
20 
21 #include "config.h"
22 
23 #include <QByteArray>
24 #include <QList>
25 #include <QObject>
26 #include <QStringList>
27 
28 #include "libkwave/ByteOrder.h"
29 
30 #include "RIFFChunk.h"
31 
32 class QIODevice;
33 
34 namespace Kwave
35 {
36  class RIFFChunk;
37 
38  class RIFFParser: public QObject
39  {
40  Q_OBJECT
41  public:
42 
49  RIFFParser(QIODevice &device, const QStringList &main_chunks,
50  const QStringList &known_subchunks);
51 
53  virtual ~RIFFParser();
54 
59  bool parse();
60 
70  bool parse(Kwave::RIFFChunk *parent,
71  quint32 offset, quint32 length);
72 
77  bool isSane();
78 
82  void dumpStructure();
83 
90  Kwave::RIFFChunk *findChunk(const QByteArray &path);
91 
93  unsigned int chunkCount(const QByteArray &path);
94 
101  Kwave::RIFFChunk *findMissingChunk(const QByteArray &name);
102 
110  void repair();
111 
112  public slots:
113 
115  void cancel();
116 
117  signals:
118 
120  void action(const QString &name);
121 
123  void progress(int percent);
124 
125  protected:
126 
134  QByteArray read4ByteString(qint64 offset);
135 
145  Kwave::RIFFChunk::ChunkType guessType(const QByteArray &name);
146 
148  bool isValidName(const char *name);
149 
151  bool isKnownName(const QByteArray &name);
152 
157  void detectEndianness();
158 
173  const QByteArray &name,
174  const QByteArray &format,
175  quint32 length,
176  quint32 phys_offset,
177  quint32 phys_length,
179 
189  bool addGarbageChunk(Kwave::RIFFChunk *parent, quint32 offset,
190  quint32 length);
191 
199  bool addEmptyChunk(Kwave::RIFFChunk *parent, const QByteArray &name,
200  quint32 offset);
201 
207  void listAllChunks(Kwave::RIFFChunk &parent,
208  Kwave::RIFFChunkList &list);
209 
216  Kwave::RIFFChunk *chunkAt(quint32 offset);
217 
229  QList<quint32> scanForName(const QByteArray &name, quint32 offset,
230  quint32 length,
231  int progress_start = 0,
232  int progress_count = 1);
233 
234  private:
235 
240  void collectGarbage();
241 
247  bool joinGarbageToEmpty();
248 
250  void fixGarbageEnds();
251 
253  void discardGarbage(Kwave::RIFFChunk &chunk);
254 
256  QIODevice &m_dev;
257 
260 
262  QStringList m_main_chunk_names;
263 
265  QStringList m_sub_chunk_names;
266 
269 
271  bool m_cancel;
272 
273  };
274 }
275 
276 #endif /* RIFF_PARSER_H */
277 
278 //***************************************************************************
279 //***************************************************************************
QStringList m_sub_chunk_names
Definition: RIFFParser.h:265
QByteArray read4ByteString(qint64 offset)
Definition: RIFFParser.cpp:208
void listAllChunks(Kwave::RIFFChunk &parent, Kwave::RIFFChunkList &list)
Definition: RIFFParser.cpp:525
byte_order_t
Definition: ByteOrder.h:25
Definition: App.h:33
RIFFParser(QIODevice &device, const QStringList &main_chunks, const QStringList &known_subchunks)
Definition: RIFFParser.cpp:58
bool isValidName(const char *name)
Definition: RIFFParser.cpp:76
void action(const QString &name)
Kwave::RIFFChunk * findMissingChunk(const QByteArray &name)
Definition: RIFFParser.cpp:544
virtual ~RIFFParser()
Definition: RIFFParser.cpp:71
bool isKnownName(const QByteArray &name)
Definition: RIFFParser.cpp:99
bool addGarbageChunk(Kwave::RIFFChunk *parent, quint32 offset, quint32 length)
Definition: RIFFParser.cpp:278
bool joinGarbageToEmpty()
Definition: RIFFParser.cpp:731
Kwave::RIFFChunk * chunkAt(quint32 offset)
Definition: RIFFParser.cpp:534
QStringList m_main_chunk_names
Definition: RIFFParser.h:262
const char name[16]
Definition: memcpy.c:510
unsigned int chunkCount(const QByteArray &path)
Definition: RIFFParser.cpp:463
QList< Kwave::RIFFChunk * > RIFFChunkList
Definition: RIFFChunk.h:30
void progress(int percent)
Kwave::RIFFChunk * findChunk(const QByteArray &path)
Definition: RIFFParser.cpp:443
Kwave::RIFFChunk m_root
Definition: RIFFParser.h:259
bool addEmptyChunk(Kwave::RIFFChunk *parent, const QByteArray &name, quint32 offset)
Definition: RIFFParser.cpp:293
Kwave::RIFFChunk::ChunkType guessType(const QByteArray &name)
Definition: RIFFParser.cpp:91
void discardGarbage(Kwave::RIFFChunk &chunk)
Definition: RIFFParser.cpp:796
Kwave::RIFFChunk * addChunk(Kwave::RIFFChunk *parent, const QByteArray &name, const QByteArray &format, quint32 length, quint32 phys_offset, quint32 phys_length, Kwave::RIFFChunk::ChunkType type)
Definition: RIFFParser.cpp:235
Kwave::byte_order_t m_endianness
Definition: RIFFParser.h:268
QIODevice & m_dev
Definition: RIFFParser.h:256
QList< quint32 > scanForName(const QByteArray &name, quint32 offset, quint32 length, int progress_start=0, int progress_count=1)
Definition: RIFFParser.cpp:484