kwave  18.07.70
CodecManager.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  CodecManager.cpp - manager for Kwave's coders and decoders
3  -------------------
4  begin : Mar 10 2002
5  copyright : (C) 2002 by Thomas Eschenbacher
6  email : Thomas Eschenbacher <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 #include "config.h"
19 
20 #include <QLatin1Char>
21 #include <QMimeData>
22 #include <QRegExp>
23 #include <QMimeDatabase>
24 #include <QMimeType>
25 
26 #include "libkwave/CodecManager.h"
27 #include "libkwave/Decoder.h"
28 #include "libkwave/Encoder.h"
29 #include "libkwave/String.h"
30 
31 //***************************************************************************
32 /* static initializers */
33 QList<Kwave::Encoder *> Kwave::CodecManager::m_encoders;
34 QList<Kwave::Decoder *> Kwave::CodecManager::m_decoders;
35 
36 //***************************************************************************
37 //***************************************************************************
39 {
40 }
41 
42 //***************************************************************************
44 {
45  Q_ASSERT(m_encoders.isEmpty());
46  Q_ASSERT(m_decoders.isEmpty());
47 }
48 
49 //***************************************************************************
51 {
52  if (m_encoders.contains(&encoder)) return; /* already known */
53  m_encoders.append(&encoder);
54 }
55 
56 //***************************************************************************
58 {
59  if (!m_encoders.contains(encoder)) return; /* unknown */
60  m_encoders.removeAll(encoder);
61 }
62 
63 //***************************************************************************
65 {
66  if (m_decoders.contains(&decoder)) return; /* already known */
67  m_decoders.append(&decoder);
68 }
69 
70 //***************************************************************************
72 {
73  if (!m_decoders.contains(decoder)) return; /* unknown */
74  m_decoders.removeAll(decoder);
75 }
76 
77 //***************************************************************************
78 bool Kwave::CodecManager::canDecode(const QString &mimetype_name)
79 {
80  foreach (Kwave::Decoder *d, m_decoders)
81  if (d && d->supports(mimetype_name)) return true;
82  return false;
83 }
84 
85 //***************************************************************************
86 QString Kwave::CodecManager::mimeTypeOf(const QUrl &url)
87 {
88  const QString default_mime_type = QMimeType().name();
89 
90  foreach (Kwave::Decoder *d, m_decoders) {
91  if (!d) continue;
92  QString mime_type = d->mimeTypeOf(url);
93  if (mime_type != default_mime_type) return mime_type;
94  }
95  foreach (Kwave::Encoder *e, m_encoders) {
96  if (!e) continue;
97  QString mime_type = e->mimeTypeOf(url);
98  if (mime_type != default_mime_type) return mime_type;
99  }
100 
101  QMimeDatabase db;
102  return db.mimeTypeForUrl(url).name();
103 }
104 
105 //***************************************************************************
107 {
108  QStringList list;
109  foreach (Kwave::Encoder *e, m_encoders) {
110  if (!e) continue;
111  foreach (const Kwave::CodecBase::MimeType &mime_type, e->mimeTypes()) {
112  QString name = mime_type.name;
113  if (list.isEmpty() || !list.contains(name))
114  list.append(name);
115  }
116  }
117  return list;
118 }
119 
120 //***************************************************************************
121 Kwave::Decoder *Kwave::CodecManager::decoder(const QString &mimetype_name)
122 {
123  foreach (Kwave::Decoder *d, m_decoders)
124  if (d && d->supports(mimetype_name)) return d->instance();
125  return Q_NULLPTR;
126 }
127 
128 //***************************************************************************
129 Kwave::Encoder *Kwave::CodecManager::encoder(const QString &mimetype_name)
130 {
131  foreach (Kwave::Encoder *e, m_encoders)
132  if (e && e->supports(mimetype_name)) return e->instance();
133  return Q_NULLPTR;
134 }
135 
136 //***************************************************************************
138 {
139  QStringList list;
140  foreach (Kwave::Encoder *e, m_encoders) {
141  // loop over all mime types that the encoder supports
142  QList<Kwave::CodecBase::MimeType> types = e->mimeTypes();
143  QListIterator<Kwave::CodecBase::MimeType> ti(types);
144  while (ti.hasNext()) {
145  Kwave::CodecBase::MimeType type = ti.next();
146  QString extensions = type.patterns.join(_(" "));
147 
148  // skip if extensions are already known/present
149  if (!list.isEmpty() && list.join(_("\n")).contains(extensions))
150  continue;
151 
152  // otherwise append to the list
153  QString entry = extensions;
154  QString comment = type.description.replace(
155  QRegExp(_("/")), _(","));
156  entry += _("|") + comment;
157  list.append(entry + _(" (") + extensions + _(")"));
158  }
159  }
160  list.sort();
161  QString str_list = list.join(_("\n"));
162  Q_ASSERT(!str_list.contains(QLatin1Char('/')));
163  if (str_list.contains(QLatin1Char('/'))) {
164  qWarning("CodecManager::encodingFilter() -> '%s'", DBG(str_list));
165  }
166 
167  return str_list;
168 }
169 
170 //***************************************************************************
172 {
173  QStringList list;
174  QStringList all_extensions;
175 
176  foreach (Kwave::Decoder *d, m_decoders) {
177  // loop over all mime types that the decoder supports
178  QList<Kwave::CodecBase::MimeType> types = d->mimeTypes();
179  QListIterator<Kwave::CodecBase::MimeType> ti(types);
180  while (ti.hasNext()) {
181  Kwave::CodecBase::MimeType type = ti.next();
182  QString extensions = type.patterns.join(_(" "));
183 
184  // skip if extensions are already known/present
185  if (!list.isEmpty() && list.join(_("\n")).contains(extensions))
186  continue;
187 
188  // otherwise append to the list
189  all_extensions += type.patterns;
190  QString entry = extensions;
191  QString comment =
192  type.description.replace(QRegExp(_("/")), _(","));
193  entry += _("|") + comment;
194  list.append(entry + _(" (") + extensions + _(")"));
195  }
196  }
197 
198  // builtin type for macro files
199  all_extensions += _("*.kwave");
200  list.append(_("*.kwave|") + i18n("Kwave Macro Files") + _(" (*.kwave)"));
201 
202  // special entries for "all" and "all supported"
203  list.sort();
204  list.prepend(_("*|") + i18n("All Files"));
205  list.prepend(all_extensions.join(_(" ")) + _("|") +
206  i18n("All Supported Files"));
207 
208  QString str_list = list.join(_("\n"));
209  Q_ASSERT(!str_list.contains(QLatin1Char('/')));
210  if (str_list.contains(QLatin1Char('/'))) {
211  qWarning("CodecManager::decodingFilter() -> '%s'", DBG(str_list));
212  }
213 
214  return str_list;
215 }
216 
217 //***************************************************************************
218 //***************************************************************************
static QString encodingFilter()
virtual Encoder * instance()=0
static QString mimeTypeOf(const QUrl &url)
virtual QString mimeTypeOf(const QUrl &url)
Definition: CodecBase.cpp:140
virtual bool supports(const QMimeType &mimetype)
Definition: CodecBase.cpp:100
const char name[16]
Definition: memcpy.c:510
static void registerDecoder(Kwave::Decoder &decoder)
static QStringList encodingMimeTypes()
static QString decodingFilter()
static QList< Kwave::Decoder * > m_decoders
Definition: CodecManager.h:125
static Kwave::Decoder * decoder(const QString &mimetype_name)
static Kwave::Encoder * encoder(const QString &mimetype_name)
virtual const QList< CodecBase::MimeType > mimeTypes()
Definition: CodecBase.cpp:128
#define _(m)
Definition: memcpy.c:66
static QList< Kwave::Encoder * > m_encoders
Definition: CodecManager.h:122
static void unregisterEncoder(Kwave::Encoder *encoder)
#define DBG(qs)
Definition: String.h:55
static void unregisterDecoder(Kwave::Decoder *decoder)
static bool canDecode(const QString &mimetype_name)
virtual Decoder * instance()=0
static void registerEncoder(Kwave::Encoder &encoder)