+
+// ============================================================================
+// global public functions
+// ============================================================================
+
+bool GetExtensionFromMimeType(wxString *pExt, const wxString& strMimeType)
+{
+ // @@@ VZ: I don't know of any official documentation which mentions this
+ // location, but as a matter of fact IE uses it, so why not we?
+ static const char *szMimeDbase = "MIME\\Database\\Content Type\\";
+
+ wxString strKey = szMimeDbase;
+ strKey << strMimeType;
+
+ // suppress possible error messages
+ wxLogNull nolog;
+ wxRegKey key(wxRegKey::HKCR, strKey);
+ if ( key.Open() ) {
+ if ( key.QueryValue("Extension", *pExt) )
+ return TRUE;
+ }
+
+ // no such MIME type or no extension for it
+ return FALSE;
+}
+
+bool GetMimeTypeFromExtension(wxString *pMimeType, const wxString& strExt)
+{
+ wxCHECK( !strExt.IsEmpty(), FALSE );
+
+ // add the leading point if necessary
+ wxString str;
+ if ( strExt[0] != '.' ) {
+ str = '.';
+ }
+ str << strExt;
+
+ // suppress possible error messages
+ wxLogNull nolog;
+ wxRegKey key(wxRegKey::HKCR, str);
+ if ( key.Open() ) {
+ if ( key.QueryValue("Content Type", *pMimeType) )
+ return TRUE;
+ }
+
+ // no such extension or no content-type
+ return FALSE;
+}
+
+bool GetFileTypeFromExtension(wxString *pFileType, const wxString& strExt)
+{
+ wxCHECK( !strExt.IsEmpty(), FALSE );
+
+ // add the leading point if necessary
+ wxString str;
+ if ( strExt[0] != '.' ) {
+ str = '.';
+ }
+ str << strExt;
+
+ // suppress possible error messages
+ wxLogNull nolog;
+ wxRegKey key(wxRegKey::HKCR, str);
+ if ( key.Open() ) {
+ if ( key.QueryValue("", *pFileType) ) // it's the default value of the key
+ return TRUE;
+ }
+
+ // no such extension or no value
+ return FALSE;
+}
+
+bool GetFileTypeIcon(wxIcon *pIcon, const wxString& strFileType)
+{
+ wxCHECK( !strFileType.IsEmpty(), FALSE );
+
+ wxString strIconKey;
+ strIconKey << strFileType << REG_SEPARATOR << "DefaultIcon";
+
+ // suppress possible error messages
+ wxLogNull nolog;
+ wxRegKey key(wxRegKey::HKCR, strIconKey);
+
+ if ( key.Open() ) {
+ wxString strIcon;
+ if ( key.QueryValue("", strIcon) ) { // it's the default value of the key
+ // the format is the following: <full path to file>, <icon index>
+ // NB: icon index may be negative as well as positive and the full path
+ // may contain the environment variables inside '%'
+ wxString strFullPath = strIcon.Before(','),
+ strIndex = strIcon.Right(',');
+
+ // index may be omitted, in which case Before(',') is empty and
+ // Right(',') is the whole string
+ if ( strFullPath.IsEmpty() ) {
+ strFullPath = strIndex;
+ strIndex = "0";
+ }
+
+ wxString strExpPath = wxExpandEnvVars(strFullPath);
+ int nIndex = atoi(strIndex);
+
+ HICON hIcon = ExtractIcon(GetModuleHandle(NULL), strExpPath, nIndex);
+ switch ( (int)hIcon ) {
+ case 0: // means no icons were found
+ case 1: // means no such file or it wasn't a DLL/EXE/OCX/ICO/...
+ wxLogDebug("incorrect registry entry '%s': no such icon.",
+ GetFullName(&key));
+ break;
+
+ default:
+ pIcon->SetHICON((WXHICON)hIcon);
+ return TRUE;
+ }
+ }
+ }
+
+ // no such file type or no value or incorrect icon entry
+ return FALSE;
+}
+
+bool GetFileTypeDescription(wxString *pDesc, const wxString& strFileType)
+{
+ wxCHECK( !strFileType.IsEmpty(), FALSE );
+
+ // suppress possible error messages
+ wxLogNull nolog;
+ wxRegKey key(wxRegKey::HKCR, strFileType);
+
+ if ( key.Open() ) {
+ if ( key.QueryValue("", *pDesc) ) // it's the default value of the key
+ return TRUE;
+ }
+
+ // no such file type or no value
+ return FALSE;
+}
+
+