17
17
#if defined(HAVE_GNOME_VFS)
18
18
#include <libgnomevfs/gnome-vfs.h>
19
19
#include <libgnomevfs/gnome-vfs-mime-handlers.h>
22
static std::map<std::string, std::string> g_mapExt2Mime;
23
static std::map<std::string, std::string> g_mapMime2Prog;
24
static bool g_bMimeMapsLoaded = false;
27
void trim(std::string& str);
28
std::string GetFileExt(const char *);
29
bool LoadMimeTypes(const char *szTypesFile, const char *szProgsFile);
21
30
bool Open(const std::string& path, const std::string& args);
22
31
std::string FileNameFromUTF8(const std::string& fileNameInUTF8);
435
445
return g_spawn_command_line_async(path.c_str(), 0);
438
return g_spawn_command_line_async(FileNameFromUTF8(path).c_str(), 0);
447
return g_spawn_command_line_async(FileNameFromUTF8(path).c_str(), 0);
451
if(!g_bMimeMapsLoaded){
452
LoadMimeTypes("/etc/mime.types", "/etc/mailcap");
453
g_bMimeMapsLoaded = true;
456
std::string strExt = GetFileExt(path.c_str());
457
if(!strExt.empty()) strExt = strExt.substr(1); // strip "."
459
TRACE("Ext: %s\n", strExt.c_str());
460
std::string strMime = g_mapExt2Mime[strExt];
461
if(!strMime.empty()){
462
TRACE("Mime: %s\n", strMime.c_str());
463
std::string strProg = g_mapMime2Prog[strMime];
465
//last chance - try alternative mime
466
// image/jpeg -> image/*
467
std::string::size_type nPos = strMime.find('/');
468
if(nPos != std::string::npos){
469
strMime = strMime.substr(0, nPos+1);
471
TRACE("Mime2: %s\n", strMime.c_str());
472
strProg = g_mapMime2Prog[strMime];
476
if(!strProg.empty()){
477
TRACE("Prog: %s\n", strProg.c_str());
479
sprintf(szBuffer, strProg.c_str(), path.c_str());
480
TRACE("Exec: %s\n", szBuffer);
481
return g_spawn_command_line_async(szBuffer, 0); // TOFIX from utf8?
486
return g_spawn_command_line_async(FileNameFromUTF8(path).c_str(), 0);
491
bool LoadMimeTypes(const char *szTypesFile, const char *szProgsFile)
493
#ifndef HAVE_GNOME_VFS
495
FILE *pTFile = fopen(szTypesFile, "r");
500
while(NULL != fgets(szBuffer, sizeof(szBuffer), pTFile))
503
if('\n'== szBuffer[strlen(szBuffer)-1])
504
szBuffer[strlen(szBuffer)-1] = '\0';
506
if( strlen(szBuffer) > 0 &&
509
std::string strLine = szBuffer;
513
std::string::size_type nPos = strLine.find('\t');
514
if(nPos != std::string::npos)
515
strMime = strLine.substr(0, nPos);
518
nPos = strLine.find_last_of('\t');
519
if(nPos != std::string::npos)
520
strLine = strLine.substr(nPos+1);
522
//extract extensions (delimited with space)
523
if(!strMime.empty()){
524
while(std::string::npos != (nPos = strLine.find(' ')))
526
std::string strExt = strLine.substr(0, nPos);
527
g_mapExt2Mime[strExt] = strMime;
528
TRACE("Mime [%s]=[%s]\n", strExt.c_str(), strMime.c_str());
529
strLine = strLine.substr(nPos+1);
531
if(!strLine.empty()){
532
g_mapExt2Mime[strLine] = strMime;
533
TRACE("Mime [%s]=[%s]\n", strLine.c_str(), strMime.c_str());
540
//load MIME handler programs
541
FILE *pPFile = fopen(szProgsFile, "r");
545
while(NULL != fgets(szBuffer, sizeof(szBuffer), pPFile))
548
if('\n'== szBuffer[strlen(szBuffer)-1])
549
szBuffer[strlen(szBuffer)-1] = '\0';
551
if( strlen(szBuffer) > 0 &&
554
std::string strLine = szBuffer;
558
std::string::size_type nPos = strLine.find("; ");
559
if(nPos != std::string::npos){
560
strMime = strLine.substr(0, nPos);
562
strLine = strLine.substr(nPos+2);
563
nPos = strLine.find("; ");
564
if(nPos != std::string::npos)
565
strLine = strLine.substr(0, nPos);
567
g_mapMime2Prog[strMime] = strLine;
568
TRACE("Prog [%s]=[%s]\n", strMime.c_str(), strLine.c_str());
578
void trim(std::string& str)
580
std::string::size_type pos = str.find_last_not_of(' ');
581
if(pos != std::string::npos) {
583
pos = str.find_first_not_of(' ');
584
if(pos != std::string::npos) str.erase(0, pos);
586
else str.erase(str.begin(), str.end());