Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
3abb5bd6
Commit
3abb5bd6
authored
Apr 25, 2005
by
Michael Jung
Committed by
Alexandre Julliard
Apr 25, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support for regular files (as opposed to directories).
parent
e901cc4b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
272 additions
and
153 deletions
+272
-153
shell32_De.rc
dlls/shell32/shell32_De.rc
+21
-38
shell32_En.rc
dlls/shell32/shell32_En.rc
+21
-38
shfldr_unixfs.c
dlls/shell32/shfldr_unixfs.c
+228
-77
shresdef.h
dlls/shell32/shresdef.h
+2
-0
No files found.
dlls/shell32/shell32_De.rc
View file @
3abb5bd6
...
@@ -132,30 +132,33 @@ FONT 8, "MS Shell Dlg"
...
@@ -132,30 +132,33 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "&Durchsuchen...", 12288, 170, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Durchsuchen...", 12288, 170, 63, 50, 14, WS_TABSTOP
}
}
/*
special folders
*/
STRINGTABLE DISCARDABLE
STRINGTABLE DISCARDABLE
{
{
/* columns in the shellview */
IDS_SHV_COLUMN1 "Datei"
IDS_SHV_COLUMN2 "Gre"
IDS_SHV_COLUMN3 "Typ"
IDS_SHV_COLUMN4 "Gendert"
IDS_SHV_COLUMN5 "Attribute"
IDS_SHV_COLUMN6 "Gesamtgre"
IDS_SHV_COLUMN7 "Freier Speicher"
IDS_SHV_COLUMN8 "Name"
IDS_SHV_COLUMN9 "Kommentar"
IDS_SHV_COLUMN10 "Besitzer"
IDS_SHV_COLUMN11 "Gruppe"
/* special folders */
IDS_DESKTOP "Desktop"
IDS_DESKTOP "Desktop"
IDS_MYCOMPUTER "Arbeitsplatz"
IDS_MYCOMPUTER "Arbeitsplatz"
}
/*
/* context menus */
context menus
*/
STRINGTABLE DISCARDABLE
{
IDS_VIEW_LARGE "&Groe Symbole"
IDS_VIEW_LARGE "&Groe Symbole"
IDS_VIEW_SMALL "&Kleine Symbole"
IDS_VIEW_SMALL "&Kleine Symbole"
IDS_VIEW_LIST "&Liste"
IDS_VIEW_LIST "&Liste"
IDS_VIEW_DETAILS "&Details"
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Auswhlen"
IDS_SELECT "Auswhlen"
IDS_OPEN "ffnen"
IDS_OPEN "ffnen"
}
STRINGTABLE DISCARDABLE
{
IDS_CREATEFOLDER_DENIED "Es konnte kein neues Verzeichnis erstellt werden: Zugriff verweigert."
IDS_CREATEFOLDER_DENIED "Es konnte kein neues Verzeichnis erstellt werden: Zugriff verweigert."
IDS_CREATEFOLDER_CAPTION "Es trat ein Fehler beim Erstellen eines neuen Verzeichnisses auf"
IDS_CREATEFOLDER_CAPTION "Es trat ein Fehler beim Erstellen eines neuen Verzeichnisses auf"
IDS_DELETEITEM_CAPTION "Besttigung: Datei lschen"
IDS_DELETEITEM_CAPTION "Besttigung: Datei lschen"
...
@@ -164,34 +167,14 @@ STRINGTABLE DISCARDABLE
...
@@ -164,34 +167,14 @@ STRINGTABLE DISCARDABLE
IDS_DELETEMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Dateien lschen mchten ?"
IDS_DELETEMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Dateien lschen mchten ?"
IDS_OVERWRITEFILE_TEXT "Mchten Sie, dass die Datei '%1' berschrieben wird ?"
IDS_OVERWRITEFILE_TEXT "Mchten Sie, dass die Datei '%1' berschrieben wird ?"
IDS_OVERWRITEFILE_CAPTION "Besttigung: Datei berschreiben"
IDS_OVERWRITEFILE_CAPTION "Besttigung: Datei berschreiben"
}
/* columns in the shellview */
/* message box strings */
STRINGTABLE
IDS_RESTART_TITLE "Neustarten"
BEGIN
IDS_RESTART_PROMPT "Mchten Sie, dass ein simulierter Windows Neustart durchgefhrt wird ?"
IDS_SHV_COLUMN1 "Datei"
IDS_SHUTDOWN_TITLE "Anhalten"
IDS_SHV_COLUMN2 "Gre"
IDS_SHUTDOWN_PROMPT "Mchten Sie die aktuelle Wine Sitzung beenden ?"
IDS_SHV_COLUMN3 "Typ"
IDS_SHV_COLUMN4 "Gendert"
IDS_SHV_COLUMN5 "Attribute"
IDS_SHV_COLUMN6 "Gesamtgre"
IDS_SHV_COLUMN7 "Freier Speicher"
IDS_SHV_COLUMN8 "Name"
IDS_SHV_COLUMN9 "Kommentar"
END
/* message box strings */
/* shell folder path default values */
STRINGTABLE DISCARDABLE
{
IDS_RESTART_TITLE "Neustarten"
IDS_RESTART_PROMPT "Mchten Sie, dass ein simulierter Windows Neustart durchgefhrt wird ?"
IDS_SHUTDOWN_TITLE "Anhalten"
IDS_SHUTDOWN_PROMPT "Mchten Sie die aktuelle Wine Sitzung beenden ?"
}
/* shell folder path default values */
STRINGTABLE DISCARDABLE
{
IDS_PROGRAMS "Startmen\\Programme"
IDS_PROGRAMS "Startmen\\Programme"
IDS_PERSONAL "Eigene Dateien"
IDS_PERSONAL "Eigene Dateien"
IDS_FAVORITES "Favoriten"
IDS_FAVORITES "Favoriten"
...
...
dlls/shell32/shell32_En.rc
View file @
3abb5bd6
...
@@ -131,30 +131,33 @@ FONT 8, "MS Shell Dlg"
...
@@ -131,30 +131,33 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP
}
}
/*
special folders
*/
STRINGTABLE DISCARDABLE
STRINGTABLE DISCARDABLE
{
{
/* columns in the shellview */
IDS_SHV_COLUMN1 "File"
IDS_SHV_COLUMN2 "Size"
IDS_SHV_COLUMN3 "Type"
IDS_SHV_COLUMN4 "Modified"
IDS_SHV_COLUMN5 "Attributes"
IDS_SHV_COLUMN6 "Size"
IDS_SHV_COLUMN7 "Size available"
IDS_SHV_COLUMN8 "Name"
IDS_SHV_COLUMN9 "Comments"
IDS_SHV_COLUMN10 "Owner"
IDS_SHV_COLUMN11 "Group"
/* special folders */
IDS_DESKTOP "Desktop"
IDS_DESKTOP "Desktop"
IDS_MYCOMPUTER "My Computer"
IDS_MYCOMPUTER "My Computer"
}
/*
/* context menus */
context menus
*/
STRINGTABLE DISCARDABLE
{
IDS_VIEW_LARGE "Lar&ge Icons"
IDS_VIEW_LARGE "Lar&ge Icons"
IDS_VIEW_SMALL "S&mall Icons"
IDS_VIEW_SMALL "S&mall Icons"
IDS_VIEW_LIST "&List"
IDS_VIEW_LIST "&List"
IDS_VIEW_DETAILS "&Details"
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_OPEN "Open"
}
STRINGTABLE DISCARDABLE
{
IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied."
IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"
IDS_DELETEITEM_CAPTION "Confirm file delete"
IDS_DELETEITEM_CAPTION "Confirm file delete"
...
@@ -163,34 +166,14 @@ STRINGTABLE DISCARDABLE
...
@@ -163,34 +166,14 @@ STRINGTABLE DISCARDABLE
IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?"
IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?"
IDS_OVERWRITEFILE_TEXT "OverWrite File %1?"
IDS_OVERWRITEFILE_TEXT "OverWrite File %1?"
IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite"
IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite"
}
/* columns in the shellview */
/* message box strings */
STRINGTABLE
IDS_RESTART_TITLE "Restart"
BEGIN
IDS_RESTART_PROMPT "Do you want to simulate a Windows reboot?"
IDS_SHV_COLUMN1 "File"
IDS_SHUTDOWN_TITLE "Shutdown"
IDS_SHV_COLUMN2 "Size"
IDS_SHUTDOWN_PROMPT "Do you want to shutdown your Wine session?"
IDS_SHV_COLUMN3 "Type"
IDS_SHV_COLUMN4 "Modified"
IDS_SHV_COLUMN5 "Attributes"
IDS_SHV_COLUMN6 "Size"
IDS_SHV_COLUMN7 "Size available"
IDS_SHV_COLUMN8 "Name"
IDS_SHV_COLUMN9 "Comments"
END
/* message box strings */
/* shell folder path default values */
STRINGTABLE DISCARDABLE
{
IDS_RESTART_TITLE "Restart"
IDS_RESTART_PROMPT "Do you want to simulate a Windows reboot?"
IDS_SHUTDOWN_TITLE "Shutdown"
IDS_SHUTDOWN_PROMPT "Do you want to shutdown your Wine session?"
}
/* shell folder path default values */
STRINGTABLE DISCARDABLE
{
IDS_PROGRAMS "Start Menu\\Programs"
IDS_PROGRAMS "Start Menu\\Programs"
IDS_PERSONAL "My Documents"
IDS_PERSONAL "My Documents"
IDS_FAVORITES "Favorites"
IDS_FAVORITES "Favorites"
...
...
dlls/shell32/shfldr_unixfs.c
View file @
3abb5bd6
...
@@ -21,6 +21,9 @@
...
@@ -21,6 +21,9 @@
#include <stdio.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdarg.h>
#include <dirent.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#define COBJMACROS
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSUNION
...
@@ -30,6 +33,8 @@
...
@@ -30,6 +33,8 @@
#include "winbase.h"
#include "winbase.h"
#include "winuser.h"
#include "winuser.h"
#include "objbase.h"
#include "objbase.h"
#include "winreg.h"
#include "winternl.h"
#include "wine/debug.h"
#include "wine/debug.h"
#include "shell32_main.h"
#include "shell32_main.h"
...
@@ -44,48 +49,101 @@ const GUID CLSID_UnixFolder = {0xcc702eb2, 0x7dc5, 0x11d9, {0xc6, 0x87, 0x00, 0x
...
@@ -44,48 +49,101 @@ const GUID CLSID_UnixFolder = {0xcc702eb2, 0x7dc5, 0x11d9, {0xc6, 0x87, 0x00, 0x
#define ADJUST_THIS(c,m,p) ((c*)(((long)p)-(long)&(((c*)0)->lp##m##Vtbl)))
#define ADJUST_THIS(c,m,p) ((c*)(((long)p)-(long)&(((c*)0)->lp##m##Vtbl)))
#define STATIC_CAST(i,p) ((i*)&p->lp##i##Vtbl)
#define STATIC_CAST(i,p) ((i*)&p->lp##i##Vtbl)
/* FileStruct reserves one byte for szNames, thus we don't
need
to
/* FileStruct reserves one byte for szNames, thus we don't
have
to
* alloc a byte for the terminating '\0' of 'name'. Two of the
four
* alloc a byte for the terminating '\0' of 'name'. Two of the
* additional bytes are for SHITEMID's cb field. One is for IDLDATA's
* additional bytes are for SHITEMID's cb field. One is for IDLDATA's
* type field. One is for FileStruct's szNames field, to terminate
* type field. One is for FileStruct's szNames field, to terminate
* the alternate DOS name, which we don't use here.
* the alternate DOS name, which we don't use here. And then there's
* the additional StatStruct.
*/
*/
#define SHITEMID_LEN_FROM_NAME_LEN(n) (sizeof(USHORT)+sizeof(PIDLTYPE)+sizeof(FileStruct)+(n)+sizeof(char))
#define SHITEMID_LEN_FROM_NAME_LEN(n) \
#define NAME_LEN_FROM_LPSHITEMID(s) (((LPSHITEMID)s)->cb-sizeof(USHORT)-sizeof(PIDLTYPE)-sizeof(FileStruct)-sizeof(char))
(sizeof(USHORT)+sizeof(PIDLTYPE)+sizeof(FileStruct)+(n)+sizeof(char)+sizeof(StatStruct))
#define NAME_LEN_FROM_LPSHITEMID(s) \
(((LPSHITEMID)s)->cb-sizeof(USHORT)-sizeof(PIDLTYPE)-sizeof(FileStruct)-sizeof(char)-sizeof(StatStruct))
#define LPSTATSTRUCT_FROM_LPSHITEMID(s) ((StatStruct*)(((LPBYTE)s)+((LPSHITEMID)s)->cb-sizeof(StatStruct)))
/* This structure is appended to shell32's FileStruct type in IDLs to store unix
* filesystem specific informationen extracted with the stat system call.
*/
typedef
struct
tagStatStruct
{
mode_t
st_mode
;
uid_t
st_uid
;
gid_t
st_gid
;
}
StatStruct
;
/******************************************************************************
* UNIXFS_is_pidl_of_type [INTERNAL]
*
* Checks for the first SHITEMID of an ITEMIDLIST if it passes a filter.
*
* PARAMS
* pIDL [I] The ITEMIDLIST to be checked.
* fFilter [I] Shell condition flags, which specify the filter.
*
* RETURNS
* TRUE, if pIDL is accepted by fFilter
* FALSE, otherwise
*/
static
inline
BOOL
UNIXFS_is_pidl_of_type
(
LPITEMIDLIST
pIDL
,
SHCONTF
fFilter
)
{
LPSTR
pszText
=
_ILGetTextPointer
(
pIDL
);
if
(
!
pszText
)
return
FALSE
;
if
(
pszText
[
0
]
==
'.'
&&
!
(
fFilter
&
SHCONTF_INCLUDEHIDDEN
))
return
FALSE
;
if
(
_ILIsFolder
(
pIDL
)
&&
(
fFilter
&
SHCONTF_FOLDERS
))
return
TRUE
;
if
(
_ILIsValue
(
pIDL
)
&&
(
fFilter
&
SHCONTF_NONFOLDERS
))
return
TRUE
;
return
FALSE
;
}
/******************************************************************************
/******************************************************************************
* UNIXFS_build_shitemid [Internal]
* UNIXFS_build_shitemid [Internal]
*
*
* Builds a shell item for the given path. Only the part of the path up to the
* Constructs a new SHITEMID for a single path item (up to the next '/' or
* next '/' or to the end of the string is considered. Don't forget do append a
* '\0') into a buffer. Decorates the SHITEMID with information from a stat
* 0 ushort value, if what you need is a ITEMIDLIST with a single entry.
* system call.
*
* PARAMS
* name [I] The name of the next path item. Terminated by either '\0' or '/'.
* pStat [I] A stat struct variable obtained by a stat system call on the file.
* buffer [O] SHITEMID will be constructed here.
*
*
* The signature of this function will change in the future. Better documentation
* RETURNS
* to follow.
* A pointer to the next '/' or '\0' character in name.
*
* NOTES
* Minimum size of buffer is SHITEMID_LEN_FROM_NAME_LEN(strlen(name)).
* If what you need is a PIDLLIST with a single SHITEMID, don't forget to append
* a 0 USHORT value.
*/
*/
static
const
char
*
UNIXFS_build_shitemid
(
const
char
*
name
,
void
*
buffer
)
{
static
char
*
UNIXFS_build_shitemid
(
char
*
name
,
struct
stat
*
pStat
,
void
*
buffer
)
{
LARGE_INTEGER
time
;
FILETIME
fileTime
;
LPPIDLDATA
pIDLData
;
LPPIDLDATA
pIDLData
;
StatStruct
*
pStatStruct
;
int
cNameLen
;
int
cNameLen
;
char
*
pSlash
;
char
*
pSlash
;
TRACE
(
"(name=%s, buffer=%p)
\n
"
,
debugstr_a
(
name
),
buffer
);
TRACE
(
"(name=%s, buffer=%p)
\n
"
,
debugstr_a
(
name
),
buffer
);
pSlash
=
strchr
(
name
,
'/'
);
pSlash
=
strchr
(
name
,
'/'
);
cNameLen
=
pSlash
?
pSlash
-
name
:
strlen
(
name
);
cNameLen
=
pSlash
?
pSlash
-
name
:
strlen
(
name
);
memset
(
buffer
,
0
,
SHITEMID_LEN_FROM_NAME_LEN
(
cNameLen
));
memset
(
buffer
,
0
,
SHITEMID_LEN_FROM_NAME_LEN
(
cNameLen
));
((
LPSHITEMID
)
buffer
)
->
cb
=
SHITEMID_LEN_FROM_NAME_LEN
(
cNameLen
)
;
((
LPSHITEMID
)
buffer
)
->
cb
=
SHITEMID_LEN_FROM_NAME_LEN
(
cNameLen
)
;
/* Other than the type and the name those are dummy values for now. More to come.
*/
pIDLData
=
_ILGetDataPointer
((
LPCITEMIDLIST
)
buffer
);
pIDLData
=
_ILGetDataPointer
((
LPCITEMIDLIST
)
buffer
);
pIDLData
->
type
=
PT_FOLDER
;
pIDLData
->
type
=
S_ISDIR
(
pStat
->
st_mode
)
?
PT_FOLDER
:
PT_VALUE
;
pIDLData
->
u
.
file
.
dwFileSize
=
0
;
pIDLData
->
u
.
file
.
dwFileSize
=
(
DWORD
)
pStat
->
st_size
;
pIDLData
->
u
.
file
.
uFileDate
=
0
;
RtlSecondsSince1970ToTime
(
pStat
->
st_mtime
,
&
time
);
pIDLData
->
u
.
file
.
uFileTime
=
0
;
fileTime
.
dwLowDateTime
=
time
.
u
.
LowPart
;
fileTime
.
dwHighDateTime
=
time
.
u
.
HighPart
;
FileTimeToDosDateTime
(
&
fileTime
,
&
pIDLData
->
u
.
file
.
uFileDate
,
&
pIDLData
->
u
.
file
.
uFileTime
);
pIDLData
->
u
.
file
.
uFileAttribs
=
0
;
pIDLData
->
u
.
file
.
uFileAttribs
=
0
;
memcpy
(
pIDLData
->
u
.
file
.
szNames
,
name
,
cNameLen
);
memcpy
(
pIDLData
->
u
.
file
.
szNames
,
name
,
cNameLen
);
pStatStruct
=
LPSTATSTRUCT_FROM_LPSHITEMID
(
buffer
);
pStatStruct
->
st_mode
=
pStat
->
st_mode
;
pStatStruct
->
st_uid
=
pStat
->
st_uid
;
pStatStruct
->
st_gid
=
pStat
->
st_gid
;
return
pSlash
?
pSlash
+
1
:
(
name
+
cNameLen
);
return
pSlash
?
pSlash
+
1
:
(
name
+
cNameLen
);
}
}
...
@@ -105,10 +163,11 @@ static const char* UNIXFS_build_shitemid(const char *name, void *buffer) {
...
@@ -105,10 +163,11 @@ static const char* UNIXFS_build_shitemid(const char *name, void *buffer) {
* ending with a slash ('/'). Currently, only directories (no files)
* ending with a slash ('/'). Currently, only directories (no files)
* are accepted.
* are accepted.
*/
*/
static
BOOL
UNIXFS_path_to_pidl
(
c
onst
c
har
*
path
,
LPITEMIDLIST
*
ppidl
)
{
static
BOOL
UNIXFS_path_to_pidl
(
char
*
path
,
LPITEMIDLIST
*
ppidl
)
{
LPITEMIDLIST
pidl
;
LPITEMIDLIST
pidl
;
struct
stat
fileStat
;
int
cSubDirs
,
cPidlLen
;
int
cSubDirs
,
cPidlLen
;
c
onst
char
*
pSlash
;
c
har
*
pSlash
,
swap
;
TRACE
(
"path=%s, ppidl=%p"
,
debugstr_a
(
path
),
ppidl
);
TRACE
(
"path=%s, ppidl=%p"
,
debugstr_a
(
path
),
ppidl
);
...
@@ -130,9 +189,26 @@ static BOOL UNIXFS_path_to_pidl(const char *path, LPITEMIDLIST *ppidl) {
...
@@ -130,9 +189,26 @@ static BOOL UNIXFS_path_to_pidl(const char *path, LPITEMIDLIST *ppidl) {
if
(
!
pidl
)
return
FALSE
;
if
(
!
pidl
)
return
FALSE
;
/* Concatenate the SHITEMIDs of the sub-directories. */
/* Concatenate the SHITEMIDs of the sub-directories. */
pSlash
=
path
;
/* First character of path is guaranteed to be '/' */
while
(
*
path
)
{
while
(
*
path
)
{
path
=
UNIXFS_build_shitemid
(
path
,
pidl
);
if
(
pSlash
)
{
/* For the stat call, we temporarily replace the char
* after the next '/' with a '\0'. */
swap
=
pSlash
[
1
];
pSlash
[
1
]
=
'\0'
;
if
(
stat
(
path
,
&
fileStat
))
{
pSlash
[
1
]
=
swap
;
return
FALSE
;
}
pSlash
[
1
]
=
swap
;
}
else
{
/* We are at the last item in path. */
if
(
stat
(
path
,
&
fileStat
))
return
FALSE
;
}
path
=
UNIXFS_build_shitemid
(
path
,
&
fileStat
,
pidl
);
pidl
=
ILGetNext
(
pidl
);
pidl
=
ILGetNext
(
pidl
);
pSlash
=
strchr
(
path
,
'/'
);
}
}
pidl
->
mkid
.
cb
=
0
;
/* Terminate the ITEMIDLIST */
pidl
->
mkid
.
cb
=
0
;
/* Terminate the ITEMIDLIST */
...
@@ -218,12 +294,14 @@ static BOOL UNIXFS_pidl_to_path(LPCITEMIDLIST pidl, PSZ *path) {
...
@@ -218,12 +294,14 @@ static BOOL UNIXFS_pidl_to_path(LPCITEMIDLIST pidl, PSZ *path) {
*/
*/
static
BOOL
UNIXFS_build_subfolder_pidls
(
const
char
*
path
,
LPITEMIDLIST
**
apidl
,
DWORD
*
pCount
)
static
BOOL
UNIXFS_build_subfolder_pidls
(
const
char
*
path
,
LPITEMIDLIST
**
apidl
,
DWORD
*
pCount
)
{
{
struct
dirent
*
pDirEntry
;
struct
stat
fileStat
;
DIR
*
dir
;
DIR
*
dir
;
struct
dirent
*
pSubDir
;
DWORD
cDirEntries
,
i
;
DWORD
cSubDirs
,
i
;
USHORT
sLen
;
USHORT
sLen
;
char
*
pszFQPath
;
TRACE
(
"(path=%s, apidl=%p, pCount=%p)
\n
"
,
path
,
apidl
,
pCount
);
TRACE
(
"(path=%s, apidl=%p, pCount=%p)
\n
"
,
debugstr_a
(
path
)
,
apidl
,
pCount
);
*
apidl
=
NULL
;
*
apidl
=
NULL
;
*
pCount
=
0
;
*
pCount
=
0
;
...
@@ -234,8 +312,9 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
...
@@ -234,8 +312,9 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
if
(
!
strlen
(
path
))
{
if
(
!
strlen
(
path
))
{
LPSHITEMID
pid
;
LPSHITEMID
pid
;
if
(
stat
(
"/"
,
&
fileStat
))
return
FALSE
;
pid
=
(
LPSHITEMID
)
SHAlloc
(
SHITEMID_LEN_FROM_NAME_LEN
(
0
)
+
sizeof
(
USHORT
));
pid
=
(
LPSHITEMID
)
SHAlloc
(
SHITEMID_LEN_FROM_NAME_LEN
(
0
)
+
sizeof
(
USHORT
));
UNIXFS_build_shitemid
(
""
,
pid
);
UNIXFS_build_shitemid
(
""
,
&
fileStat
,
pid
);
memset
(((
PBYTE
)
pid
)
+
pid
->
cb
,
0
,
sizeof
(
USHORT
));
memset
(((
PBYTE
)
pid
)
+
pid
->
cb
,
0
,
sizeof
(
USHORT
));
*
apidl
=
SHAlloc
(
sizeof
(
LPITEMIDLIST
));
*
apidl
=
SHAlloc
(
sizeof
(
LPITEMIDLIST
));
...
@@ -255,48 +334,51 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
...
@@ -255,48 +334,51 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
return
FALSE
;
return
FALSE
;
}
}
/* Count number of sub directories.
/* Allocate space for fully qualified paths */
*/
pszFQPath
=
SHAlloc
(
strlen
(
path
)
+
NAME_MAX
);
for
(
cSubDirs
=
0
,
pSubDir
=
readdir
(
dir
);
pSubDir
;
pSubDir
=
readdir
(
dir
))
{
if
(
!
pszFQPath
)
{
if
(
strcmp
(
pSubDir
->
d_name
,
"."
)
&&
WARN
(
"SHAlloc failed!
\n
"
);
strcmp
(
pSubDir
->
d_name
,
".."
)
&&
return
FALSE
;
pSubDir
->
d_type
==
DT_DIR
)
}
{
cSubDirs
++
;
/* Count number of directory entries. */
}
for
(
cDirEntries
=
0
,
pDirEntry
=
readdir
(
dir
);
pDirEntry
;
pDirEntry
=
readdir
(
dir
))
{
if
(
!
strcmp
(
pDirEntry
->
d_name
,
"."
)
||
!
strcmp
(
pDirEntry
->
d_name
,
".."
))
continue
;
sprintf
(
pszFQPath
,
"%s%s"
,
path
,
pDirEntry
->
d_name
);
if
(
!
stat
(
pszFQPath
,
&
fileStat
)
&&
(
S_ISDIR
(
fileStat
.
st_mode
)
||
S_ISREG
(
fileStat
.
st_mode
)))
cDirEntries
++
;
}
}
/* If there are no
subdirecto
ries, we are done. */
/* If there are no
ent
ries, we are done. */
if
(
c
SubDir
s
==
0
)
{
if
(
c
DirEntrie
s
==
0
)
{
closedir
(
dir
);
closedir
(
dir
);
SHFree
(
pszFQPath
);
return
TRUE
;
return
TRUE
;
}
}
/* Allocate the array of PIDLs */
/* Allocate the array of PIDLs */
*
apidl
=
SHAlloc
(
c
SubDir
s
*
sizeof
(
LPITEMIDLIST
));
*
apidl
=
SHAlloc
(
c
DirEntrie
s
*
sizeof
(
LPITEMIDLIST
));
if
(
!
apidl
)
{
if
(
!
apidl
)
{
WARN
(
"SHAlloc failed!
\n
"
);
WARN
(
"SHAlloc failed!
\n
"
);
return
FALSE
;
return
FALSE
;
}
}
/* Allocate and initialize one SHITEMID per sub-directory. */
/* Allocate and initialize one SHITEMID per sub-directory. */
for
(
rewinddir
(
dir
),
p
SubDir
=
readdir
(
dir
),
i
=
0
;
pSubDir
;
pSubDir
=
readdir
(
dir
))
{
for
(
rewinddir
(
dir
),
p
DirEntry
=
readdir
(
dir
),
i
=
0
;
pDirEntry
;
pDirEntry
=
readdir
(
dir
))
{
LPSHITEMID
pid
;
LPSHITEMID
pid
;
if
(
!
strcmp
(
pSubDir
->
d_name
,
"."
)
||
if
(
!
strcmp
(
pDirEntry
->
d_name
,
"."
)
||
!
strcmp
(
pDirEntry
->
d_name
,
".."
))
continue
;
!
strcmp
(
pSubDir
->
d_name
,
".."
)
||
pSubDir
->
d_type
!=
DT_DIR
)
sprintf
(
pszFQPath
,
"%s%s"
,
path
,
pDirEntry
->
d_name
);
{
if
(
stat
(
pszFQPath
,
&
fileStat
))
continue
;
continue
;
if
(
!
S_ISDIR
(
fileStat
.
st_mode
)
&&
!
S_ISREG
(
fileStat
.
st_mode
))
continue
;
}
sLen
=
strlen
(
p
SubDir
->
d_name
);
sLen
=
strlen
(
p
DirEntry
->
d_name
);
pid
=
(
LPSHITEMID
)
SHAlloc
(
SHITEMID_LEN_FROM_NAME_LEN
(
sLen
)
+
sizeof
(
USHORT
));
pid
=
(
LPSHITEMID
)
SHAlloc
(
SHITEMID_LEN_FROM_NAME_LEN
(
sLen
)
+
sizeof
(
USHORT
));
if
(
!
pid
)
{
if
(
!
pid
)
{
WARN
(
"SHAlloc failed!
\n
"
);
WARN
(
"SHAlloc failed!
\n
"
);
return
FALSE
;
return
FALSE
;
}
}
UNIXFS_build_shitemid
(
p
SubDir
->
d_name
,
pid
);
UNIXFS_build_shitemid
(
p
DirEntry
->
d_name
,
&
fileStat
,
pid
);
memset
(((
PBYTE
)
pid
)
+
pid
->
cb
,
0
,
sizeof
(
USHORT
));
memset
(((
PBYTE
)
pid
)
+
pid
->
cb
,
0
,
sizeof
(
USHORT
));
(
*
apidl
)[
i
++
]
=
(
LPITEMIDLIST
)
pid
;
(
*
apidl
)[
i
++
]
=
(
LPITEMIDLIST
)
pid
;
...
@@ -304,6 +386,7 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
...
@@ -304,6 +386,7 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
*
pCount
=
i
;
*
pCount
=
i
;
closedir
(
dir
);
closedir
(
dir
);
SHFree
(
pszFQPath
);
return
TRUE
;
return
TRUE
;
}
}
...
@@ -321,6 +404,7 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
...
@@ -321,6 +404,7 @@ static BOOL UNIXFS_build_subfolder_pidls(const char *path, LPITEMIDLIST **apidl,
*/
*/
typedef
struct
_UnixFolderIcon
{
typedef
struct
_UnixFolderIcon
{
const
IExtractIconWVtbl
*
lpIExtractIconWVtbl
;
const
IExtractIconWVtbl
*
lpIExtractIconWVtbl
;
BOOL
bFolder
;
}
UnixFolderIcon
;
}
UnixFolderIcon
;
static
HRESULT
WINAPI
UnixFolderIcon_IExtractIconW_QueryInterface
(
IExtractIconW
*
iface
,
REFIID
riid
,
static
HRESULT
WINAPI
UnixFolderIcon_IExtractIconW_QueryInterface
(
IExtractIconW
*
iface
,
REFIID
riid
,
...
@@ -356,11 +440,17 @@ static ULONG WINAPI UnixFolderIcon_IExtractIconW_Release(IExtractIconW *iface) {
...
@@ -356,11 +440,17 @@ static ULONG WINAPI UnixFolderIcon_IExtractIconW_Release(IExtractIconW *iface) {
static
HRESULT
WINAPI
UnixFolderIcon_IExtractIconW_GetIconLocation
(
IExtractIconW
*
iface
,
static
HRESULT
WINAPI
UnixFolderIcon_IExtractIconW_GetIconLocation
(
IExtractIconW
*
iface
,
UINT
uFlags
,
LPWSTR
szIconFile
,
UINT
cchMax
,
INT
*
piIndex
,
UINT
*
pwFlags
)
UINT
uFlags
,
LPWSTR
szIconFile
,
UINT
cchMax
,
INT
*
piIndex
,
UINT
*
pwFlags
)
{
{
UnixFolderIcon
*
This
=
ADJUST_THIS
(
UnixFolderIcon
,
IExtractIconW
,
iface
);
TRACE
(
"(iface=%p, uFlags=%u, szIconFile=%s, cchMax=%u, piIndex=%p, pwFlags=%p)
\n
"
,
TRACE
(
"(iface=%p, uFlags=%u, szIconFile=%s, cchMax=%u, piIndex=%p, pwFlags=%p)
\n
"
,
iface
,
uFlags
,
debugstr_w
(
szIconFile
),
cchMax
,
piIndex
,
pwFlags
);
iface
,
uFlags
,
debugstr_w
(
szIconFile
),
cchMax
,
piIndex
,
pwFlags
);
lstrcpynW
(
szIconFile
,
swShell32Name
,
cchMax
);
lstrcpynW
(
szIconFile
,
swShell32Name
,
cchMax
);
*
piIndex
=
(
uFlags
&
GIL_OPENICON
)
?
4
:
3
;
if
(
This
->
bFolder
)
{
*
piIndex
=
(
uFlags
&
GIL_OPENICON
)
?
-
IDI_SHELL_FOLDER_OPEN
:
-
IDI_SHELL_FOLDER
;
}
else
{
*
piIndex
=
-
IDI_SHELL_DOCUMENT
;
}
*
pwFlags
=
0
;
*
pwFlags
=
0
;
return
S_OK
;
return
S_OK
;
...
@@ -388,7 +478,8 @@ static const IExtractIconWVtbl UnixFolderIcon_IExtractIconW_Vtbl = {
...
@@ -388,7 +478,8 @@ static const IExtractIconWVtbl UnixFolderIcon_IExtractIconW_Vtbl = {
/* The singleton instance
/* The singleton instance
*/
*/
UnixFolderIcon
UnixFolderIconSingleton
=
{
&
UnixFolderIcon_IExtractIconW_Vtbl
};
UnixFolderIcon
UnixFolderIconSingleton
=
{
&
UnixFolderIcon_IExtractIconW_Vtbl
,
TRUE
};
UnixFolderIcon
UnixDocumentIconSingleton
=
{
&
UnixFolderIcon_IExtractIconW_Vtbl
,
FALSE
};
/******************************************************************************
/******************************************************************************
* UnixFolder
* UnixFolder
...
@@ -396,16 +487,6 @@ UnixFolderIcon UnixFolderIconSingleton = { &UnixFolderIcon_IExtractIconW_Vtbl };
...
@@ -396,16 +487,6 @@ UnixFolderIcon UnixFolderIconSingleton = { &UnixFolderIcon_IExtractIconW_Vtbl };
* Class whose heap based instances represent unix filesystem directories.
* Class whose heap based instances represent unix filesystem directories.
*/
*/
static
shvheader
GenericSFHeader
[]
=
{
{
IDS_SHV_COLUMN1
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
15
},
{
IDS_SHV_COLUMN2
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
10
},
{
IDS_SHV_COLUMN3
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
10
},
{
IDS_SHV_COLUMN4
,
SHCOLSTATE_TYPE_DATE
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
12
},
{
IDS_SHV_COLUMN5
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
5
}
};
#define GENERICSHELLVIEWCOLUMNS 5
/* UnixFolder object layout and typedef.
/* UnixFolder object layout and typedef.
*/
*/
typedef
struct
_UnixFolder
{
typedef
struct
_UnixFolder
{
...
@@ -501,7 +582,7 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_ParseDisplayName(IShellFolder2* i
...
@@ -501,7 +582,7 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_ParseDisplayName(IShellFolder2* i
return
result
?
S_OK
:
E_FAIL
;
return
result
?
S_OK
:
E_FAIL
;
}
}
static
IUnknown
*
UnixSubFolderIterator_Construct
(
UnixFolder
*
pUnixFolder
);
static
IUnknown
*
UnixSubFolderIterator_Construct
(
UnixFolder
*
pUnixFolder
,
SHCONTF
fFilter
);
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_EnumObjects
(
IShellFolder2
*
iface
,
HWND
hwndOwner
,
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_EnumObjects
(
IShellFolder2
*
iface
,
HWND
hwndOwner
,
SHCONTF
grfFlags
,
IEnumIDList
**
ppEnumIDList
)
SHCONTF
grfFlags
,
IEnumIDList
**
ppEnumIDList
)
...
@@ -513,7 +594,7 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_EnumObjects(IShellFolder2* iface,
...
@@ -513,7 +594,7 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_EnumObjects(IShellFolder2* iface,
TRACE
(
"(iface=%p, hwndOwner=%p, grfFlags=%08lx, ppEnumIDList=%p)
\n
"
,
TRACE
(
"(iface=%p, hwndOwner=%p, grfFlags=%08lx, ppEnumIDList=%p)
\n
"
,
iface
,
hwndOwner
,
grfFlags
,
ppEnumIDList
);
iface
,
hwndOwner
,
grfFlags
,
ppEnumIDList
);
newIterator
=
UnixSubFolderIterator_Construct
(
This
);
newIterator
=
UnixSubFolderIterator_Construct
(
This
,
grfFlags
);
hr
=
IUnknown_QueryInterface
(
newIterator
,
&
IID_IEnumIDList
,
(
void
**
)
ppEnumIDList
);
hr
=
IUnknown_QueryInterface
(
newIterator
,
&
IID_IEnumIDList
,
(
void
**
)
ppEnumIDList
);
IUnknown_Release
(
newIterator
);
IUnknown_Release
(
newIterator
);
...
@@ -571,6 +652,11 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_CompareIDs(IShellFolder2* iface,
...
@@ -571,6 +652,11 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_CompareIDs(IShellFolder2* iface,
else
if
(
isEmpty2
)
else
if
(
isEmpty2
)
return
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
0
,
(
WORD
)
1
);
return
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
0
,
(
WORD
)
1
);
if
(
_ILIsFolder
(
pidl1
)
&&
!
_ILIsFolder
(
pidl2
))
return
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
0
,
(
WORD
)
-
1
);
if
(
!
_ILIsFolder
(
pidl1
)
&&
_ILIsFolder
(
pidl2
))
return
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
0
,
(
WORD
)
1
);
compare
=
CompareStringA
(
LOCALE_USER_DEFAULT
,
NORM_IGNORECASE
,
compare
=
CompareStringA
(
LOCALE_USER_DEFAULT
,
NORM_IGNORECASE
,
_ILGetTextPointer
(
pidl1
),
NAME_LEN_FROM_LPSHITEMID
(
pidl1
),
_ILGetTextPointer
(
pidl1
),
NAME_LEN_FROM_LPSHITEMID
(
pidl1
),
_ILGetTextPointer
(
pidl2
),
NAME_LEN_FROM_LPSHITEMID
(
pidl2
));
_ILGetTextPointer
(
pidl2
),
NAME_LEN_FROM_LPSHITEMID
(
pidl2
));
...
@@ -623,9 +709,19 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_CreateViewObject(IShellFolder2* i
...
@@ -623,9 +709,19 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_CreateViewObject(IShellFolder2* i
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_GetAttributesOf
(
IShellFolder2
*
iface
,
UINT
cidl
,
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_GetAttributesOf
(
IShellFolder2
*
iface
,
UINT
cidl
,
LPCITEMIDLIST
*
apidl
,
SFGAOF
*
rgfInOut
)
LPCITEMIDLIST
*
apidl
,
SFGAOF
*
rgfInOut
)
{
{
UINT
i
;
SFGAOF
flags
=
~
(
SFGAOF
)
0
;
TRACE
(
"(iface=%p, cidl=%u, apidl=%p, rgfInOut=%p) semi-stub
\n
"
,
iface
,
cidl
,
apidl
,
rgfInOut
);
TRACE
(
"(iface=%p, cidl=%u, apidl=%p, rgfInOut=%p) semi-stub
\n
"
,
iface
,
cidl
,
apidl
,
rgfInOut
);
for
(
i
=
0
;
i
<
cidl
;
i
++
)
{
LPPIDLDATA
pData
=
_ILGetDataPointer
(
apidl
[
i
]);
if
(
!
pData
)
continue
;
if
(
pData
->
type
==
PT_FOLDER
)
flags
&=
(
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
);
if
(
pData
->
type
==
PT_VALUE
)
flags
&=
SFGAO_FILESYSTEM
;
}
*
rgfInOut
=
*
rgfInOut
&
(
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
)
;
*
rgfInOut
=
*
rgfInOut
&
flags
;
return
S_OK
;
return
S_OK
;
}
}
...
@@ -648,7 +744,11 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetUIObjectOf(IShellFolder2* ifac
...
@@ -648,7 +744,11 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetUIObjectOf(IShellFolder2* ifac
FIXME
(
"IExtractIconA
\n
"
);
FIXME
(
"IExtractIconA
\n
"
);
return
E_FAIL
;
return
E_FAIL
;
}
else
if
(
IsEqualIID
(
&
IID_IExtractIconW
,
riid
))
{
}
else
if
(
IsEqualIID
(
&
IID_IExtractIconW
,
riid
))
{
*
ppvOut
=
&
UnixFolderIconSingleton
;
if
(
cidl
!=
1
)
return
E_FAIL
;
if
(
_ILIsFolder
(
apidl
[
0
]))
*
ppvOut
=
&
UnixFolderIconSingleton
;
else
*
ppvOut
=
&
UnixDocumentIconSingleton
;
return
S_OK
;
return
S_OK
;
}
else
if
(
IsEqualIID
(
&
IID_IDropTarget
,
riid
))
{
}
else
if
(
IsEqualIID
(
&
IID_IDropTarget
,
riid
))
{
FIXME
(
"IDropTarget
\n
"
);
FIXME
(
"IDropTarget
\n
"
);
...
@@ -760,34 +860,70 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetDetailsEx(IShellFolder2* iface
...
@@ -760,34 +860,70 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetDetailsEx(IShellFolder2* iface
return
E_NOTIMPL
;
return
E_NOTIMPL
;
}
}
#define SHELLVIEWCOLUMNS 6
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_GetDetailsOf
(
IShellFolder2
*
iface
,
static
HRESULT
WINAPI
UnixFolder_IShellFolder2_GetDetailsOf
(
IShellFolder2
*
iface
,
LPCITEMIDLIST
pidl
,
UINT
iColumn
,
SHELLDETAILS
*
psd
)
LPCITEMIDLIST
pidl
,
UINT
iColumn
,
SHELLDETAILS
*
psd
)
{
{
HRESULT
hr
=
E_FAIL
;
HRESULT
hr
=
E_FAIL
;
struct
passwd
*
pPasswd
;
struct
group
*
pGroup
;
static
const
shvheader
SFHeader
[
SHELLVIEWCOLUMNS
]
=
{
{
IDS_SHV_COLUMN1
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
15
},
{
IDS_SHV_COLUMN5
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
10
},
{
IDS_SHV_COLUMN10
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
7
},
{
IDS_SHV_COLUMN11
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
7
},
{
IDS_SHV_COLUMN2
,
SHCOLSTATE_TYPE_STR
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
8
},
{
IDS_SHV_COLUMN4
,
SHCOLSTATE_TYPE_DATE
|
SHCOLSTATE_ONBYDEFAULT
,
LVCFMT_RIGHT
,
10
}
};
TRACE
(
"(iface=%p, pidl=%p, iColumn=%d, psd=%p) stub
\n
"
,
iface
,
pidl
,
iColumn
,
psd
);
TRACE
(
"(iface=%p, pidl=%p, iColumn=%d, psd=%p) stub
\n
"
,
iface
,
pidl
,
iColumn
,
psd
);
if
(
!
psd
||
iColumn
>=
GENERIC
SHELLVIEWCOLUMNS
)
if
(
!
psd
||
iColumn
>=
SHELLVIEWCOLUMNS
)
return
E_INVALIDARG
;
return
E_INVALIDARG
;
if
(
!
pidl
)
{
if
(
!
pidl
)
{
psd
->
fmt
=
Generic
SFHeader
[
iColumn
].
fmt
;
psd
->
fmt
=
SFHeader
[
iColumn
].
fmt
;
psd
->
cxChar
=
Generic
SFHeader
[
iColumn
].
cxChar
;
psd
->
cxChar
=
SFHeader
[
iColumn
].
cxChar
;
psd
->
str
.
uType
=
STRRET_CSTR
;
psd
->
str
.
uType
=
STRRET_CSTR
;
LoadStringA
(
shell32_hInstance
,
Generic
SFHeader
[
iColumn
].
colnameid
,
psd
->
str
.
u
.
cStr
,
MAX_PATH
);
LoadStringA
(
shell32_hInstance
,
SFHeader
[
iColumn
].
colnameid
,
psd
->
str
.
u
.
cStr
,
MAX_PATH
);
return
S_OK
;
return
S_OK
;
}
else
{
}
else
{
StatStruct
*
pStatStruct
=
LPSTATSTRUCT_FROM_LPSHITEMID
(
pidl
);
psd
->
str
.
u
.
cStr
[
0
]
=
'\0'
;
psd
->
str
.
uType
=
STRRET_CSTR
;
switch
(
iColumn
)
{
switch
(
iColumn
)
{
case
0
:
case
0
:
hr
=
IShellFolder2_GetDisplayNameOf
(
iface
,
pidl
,
SHGDN_NORMAL
|
SHGDN_INFOLDER
,
&
psd
->
str
);
hr
=
IShellFolder2_GetDisplayNameOf
(
iface
,
pidl
,
SHGDN_NORMAL
|
SHGDN_INFOLDER
,
&
psd
->
str
);
break
;
break
;
case
1
:
psd
->
str
.
u
.
cStr
[
0
]
=
S_ISDIR
(
pStatStruct
->
st_mode
)
?
'd'
:
'-'
;
psd
->
str
.
u
.
cStr
[
1
]
=
(
pStatStruct
->
st_mode
&
S_IRUSR
)
?
'r'
:
'-'
;
psd
->
str
.
u
.
cStr
[
2
]
=
(
pStatStruct
->
st_mode
&
S_IWUSR
)
?
'w'
:
'-'
;
psd
->
str
.
u
.
cStr
[
3
]
=
(
pStatStruct
->
st_mode
&
S_IXUSR
)
?
'x'
:
'-'
;
psd
->
str
.
u
.
cStr
[
4
]
=
(
pStatStruct
->
st_mode
&
S_IRGRP
)
?
'r'
:
'-'
;
psd
->
str
.
u
.
cStr
[
5
]
=
(
pStatStruct
->
st_mode
&
S_IWGRP
)
?
'w'
:
'-'
;
psd
->
str
.
u
.
cStr
[
6
]
=
(
pStatStruct
->
st_mode
&
S_IXGRP
)
?
'x'
:
'-'
;
psd
->
str
.
u
.
cStr
[
7
]
=
(
pStatStruct
->
st_mode
&
S_IROTH
)
?
'r'
:
'-'
;
psd
->
str
.
u
.
cStr
[
8
]
=
(
pStatStruct
->
st_mode
&
S_IWOTH
)
?
'w'
:
'-'
;
psd
->
str
.
u
.
cStr
[
9
]
=
(
pStatStruct
->
st_mode
&
S_IXOTH
)
?
'x'
:
'-'
;
psd
->
str
.
u
.
cStr
[
10
]
=
'\0'
;
break
;
case
2
:
case
2
:
_ILGetFileType
(
pidl
,
psd
->
str
.
u
.
cStr
,
MAX_PATH
);
pPasswd
=
getpwuid
(
pStatStruct
->
st_uid
);
if
(
pPasswd
)
strcpy
(
psd
->
str
.
u
.
cStr
,
pPasswd
->
pw_name
);
break
;
case
3
:
pGroup
=
getgrgid
(
pStatStruct
->
st_gid
);
if
(
pGroup
)
strcpy
(
psd
->
str
.
u
.
cStr
,
pGroup
->
gr_name
);
break
;
case
4
:
_ILGetFileSize
(
pidl
,
psd
->
str
.
u
.
cStr
,
MAX_PATH
);
break
;
case
5
:
_ILGetFileDate
(
pidl
,
psd
->
str
.
u
.
cStr
,
MAX_PATH
);
break
;
break
;
default:
psd
->
str
.
u
.
cStr
[
0
]
=
'\0'
;
}
}
psd
->
str
.
uType
=
STRRET_CSTR
;
}
}
return
hr
;
return
hr
;
...
@@ -920,6 +1056,7 @@ typedef struct _UnixSubFolderIterator {
...
@@ -920,6 +1056,7 @@ typedef struct _UnixSubFolderIterator {
ULONG
m_cRef
;
ULONG
m_cRef
;
UnixFolder
*
m_pUnixFolder
;
UnixFolder
*
m_pUnixFolder
;
ULONG
m_cIdx
;
ULONG
m_cIdx
;
SHCONTF
m_fFilter
;
}
UnixSubFolderIterator
;
}
UnixSubFolderIterator
;
static
void
UnixSubFolderIterator_Destroy
(
UnixSubFolderIterator
*
iterator
)
{
static
void
UnixSubFolderIterator_Destroy
(
UnixSubFolderIterator
*
iterator
)
{
...
@@ -979,8 +1116,12 @@ static HRESULT WINAPI UnixSubFolderIterator_IEnumIDList_Next(IEnumIDList* iface,
...
@@ -979,8 +1116,12 @@ static HRESULT WINAPI UnixSubFolderIterator_IEnumIDList_Next(IEnumIDList* iface,
TRACE
(
"(iface=%p, celt=%ld, rgelt=%p, pceltFetched=%p)
\n
"
,
iface
,
celt
,
rgelt
,
pceltFetched
);
TRACE
(
"(iface=%p, celt=%ld, rgelt=%p, pceltFetched=%p)
\n
"
,
iface
,
celt
,
rgelt
,
pceltFetched
);
for
(
i
=
0
;
(
i
<
celt
)
&&
(
This
->
m_cIdx
<
This
->
m_pUnixFolder
->
m_cSubDirs
);
i
++
,
This
->
m_cIdx
++
)
{
for
(
i
=
0
;
(
i
<
celt
)
&&
(
This
->
m_cIdx
<
This
->
m_pUnixFolder
->
m_cSubDirs
);
This
->
m_cIdx
++
)
{
rgelt
[
i
]
=
ILClone
(
This
->
m_pUnixFolder
->
m_apidlSubDirs
[
This
->
m_cIdx
]);
LPITEMIDLIST
pCurrent
=
This
->
m_pUnixFolder
->
m_apidlSubDirs
[
This
->
m_cIdx
];
if
(
UNIXFS_is_pidl_of_type
(
pCurrent
,
This
->
m_fFilter
))
{
rgelt
[
i
]
=
ILClone
(
pCurrent
);
i
++
;
}
}
}
if
(
pceltFetched
)
if
(
pceltFetched
)
...
@@ -992,14 +1133,23 @@ static HRESULT WINAPI UnixSubFolderIterator_IEnumIDList_Next(IEnumIDList* iface,
...
@@ -992,14 +1133,23 @@ static HRESULT WINAPI UnixSubFolderIterator_IEnumIDList_Next(IEnumIDList* iface,
static
HRESULT
WINAPI
UnixSubFolderIterator_IEnumIDList_Skip
(
IEnumIDList
*
iface
,
ULONG
celt
)
static
HRESULT
WINAPI
UnixSubFolderIterator_IEnumIDList_Skip
(
IEnumIDList
*
iface
,
ULONG
celt
)
{
{
UnixSubFolderIterator
*
This
=
ADJUST_THIS
(
UnixSubFolderIterator
,
IEnumIDList
,
iface
);
UnixSubFolderIterator
*
This
=
ADJUST_THIS
(
UnixSubFolderIterator
,
IEnumIDList
,
iface
);
ULONG
i
;
TRACE
(
"(iface=%p, celt=%ld)
\n
"
,
iface
,
celt
);
TRACE
(
"(iface=%p, celt=%ld)
\n
"
,
iface
,
celt
);
if
(
This
->
m_cIdx
+
celt
>
This
->
m_pUnixFolder
->
m_cSubDirs
)
{
for
(
i
=
0
;
i
<
celt
;
i
++
)
{
while
(
This
->
m_cIdx
<
This
->
m_pUnixFolder
->
m_cSubDirs
&&
!
UNIXFS_is_pidl_of_type
(
This
->
m_pUnixFolder
->
m_apidlSubDirs
[
This
->
m_cIdx
],
This
->
m_fFilter
))
{
This
->
m_cIdx
++
;
}
This
->
m_cIdx
++
;
}
if
(
This
->
m_cIdx
>
This
->
m_pUnixFolder
->
m_cSubDirs
)
{
This
->
m_cIdx
=
This
->
m_pUnixFolder
->
m_cSubDirs
;
This
->
m_cIdx
=
This
->
m_pUnixFolder
->
m_cSubDirs
;
return
S_FALSE
;
return
S_FALSE
;
}
else
{
}
else
{
This
->
m_cIdx
+=
celt
;
return
S_OK
;
return
S_OK
;
}
}
}
}
...
@@ -1034,7 +1184,7 @@ static const IEnumIDListVtbl UnixSubFolderIterator_IEnumIDList_Vtbl = {
...
@@ -1034,7 +1184,7 @@ static const IEnumIDListVtbl UnixSubFolderIterator_IEnumIDList_Vtbl = {
UnixSubFolderIterator_IEnumIDList_Clone
UnixSubFolderIterator_IEnumIDList_Clone
};
};
static
IUnknown
*
UnixSubFolderIterator_Construct
(
UnixFolder
*
pUnixFolder
)
{
static
IUnknown
*
UnixSubFolderIterator_Construct
(
UnixFolder
*
pUnixFolder
,
SHCONTF
fFilter
)
{
UnixSubFolderIterator
*
iterator
;
UnixSubFolderIterator
*
iterator
;
TRACE
(
"(pUnixFolder=%p)
\n
"
,
pUnixFolder
);
TRACE
(
"(pUnixFolder=%p)
\n
"
,
pUnixFolder
);
...
@@ -1044,6 +1194,7 @@ static IUnknown *UnixSubFolderIterator_Construct(UnixFolder *pUnixFolder) {
...
@@ -1044,6 +1194,7 @@ static IUnknown *UnixSubFolderIterator_Construct(UnixFolder *pUnixFolder) {
iterator
->
m_cRef
=
0
;
iterator
->
m_cRef
=
0
;
iterator
->
m_cIdx
=
0
;
iterator
->
m_cIdx
=
0
;
iterator
->
m_pUnixFolder
=
pUnixFolder
;
iterator
->
m_pUnixFolder
=
pUnixFolder
;
iterator
->
m_fFilter
=
fFilter
;
UnixSubFolderIterator_IEnumIDList_AddRef
((
IEnumIDList
*
)
iterator
);
UnixSubFolderIterator_IEnumIDList_AddRef
((
IEnumIDList
*
)
iterator
);
UnixFolder_IShellFolder2_AddRef
((
IShellFolder2
*
)
pUnixFolder
);
UnixFolder_IShellFolder2_AddRef
((
IShellFolder2
*
)
pUnixFolder
);
...
...
dlls/shell32/shresdef.h
View file @
3abb5bd6
...
@@ -31,6 +31,8 @@
...
@@ -31,6 +31,8 @@
#define IDS_SHV_COLUMN7 13
#define IDS_SHV_COLUMN7 13
#define IDS_SHV_COLUMN8 14
#define IDS_SHV_COLUMN8 14
#define IDS_SHV_COLUMN9 15
#define IDS_SHV_COLUMN9 15
#define IDS_SHV_COLUMN10 16
#define IDS_SHV_COLUMN11 17
#define IDS_DESKTOP 20
#define IDS_DESKTOP 20
#define IDS_MYCOMPUTER 21
#define IDS_MYCOMPUTER 21
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment