Dmitry Timoshkov : schedsvc: Implement SchRpcRetrieveTask.
Alexandre Julliard
julliard at winehq.org
Thu Mar 13 14:40:35 CDT 2014
Module: wine
Branch: master
Commit: c751ec6a65f6c1ba3a417b05c5df31945cf54143
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c751ec6a65f6c1ba3a417b05c5df31945cf54143
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Fri Mar 7 12:10:49 2014 +0900
schedsvc: Implement SchRpcRetrieveTask.
---
dlls/schedsvc/schedsvc.c | 74 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 72 insertions(+), 2 deletions(-)
diff --git a/dlls/schedsvc/schedsvc.c b/dlls/schedsvc/schedsvc.c
index a527ab4..538a423 100644
--- a/dlls/schedsvc/schedsvc.c
+++ b/dlls/schedsvc/schedsvc.c
@@ -214,10 +214,80 @@ HRESULT __cdecl SchRpcRegisterTask(const WCHAR *path, const WCHAR *xml, DWORD fl
return hr;
}
+static int detect_encoding(const void *buffer, DWORD size)
+{
+ static const char bom_utf8[] = { 0xef,0xbb,0xbf };
+
+ if (size >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8)))
+ return CP_UTF8;
+ else
+ {
+ int flags = IS_TEXT_UNICODE_SIGNATURE |
+ IS_TEXT_UNICODE_REVERSE_SIGNATURE |
+ IS_TEXT_UNICODE_ODD_LENGTH;
+ IsTextUnicode(buffer, size, &flags);
+ if (flags & IS_TEXT_UNICODE_SIGNATURE)
+ return -1;
+ if (flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
+ return -2;
+ return CP_ACP;
+ }
+}
+
+static HRESULT read_xml(const WCHAR *name, WCHAR **xml)
+{
+ HANDLE hfile;
+ DWORD size;
+ char *src;
+ int cp;
+
+ hfile = CreateFileW(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
+ if (hfile == INVALID_HANDLE_VALUE)
+ return HRESULT_FROM_WIN32(GetLastError());
+
+ size = GetFileSize(hfile, NULL);
+ src = heap_alloc(size + 2);
+ if (!src)
+ {
+ CloseHandle(hfile);
+ return E_OUTOFMEMORY;
+ }
+
+ src[size] = 0;
+ src[size + 1] = 0;
+
+ ReadFile(hfile, src, size, &size, NULL);
+ CloseHandle(hfile);
+
+ cp = detect_encoding(src, size);
+ if (cp < 0)
+ {
+ *xml = (WCHAR *)src;
+ return S_OK;
+ }
+
+ size = MultiByteToWideChar(cp, 0, src, -1, NULL, 0);
+ *xml = heap_alloc(size * sizeof(WCHAR));
+ if (!*xml) return E_OUTOFMEMORY;
+ MultiByteToWideChar(cp, 0, src, -1, *xml, size);
+ return S_OK;
+}
+
HRESULT __cdecl SchRpcRetrieveTask(const WCHAR *path, const WCHAR *languages, ULONG *n_languages, WCHAR **xml)
{
- WINE_FIXME("%s,%s,%p,%p: stub\n", wine_dbgstr_w(path), wine_dbgstr_w(languages), n_languages, xml);
- return E_NOTIMPL;
+ WCHAR *full_name;
+ HRESULT hr;
+
+ WINE_TRACE("%s,%s,%p,%p\n", wine_dbgstr_w(path), wine_dbgstr_w(languages), n_languages, xml);
+
+ full_name = get_full_name(path, NULL);
+ if (!full_name) return E_OUTOFMEMORY;
+
+ hr = read_xml(full_name, xml);
+ if (hr != S_OK) *xml = NULL;
+
+ heap_free(full_name);
+ return hr;
}
HRESULT __cdecl SchRpcCreateFolder(const WCHAR *path, const WCHAR *sddl, DWORD flags)
More information about the wine-cvs
mailing list