// @(#)root/qt:$Id: 98e9b85f582807ea6469888efd07a1ab980ac70a $
// Author: Valeri Fine   21/01/2003
/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * Copyright (C) 2003 by Valeri Fine.                                    *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TQMimeTypes and TQMime                                               //
//                                                                      //
// This class handles mime types, used by browsers to map file types    //
// to applications and icons. TQMime is internally used by TQMimeType.  //
// This class does allow the Qt-base gui to get the same Mime types     //
// as ROOT mime defines                                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TQMimeTypes.h"
#include "TOrdCollection.h"
#include "TSystem.h"
#include "TSystemFile.h"
#include "TDatime.h"
#include "TRegexp.h"

#include "TQtRConfig.h"

#include <QIcon>
#include <QFileIconProvider>
#include <QPixmap>
#include <qfileinfo.h>

ClassImp(TQMimeTypes)
QFileIconProvider  *TQMimeTypes::fgDefaultProvider = 0; // Default provider of the system icons;
//______________________________________________________________________________
QIcon
TQMimeTypes::IconProvider(const QFileInfo &info)
{
    if (!fgDefaultProvider) {
      fgDefaultProvider = new QFileIconProvider;
    }
    return fgDefaultProvider->icon(info);
}

//______________________________________________________________________________
TQMimeTypes::TQMimeTypes(const char *iconPath, const char *filename)
{
   // Create a mime type cache. Read the mime types file "filename" and
   // built a list of mime types.

   char     line[1024];
   char     mime[1024];
   char     pattern[256];
   char     icon[256];
   char     sicon[256];
   char     action[256];
   char    *s;

   fIconPath = iconPath;
   fFilename = filename;
   fChanged  = kFALSE;
   fList     = new TOrdCollection(50);

   FILE *mfp;
   mfp = fopen(filename, "r");
   if (!mfp) {
      Warning("TQMimeTypes", "error opening mime type file %s", filename);
      return;
   }

   int cnt = 0;
   while (fgets(line, 1024, mfp)) {
      s = line;
      s[strlen(line)-1] = 0;       // strip off trailing \n
      while (*s == ' ') s++;       // strip leading blanks
      if (*s == '#') continue;     // skip comments
      if (!s[0]) continue;    // skip empty lines

      if (*s == '[') {
         strlcpy(mime, line,1024);
         cnt = 0;
         continue;
      }
      if (!strncmp(s, "pattern", 7)) {
         if (!(s = strchr(line, '='))) {
            Error("TQMimeTypes", "malformed pattern line, = missing");
            pattern[0] = 0;
         } else {
            s++;
            s = Strip(s);
            strlcpy(pattern, s,256);
            delete [] s;
         }
         cnt++;
      } else if (!strncmp(s, "icon", 4)) {
         if (!(s = strchr(line, '='))) {
            Error("TQMimeTypes", "malformed icon line, = missing");
            icon[0] = 0;
         } else {
            s++;
            s = Strip(s);
            char *s2;
            if ((s2 = strchr(s, ' '))) {
               *s2 = 0;
               strlcpy(icon, s,256);
               s2++;
               s2 = Strip(s2);
               strlcpy(sicon, s2,256);
               delete [] s2;
            } else {
               strlcpy(icon, s,256);
               strlcpy(sicon, s,256);
            }
            delete [] s;
         }
         cnt++;
      } else if (!strncmp(s, "action", 6)) {
         if (!(s = strchr(line, '='))) {
            Error("TQMimeTypes", "malformed action line, = missing");
            action[0] = 0;
         } else {
            s++;
            s = Strip(s);
            strlcpy(action, s,256);
            delete [] s;
         }
         cnt++;
      }

      if (cnt == 3) {
         if (strchr(pattern, ' ')) {
            char *tmppattern = strtok(pattern, " ");
            while (tmppattern && (*tmppattern != ' ')) {
               AddType(mime, tmppattern, icon, sicon, action);
               tmppattern = strtok(0, " ");
            }
         } else {
            AddType(mime, pattern, icon, sicon, action);
         }
      }
   }

   fclose(mfp);

   fChanged = kFALSE;
}

//______________________________________________________________________________
TQMimeTypes::~TQMimeTypes()
{
   // Delete mime type pool.

   if (fChanged) SaveMimes();
   fList->Delete();
   delete fList;
}

