xref: /reactos/dll/win32/shell32/dialogs/filedefext.h (revision 279107d5)
1 /*
2  * Provides default file shell extension
3  *
4  * Copyright 2012 Rafal Harabien
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #ifndef _FILE_DEF_EXT_H_
22 #define _FILE_DEF_EXT_H_
23 
24 class CFileVersionInfo
25 {
26     private:
27         PVOID m_pInfo;
28         WORD m_wLang, m_wCode;
29         WCHAR m_wszLang[64];
30 
31         typedef struct _LANGANDCODEPAGE_
32         {
33             WORD wLang;
34             WORD wCode;
35         } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
36 
37     public:
38         inline CFileVersionInfo():
39             m_pInfo(NULL), m_wLang(0), m_wCode(0)
40         {
41             m_wszLang[0] = L'\0';
42         }
43 
44         inline ~CFileVersionInfo()
45         {
46             if (m_pInfo)
47                 HeapFree(GetProcessHeap(), 0, m_pInfo);
48         }
49 
50         BOOL Load(LPCWSTR pwszPath);
51         LPCWSTR GetString(LPCWSTR pwszName);
52         VS_FIXEDFILEINFO *GetFixedInfo();
53         LPCWSTR GetLangName();
54 };
55 
56 class CFileDefExt :
57 	public CComCoClass<CFileDefExt, &CLSID_ShellFileDefExt>,
58 	public CComObjectRootEx<CComMultiThreadModelNoCS>,
59 	public IShellExtInit,
60 	public IContextMenu,
61 	public IShellPropSheetExt,
62 	public IObjectWithSite
63 {
64 private:
65     VOID InitOpensWithField(HWND hwndDlg);
66     BOOL InitFileType(HWND hwndDlg);
67     BOOL InitFilePath(HWND hwndDlg);
68     static BOOL GetFileTimeString(LPFILETIME lpFileTime, LPWSTR pwszResult, UINT cchResult);
69     BOOL InitFileAttr(HWND hwndDlg);
70     BOOL InitGeneralPage(HWND hwndDlg);
71     BOOL SetVersionLabel(HWND hwndDlg, DWORD idCtrl, LPCWSTR pwszName);
72     BOOL AddVersionString(HWND hwndDlg, LPCWSTR pwszName);
73     BOOL InitVersionPage(HWND hwndDlg);
74     BOOL InitFolderCustomizePage(HWND hwndDlg);
75     static INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
76 	static INT_PTR CALLBACK VersionPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
77 	static INT_PTR CALLBACK FolderCustomizePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
78 	BOOL CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, LPDWORD ticks);
79 
80 	WCHAR m_wszPath[MAX_PATH];
81 	CFileVersionInfo m_VerInfo;
82 	BOOL m_bDir;
83 
84 	DWORD m_cFiles;
85     DWORD m_cFolders;
86     ULARGE_INTEGER m_DirSize;
87 
88     static DWORD WINAPI _CountFolderAndFilesThreadProc(LPVOID lpParameter);
89 
90     // FolderCustomize
91     WCHAR   m_szFolderIconPath[MAX_PATH];
92     INT     m_nFolderIconIndex;
93     HICON   m_hFolderIcon;
94     BOOL    m_bFolderIconIsSet;
95 
96 public:
97 	CFileDefExt();
98 	~CFileDefExt();
99 
100     // FolderCustomize
101     BOOL OnFolderCustApply(HWND hwndDlg);
102     void OnFolderCustChangeIcon(HWND hwndDlg);
103     void OnFolderCustDestroy(HWND hwndDlg);
104     void UpdateFolderIcon(HWND hwndDlg);
105 
106 	// IShellExtInit
107 	virtual HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
108 
109     // IContextMenu
110 	virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
111 	virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
112 	virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax);
113 
114 	// IShellPropSheetExt
115 	virtual HRESULT WINAPI AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
116 	virtual HRESULT WINAPI ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam);
117 
118     // IObjectWithSite
119 	virtual HRESULT WINAPI SetSite(IUnknown *punk);
120 	virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite);
121 
122 DECLARE_REGISTRY_RESOURCEID(IDR_FILEDEFEXT)
123 DECLARE_NOT_AGGREGATABLE(CFileDefExt)
124 
125 DECLARE_PROTECT_FINAL_CONSTRUCT()
126 
127 BEGIN_COM_MAP(CFileDefExt)
128 	COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
129 	COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
130 	COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt, IShellPropSheetExt)
131 	COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
132 END_COM_MAP()
133 };
134 
135 struct _CountFolderAndFilesData {
136     CFileDefExt *This;
137     HWND hwndDlg;
138     LPWSTR pwszBuf;
139     UINT cchBufMax;
140 };
141 
142 #endif /* _FILE_DEF_EXT_H_ */