Lei Zhang : shell32: Perform copy in UnixFolder_ISFHelper_CopyItems.
Alexandre Julliard
julliard at winehq.org
Wed Nov 21 07:47:40 CST 2007
Module: wine
Branch: master
Commit: fa057686bb52b0f39d4acc790c7d9b4b0f7f20e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fa057686bb52b0f39d4acc790c7d9b4b0f7f20e3
Author: Lei Zhang <thestig at google.com>
Date: Tue Nov 20 11:54:58 2007 -0800
shell32: Perform copy in UnixFolder_ISFHelper_CopyItems.
---
dlls/shell32/shfldr_unixfs.c | 73 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shfldr_unixfs.c b/dlls/shell32/shfldr_unixfs.c
index 6016dc7..6c19001 100644
--- a/dlls/shell32/shfldr_unixfs.c
+++ b/dlls/shell32/shfldr_unixfs.c
@@ -742,6 +742,61 @@ static HRESULT UNIXFS_initialize_target_folder(UnixFolder *This, const char *szB
}
/******************************************************************************
+ * UNIXFS_copy [Internal]
+ *
+ * Copy pwszDosSrc to pwszDosDst.
+ *
+ * PARAMS
+ * pwszDosSrc [I] absolute path of the source
+ * pwszDosDst [I] absolute path of the destination
+ *
+ * RETURNS
+ * Success: S_OK,
+ * Failure: E_FAIL
+ */
+static HRESULT UNIXFS_copy(LPCWSTR pwszDosSrc, LPCWSTR pwszDosDst)
+{
+ SHFILEOPSTRUCTW op;
+ LPWSTR pwszSrc, pwszDst;
+ HRESULT res = E_OUTOFMEMORY;
+ UINT iSrcLen, iDstLen;
+
+ if (!pwszDosSrc || !pwszDosDst)
+ return E_FAIL;
+
+ iSrcLen = lstrlenW(pwszDosSrc);
+ iDstLen = lstrlenW(pwszDosDst);
+ pwszSrc = HeapAlloc(GetProcessHeap(), 0, (iSrcLen + 2) * sizeof(WCHAR));
+ pwszDst = HeapAlloc(GetProcessHeap(), 0, (iDstLen + 2) * sizeof(WCHAR));
+
+ if (pwszSrc && pwszDst) {
+ lstrcpyW(pwszSrc, pwszDosSrc);
+ lstrcpyW(pwszDst, pwszDosDst);
+ /* double null termination */
+ pwszSrc[iSrcLen + 1] = 0;
+ pwszDst[iDstLen + 1] = 0;
+
+ ZeroMemory(&op, sizeof(op));
+ op.hwnd = GetActiveWindow();
+ op.wFunc = FO_COPY;
+ op.pFrom = pwszSrc;
+ op.pTo = pwszDst;
+ op.fFlags = FOF_ALLOWUNDO;
+ if (!SHFileOperationW(&op))
+ {
+ WARN("SHFileOperationW failed\n");
+ res = E_FAIL;
+ }
+ else
+ res = S_OK;
+ }
+
+ HeapFree(GetProcessHeap(), 0, pwszSrc);
+ HeapFree(GetProcessHeap(), 0, pwszDst);
+ return res;
+}
+
+/******************************************************************************
* UnixFolder
*
* Class whose heap based instances represent unix filesystem directories.
@@ -1864,7 +1919,7 @@ static HRESULT WINAPI UnixFolder_ISFHelper_CopyItems(ISFHelper* iface, IShellFol
HRESULT hr;
char szAbsoluteDst[FILENAME_MAX], *pszRelativeDst;
- TRACE("(iface=%p, psfFrom=%p, cidl=%d, apidl=%p): semi-stub\n", iface, psfFrom, cidl, apidl);
+ TRACE("(iface=%p, psfFrom=%p, cidl=%d, apidl=%p)\n", iface, psfFrom, cidl, apidl);
if (!psfFrom || !cidl || !apidl)
return E_INVALIDARG;
@@ -1882,6 +1937,8 @@ static HRESULT WINAPI UnixFolder_ISFHelper_CopyItems(ISFHelper* iface, IShellFol
WCHAR wszSrc[MAX_PATH];
char szSrc[FILENAME_MAX];
STRRET strret;
+ HRESULT res;
+ WCHAR *pwszDosSrc, *pwszDosDst;
/* Build the unix path of the current source item. */
if (FAILED(IShellFolder_GetDisplayNameOf(psfFrom, apidl[i], SHGDN_FORPARSING, &strret)))
@@ -1894,7 +1951,19 @@ static HRESULT WINAPI UnixFolder_ISFHelper_CopyItems(ISFHelper* iface, IShellFol
/* Build the unix path of the current destination item */
UNIXFS_filename_from_shitemid(apidl[i], pszRelativeDst);
- FIXME("Would copy %s to %s. Not yet implemented.\n", szSrc, szAbsoluteDst);
+ pwszDosSrc = wine_get_dos_file_name(szSrc);
+ pwszDosDst = wine_get_dos_file_name(szAbsoluteDst);
+
+ if (pwszDosSrc && pwszDosDst)
+ res = UNIXFS_copy(pwszDosSrc, pwszDosDst);
+ else
+ res = E_OUTOFMEMORY;
+
+ HeapFree(GetProcessHeap(), 0, pwszDosSrc);
+ HeapFree(GetProcessHeap(), 0, pwszDosDst);
+
+ if (res != S_OK)
+ return res;
}
return S_OK;
}
More information about the wine-cvs
mailing list