display types of files, NT objects and registry key/entries

svn path=/trunk/; revision=7946
This commit is contained in:
Martin Fuchs 2004-01-31 23:02:21 +00:00
parent df1d5b7032
commit 18feaceddc
11 changed files with 126 additions and 63 deletions

View file

@ -92,6 +92,35 @@ void _log_(LPCTSTR txt)
}
bool FileTypeManager::is_exe_file(LPCTSTR ext)
{
static const LPCTSTR s_executable_extensions[] = {
TEXT("COM"),
TEXT("EXE"),
TEXT("BAT"),
TEXT("CMD"),
TEXT("CMM"),
TEXT("BTM"),
TEXT("AWK"),
0
};
TCHAR ext_buffer[_MAX_EXT];
const LPCTSTR* p;
LPCTSTR s;
LPTSTR d;
for(s=ext+1,d=ext_buffer; (*d=toupper(*s)); s++)
++d;
for(p=s_executable_extensions; *p; p++)
if (!lstrcmp(ext_buffer, *p))
return true;
return false;
}
const FileTypeInfo& FileTypeManager::operator[](String ext)
{
#ifndef __WINE__ ///@todo
@ -107,12 +136,16 @@ const FileTypeInfo& FileTypeManager::operator[](String ext)
ftype._neverShowExt = false;
HKEY hkey;
TCHAR value[MAX_PATH];
LONG valuelen = MAX_PATH;
TCHAR value[MAX_PATH], display_name[MAX_PATH];;
LONG valuelen = sizeof(value);
if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, value, &valuelen)) {
ftype._classname = value;
valuelen = sizeof(display_name);
if (!RegQueryValue(HKEY_CLASSES_ROOT, ftype._classname, display_name, &valuelen))
ftype._displayname = display_name;
if (!RegOpenKey(HKEY_CLASSES_ROOT, ftype._classname, &hkey)) {
if (!RegQueryValueEx(hkey, TEXT("NeverShowExt"), 0, NULL, NULL, NULL))
ftype._neverShowExt = true;
@ -124,6 +157,31 @@ const FileTypeInfo& FileTypeManager::operator[](String ext)
return ftype;
}
LPCTSTR FileTypeManager::set_type(Entry* entry, bool dont_hide_ext)
{
LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.'));
if (ext) {
const FileTypeInfo& type = (*this)[ext];
if (!type._displayname.empty())
entry->_type_name = _tcsdup(type._displayname);
// hide some file extensions
if (type._neverShowExt && !dont_hide_ext) {
int len = ext - entry->_data.cFileName;
entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR));
_tcsncpy(entry->_display_name, entry->_data.cFileName, len);
entry->_display_name[len] = TEXT('\0');
}
if (is_exe_file(ext))
entry->_data.dwFileAttributes |= ATTRIBUTE_EXECUTABLE;
}
return ext;
}
Icon::Icon()
: _id(ICID_UNKNOWN),

View file

@ -29,6 +29,7 @@
/// management of file types
struct FileTypeInfo {
String _classname;
String _displayname;
bool _neverShowExt;
};
@ -37,6 +38,10 @@ struct FileTypeManager : public map<String, FileTypeInfo>
typedef map<String, FileTypeInfo> super;
const FileTypeInfo& operator[](String ext);
static bool is_exe_file(LPCTSTR ext);
LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false);
};

View file

@ -46,6 +46,7 @@ Entry::Entry(ENTRY_TYPE etype)
_level = 0;
_icon_id = ICID_UNKNOWN;
_display_name = _data.cFileName;
_type_name = NULL;
}
Entry::Entry(Entry* parent, ENTRY_TYPE etype)
@ -60,6 +61,7 @@ Entry::Entry(Entry* parent, ENTRY_TYPE etype)
_level = 0;
_icon_id = ICID_UNKNOWN;
_display_name = _data.cFileName;
_type_name = NULL;
}
Entry::Entry(const Entry& other)
@ -80,6 +82,7 @@ Entry::Entry(const Entry& other)
_shell_attribs = other._shell_attribs;
_display_name = other._display_name==other._data.cFileName? _data.cFileName: _tcsdup(other._display_name);
_type_name = other._type_name? _tcsdup(other._type_name): NULL;
_etype = other._etype;
_icon_id = other._icon_id;
@ -96,6 +99,9 @@ Entry::~Entry()
if (_display_name != _data.cFileName)
free(_display_name);
if (_type_name)
free(_type_name);
}

