mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-26 22:09:43 +03:00
66a759e2a1
filetype.c has been changed to get the MIME type of a file from the MIMETYPE tooltype of the icon or default icon for the file. The install script will set the basic of these, and icons for default.css and AdBlock.css have been added to ensure these always return the correct MIME type. If the MIMETYPE tooltype is not found, the code will use datatypes.library to identify the file and make a guess as to what the MIME type is. svn path=/trunk/netsurf/; revision=5651
103 lines
2.7 KiB
C
103 lines
2.7 KiB
C
/*
|
|
* Copyright 2008 Chris Young <chris@unsatisfactorysoftware.co.uk>
|
|
*
|
|
* This file is part of NetSurf, http://www.netsurf-browser.org/
|
|
*
|
|
* NetSurf is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* NetSurf is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "content/fetch.h"
|
|
#include "utils/log.h"
|
|
#include "utils/utils.h"
|
|
#include <proto/icon.h>
|
|
#include <proto/dos.h>
|
|
#include <proto/datatypes.h>
|
|
#include <workbench/icon.h>
|
|
|
|
/**
|
|
* filetype -- determine the MIME type of a local file
|
|
*/
|
|
|
|
const char *fetch_filetype(const char *unix_path)
|
|
{
|
|
static char mimetype[20];
|
|
STRPTR ttype = NULL;
|
|
struct DiskObject *dobj = NULL;
|
|
BPTR lock = 0;
|
|
struct DataTypeHeader *dth;
|
|
struct DataType *dtn;
|
|
|
|
/* First try getting a tooltype "MIMETYPE" and use that as the MIME type. Will fail over
|
|
to default icons if the file doesn't have a real icon. */
|
|
|
|
if(dobj = GetIconTags(unix_path,ICONGETA_FailIfUnavailable,FALSE,
|
|
TAG_DONE))
|
|
{
|
|
ttype = FindToolType(dobj->do_ToolTypes, "MIMETYPE");
|
|
if(ttype) strcpy(mimetype,ttype);
|
|
FreeDiskObject(dobj);
|
|
}
|
|
|
|
if(!mimetype)
|
|
{
|
|
/* If that didn't work, have a go at guessing it using datatypes.library. This isn't
|
|
accurate - the base names differ from those used by MIME and it relies on the
|
|
user having a datatype installed which can handle the file. */
|
|
|
|
if (lock = Lock (unix_path, ACCESS_READ))
|
|
{
|
|
if (dtn = ObtainDataTypeA (DTST_FILE, (APTR)lock, NULL))
|
|
{
|
|
dth = dtn->dtn_Header;
|
|
|
|
switch(dth->dth_GroupID)
|
|
{
|
|
case GID_SYSTEM:
|
|
sprintf(mimetype,"application/%s",dth->dth_BaseName);
|
|
break;
|
|
case GID_TEXT:
|
|
case GID_DOCUMENT:
|
|
sprintf(mimetype,"text/%s",dth->dth_BaseName);
|
|
break;
|
|
case GID_SOUND:
|
|
case GID_INSTRUMENT:
|
|
case GID_MUSIC:
|
|
sprintf(mimetype,"audio/%s",dth->dth_BaseName);
|
|
break;
|
|
case GID_PICTURE:
|
|
sprintf(mimetype,"image/%s",dth->dth_BaseName);
|
|
break;
|
|
case GID_ANIMATION:
|
|
case GID_MOVIE:
|
|
sprintf(mimetype,"video/%s",dth->dth_BaseName);
|
|
break;
|
|
}
|
|
ReleaseDataType(dtn);
|
|
}
|
|
UnLock(lock);
|
|
}
|
|
}
|
|
|
|
if(!mimetype) strcpy(mimetype,"text/plain"); /* If all else fails */
|
|
|
|
return mimetype;
|
|
}
|
|
|
|
|
|
char *fetch_mimetype(const char *ro_path)
|
|
{
|
|
return strdup(fetch_filetype(ro_path));
|
|
}
|