Module: wine Branch: stable Commit: 9d26384beb0a2f80a9b766a01e220013cece3899 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d26384beb0a2f80a9b766a01e...
Author: Nikolay Sivov nsivov@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,