#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
+#include <shtypes.h>
+#include <shlwapi.h>
extern "C" {
#include <afs/param.h>
#include <afs/stds.h>
+#include <afs/afs_consts.h>
}
#include <atlconv.h>
ULONG nTPRefCount=0;
ULONG nXPRefCount=0;
-#define MAXSIZE 2048 /* most I'll get back from PIOCTL */
#define PCCHAR(str) ((char *)(const char *)str)
-static char space[MAXSIZE];
+static char space[AFS_PIOCTL_MAXSIZE];
static BOOL IsADir(const CString& strName)
{
m_bIsOverlayEnabled=FALSE;
if (FAILED(hr))
m_pAlloc = NULL;
- RegOpenKeyExA(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &NPKey);
+ RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &NPKey);
LSPsize=sizeof(ShellOption);
code=RegQueryValueEx(NPKey, _T("ShellOption"), NULL,
&LSPtype, (LPBYTE)&ShellOption, &LSPsize);
STGMEDIUM medium;
// We must have a data object
- if (pdobj == NULL)
- return E_FAIL;
+ if ((pdobj == NULL) && (pidlFolder == NULL))
+ return E_FAIL;
- // Use the given IDataObject to get a list of filenames (CF_HDROP)
- hres = pdobj->GetData(&fmte, &medium);
- if (FAILED(hres)) {
- return E_FAIL;
+ if (pdobj) {
+ // Use the given IDataObject to get a list of filenames (CF_HDROP)
+ hres = pdobj->GetData(&fmte, &medium);
+ if (FAILED(hres)) {
+ return E_FAIL;
+ }
+
+ int nNumFiles = DragQueryFile((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0);
+ if (nNumFiles == 0)
+ hres = E_FAIL;
+ else {
+ pThis->m_bDirSelected = FALSE;
+
+ for (int ii = 0; ii < nNumFiles; ii++) {
+ CString strFileName;
+
+ // Get the size of the file name string
+ int nNameLen = DragQueryFile((HDROP)medium.hGlobal, ii, 0, 0);
+
+ // Make room for it in our string object
+ LPTSTR pszFileNameBuf = strFileName.GetBuffer(nNameLen + 1); // +1 for the terminating NULL
+ ASSERT(pszFileNameBuf);
+
+ // Get the file name
+ DragQueryFile((HDROP)medium.hGlobal, ii, pszFileNameBuf, nNameLen + 1);
+
+ strFileName.ReleaseBuffer();
+ if (!IsPathInAfs(strFileName)) {
+ pThis->m_astrFileNames.RemoveAll();
+ break;
+ } else {
+ pThis->m_bIsSymlink=IsSymlink(strFileName);
+ }
+
+ if (IsADir(strFileName))
+ pThis->m_bDirSelected = TRUE;
+
+ pThis->m_astrFileNames.Add(strFileName);
+ }
+ // Release the data
+ ReleaseStgMedium(&medium);
+ }
+ }
+ if ((pThis->m_astrFileNames.GetSize() == 0)&&(pidlFolder)) {
+ // if there are no valid files selected, try the folder background
+ IShellFolder *parentFolder = NULL;
+ STRRET name;
+ TCHAR * szDisplayName = NULL;
+
+ hres = ::SHGetDesktopFolder(&parentFolder);
+ if (FAILED(hres))
+ return hres;
+
+ hres = parentFolder->GetDisplayNameOf(pidlFolder, SHGDN_NORMAL | SHGDN_FORPARSING, &name);
+ if (FAILED(hres)) {
+ parentFolder->Release();
+ return hres;
+ }
+
+ hres = StrRetToStr (&name, pidlFolder, &szDisplayName);
+ if (FAILED(hres))
+ return hres;
+ parentFolder->Release();
+ if (szDisplayName) {
+ pThis->m_bDirSelected = TRUE;
+ CString strFileName = CString(szDisplayName);
+ if (IsPathInAfs(strFileName)) {
+ pThis->m_bIsSymlink=IsSymlink(strFileName);
+ pThis->m_astrFileNames.Add(strFileName);
+ }
+ CoTaskMemFree(szDisplayName);
+ }
}
-
- int nNumFiles = DragQueryFile((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0);
- if (nNumFiles == 0)
- hres = E_FAIL;
- else {
- pThis->m_bDirSelected = FALSE;
-
- for (int ii = 0; ii < nNumFiles; ii++) {
- CString strFileName;
-
- // Get the size of the file name string
- int nNameLen = DragQueryFile((HDROP)medium.hGlobal, ii, 0, 0);
-
- // Make room for it in our string object
- LPTSTR pszFileNameBuf = strFileName.GetBuffer(nNameLen + 1); // +1 for the terminating NULL
- ASSERT(pszFileNameBuf);
-
- // Get the file name
- DragQueryFile((HDROP)medium.hGlobal, ii, pszFileNameBuf, nNameLen + 1);
-
- strFileName.ReleaseBuffer();
-
- if (!IsPathInAfs(strFileName)) {
- pThis->m_astrFileNames.RemoveAll();
- break;
- } else {
- pThis->m_bIsSymlink=IsSymlink(strFileName);
- }
-
- if (IsADir(strFileName))
- pThis->m_bDirSelected = TRUE;
-
- pThis->m_astrFileNames.Add(strFileName);
- }
-
if (pThis->m_astrFileNames.GetSize() > 0)
hres = NOERROR;
else
hres = E_FAIL;
- }
- // Release the data
- ReleaseStgMedium(&medium);
-
return hres;
}
_tcsncpy(pwszIconFile, szModule, cchMax);
#endif
*pIndex = 30;
- *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX;
+ *pdwFlags = ISIOI_ICONFILE|ISIOI_ICONINDEX;
return S_OK;
}
#else
WideCharToMultiByte( CP_ACP,0,pwszPath,-1,szPath,MAX_PATH,NULL,NULL);
#endif
- if (IsSymlink(szPath))
- return S_OK;
+ if (IsSymlink(szPath) || IsMountPoint(szPath)) {
+ return S_OK;
+ }
return S_FALSE;
}
STDMETHODIMP CShellExt::XPersistFileExt::GetCurFile(LPOLESTR FAR*)
{
return E_NOTIMPL;
-}
+}
\ No newline at end of file