added wxFileType::GetMimeTypes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5601 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2000-01-23 01:03:17 +00:00
parent 2faa3a6b3f
commit 4d2976ad6b
10 changed files with 238 additions and 35 deletions

View File

@@ -125,6 +125,16 @@ The destructor of this class is not virtual, so it should not be derived from.
If the function returns TRUE, the string pointed to by {\it mimeType} is filled If the function returns TRUE, the string pointed to by {\it mimeType} is filled
with full MIME type specification for this file type: for example, "text/plain". with full MIME type specification for this file type: for example, "text/plain".
\membersection{wxFileType::GetMimeTypes}\label{wxfiletypegetmimetypes}
\func{bool}{GetMimeType}{\param{wxArrayString&}{ mimeTypes}}
Same as \helpref{GetMimeType}{wxfiletypegetmimetype} but returns array of MIME
types. This array will contain only one item in most cases but sometimes,
notably under Unix with KDE, may contain more MIME types. This happens when
one file extension is mapped to different MIME types by KDE, mailcap and
mime.types.
\membersection{wxFileType::GetExtensions}\label{wxfiletypegetextensions} \membersection{wxFileType::GetExtensions}\label{wxfiletypegetextensions}
\func{bool}{GetExtensions}{\param{wxArrayString\&}{ extensions}} \func{bool}{GetExtensions}{\param{wxArrayString\&}{ extensions}}

View File

@@ -51,6 +51,7 @@ public:
// implement accessor functions // implement accessor functions
bool GetExtensions(wxArrayString& extensions); bool GetExtensions(wxArrayString& extensions);
bool GetMimeType(wxString *mimeType) const; bool GetMimeType(wxString *mimeType) const;
bool GetMimeTypes(wxArrayString& mimeTypes) const;
bool GetIcon(wxIcon *icon) const; bool GetIcon(wxIcon *icon) const;
bool GetDescription(wxString *desc) const; bool GetDescription(wxString *desc) const;
bool GetOpenCommand(wxString *openCmd, bool GetOpenCommand(wxString *openCmd,

View File

@@ -75,6 +75,7 @@ public:
// parameters are unchanged) // parameters are unchanged)
// return the MIME type for this file type // return the MIME type for this file type
bool GetMimeType(wxString *mimeType) const; bool GetMimeType(wxString *mimeType) const;
bool GetMimeTypes(wxArrayString& mimeTypes) const;
// fill passed in array with all extensions associated with this file // fill passed in array with all extensions associated with this file
// type // type
bool GetExtensions(wxArrayString& extensions); bool GetExtensions(wxArrayString& extensions);

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: wx/mimetype.h // Name: wx/msw/mimetype.h
// Purpose: classes and functions to manage MIME types // Purpose: classes and functions to manage MIME types
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: // Modified by:
@@ -43,6 +43,7 @@ public:
// implement accessor functions // implement accessor functions
bool GetExtensions(wxArrayString& extensions); bool GetExtensions(wxArrayString& extensions);
bool GetMimeType(wxString *mimeType) const; bool GetMimeType(wxString *mimeType) const;
bool GetMimeTypes(wxArrayString& mimeTypes) const;
bool GetIcon(wxIcon *icon) const; bool GetIcon(wxIcon *icon) const;
bool GetDescription(wxString *desc) const; bool GetDescription(wxString *desc) const;
bool GetOpenCommand(wxString *openCmd, bool GetOpenCommand(wxString *openCmd,

View File

@@ -76,20 +76,23 @@ private:
static ArrayIconHandlers ms_iconHandlers; static ArrayIconHandlers ms_iconHandlers;
}; };
class WXDLLEXPORT wxFileTypeImpl class WXDLLEXPORT wxFileTypeImpl
{ {
public: public:
// initialization functions // initialization functions
void Init(wxMimeTypesManagerImpl *manager, size_t index) void Init(wxMimeTypesManagerImpl *manager, size_t index)
{ m_manager = manager; m_index = index; } { m_manager = manager; m_index.Add(index); }
// accessors // accessors
bool GetExtensions(wxArrayString& extensions); bool GetExtensions(wxArrayString& extensions);
bool GetMimeType(wxString *mimeType) const bool GetMimeType(wxString *mimeType) const
{ *mimeType = m_manager->m_aTypes[m_index]; return TRUE; } { *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; }
bool GetMimeTypes(wxArrayString& mimeTypes) const;
bool GetIcon(wxIcon *icon) const; bool GetIcon(wxIcon *icon) const;
bool GetDescription(wxString *desc) const bool GetDescription(wxString *desc) const
{ *desc = m_manager->m_aDescriptions[m_index]; return TRUE; } { *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; }
bool GetOpenCommand(wxString *openCmd, bool GetOpenCommand(wxString *openCmd,
const wxFileType::MessageParameters& params) const const wxFileType::MessageParameters& params) const
@@ -113,7 +116,7 @@ private:
bool open) const; bool open) const;
wxMimeTypesManagerImpl *m_manager; wxMimeTypesManagerImpl *m_manager;
size_t m_index; // in the wxMimeTypesManagerImpl arrays wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays
}; };