//______________________________________________________________________________
TQMime *TQMimeTypes::Find(const char *filename) const
{
   // Given a filename find the matching mime type object.

   if (!filename) return 0;

   TString fn = filename;

   TQMime  *mime;
   TIter    next(fList);

   while ((mime = (TQMime *) next()))
      if (fn.Index(*(mime->fReg)) != kNPOS) return mime;

   return 0;
}

//______________________________________________________________________________
const QIcon *TQMimeTypes::GetIcon(const char *filename) const
{
   // Return icon belonging to mime type of filename.
   TQMime *mime= Find(filename);
   if (mime)  return mime->fIcon;
   return 0;
}
//______________________________________________________________________________
const QIcon *TQMimeTypes::GetIcon(const TSystemFile *filename)
{
   // Return icon belonging to mime type of TSystemFile extension
   const char *name = filename->GetName();
   const QIcon *set = GetIcon(name);
   if (!set) set = AddType(filename);
   return set;
}
//______________________________________________________________________________
const QIcon *TQMimeTypes::AddType(const TSystemFile *filename)
{
   //

   QFileInfo info(filename->GetName());
   const QIcon    icon = IconProvider(info);
   if (icon.isNull()) return 0;

   // Add an artificial mime type to the list of mime types from the default system
   TQMime *mime = new TQMime;
   mime->fType    = "system/file";
   mime->fPattern = "*.";
   mime->fPattern += info.suffix().toAscii().data();
   mime->fIcon  = 0;
   mime->fIcon  = new QIcon(icon) ;
#ifdef R__QTWIN32
   mime->fAction  = "!%s";
#else
   mime->fAction  = "";
#endif

   mime->fReg = new TRegexp(mime->fPattern, kTRUE);

   fList->Add(mime);

   fChanged = kTRUE;
   return mime->fIcon;
}
//______________________________________________________________________________
Bool_t TQMimeTypes::GetAction(const char *filename, char *action) const
{
   // Return in action the mime action string belonging to filename.

   TQMime *mime;

   action[0] = 0;
   if ((mime = Find(filename))) {
      strcpy(action, mime->fAction.Data());
      return (strlen(action) > 0);
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TQMimeTypes::GetType(const char *filename, char *type) const
{
   // Return in type the mime type belonging to filename.

   TQMime *mime;

   memset(type, 0, strlen(type));
   if ((mime = Find(filename))) {
      strcpy(type, mime->fType.Data());
      return (strlen(type) > 0);
   }
   return kFALSE;
}

//______________________________________________________________________________
void TQMimeTypes::Print(Option_t *) const
{
   // Print list of mime types.

   TQMime *m;
   TIter next(fList);

   while ((m = (TQMime *) next())) {
      printf("Type:    %s\n", m->fType.Data());
      printf("Pattern: %s\n", m->fPattern.Data());
      printf("Icon:    %p\n", m->fIcon);
      printf("Action:  %s\n", m->fAction.Data());
      printf("------------\n\n");
   }
}

//______________________________________________________________________________
void TQMimeTypes::SaveMimes()
{
   // Save mime types in user's mime type file.

   char filename[1024];
   snprintf(filename,1024, "%s/.root.mimes",  gSystem->HomeDirectory());

   FILE *fp = fopen(filename, "w");

   if (!fp) {
      Error("SaveMimes", "can not open %s to store mime types", filename);
      return;
   }

   TDatime dt;
   fprintf(fp, "# %s written on %s\n\n", filename, dt.AsString());

   TQMime *m;
   TIter next(fList);

   while ((m = (TQMime *) next())) {
      fprintf(fp, "%s\n",            m->fType.Data());
      fprintf(fp, "pattern = %s\n",  m->fPattern.Data());
      fprintf(fp, "icon = %p\n",    m->fIcon);
      fprintf(fp, "action = %s\n\n", m->fAction.Data());
   }

   fclose(fp);

   fChanged = kFALSE;
}

//______________________________________________________________________________
void TQMimeTypes::AddType(const char *type, const char *pattern, const char *icon,
                          const char * /*sicon*/, const char *action)
{
   // Add a mime type to the list of mime types.

   TQMime *mime = new TQMime;

   mime->fType    = type;
   mime->fPattern = pattern;
   mime->fIcon    = 0;
   char *picnam = gSystem->Which(fIconPath.Data(),icon, kReadPermission);
   if (picnam) mime->fIcon  = new QIcon( QPixmap(picnam) ) ;
   delete [] picnam;
   mime->fAction  = action;

   mime->fReg = new TRegexp(pattern, kTRUE);

   fList->Add(mime);

   fChanged = kTRUE;
}

//______________________________________________________________________________
TQMime::~TQMime()
{
   // Delete mime object.
   delete fIcon; fIcon = 0;
   delete fReg;
}
 TQMimeTypes.cxx:1
 TQMimeTypes.cxx:2
 TQMimeTypes.cxx:3
 TQMimeTypes.cxx:4
 TQMimeTypes.cxx:5
 TQMimeTypes.cxx:6
 TQMimeTypes.cxx:7
 TQMimeTypes.cxx:8
 TQMimeTypes.cxx:9
 TQMimeTypes.cxx:10
 TQMimeTypes.cxx:11
 TQMimeTypes.cxx:12
 TQMimeTypes.cxx:13
 TQMimeTypes.cxx:14
 TQMimeTypes.cxx:15
 TQMimeTypes.cxx:16
 TQMimeTypes.cxx:17
 TQMimeTypes.cxx:18
 TQMimeTypes.cxx:19
 TQMimeTypes.cxx:20
 TQMimeTypes.cxx:21
 TQMimeTypes.cxx:22
 TQMimeTypes.cxx:23
 TQMimeTypes.cxx:24
 TQMimeTypes.cxx:25
 TQMimeTypes.cxx:26
 TQMimeTypes.cxx:27
 TQMimeTypes.cxx:28
 TQMimeTypes.cxx:29
 TQMimeTypes.cxx:30
 TQMimeTypes.cxx:31
 TQMimeTypes.cxx:32
 TQMimeTypes.cxx:33
 TQMimeTypes.cxx:34
 TQMimeTypes.cxx:35
 TQMimeTypes.cxx:36
 TQMimeTypes.cxx:37
 TQMimeTypes.cxx:38
 TQMimeTypes.cxx:39
 TQMimeTypes.cxx:40
 TQMimeTypes.cxx:41
 TQMimeTypes.cxx:42
 TQMimeTypes.cxx:43
 TQMimeTypes.cxx:44
 TQMimeTypes.cxx:45
 TQMimeTypes.cxx:46
 TQMimeTypes.cxx:47
 TQMimeTypes.cxx:48
 TQMimeTypes.cxx:49
 TQMimeTypes.cxx:50
 TQMimeTypes.cxx:51
 TQMimeTypes.cxx:52
 TQMimeTypes.cxx:53
 TQMimeTypes.cxx:54
 TQMimeTypes.cxx:55
 TQMimeTypes.cxx:56
 TQMimeTypes.cxx:57
 TQMimeTypes.cxx:58
 TQMimeTypes.cxx:59
 TQMimeTypes.cxx:60
 TQMimeTypes.cxx:61
 TQMimeTypes.cxx:62
 TQMimeTypes.cxx:63
 TQMimeTypes.cxx:64
 TQMimeTypes.cxx:65
 TQMimeTypes.cxx:66
 TQMimeTypes.cxx:67
 TQMimeTypes.cxx:68
 TQMimeTypes.cxx:69
 TQMimeTypes.cxx:70
 TQMimeTypes.cxx:71
 TQMimeTypes.cxx:72
 TQMimeTypes.cxx:73
 TQMimeTypes.cxx:74
 TQMimeTypes.cxx:75
 TQMimeTypes.cxx:76
 TQMimeTypes.cxx:77
 TQMimeTypes.cxx:78
 TQMimeTypes.cxx:79
 TQMimeTypes.cxx:80
 TQMimeTypes.cxx:81
 TQMimeTypes.cxx:82
 TQMimeTypes.cxx:83
 TQMimeTypes.cxx:84
 TQMimeTypes.cxx:85
 TQMimeTypes.cxx:86
 TQMimeTypes.cxx:87
 TQMimeTypes.cxx:88
 TQMimeTypes.cxx:89
 TQMimeTypes.cxx:90
 TQMimeTypes.cxx:91
 TQMimeTypes.cxx:92
 TQMimeTypes.cxx:93
 TQMimeTypes.cxx:94
 TQMimeTypes.cxx:95
 TQMimeTypes.cxx:96
 TQMimeTypes.cxx:97
 TQMimeTypes.cxx:98
 TQMimeTypes.cxx:99
 TQMimeTypes.cxx:100
 TQMimeTypes.cxx:101
 TQMimeTypes.cxx:102
 TQMimeTypes.cxx:103
 TQMimeTypes.cxx:104
 TQMimeTypes.cxx:105
 TQMimeTypes.cxx:106
 TQMimeTypes.cxx:107
 TQMimeTypes.cxx:108
 TQMimeTypes.cxx:109
 TQMimeTypes.cxx:110
 TQMimeTypes.cxx:111
 TQMimeTypes.cxx:112
 TQMimeTypes.cxx:113
 TQMimeTypes.cxx:114
 TQMimeTypes.cxx:115
 TQMimeTypes.cxx:116
 TQMimeTypes.cxx:117
 TQMimeTypes.cxx:118
 TQMimeTypes.cxx:119
 TQMimeTypes.cxx:120
 TQMimeTypes.cxx:121
 TQMimeTypes.cxx:122
 TQMimeTypes.cxx:123
 TQMimeTypes.cxx:124
 TQMimeTypes.cxx:125
 TQMimeTypes.cxx:126
 TQMimeTypes.cxx:127
 TQMimeTypes.cxx:128
 TQMimeTypes.cxx:129
 TQMimeTypes.cxx:130
 TQMimeTypes.cxx:131
 TQMimeTypes.cxx:132
 TQMimeTypes.cxx:133
 TQMimeTypes.cxx:134
 TQMimeTypes.cxx:135
 TQMimeTypes.cxx:136
 TQMimeTypes.cxx:137
 TQMimeTypes.cxx:138
 TQMimeTypes.cxx:139
 TQMimeTypes.cxx:140
 TQMimeTypes.cxx:141
 TQMimeTypes.cxx:142
 TQMimeTypes.cxx:143
 TQMimeTypes.cxx:144
 TQMimeTypes.cxx:145
 TQMimeTypes.cxx:146
 TQMimeTypes.cxx:147
 TQMimeTypes.cxx:148
 TQMimeTypes.cxx:149
 TQMimeTypes.cxx:150
 TQMimeTypes.cxx:151
 TQMimeTypes.cxx:152
 TQMimeTypes.cxx:153
 TQMimeTypes.cxx:154
 TQMimeTypes.cxx:155
 TQMimeTypes.cxx:156
 TQMimeTypes.cxx:157
 TQMimeTypes.cxx:158
 TQMimeTypes.cxx:159
 TQMimeTypes.cxx:160
 TQMimeTypes.cxx:161
 TQMimeTypes.cxx:162
 TQMimeTypes.cxx:163
 TQMimeTypes.cxx:164
 TQMimeTypes.cxx:165
 TQMimeTypes.cxx:166
 TQMimeTypes.cxx:167
 TQMimeTypes.cxx:168
 TQMimeTypes.cxx:169
 TQMimeTypes.cxx:170
 TQMimeTypes.cxx:171
 TQMimeTypes.cxx:172
 TQMimeTypes.cxx:173
 TQMimeTypes.cxx:174
 TQMimeTypes.cxx:175
 TQMimeTypes.cxx:176
 TQMimeTypes.cxx:177
 TQMimeTypes.cxx:178
 TQMimeTypes.cxx:179
 TQMimeTypes.cxx:180
 TQMimeTypes.cxx:181
 TQMimeTypes.cxx:182
 TQMimeTypes.cxx:183
 TQMimeTypes.cxx:184
 TQMimeTypes.cxx:185
 TQMimeTypes.cxx:186
 TQMimeTypes.cxx:187
 TQMimeTypes.cxx:188
 TQMimeTypes.cxx:189
 TQMimeTypes.cxx:190
 TQMimeTypes.cxx:191
 TQMimeTypes.cxx:192
 TQMimeTypes.cxx:193
 TQMimeTypes.cxx:194
 TQMimeTypes.cxx:195
 TQMimeTypes.cxx:196
 TQMimeTypes.cxx:197
 TQMimeTypes.cxx:198
 TQMimeTypes.cxx:199
 TQMimeTypes.cxx:200
 TQMimeTypes.cxx:201
 TQMimeTypes.cxx:202
 TQMimeTypes.cxx:203
 TQMimeTypes.cxx:204
 TQMimeTypes.cxx:205
 TQMimeTypes.cxx:206
 TQMimeTypes.cxx:207
 TQMimeTypes.cxx:208
 TQMimeTypes.cxx:209
 TQMimeTypes.cxx:210
 TQMimeTypes.cxx:211
 TQMimeTypes.cxx:212
 TQMimeTypes.cxx:213
 TQMimeTypes.cxx:214
 TQMimeTypes.cxx:215
 TQMimeTypes.cxx:216
 TQMimeTypes.cxx:217
 TQMimeTypes.cxx:218
 TQMimeTypes.cxx:219
 TQMimeTypes.cxx:220
 TQMimeTypes.cxx:221
 TQMimeTypes.cxx:222
 TQMimeTypes.cxx:223
 TQMimeTypes.cxx:224
 TQMimeTypes.cxx:225
 TQMimeTypes.cxx:226
 TQMimeTypes.cxx:227
 TQMimeTypes.cxx:228
 TQMimeTypes.cxx:229
 TQMimeTypes.cxx:230
 TQMimeTypes.cxx:231
 TQMimeTypes.cxx:232
 TQMimeTypes.cxx:233
 TQMimeTypes.cxx:234
 TQMimeTypes.cxx:235
 TQMimeTypes.cxx:236
 TQMimeTypes.cxx:237
 TQMimeTypes.cxx:238
 TQMimeTypes.cxx:239
 TQMimeTypes.cxx:240
 TQMimeTypes.cxx:241
 TQMimeTypes.cxx:242
 TQMimeTypes.cxx:243
 TQMimeTypes.cxx:244
 TQMimeTypes.cxx:245
 TQMimeTypes.cxx:246
 TQMimeTypes.cxx:247
 TQMimeTypes.cxx:248
 TQMimeTypes.cxx:249
 TQMimeTypes.cxx:250
 TQMimeTypes.cxx:251
 TQMimeTypes.cxx:252
 TQMimeTypes.cxx:253
 TQMimeTypes.cxx:254
 TQMimeTypes.cxx:255
 TQMimeTypes.cxx:256
 TQMimeTypes.cxx:257
 TQMimeTypes.cxx:258
 TQMimeTypes.cxx:259
 TQMimeTypes.cxx:260
 TQMimeTypes.cxx:261
 TQMimeTypes.cxx:262
 TQMimeTypes.cxx:263
 TQMimeTypes.cxx:264
 TQMimeTypes.cxx:265
 TQMimeTypes.cxx:266
 TQMimeTypes.cxx:267
 TQMimeTypes.cxx:268
 TQMimeTypes.cxx:269
 TQMimeTypes.cxx:270
 TQMimeTypes.cxx:271
 TQMimeTypes.cxx:272
 TQMimeTypes.cxx:273
 TQMimeTypes.cxx:274
 TQMimeTypes.cxx:275
 TQMimeTypes.cxx:276
 TQMimeTypes.cxx:277
 TQMimeTypes.cxx:278
 TQMimeTypes.cxx:279
 TQMimeTypes.cxx:280
 TQMimeTypes.cxx:281
 TQMimeTypes.cxx:282
 TQMimeTypes.cxx:283
 TQMimeTypes.cxx:284
 TQMimeTypes.cxx:285
 TQMimeTypes.cxx:286
 TQMimeTypes.cxx:287
 TQMimeTypes.cxx:288
 TQMimeTypes.cxx:289
 TQMimeTypes.cxx:290
 TQMimeTypes.cxx:291
 TQMimeTypes.cxx:292
 TQMimeTypes.cxx:293
 TQMimeTypes.cxx:294
 TQMimeTypes.cxx:295
 TQMimeTypes.cxx:296
 TQMimeTypes.cxx:297
 TQMimeTypes.cxx:298
 TQMimeTypes.cxx:299
 TQMimeTypes.cxx:300
 TQMimeTypes.cxx:301
 TQMimeTypes.cxx:302
 TQMimeTypes.cxx:303
 TQMimeTypes.cxx:304
 TQMimeTypes.cxx:305
 TQMimeTypes.cxx:306
 TQMimeTypes.cxx:307
 TQMimeTypes.cxx:308
 TQMimeTypes.cxx:309
 TQMimeTypes.cxx:310
 TQMimeTypes.cxx:311
 TQMimeTypes.cxx:312
 TQMimeTypes.cxx:313
 TQMimeTypes.cxx:314
 TQMimeTypes.cxx:315
 TQMimeTypes.cxx:316
 TQMimeTypes.cxx:317
 TQMimeTypes.cxx:318
 TQMimeTypes.cxx:319
 TQMimeTypes.cxx:320
 TQMimeTypes.cxx:321
 TQMimeTypes.cxx:322
 TQMimeTypes.cxx:323
 TQMimeTypes.cxx:324
 TQMimeTypes.cxx:325
 TQMimeTypes.cxx:326
 TQMimeTypes.cxx:327
 TQMimeTypes.cxx:328
 TQMimeTypes.cxx:329
 TQMimeTypes.cxx:330
 TQMimeTypes.cxx:331
 TQMimeTypes.cxx:332
 TQMimeTypes.cxx:333
 TQMimeTypes.cxx:334
 TQMimeTypes.cxx:335