1 /*
2 * Copyright 2003, 2004, 2005 Martin Fuchs
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19
20 //
21 // Explorer clone
22 //
23 // shellfs.h
24 //
25 // Martin Fuchs, 23.07.2003
26 //
27
28
29 /// shell file/directory entry
30 struct ShellEntry : public Entry
31 {
ShellEntryShellEntry32 ShellEntry(Entry* parent, LPITEMIDLIST shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {}
ShellEntryShellEntry33 ShellEntry(Entry* parent, const ShellPath& shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {}
34
35 virtual bool get_path(PTSTR path, size_t path_count) const;
36 virtual ShellPath create_absolute_pidl() const;
37 virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
38 virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
39 virtual HRESULT do_context_menu(HWND hwnd, const POINT& pptScreen, CtxMenuInterfaces& cm_ifs);
40 virtual ShellFolder get_shell_folder() const;
41
42 IShellFolder* get_parent_folder() const;
43
44 ShellPath _pidl; // parent relative PIDL
45
46 protected:
ShellEntryShellEntry47 ShellEntry(LPITEMIDLIST shell_path) : Entry(ET_SHELL), _pidl(shell_path) {}
ShellEntryShellEntry48 ShellEntry(const ShellPath& shell_path) : Entry(ET_SHELL), _pidl(shell_path) {}
49 };
50
51
52 /// shell folder entry
53 struct ShellDirectory : public ShellEntry, public Directory
54 {
ShellDirectoryShellDirectory55 ShellDirectory(ShellFolder& root_folder, const ShellPath& shell_path, HWND hwnd)
56 : ShellEntry(shell_path),
57 _folder(root_folder, shell_path),
58 _hwnd(hwnd)
59 {
60 CONTEXT("ShellDirectory::ShellDirectory()");
61
62 lstrcpy(_data.cFileName, root_folder.get_name(shell_path, SHGDN_FORADDRESSBAR));
63 _data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
64 _shell_attribs = SFGAO_FOLDER;
65
66 ShellFolder subfolder(root_folder, shell_path);
67 IShellFolder* pFolder = subfolder;
68 pFolder->AddRef();
69 _path = pFolder;
70 }
71
ShellDirectoryShellDirectory72 explicit ShellDirectory(ShellDirectory* parent, LPITEMIDLIST shell_path, HWND hwnd)
73 : ShellEntry(parent, shell_path),
74 _folder(parent->_folder, shell_path),
75 _hwnd(hwnd)
76 {
77 /* not neccessary - the caller will fill the info
78 lstrcpy(_data.cFileName, _folder.get_name(shell_path));
79 _data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
80 _shell_attribs = SFGAO_FOLDER; */
81
82 _folder->AddRef();
83 _path = _folder;
84 }
85
ShellDirectoryShellDirectory86 ShellDirectory(const ShellDirectory& other)
87 : ShellEntry(other),
88 Directory(other),
89 _folder(other._folder),
90 _hwnd(other._hwnd)
91 {
92 IShellFolder* pFolder = (IShellFolder*)_path;
93 pFolder->AddRef();
94 }
95
~ShellDirectoryShellDirectory96 ~ShellDirectory()
97 {
98 IShellFolder* pFolder = (IShellFolder*)_path;
99 _path = NULL;
100 pFolder->Release();
101 }
102
103 virtual void read_directory(int scan_flags=0);
104 virtual const void* get_next_path_component(const void*) const;
105 virtual Entry* find_entry(const void*);
106
107 virtual bool get_path(PTSTR path, size_t path_count) const;
108 virtual ShellFolder get_shell_folder() const;
109
110 int extract_icons(ICONCACHE_FLAGS flags);
111
112 ShellFolder _folder;
113 HWND _hwnd;
114
115 protected:
116 bool fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA*, BY_HANDLE_FILE_INFORMATION*, bool do_access=true);
117 };
118
119
get_parent_folder()120 inline IShellFolder* ShellEntry::get_parent_folder() const
121 {
122 if (_up)
123 return static_cast<ShellDirectory*>(_up)->_folder;
124 else
125 return GetDesktopFolder();
126 }
127