View file

@ -53,6 +53,12 @@ enum SCAN_FLAGS {
SCAN_FILESYSTEM = 4
};
#ifndef ATTRIBUTE_SYMBOLIC_LINK
#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000
#define ATTRIBUTE_EXECUTABLE 0x80000000
#endif
/// base of all file and directory entries
struct Entry
{
@ -76,6 +82,7 @@ public:
SFGAOF _shell_attribs;
LPTSTR _display_name;
LPTSTR _type_name;
ENTRY_TYPE _etype;
int /*ICON_ID*/ _icon_id;

View file

@ -230,10 +230,8 @@ void NtObjDirectory::read_directory(int scan_flags)
#ifdef UNICODE
wcscpyn(p, info->name.string_ptr, _MAX_PATH);
//@@wcscpyn(_class, info->type.string_ptr, 32);
#else
WideCharToMultiByte(CP_ACP, 0, info->name.string_ptr, info->name.string_len, p, MAX_PATH, 0, 0);
//@@U2T(info->type.string_ptr, _class, 32);
#endif
lstrcpy(w32fd.cFileName, p);
@ -301,6 +299,14 @@ void NtObjDirectory::read_directory(int scan_flags)
memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
#ifdef UNICODE
entry->_type_name = _wcsdup(info->type.string_ptr);
#else
char type_name[32];
WideCharToMultiByte(CP_ACP, 0, info->type.string_ptr, info->type.string_len, type_name, 32, 0, 0);
entry->_type_name = strdup(type_name);
#endif
if (!first_entry)
first_entry = entry;

View file

@ -81,12 +81,6 @@ struct NtObject {
};
#ifndef ATTRIBUTE_SYMBOLIC_LINK
#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000
#define ATTRIBUTE_EXECUTABLE 0x80000000
#endif
/// NtObj file system file-entry
struct NtObjEntry : public Entry
{

View file

@ -45,45 +45,10 @@ enum IMAGE {
#define IMAGE_HEIGHT 13
static int is_exe_file(LPCTSTR ext)
{
static const LPCTSTR executable_extensions[] = {
TEXT("COM"),
TEXT("EXE"),
TEXT("BAT"),
TEXT("CMD"),
TEXT("CMM"),
TEXT("BTM"),
TEXT("AWK"),
0
};
TCHAR ext_buffer[_MAX_EXT];
const LPCTSTR* p;
LPCTSTR s;
LPTSTR d;
for(s=ext+1,d=ext_buffer; (*d=tolower(*s)); s++)
++d;
for(p=executable_extensions; *p; p++)
if (!lstrcmp(ext_buffer, *p))
return 1;
return 0;
}
static int is_registered_type(LPCTSTR ext)
{
// TODO
return 1;
}
static const LPTSTR g_pos_names[COLUMNS] = {
TEXT(""), /* symbol */
TEXT("Name"),
TEXT("Type"),
TEXT("Size"),
TEXT("CDate"),
TEXT("ADate"),
@ -97,6 +62,7 @@ static const LPTSTR g_pos_names[COLUMNS] = {
static const int g_pos_align[] = {
0,
HDF_LEFT, /* Name */
HDF_LEFT, /* Type */
HDF_RIGHT, /* Size */
HDF_LEFT, /* CDate */
HDF_LEFT, /* ADate */
@ -353,13 +319,9 @@ void Pane::draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol)
else
img = IMG_FOLDER;
} else {
LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.'));
if (!ext)
ext = TEXT("");
if (is_exe_file(ext))
if (attrs & ATTRIBUTE_EXECUTABLE)
img = IMG_EXECUTABLE;
else if (is_registered_type(ext))
else if (entry->_type_name)
img = IMG_DOCUMENT;
else
img = IMG_FILE;
@ -521,6 +483,14 @@ void Pane::draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol)
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, entry->_display_name);
++col;
// ouput type/class name
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, entry->_type_name, 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, entry->_type_name);
++col;
// display file size

View file

@ -67,7 +67,7 @@ struct Pane : public SubclassedWindow
Pane(HWND hparent, int id, int id_header, Entry* rool, bool treePane, int visible_cols);
#define COLUMNS 10
#define COLUMNS 11
int _widths[COLUMNS];
int _positions[COLUMNS+1];

View file

@ -68,7 +68,6 @@ void RegDirectory::read_directory(int scan_flags)
w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
_tcscpy(p, name);
///@todo class_name -> _entry->_class_name
lstrcpy(w32fd.cFileName, p);
@ -76,6 +75,9 @@ void RegDirectory::read_directory(int scan_flags)
memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
if (*class_name)
entry->_type_name = _tcsdup(class_name);
if (!first_entry)
first_entry = entry;
@ -100,7 +102,6 @@ void RegDirectory::read_directory(int scan_flags)
memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
_tcscpy(p, name);
///@todo type -> _entry->_class_name
lstrcpy(w32fd.cFileName, p);
@ -108,6 +109,21 @@ void RegDirectory::read_directory(int scan_flags)
memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
switch(type) {
case REG_NONE: entry->_type_name = _tcsdup(TEXT("REG_NONE")); break;
case REG_SZ: entry->_type_name = _tcsdup(TEXT("REG_SZ")); break;
case REG_EXPAND_SZ: entry->_type_name = _tcsdup(TEXT("REG_EXPAND_SZ")); break;
case REG_BINARY: entry->_type_name = _tcsdup(TEXT("REG_BINARY")); break;
case REG_DWORD: entry->_type_name = _tcsdup(TEXT("REG_DWORD")); break;
case REG_DWORD_BIG_ENDIAN: entry->_type_name = _tcsdup(TEXT("REG_DWORD_BIG_ENDIAN")); break;
case REG_LINK: entry->_type_name = _tcsdup(TEXT("REG_LINK")); break;
case REG_MULTI_SZ: entry->_type_name = _tcsdup(TEXT("REG_MULTI_SZ")); break;
case REG_RESOURCE_LIST: entry->_type_name = _tcsdup(TEXT("REG_RESOURCE_LIST")); break;
case REG_FULL_RESOURCE_DESCRIPTOR: entry->_type_name = _tcsdup(TEXT("REG_FULL_RESOURCE_DESCRIPTOR")); break;
case REG_RESOURCE_REQUIREMENTS_LIST: entry->_type_name = _tcsdup(TEXT("REG_RESOURCE_REQUIREMENTS_LIST"));break;
case REG_QWORD: entry->_type_name = _tcsdup(TEXT("REG_QWORD")); break;
}
if (!first_entry)
first_entry = entry;

View file

@ -282,14 +282,8 @@ void ShellDirectory::read_directory(int scan_flags)
}
}
LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.'));
if (ext && g_Globals._ftype_mgr[ext]._neverShowExt) {
int len = ext - entry->_data.cFileName;
entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR));
_tcsncpy(entry->_display_name, entry->_data.cFileName, len);
entry->_display_name[len] = TEXT('\0');
}
// set file type name
LPCTSTR ext = g_Globals._ftype_mgr.set_type(entry);
DWORD attribs = SFGAO_FILESYSTEM;
@ -408,6 +402,9 @@ void ShellDirectory::read_directory(int scan_flags)
entry->_shell_attribs = attribs;
entry->_bhfi_valid = bhfi_valid;
// set file type name
g_Globals._ftype_mgr.set_type(entry);
// get icons for files and virtual objects
if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
!(attribs & SFGAO_FILESYSTEM)) {

View file

@ -28,6 +28,7 @@
#include "../utility/utility.h"
#include "../utility/shellclasses.h"
#include "../globals.h"
#include "entries.h"
#include "winfs.h"
@ -159,6 +160,9 @@ void WinDirectory::read_directory(int scan_flags)
entry->_scanned = false;
entry->_level = level;
// display file type names, but don't hide file extensions
g_Globals._ftype_mgr.set_type(entry, true);
if (scan_flags & SCAN_DO_ACCESS) {
HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);