Nikolay Sivov : scrrun: Implement BuildPath method.
Alexandre Julliard
julliard at winehq.org
Fri Jan 10 14:44:56 CST 2014
Module: wine
Branch: stable
Commit: 9d26384beb0a2f80a9b766a01e220013cece3899
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d26384beb0a2f80a9b766a01e220013cece3899
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Nov 17 11:49:53 2013 +0400
scrrun: Implement BuildPath method.
(cherry picked from commit 70bb23a9acc6abb73005dc221c65c9c682a2d868)
---
dlls/scrrun/filesystem.c | 57 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 54 insertions(+), 3 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 4f0b163..5b94e8f 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -713,11 +713,62 @@ static HRESULT WINAPI filesys_get_Drives(IFileSystem3 *iface, IDriveCollection *
}
static HRESULT WINAPI filesys_BuildPath(IFileSystem3 *iface, BSTR Path,
- BSTR Name, BSTR *pbstrResult)
+ BSTR Name, BSTR *Result)
{
- FIXME("%p %s %s %p\n", iface, debugstr_w(Path), debugstr_w(Name), pbstrResult);
+ BSTR ret;
- return E_NOTIMPL;
+ TRACE("%p %s %s %p\n", iface, debugstr_w(Path), debugstr_w(Name), Result);
+
+ if (!Result) return E_POINTER;
+
+ if (Path && Name)
+ {
+ int path_len = SysStringLen(Path), name_len = SysStringLen(Name);
+
+ /* if both parts have backslashes strip one from Path */
+ if (Path[path_len-1] == '\\' && Name[0] == '\\')
+ {
+ path_len -= 1;
+
+ ret = SysAllocStringLen(NULL, path_len + name_len);
+ if (ret)
+ {
+ strcpyW(ret, Path);
+ ret[path_len] = 0;
+ strcatW(ret, Name);
+ }
+ }
+ else if (Path[path_len-1] != '\\' && Name[0] != '\\')
+ {
+ static const WCHAR bsW[] = {'\\',0};
+ ret = SysAllocStringLen(NULL, path_len + name_len + 1);
+ if (ret)
+ {
+ strcpyW(ret, Path);
+ if (Path[path_len-1] != ':')
+ strcatW(ret, bsW);
+ strcatW(ret, Name);
+ }
+ }
+ else
+ {
+ ret = SysAllocStringLen(NULL, path_len + name_len);
+ if (ret)
+ {
+ strcpyW(ret, Path);
+ strcatW(ret, Name);
+ }
+ }
+ }
+ else if (Path || Name)
+ ret = SysAllocString(Path ? Path : Name);
+ else
+ ret = SysAllocStringLen(NULL, 0);
+
+ if (!ret) return E_OUTOFMEMORY;
+ *Result = ret;
+
+ return S_OK;
}
static HRESULT WINAPI filesys_GetDriveName(IFileSystem3 *iface, BSTR Path,
More information about the wine-cvs
mailing list