windows-nt/Source/XPSP1/NT/sdktools/winobj/wfext.c
2020-09-26 16:20:57 +08:00

245 lines
6.6 KiB
C

//-------------------------------------------------------------------------
// File Manager Extensions support routines
//
//
// radical
//
//-------------------------------------------------------------------------
#include "winfile.h"
#include "winnet.h"
LONG
GetExtSelection(
HWND hWnd,
WORD wItem,
LPFMS_GETFILESEL lpSel,
BOOL bSearch,
BOOL bGetCount,
BOOL bLFNAware
)
{
HANDLE hDTA;
LPMYDTA lpmydta;
LPDTASEARCH lpdtasch, lpdtaschT;
INT count, sel_ind, i;
HWND hwndLB;
CHAR szPath[MAXPATHLEN];
FMS_GETFILESEL file;
if (bGetCount)
lpSel = &file;
if (bSearch) {
hDTA = (HANDLE)GetWindowLongPtr(hWnd, GWLP_HDTASEARCH);
lpdtasch = (LPDTASEARCH)LocalLock(hDTA);
hwndLB = GetDlgItem(hWnd, IDCW_LISTBOX);
} else {
hDTA = (HANDLE)GetWindowLongPtr(HasDirWindow(hWnd), GWLP_HDTA);
hwndLB = GetDlgItem(HasDirWindow(hWnd), IDCW_LISTBOX);
LocalLock(hDTA);
}
count = (WORD)SendMessage(hwndLB, LB_GETCOUNT, 0, 0L);
sel_ind = 0; // index of current selected item
for (i = 0; i < count; i++) {
if ((BOOL)SendMessage(hwndLB, LB_GETSEL, i, 0L)) {
if (bSearch) {
lpdtaschT = &(lpdtasch[(INT)SendMessage(hwndLB, LB_GETITEMDATA, i, 0L)]);
SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)szPath);
lpSel->bAttr = (BYTE)lpdtaschT->sch_dwAttrs;
lpSel->ftTime = lpdtaschT->sch_ftLastWriteTime;
lpSel->dwSize = lpdtaschT->sch_nFileSizeLow;
} else {
SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)&lpmydta);
if (lpmydta->my_dwAttrs & ATTR_PARENT)
continue;
SendMessage(hWnd, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath);
lstrcat(szPath, lpmydta->my_cFileName);
lpSel->bAttr = (BYTE)lpmydta->my_dwAttrs;
lpSel->ftTime = lpmydta->my_ftLastWriteTime;
lpSel->dwSize = lpmydta->my_nFileSizeLow;
}
// skip LFN stuff for non LFN aware dudes!
if (!bLFNAware && (lpSel->bAttr & ATTR_LFN))
continue;
FixAnsiPathForDos(szPath);
lstrcpy(lpSel->szName, szPath);
if (!bGetCount) {
if (wItem == (WORD)sel_ind)
goto BailOutDude;
}
sel_ind++;
}
}
BailOutDude:
LocalUnlock(hDTA);
return (LONG)sel_ind;
}
LONG
GetDriveInfo(
HWND hwnd,
LPFMS_GETDRIVEINFO lpSel
)
{
CHAR szPath[MAXPATHLEN];
CHAR szVol[14];
// this has to work for hwnd a tree or search window
SendMessage(hwnd, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath);
StripBackslash(szPath);
FixAnsiPathForDos(szPath);
lstrcpy(lpSel->szPath, szPath);
lpSel->dwTotalSpace = lTotalSpace;
lpSel->dwFreeSpace = lFreeSpace;
GetVolumeLabel((szPath[0] & ~0x20) - 'A', szVol, FALSE);
lstrcpy(lpSel->szVolume, szVol);
szPath[2] = 0;
if (WFGetConnection(szPath, lpSel->szShare, FALSE) != WN_SUCCESS)
lpSel->szShare[0] = 0;
return 1L;
}
VOID
APIENTRY
FreeExtensions()
{
INT i;
HMENU hMenuFrame;
INT iMax;
HWND hwndActive;
hMenuFrame = GetMenu(hwndFrame);
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
if (hwndActive && GetWindowLong(hwndActive, GWL_STYLE) & WS_MAXIMIZE)
iMax = 1;
else
iMax = 0;
for (i = 0; i < iNumExtensions; i++) {
(extensions[i].ExtProc)(NULL, FMEVENT_UNLOAD, 0L);
DeleteMenu(hMenuFrame, IDM_EXTENSIONS + iMax, MF_BYPOSITION);
FreeLibrary((HANDLE)extensions[i].hModule);
}
iNumExtensions = 0;
}
INT_PTR
APIENTRY
ExtensionMsgProc(
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndActive;
HWND hwndTree, hwndDir, hwndDrives, hwndFocus;
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
GetTreeWindows(hwndActive, &hwndTree, &hwndDir, &hwndDrives);
switch (wMsg) {
case FM_RELOAD_EXTENSIONS:
SendMessage(hwndFrame, WM_CANCELMODE, 0, 0L);
FreeExtensions();
InitExtensions();
DrawMenuBar(hwndFrame);
break;
case FM_GETFOCUS:
// wParam unused
// lParam unused
// return window tyep with focus
if (hwndActive == hwndSearch)
return FMFOCUS_SEARCH;
hwndFocus = GetTreeFocus(hwndActive);
if (hwndFocus == hwndTree)
return FMFOCUS_TREE;
else if (hwndFocus == hwndDir)
return FMFOCUS_DIR;
else if (hwndFocus == hwndDrives)
return FMFOCUS_DRIVES;
break;
case FM_GETDRIVEINFO:
// wParam unused
// lParam LPFMS_GETDRIVEINFO structure to be filled in
return GetDriveInfo(hwndActive, (LPFMS_GETDRIVEINFO)lParam);
break;
case FM_REFRESH_WINDOWS:
// wParam 0 refresh the current window
// non zero refresh all windows
// lParam unused
if (wParam == 0)
RefreshWindow(hwndActive);
else {
HWND hwndT, hwndNext;
hwndT = GetWindow(hwndMDIClient, GW_CHILD);
while (hwndT) {
hwndNext = GetWindow(hwndT, GW_HWNDNEXT);
if (!GetWindow(hwndT, GW_OWNER))
RefreshWindow(hwndT);
hwndT = hwndNext;
}
}
lFreeSpace = -1L;
UpdateStatus(hwndActive);
break;
case FM_GETSELCOUNT:
case FM_GETSELCOUNTLFN:
// wParam unused
// lParam unused
// return # of selected items
case FM_GETFILESEL:
case FM_GETFILESELLFN:
// wParam index of selected item to get
// lParam LPFMS_GETFILESEL structure to be filled in
if (hwndActive != hwndSearch && !hwndDir)
return 0L;
// note, this uses the fact that LFN messages are odd!
return GetExtSelection(hwndActive, (WORD)wParam, (LPFMS_GETFILESEL)lParam,
hwndActive == hwndSearch, (wMsg & ~1) == FM_GETSELCOUNT,
(BOOL)(wMsg & 1));
}
return 0;
}