View File

@@ -217,6 +217,11 @@ bool wxFileType::GetMimeType(wxString *mimeType) const
return m_impl->GetMimeType(mimeType); return m_impl->GetMimeType(mimeType);
} }
bool wxFileType::GetMimeTypes(wxArrayString& mimeTypes) const
{
return m_impl->GetMimeTypes(mimeTypes);
}
bool wxFileType::GetIcon(wxIcon *icon) const bool wxFileType::GetIcon(wxIcon *icon) const
{ {
return m_impl->GetIcon(icon); return m_impl->GetIcon(icon);

View File

@@ -73,6 +73,20 @@ bool wxFileTypeImpl::GetMimeType(wxString *mimeType) const
return FALSE; return FALSE;
} }
bool wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
{
wxString s;
if (GetMimeType(&s))
{
mimeTypes.Clear();
mimeTypes.Add(s);
return TRUE;
}
else
return FALSE;
}
bool wxFileTypeImpl::GetIcon(wxIcon *icon) const bool wxFileTypeImpl::GetIcon(wxIcon *icon) const
{ {
// no such file type or no value or incorrect icon entry // no such file type or no value or incorrect icon entry

View File

@@ -73,6 +73,20 @@ bool wxFileTypeImpl::GetMimeType(wxString *mimeType) const
return FALSE; return FALSE;
} }
bool wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
{
wxString s;
if (GetMimeType(&s))
{
mimeTypes.Clear();
mimeTypes.Add(s);
return TRUE;
}
else
return FALSE;
}
bool wxFileTypeImpl::GetIcon(wxIcon *icon) const bool wxFileTypeImpl::GetIcon(wxIcon *icon) const
{ {
// no such file type or no value or incorrect icon entry // no such file type or no value or incorrect icon entry

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: common/mimetype.cpp // Name: msw/mimetype.cpp
// Purpose: classes and functions to manage MIME types // Purpose: classes and functions to manage MIME types
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: // Modified by:
@@ -235,6 +235,22 @@ bool wxFileTypeImpl::GetMimeType(wxString *mimeType) const
} }
} }
bool wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
{
wxString s;
if (GetMimeType(&s))
{
mimeTypes.Clear();
mimeTypes.Add(s);
return TRUE;
}
else
return FALSE;
}
bool wxFileTypeImpl::GetIcon(wxIcon *icon) const bool wxFileTypeImpl::GetIcon(wxIcon *icon) const
{ {
#if wxUSE_GUI #if wxUSE_GUI

View File

@@ -208,13 +208,16 @@ class wxGNOMEIconHandler : public wxMimeTypeIconHandler
{ {
public: public:
virtual bool GetIcon(const wxString& mimetype, wxIcon *icon); virtual bool GetIcon(const wxString& mimetype, wxIcon *icon);
virtual void GetMimeInfoRecords(wxMimeTypesManagerImpl *manager) {} virtual void GetMimeInfoRecords(wxMimeTypesManagerImpl *manager);
private: private:
void Init(); void Init();
void LoadIconsFromKeyFile(const wxString& filename); void LoadIconsFromKeyFile(const wxString& filename);
void LoadKeyFilesFromDir(const wxString& dirbase); void LoadKeyFilesFromDir(const wxString& dirbase);
void LoadMimeTypesFromMimeFile(const wxString& filename, wxMimeTypesManagerImpl *manager);
void LoadMimeFilesFromDir(const wxString& dirbase, wxMimeTypesManagerImpl *manager);
static bool m_inited; static bool m_inited;
static wxSortedArrayString ms_mimetypes; static wxSortedArrayString ms_mimetypes;
@@ -375,16 +378,6 @@ void wxGNOMEIconHandler::LoadIconsFromKeyFile(const wxString& filename)
{ {
curMimeType += *pc++; curMimeType += *pc++;
} }
if ( !*pc )
{
// we reached the end of line without finding the colon,
// something is wrong - ignore this line completely
wxLogDebug(_T("Unreckognized line %d in file '%s' ignored"),
nLine + 1, filename.c_str());
break;
}
} }
} }
} }
@@ -417,6 +410,112 @@ void wxGNOMEIconHandler::LoadKeyFilesFromDir(const wxString& dirbase)
} }
} }
void wxGNOMEIconHandler::LoadMimeTypesFromMimeFile(const wxString& filename, wxMimeTypesManagerImpl *manager)
{
wxTextFile textfile(filename);
if ( !textfile.Open() )
return;
// values for the entry being parsed
wxString curMimeType, curExtList;
const wxChar *pc;
size_t nLineCount = textfile.GetLineCount();
for ( size_t nLine = 0; ; nLine++ )
{
if ( nLine < nLineCount )
{
pc = textfile[nLine].c_str();
if ( *pc == _T('#') )
{
// skip comments
continue;
}
}
else
{
// so that we will fall into the "if" below
pc = NULL;
}
if ( !pc || !*pc )
{
// end of the entry
if ( !!curMimeType && !!curExtList )
{
manager -> AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString);
}
if ( !pc )
{
// the end - this can only happen if nLine == nLineCount
break;
}
curExtList.Empty();
continue;
}
// what do we have here?
if ( *pc == _T('\t') )
{
// this is a field=value ling
pc++; // skip leading TAB
static const int lenField = 4; // strlen("ext:")
if ( wxStrncmp(pc, _T("ext:"), lenField) == 0 )
{
// skip ' ' which follows and take everything left until the end
// of line
curExtList = pc + lenField + 1;
}
//else: some other field, we don't care
}
else
{
// this is the start of the new section
curMimeType.Empty();
while ( *pc != _T(':') && *pc != _T('\0') )
{
curMimeType += *pc++;
}
}
}
}
void wxGNOMEIconHandler::LoadMimeFilesFromDir(const wxString& dirbase, wxMimeTypesManagerImpl *manager)
{
wxASSERT_MSG( !!dirbase && !wxEndsWithPathSeparator(dirbase),
_T("base directory shouldn't end with a slash") );
wxString dirname = dirbase;
dirname << _T("/mime-info");
if ( !wxDir::Exists(dirname) )
return;
wxDir dir(dirname);
if ( !dir.IsOpened() )
return;
// we will concatenate it with filename to get the full path below
dirname += _T('/');
wxString filename;
bool cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
while ( cont )
{
LoadMimeTypesFromMimeFile(dirname + filename, manager);
cont = dir.GetNext(&filename);
}
}
void wxGNOMEIconHandler::Init() void wxGNOMEIconHandler::Init()
{ {
wxArrayString dirs; wxArrayString dirs;
@@ -437,6 +536,31 @@ void wxGNOMEIconHandler::Init()
m_inited = TRUE; m_inited = TRUE;
} }
void wxGNOMEIconHandler::GetMimeInfoRecords(wxMimeTypesManagerImpl *manager)
{
if ( !m_inited )
{
Init();
}
wxArrayString dirs;
dirs.Add(_T("/usr/share"));
dirs.Add(_T("/usr/local/share"));
wxString gnomedir;
wxGetHomeDir( &gnomedir );
gnomedir += _T("/.gnome");
dirs.Add( gnomedir );
size_t nDirs = dirs.GetCount();
for ( size_t nDir = 0; nDir < nDirs; nDir++ )
{
LoadMimeFilesFromDir(dirs[nDir], manager);
}
}
bool wxGNOMEIconHandler::GetIcon(const wxString& mimetype, wxIcon *icon) bool wxGNOMEIconHandler::GetIcon(const wxString& mimetype, wxIcon *icon)
{ {
if ( !m_inited ) if ( !m_inited )
@@ -727,7 +851,7 @@ MailCapEntry *
wxFileTypeImpl::GetEntry(const wxFileType::MessageParameters& params) const wxFileTypeImpl::GetEntry(const wxFileType::MessageParameters& params) const
{ {
wxString command; wxString command;
MailCapEntry *entry = m_manager->m_aEntries[m_index]; MailCapEntry *entry = m_manager->m_aEntries[m_index[0]];
while ( entry != NULL ) { while ( entry != NULL ) {
// notice that an empty command would always succeed (it's ok) // notice that an empty command would always succeed (it's ok)
command = wxFileType::ExpandCommand(entry->GetTestCmd(), params); command = wxFileType::ExpandCommand(entry->GetTestCmd(), params);
@@ -751,20 +875,35 @@ wxFileTypeImpl::GetEntry(const wxFileType::MessageParameters& params) const
bool wxFileTypeImpl::GetIcon(wxIcon *icon) const bool wxFileTypeImpl::GetIcon(wxIcon *icon) const
{ {
wxString mimetype; wxArrayString mimetypes;
(void)GetMimeType(&mimetype); GetMimeTypes(mimetypes);
ArrayIconHandlers& handlers = m_manager->GetIconHandlers(); ArrayIconHandlers& handlers = m_manager->GetIconHandlers();
size_t count = handlers.GetCount(); size_t count = handlers.GetCount();
size_t counttypes = mimetypes.GetCount();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
if ( handlers[n]->GetIcon(mimetype, icon) ) for ( size_t n2 = 0; n2 < counttypes; n2++ )
return TRUE; {
if ( handlers[n]->GetIcon(mimetypes[n2], icon) )
return TRUE;
}
} }
return FALSE; return FALSE;
} }
bool
wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
{
mimeTypes.Clear();
for (size_t i = 0; i < m_index.GetCount(); i++)
mimeTypes.Add(m_manager->m_aTypes[m_index[i]]);
return TRUE;
}
bool bool
wxFileTypeImpl::GetExpandedCommand(wxString *expandedCmd, wxFileTypeImpl::GetExpandedCommand(wxString *expandedCmd,
const wxFileType::MessageParameters& params, const wxFileType::MessageParameters& params,
@@ -788,7 +927,7 @@ wxFileTypeImpl::GetExpandedCommand(wxString *expandedCmd,
bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions) bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions)
{ {
wxString strExtensions = m_manager->GetExtension(m_index); wxString strExtensions = m_manager->GetExtension(m_index[0]);
extensions.Empty(); extensions.Empty();
// one extension in the space or comma delimitid list // one extension in the space or comma delimitid list
@@ -829,8 +968,8 @@ ArrayIconHandlers& wxMimeTypesManagerImpl::GetIconHandlers()
{ {
if ( ms_iconHandlers.GetCount() == 0 ) if ( ms_iconHandlers.GetCount() == 0 )
{ {
ms_iconHandlers.Add(&gs_iconHandlerKDE);
ms_iconHandlers.Add(&gs_iconHandlerGNOME); ms_iconHandlers.Add(&gs_iconHandlerGNOME);
ms_iconHandlers.Add(&gs_iconHandlerKDE);
} }
return ms_iconHandlers; return ms_iconHandlers;
@@ -839,12 +978,6 @@ ArrayIconHandlers& wxMimeTypesManagerImpl::GetIconHandlers()
// read system and user mailcaps (TODO implement mime.types support) // read system and user mailcaps (TODO implement mime.types support)
wxMimeTypesManagerImpl::wxMimeTypesManagerImpl() wxMimeTypesManagerImpl::wxMimeTypesManagerImpl()
{ {
// read KDE/GNOME tables
ArrayIconHandlers& handlers = GetIconHandlers();
size_t count = handlers.GetCount();
for ( size_t hn = 0; hn < count; hn++ )
handlers[hn]->GetMimeInfoRecords(this);
// directories where we look for mailcap and mime.types by default // directories where we look for mailcap and mime.types by default
// (taken from metamail(1) sources) // (taken from metamail(1) sources)
static const wxChar *aStandardLocations[] = static const wxChar *aStandardLocations[] =
@@ -885,11 +1018,18 @@ wxMimeTypesManagerImpl::wxMimeTypesManagerImpl()
if ( wxFile::Exists(strUserMimeTypes) ) { if ( wxFile::Exists(strUserMimeTypes) ) {
ReadMimeTypes(strUserMimeTypes); ReadMimeTypes(strUserMimeTypes);
} }
// read KDE/GNOME tables
ArrayIconHandlers& handlers = GetIconHandlers();
size_t count = handlers.GetCount();
for ( size_t hn = 0; hn < count; hn++ )
handlers[hn]->GetMimeInfoRecords(this);
} }
wxFileType * wxFileType *
wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext) wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext)
{ {
wxFileType *fileType = NULL;
size_t count = m_aExtensions.GetCount(); size_t count = m_aExtensions.GetCount();
for ( size_t n = 0; n < count; n++ ) { for ( size_t n = 0; n < count; n++ ) {
wxString extensions = m_aExtensions[n]; wxString extensions = m_aExtensions[n];
@@ -900,16 +1040,14 @@ wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext)
// consider extensions as not being case-sensitive // consider extensions as not being case-sensitive
if ( field.IsSameAs(ext, FALSE /* no case */) ) { if ( field.IsSameAs(ext, FALSE /* no case */) ) {
// found // found
wxFileType *fileType = new wxFileType; if (fileType == NULL) fileType = new wxFileType;
fileType->m_impl->Init(this, n); fileType->m_impl->Init(this, n);
// adds this mime type to _list_ of mime types with this extension
return fileType;
} }
} }
} }
// not found return fileType;
return NULL;
} }
wxFileType * wxFileType *