summaryrefslogtreecommitdiff
path: root/library/mimetype.cpp
Side-by-side diff
Diffstat (limited to 'library/mimetype.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/mimetype.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/library/mimetype.cpp b/library/mimetype.cpp
index ef5d619..d0a578e 100644
--- a/library/mimetype.cpp
+++ b/library/mimetype.cpp
@@ -109,131 +109,189 @@ public:
Private() {}
~Private() {}
// ...
};
MimeType::Private* MimeType::d=0;
static QMap<QString,QString> *typeFor = 0;
static QMap<QString,QStringList> *extFor = 0;
MimeType::Private& MimeType::data()
{
if ( !d ) {
d = new Private;
d->setAutoDelete(TRUE);
static bool setCleanup = FALSE;
if ( !setCleanup ) {
qAddPostRoutine( cleanupMime );
setCleanup = TRUE;
}
}
return *d;
}
+/*!
+ \class MimeType mimetype.h
+ \brief The MimeType class provides MIME type information.
+
+ A MimeType object is a light-weight value which
+ provides information about a MIME type.
+
+ \ingroup qtopiaemb
+*/
+
+/*!
+ Constructs a MimeType.
+ Normally, \a ext_or_id is a MIME type,
+ but if \a ext_or_id starts with / or contains no /,
+ it is interpretted as a filename and the
+ extension (eg. .txt) is used as the
+ MIME type.
+*/
MimeType::MimeType( const QString& ext_or_id )
{
init(ext_or_id);
}
+/*!
+ Constructs a MimeType from the type() of \a lnk.
+*/
MimeType::MimeType( const DocLnk& lnk )
{
init(lnk.type());
}
+/*!
+ Returns the MIME type identifier.
+*/
QString MimeType::id() const
{
return i;
}
+/*!
+ Returns a description of the MIME Type. This is usually based
+ on the application() associated with the type.
+*/
QString MimeType::description() const
{
MimeTypeData* d = data(i);
return d ? d->description() : QString::null;
}
+/*!
+ Returns a small QPixmap appropriate for the MIME type.
+*/
QPixmap MimeType::pixmap() const
{
MimeTypeData* d = data(i);
return d ? d->regIcon() : QPixmap();
}
+/*!
+ \internal
+ This function is not generally available.
+*/
QString MimeType::extension() const
{
return extensions().first();
}
+
+/*!
+ \internal
+ This function is not generally available.
+*/
QStringList MimeType::extensions() const
{
loadExtensions();
return *(*extFor).find(i);
}
+/*!
+ Returns a larger QPixmap appropriate for the MIME type.
+*/
QPixmap MimeType::bigPixmap() const
{
MimeTypeData* d = data(i);
return d ? d->bigIcon() : QPixmap();
}
+/*!
+ Returns the AppLnk defining the application associated
+ with this MIME type, or 0 if none is associated.
+
+ The caller must not retain the pointer,
+ but of course you can dereference it to take a copy if needed.
+
+ \sa Service::binding()
+*/
const AppLnk* MimeType::application() const
{
MimeTypeData* d = data(i);
return d ? d->apps.first() : 0;
}
static QString serviceBinding(const QString& service)
{
// Copied from qtopiaservices
QString svrc = service;
for (int i=0; i<(int)svrc.length(); i++)
if ( svrc[i]=='/' ) svrc[i] = '-';
return "Service-"+svrc;
}
+/*!
+ \internal
+*/
void MimeType::registerApp( const AppLnk& lnk )
{
QStringList list = lnk.mimeTypes();
for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
MimeTypeData* cur = data()[*it];
AppLnk* l = new AppLnk(lnk);
if ( !cur ) {
cur = new MimeTypeData( *it );
data().insert( *it, cur );
cur->apps.append(l);
} else if ( cur->apps.count() ) {
Config binding(serviceBinding("Open/"+*it));
binding.setGroup("Service");
QString def = binding.readEntry("default");
if ( l->exec() == def )
cur->apps.prepend(l);
else
cur->apps.append(l);
} else {
cur->apps.append(l);
}
}
}
+/*!
+ \internal
+*/
void MimeType::clear()
{
delete d;
d = 0;
}
void MimeType::loadExtensions()
{
if ( !typeFor ) {
extFor = new QMap<QString,QStringList>;
typeFor = new QMap<QString,QString>;
loadExtensions("/etc/mime.types");
loadExtensions(QPEApplication::qpeDir()+"etc/mime.types");
}
}
void MimeType::loadExtensions(const QString& filename)
{
QFile file(filename);
if ( file.open(IO_ReadOnly) ) {
QTextStream in(&file);
QRegExp space("[ \t]+");
while (!in.atEnd()) {
QStringList tokens = QStringList::split(space, in.readLine());
@@ -265,42 +323,48 @@ void MimeType::init( const QString& ext_or_id )
int dot = ext_or_id.findRev('.');
QString ext = dot >= 0 ? ext_or_id.mid(dot+1) : ext_or_id;
i = (*typeFor)[ext.lower()];
if ( i.isNull() )
i = "application/octet-stream";
}
static bool appsUpdated = FALSE;
if ( !appsUpdated ) {
appsUpdated = TRUE;
updateApplications();
}
}
MimeTypeData* MimeType::data(const QString& id)
{
MimeTypeData* d = data()[id];
if ( !d ) {
int s = id.find('/');
QString idw = id.left(s)+"/*";
d = data()[idw];
}
return d;
}
+/*!
+ Returns a Qtopia folder containing application definitions.
+*/
QString MimeType::appsFolderName()
{
return QPEApplication::qpeDir() + "apps";
}
+/*!
+ Reloads application definitions.
+*/
void MimeType::updateApplications()
{
clear();
AppLnkSet apps( appsFolderName() );
updateApplications(&apps);
}
void MimeType::updateApplications(AppLnkSet* folder)
{
for ( QListIterator<AppLnk> it( folder->children() ); it.current(); ++it ) {
registerApp(*it.current());
}
}