39 ClassImp(TGMimeTypes);
45 TGMimeTypes::TGMimeTypes(TGClient *client,
const char *filename)
47 char line[1024] = {0};
48 char mime[1024] = {0};
49 char pattern[256] = {0};
51 char sicon[256] = {0};
52 char action[256] = {0};
58 fList =
new TOrdCollection(50);
61 mfp = fopen(filename,
"r");
63 Warning(
"TGMimeTypes",
"error opening mime type file %s", filename);
68 while (fgets(line, 1024, mfp)) {
70 s[strlen(line)-1] = 0;
71 while (*s ==
' ') s++;
72 if (*s ==
'#')
continue;
76 strlcpy(mime, line, 1024);
80 if (!strncmp(s,
"pattern", 7)) {
81 if (!(s = strchr(line,
'='))) {
82 Error(
"TGMimeTypes",
"malformed pattern line, = missing");
87 strlcpy(pattern, s, 256);
91 }
else if (!strncmp(s,
"icon", 4)) {
92 if (!(s = strchr(line,
'='))) {
93 Error(
"TGMimeTypes",
"malformed icon line, = missing");
99 if ((s2 = strchr(s,
' '))) {
101 strlcpy(icon, s, 256);
104 strlcpy(sicon, s2, 256);
107 strlcpy(icon, s, 256);
108 strlcpy(sicon, s, 256);
113 }
else if (!strncmp(s,
"action", 6)) {
114 if (!(s = strchr(line,
'='))) {
115 Error(
"TGMimeTypes",
"malformed action line, = missing");
120 strlcpy(action, s, 256);
127 if (strchr(pattern,
' ')) {
128 char *tmppattern = strtok(pattern,
" ");
129 while (tmppattern && (*tmppattern !=
' ')) {
130 AddType(mime, tmppattern, icon, sicon, action);
131 tmppattern = strtok(0,
" ");
134 AddType(mime, pattern, icon, sicon, action);
147 TGMimeTypes::~TGMimeTypes()
149 if (fChanged) SaveMimes();
157 TGMimeTypes::TGMimeTypes(
const TGMimeTypes& gmt) :
159 fClient(gmt.fClient),
160 fFilename(gmt.fFilename),
161 fChanged(gmt.fChanged),
169 TGMimeTypes& TGMimeTypes::operator=(
const TGMimeTypes& gmt)
172 TObject::operator=(gmt);
174 fFilename=gmt.fFilename;
175 fChanged=gmt.fChanged;
185 TGMime *TGMimeTypes::Find(
const char *filename)
187 if (!filename)
return 0;
189 TString fn = filename;
194 while ((mime = (TGMime *) next()))
195 if (fn.Index(*(mime->fReg)) != kNPOS)
return mime;
203 const TGPicture *TGMimeTypes::GetIcon(
const char *filename, Bool_t small_icon)
206 const TGPicture *mypic = 0;
208 if ((mime = Find(filename))) {
209 Bool_t thumb = (mime->fType ==
"[thumbnail]");
211 mypic = thumb ? fClient->GetPicture(mime->fSIcon.Data(), 32, 32) :
212 fClient->GetPicture(mime->fSIcon.Data(), 16, 16);
214 mypic = thumb ? fClient->GetPicture(mime->fIcon.Data(), 64, 64) :
215 fClient->GetPicture(mime->fIcon.Data(), 32, 32);
225 Bool_t TGMimeTypes::GetAction(
const char *filename,
char *action)
230 if ((mime = Find(filename))) {
231 strlcpy(action, mime->fAction.Data(), 512);
232 return (strlen(action) > 0);
240 Bool_t TGMimeTypes::GetType(
const char *filename,
char *type)
244 memset(type, 0, strlen(type));
245 if ((mime = Find(filename))) {
246 strlcpy(type, mime->fType.Data(), 256);
247 return (strlen(type) > 0);
255 void TGMimeTypes::Print(Option_t *)
const
260 while ((m = (TGMime *) next())) {
261 printf(
"Type: %s\n", m->fType.Data());
262 printf(
"Pattern: %s\n", m->fPattern.Data());
263 if (m->fIcon != m->fSIcon)
264 printf(
"Icon: %s %s\n", m->fIcon.Data(), m->fSIcon.Data());
266 printf(
"Icon: %s\n", m->fIcon.Data());
267 printf(
"Action: %s\n", m->fAction.Data());
268 printf(
"------------\n\n");
275 void TGMimeTypes::SaveMimes()
279 filename.Form(
"%s\\.root.mimes", gSystem->HomeDirectory());
281 filename.Form(
"%s/.root.mimes", gSystem->HomeDirectory());
284 FILE *fp = fopen(filename.Data(),
"wt");
287 Error(
"SaveMimes",
"can not open %s to store mime types", filename.Data());
292 fprintf(fp,
"# %s written on %s\n\n", filename.Data(), dt.AsString());
297 while ((m = (TGMime *) next())) {
298 fprintf(fp,
"%s\n", m->fType.Data());
299 fprintf(fp,
"pattern = %s\n", m->fPattern.Data());
300 if (m->fIcon != m->fSIcon)
301 fprintf(fp,
"icon = %s %s\n", m->fIcon.Data(), m->fSIcon.Data());
303 fprintf(fp,
"icon = %s\n", m->fIcon.Data());
304 fprintf(fp,
"action = %s\n\n", m->fAction.Data());
315 void TGMimeTypes::AddType(
const char *type,
const char *pattern,
const char *icon,
316 const char *sicon,
const char *action)
318 TGMime *mime =
new TGMime;
321 mime->fPattern = pattern;
323 mime->fSIcon = sicon;
324 mime->fAction = action;
326 mime->fReg =
new TRegexp(pattern, kTRUE);
328 fList->AddFirst(mime);