summaryrefslogtreecommitdiff
path: root/library/mimetype.cpp
Unidiff
Diffstat (limited to 'library/mimetype.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/mimetype.cpp165
1 files changed, 128 insertions, 37 deletions
diff --git a/library/mimetype.cpp b/library/mimetype.cpp
index 9fab160..e2e0dab 100644
--- a/library/mimetype.cpp
+++ b/library/mimetype.cpp
@@ -1,5 +1,5 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
@@ -25,2 +25,4 @@
25#include "qpeapplication.h" 25#include "qpeapplication.h"
26#include "config.h"
27
26#include <qfile.h> 28#include <qfile.h>
@@ -31,18 +33,15 @@
31#include <qmap.h> 33#include <qmap.h>
32 34
35
36static void cleanupMime()
37{
38 MimeType::clear();
39}
40
33class MimeTypeData { 41class MimeTypeData {
34public: 42public:
35 MimeTypeData(const QString& i, const AppLnk& lnk, const QString& icon ) : 43 MimeTypeData(const QString& i) :
36 id(i), 44 id(i)
37 desc(lnk.name()+" document"),
38 app(lnk)
39 { 45 {
40 if ( icon.isEmpty() ) { 46 apps.setAutoDelete(TRUE);
41 regIcon = lnk.pixmap();
42 bigIcon = lnk.bigPixmap();
43 } else {
44 QImage unscaledIcon = Resource::loadImage( icon );
45 regIcon.convertFromImage( unscaledIcon.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) );
46 bigIcon.convertFromImage( unscaledIcon.smoothScale( AppLnk::bigIconSize(), AppLnk::bigIconSize() ) );
47 }
48 } 47 }
@@ -50,22 +49,81 @@ public:
50 QString extension; 49 QString extension;
50 QList<AppLnk> apps;
51
52 QString description()
53 {
54 if ( desc.isEmpty() )
55 desc = QPEApplication::tr("%1 document").arg(apps.first()->name());
56 return desc;
57 }
58
59 QPixmap regIcon()
60 {
61 if ( regicon.isNull() )
62 loadPixmaps();
63 return regicon;
64 }
65
66 QPixmap bigIcon()
67 {
68 if ( bigicon.isNull() )
69 loadPixmaps();
70 return bigicon;
71 }
72
73private:
74 void loadPixmaps()
75 {
76 if ( apps.count() ) {
77 QString icon;
78 for (AppLnk* lnk = apps.first(); icon.isNull() && lnk; lnk=apps.next()) {
79 QStringList icons = lnk->mimeTypeIcons();
80 if ( icons.count() ) {
81 QStringList types = lnk->mimeTypes();
82 for (QStringList::ConstIterator t=types.begin(),i=icons.begin(); t!=types.end() && i!=icons.end(); ++i,++t) {
83 if ( *t == id ) {
84 icon = *i;
85 break;
86 }
87 }
88 }
89 }
90 if ( icon.isNull() ) {
91 AppLnk* lnk = apps.first();
92 regicon = lnk->pixmap();
93 bigicon = lnk->bigPixmap();
94 } else {
95 QImage unscaledIcon = Resource::loadImage( icon );
96 regicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) );
97 bigicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::bigIconSize(), AppLnk::bigIconSize() ) );
98 }
99 }
100 }
101
102 QPixmap regicon;
103 QPixmap bigicon;
51 QString desc; 104 QString desc;
52 QPixmap regIcon;
53 QPixmap bigIcon;
54 AppLnk app;
55}; 105};
56 106
57class MimeType::Dict : public QDict<MimeTypeData> { 107class MimeType::Private : public QDict<MimeTypeData> {
58public: 108public:
59 Dict() {} 109 Private() {}
110 ~Private() {}
111
112 // ...
60}; 113};
61 114
62MimeType::Dict* MimeType::d=0; 115MimeType::Private* MimeType::d=0;
63static QMap<QString,QString> *typeFor = 0; 116static QMap<QString,QString> *typeFor = 0;
64static QMap<QString,QString> *extFor = 0; 117static QMap<QString,QStringList> *extFor = 0;
65 118
66MimeType::Dict& MimeType::dict() 119MimeType::Private& MimeType::data()
67{ 120{
68 if ( !d ) { 121 if ( !d ) {
69 d = new Dict; 122 d = new Private;
70 d->setAutoDelete(TRUE); 123 d->setAutoDelete(TRUE);
124 static bool setCleanup = FALSE;
125 if ( !setCleanup ) {
126 qAddPostRoutine( cleanupMime );
127 setCleanup = TRUE;
128 }
71 } 129 }
@@ -92,3 +150,3 @@ QString MimeType::description() const
92 MimeTypeData* d = data(i); 150 MimeTypeData* d = data(i);
93 return d ? d->desc : QString::null; 151 return d ? d->description() : QString::null;
94} 152}
@@ -98,3 +156,3 @@ QPixmap MimeType::pixmap() const
98 MimeTypeData* d = data(i); 156 MimeTypeData* d = data(i);
99 return d ? d->regIcon : QPixmap(); 157 return d ? d->regIcon() : QPixmap();
100} 158}
@@ -103,2 +161,7 @@ QString MimeType::extension() const
103{ 161{
162 return extensions().first();
163}
164
165QStringList MimeType::extensions() const
166{
104 loadExtensions(); 167 loadExtensions();
@@ -110,3 +173,3 @@ QPixmap MimeType::bigPixmap() const
110 MimeTypeData* d = data(i); 173 MimeTypeData* d = data(i);
111 return d ? d->bigIcon : QPixmap(); 174 return d ? d->bigIcon() : QPixmap();
112} 175}
@@ -116,3 +179,12 @@ const AppLnk* MimeType::application() const
116 MimeTypeData* d = data(i); 179 MimeTypeData* d = data(i);
117 return d ? &d->app : 0; 180 return d ? d->apps.first() : 0;
181}
182
183static QString serviceBinding(const QString& service)
184{
185 // Copied from qtopiaservices
186 QString svrc = service;
187 for (int i=0; i<(int)svrc.length(); i++)
188 if ( svrc[i]=='/' ) svrc[i] = '-';
189 return "Service-"+svrc;
118} 190}
@@ -122,7 +194,20 @@ void MimeType::registerApp( const AppLnk& lnk )
122 QStringList list = lnk.mimeTypes(); 194 QStringList list = lnk.mimeTypes();
123 QStringList icons = lnk.mimeTypeIcons(); 195 for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
124 QStringList::ConstIterator icon = icons.begin(); 196 MimeTypeData* cur = data()[*it];
125 for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it, ++icon) { 197 AppLnk* l = new AppLnk(lnk);
126 MimeTypeData *item = new MimeTypeData( *it, lnk, *icon ); 198 if ( !cur ) {
127 dict().replace( *it, item ); 199 cur = new MimeTypeData( *it );
200 data().insert( *it, cur );
201 cur->apps.append(l);
202 } else if ( cur->apps.count() ) {
203 Config binding(serviceBinding("Open/"+*it));
204 binding.setGroup("Service");
205 QString def = binding.readEntry("default");
206 if ( l->exec() == def )
207 cur->apps.prepend(l);
208 else
209 cur->apps.append(l);
210 } else {
211 cur->apps.append(l);
212 }
128 } 213 }
@@ -139,3 +224,3 @@ void MimeType::loadExtensions()
139 if ( !typeFor ) { 224 if ( !typeFor ) {
140 extFor = new QMap<QString,QString>; 225 extFor = new QMap<QString,QStringList>;
141 typeFor = new QMap<QString,QString>; 226 typeFor = new QMap<QString,QString>;
@@ -157,4 +242,9 @@ void MimeType::loadExtensions(const QString& filename)
157 QString id = *it; ++it; 242 QString id = *it; ++it;
243 // new override old (though left overrides right)
244 QStringList exts = (*extFor)[id];
245 QStringList newexts;
158 if ( it != tokens.end() ) { 246 if ( it != tokens.end() ) {
159 (*extFor)[id] = *it; 247 exts.remove(*it);
248 if ( !newexts.contains(*it) )
249 newexts.append(*it);
160 while (it != tokens.end()) { 250 while (it != tokens.end()) {
@@ -164,2 +254,3 @@ void MimeType::loadExtensions(const QString& filename)
164 } 254 }
255 (*extFor)[id] = newexts + exts;
165 } 256 }
@@ -190,3 +281,3 @@ MimeTypeData* MimeType::data(const QString& id)
190{ 281{
191 MimeTypeData* d = dict()[id]; 282 MimeTypeData* d = data()[id];
192 if ( !d ) { 283 if ( !d ) {
@@ -194,3 +285,3 @@ MimeTypeData* MimeType::data(const QString& id)
194 QString idw = id.left(s)+"/*"; 285 QString idw = id.left(s)+"/*";
195 d = dict()[idw]; 286 d = data()[idw];
196 } 287 }