diff options
Diffstat (limited to 'src/3rd_party/dbus-1.7.8/dbus/dbus-sysdeps-wince-glue.c')
-rw-r--r-- | src/3rd_party/dbus-1.7.8/dbus/dbus-sysdeps-wince-glue.c | 1165 |
1 files changed, 0 insertions, 1165 deletions
diff --git a/src/3rd_party/dbus-1.7.8/dbus/dbus-sysdeps-wince-glue.c b/src/3rd_party/dbus-1.7.8/dbus/dbus-sysdeps-wince-glue.c deleted file mode 100644 index e276f046e1..0000000000 --- a/src/3rd_party/dbus-1.7.8/dbus/dbus-sysdeps-wince-glue.c +++ /dev/null @@ -1,1165 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ -/* dbus-sysdeps-wince-glue.c Wrappers for Windows CE around system/libc features (internal to D-BUS implementation) - * - * Copyright (C) 2002, 2003 Red Hat, Inc. - * Copyright (C) 2003 CodeFactory AB - * Copyright (C) 2005 Novell, Inc. - * Copyright (C) 2006 Ralf Habacker <ralf.habacker@freenet.de> - * Copyright (C) 2006 Peter Kümmel <syntheticpp@gmx.net> - * Copyright (C) 2006 Christian Ehrlicher <ch.ehrlicher@gmx.de> - * - * Licensed under the Academic Free License version 2.1 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include <config.h> -#include "dbus-internals.h" -#include "dbus-sysdeps.h" -#include "dbus-sysdeps-win.h" - -#include <windows.h> -/* Including shlobj.h creates trouble on some compilers. Just chicken - out here by defining just what we need. */ -#ifndef CSIDL_PERSONAL -#define CSIDL_PERSONAL 5 -#endif - - -/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ -static char * -stpcpy (char *dest, const char *src) -{ - char *d = dest; - const char *s = src; - - do - *d++ = *s; - while (*s++ != '\0'); - - return d - 1; -} - - -/* This is special cased, because we must avoid using many dbus - functions (such as memory allocations): Those functions may in turn - cause verbose output and check the flag! */ -static char * -get_verbose_setting() -{ - const wchar_t dir[] = L"Software\\freedesktop\\DBus"; - const wchar_t name[] = L"Verbose"; - HKEY root_key; - HKEY key_handle; - DWORD nbytes; - DWORD n1; - DWORD type; - wchar_t *result_w = NULL; - char *result; - int len; - - root_key = HKEY_LOCAL_MACHINE; - if (RegOpenKeyExW (root_key, dir, 0, KEY_READ, &key_handle)) - return NULL; - - nbytes = 1; - if (RegQueryValueExW (key_handle, name, 0, NULL, NULL, &nbytes)) - { - RegCloseKey (key_handle); - return NULL; - } - /* Round up to multiple of wchar_t, convert to number of wchar_t's, and add 1. */ - n1 = ((nbytes + sizeof(wchar_t) - 1) / sizeof (wchar_t)) + 1; - result_w = malloc (n1 * sizeof (wchar_t)); - if (!result_w) - { - RegCloseKey (key_handle); - return NULL; - } - if (RegQueryValueExW (key_handle, name, 0, &type, (LPBYTE) result_w, &nbytes)) - { - RegCloseKey (key_handle); - free (result_w); - return NULL; - } - RegCloseKey (key_handle); - result_w[n1 - 1] = 0; /* Make sure it is really a string. */ - - /* NOTE: REG_MULTI_SZ and REG_EXPAND_SZ not supported, because they - are not needed in this module. */ - if (type != REG_SZ) - { - free (result_w); - return NULL; - } - - len = WideCharToMultiByte (CP_UTF8, 0, result_w, -1, NULL, 0, NULL, NULL); - if (len < 0) - { - free (result_w); - return NULL; - } - - result = malloc (len + 1); - if (!result) - { - free (result_w); - return NULL; - } - - len = WideCharToMultiByte (CP_UTF8, 0, result_w, -1, result, len, NULL, NULL); - free (result_w); - if (len < 0) - { - free (result); - return NULL; - } - return result; -} - - -/* Return a string from the W32 Registry or NULL in case of error. - Caller must release the return value. A NULL for root is an alias - for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn. */ -static char * -read_w32_registry_string (const char *root, const char *dir, const char *name) -{ - HKEY root_key, key_handle; - DWORD n1, nbytes, type; - char *result = NULL; - - if ( !root ) - root_key = HKEY_CURRENT_USER; - else if ( !strcmp( root, "HKEY_CLASSES_ROOT" ) ) - root_key = HKEY_CLASSES_ROOT; - else if ( !strcmp( root, "HKEY_CURRENT_USER" ) ) - root_key = HKEY_CURRENT_USER; - else if ( !strcmp( root, "HKEY_LOCAL_MACHINE" ) ) - root_key = HKEY_LOCAL_MACHINE; - else if ( !strcmp( root, "HKEY_USERS" ) ) - root_key = HKEY_USERS; - else - return NULL; - - if (RegOpenKeyExA (root_key, dir, 0, KEY_READ, &key_handle)) - { - if (root) - return NULL; /* no need for a RegClose, so return direct */ - /* It seems to be common practise to fall back to HKLM. */ - if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle)) - return NULL; /* still no need for a RegClose, so return direct */ - } - - nbytes = 1; - if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes)) - { - if (root) - goto out; - /* Try to fallback to HKLM also for a missing value. */ - RegCloseKey (key_handle); - if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle)) - return NULL; /* Nope. */ - if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes)) - goto out; - } - n1 = nbytes + 1; - result = malloc (n1); - if (!result) - goto out; - if (RegQueryValueExA (key_handle, name, 0, &type, result, &n1)) - { - free(result); - result = NULL; - goto out; - } - result[nbytes] = 0; /* Make sure it is really a string. */ - - out: - RegCloseKey (key_handle); - return result; -} - - -static char * -find_inst_dir () -{ - return read_w32_registry_string ("HKEY_LOCAL_MACHINE", - "Software\\freedesktop\\DBus", - "Install Directory"); -} - - -static char * -find_env_in_registry (const char *name) -{ - return read_w32_registry_string ("HKEY_LOCAL_MACHINE", - "Software\\freedesktop\\DBus", - name); -} - - -static char * -find_program_in_inst_dir (const char *name) -{ - char *result = NULL; - char *tmp; - - tmp = find_inst_dir (); - if (!tmp) - return NULL; - - result = malloc (strlen (tmp) + 5 + strlen (name) + 1); - if (!result) - { - free (tmp); - return NULL; - } - - strcpy (stpcpy (stpcpy (result, tmp), "\\bin\\"), name); - free (tmp); - - return result; -} - - -static char * -find_inst_subdir (const char *name) -{ - char *result = NULL; - char *tmp; - - tmp = find_inst_dir (); - if (!tmp) - return NULL; - - result = malloc (strlen (tmp) + 1 + strlen (name) + 1); - if (!result) - { - free (tmp); - return NULL; - } - - strcpy (stpcpy (stpcpy (result, tmp), "\\"), name); - free (tmp); - - return result; -} - - -static char * -find_my_documents_folder () -{ - /* One for safety, just in case. */ - char dir[MAX_PATH + 1]; - char *result; - - dir[0] = '\0'; - /* May return false even if successful. */ - SHGetSpecialFolderPathA (0, dir, CSIDL_PERSONAL, 0); - if (dir[0] == '\0') - return NULL; - - result = malloc (strlen (dir) + 1); - if (!result) - return NULL; - strcpy (result, dir); - return result; -} - - -#define MAX_ENV 30 - -char *environ[MAX_ENV + 1]; - -char * -getenv (const char *name) -{ - static char *past_result; - char **envp; - int idx; - - if (past_result) - { - free (past_result); - past_result = NULL; - } - - if (! strcmp (name, "DBUS_VERBOSE")) - return past_result = get_verbose_setting (); - else if (! strcmp (name, "HOMEPATH")) - return past_result = find_my_documents_folder (); - else if (! strcmp (name, "DBUS_DATADIR")) - return past_result = find_inst_subdir ("share"); - - for (envp = environ; *envp != 0; envp++) - { - const char *varp = name; - char *ep = *envp; - int same_name = 0; - - while (*varp == *ep && *varp != '\0') - { - ++ep; - ++varp; - }; - - if (*varp == '\0' && *ep == '=') - return ep + 1; - } - - return NULL; -} - - -int -putenv (char *str) -{ - char **envp; - int idx; - for (envp = environ; *envp != 0; envp++) - { - char *varp = str; - char *ep = *envp; - int same_name = 0; - - while (*varp == *ep && *varp != '\0') - { - if (*varp == '=') - same_name = 1; - ++ep; - ++varp; - }; - - if (*varp == *ep && *varp == '\0') - return 0; - if (same_name) - { - *envp = str; - return 0; - } - } - - idx = envp - environ; - if (idx > MAX_ENV) - { - _dbus_win_set_errno (ENOMEM); - return -1; - } - - environ[idx] = str; - return 0; -} - - -clock_t -clock (void) -{ - return GetTickCount (); -} - - -void -abort (void) -{ - /* This is what windows does. */ - exit (3); -} - - -void -GetSystemTimeAsFileTime (LPFILETIME ftp) -{ - SYSTEMTIME st; - GetSystemTime (&st); - SystemTimeToFileTime (&st, ftp); -} - - -unsigned char* -_mbsrchr (const unsigned char* str, unsigned int ch) -{ - /* FIXME. This is not multi-byte safe. */ - return strrchr (str, ch); -} - - -HANDLE OpenFileMappingA(DWORD dwDesiredAccess, - BOOL bInheritHandle, - LPCSTR lpName) -{ - DWORD flProtect = 0; - HANDLE hMapping; - - if (dwDesiredAccess & FILE_MAP_READ) - flProtect |= PAGE_READONLY; - - if (dwDesiredAccess & FILE_MAP_WRITE) - flProtect |= PAGE_READWRITE; - - SetLastError (0); - hMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, - NULL, flProtect, 0, 0, lpName); - if (hMapping != INVALID_HANDLE_VALUE) - { - /* Just in case Windows CE changes its behaviour, we check for - the right error value here. */ - if (GetLastError () != ERROR_ALREADY_EXISTS) - { - CloseHandle(hMapping); - hMapping = INVALID_HANDLE_VALUE; - } - } - return hMapping; -} - - -BOOL -MoveFileExA (LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags) -{ - _dbus_assert (dwFlags == MOVEFILE_REPLACE_EXISTING); - - if (_dbus_file_exists (lpNewFileName)) - { - BOOL result = DeleteFileA (lpNewFileName); - if (result == 0) - return FALSE; - } - return MoveFileA (lpExistingFileName, lpNewFileName); -} - - -BOOL -SetHandleInformation (HANDLE hObject, DWORD dwMask, DWORD dwFlags) -{ - _dbus_assert (dwMask == (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE)); - _dbus_assert (dwFlags == 0); - - /* Not supported on Windows CE, and actually the default. So just - return overwhelming success. */ - return 1; -} - - -DWORD -SearchPathA (LPCSTR lpPath, LPCSTR lpFileName, LPCSTR lpExtension, - DWORD nBufferLength, LPSTR lpBuffer, LPSTR* lpFilePart) -{ - char *filename; - char *filepart; - int filename_len; - - _dbus_assert (lpPath == NULL); - _dbus_assert (lpExtension == NULL); - - filename = find_program_in_inst_dir (lpFileName); - if (!filename) - { - SetLastError (ERROR_FILE_NOT_FOUND); - return 0; - } - - filename_len = strlen (filename) + 1; - if (filename_len > nBufferLength) - { - free (filename); - return filename_len; - } - - strcpy (lpBuffer, filename); - free (filename); - - filepart = _mbsrchr (lpBuffer, '\\'); - if (!filepart) - filepart = lpBuffer; - *lpFilePart = filepart; - - return filename_len - 1; -} - - -/** Gets our SID - * @param sid points to sid buffer, need to be freed with LocalFree() - * @returns process sid - */ -dbus_bool_t -_dbus_getsid(char **sid) -{ - /* There is nothing like this on Windows CE, so we fake it. */ - static const char asid[] = "S-1-5-21-515967899-920026266-1708537768-1000"; - char *buf = LocalAlloc (LMEM_FIXED, sizeof (asid)); - if (!buf) - { - _dbus_win_warn_win_error ("LocalAlloc failed", GetLastError ()); - return FALSE; - } - - memcpy (buf, asid, sizeof (asid)); - *sid = buf; - return TRUE; -} - - -BOOL -LookupAccountNameW (LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid, PDWORD cbSid, - LPWSTR ReferencedDomainName, PDWORD cchReferencedDomainName, PSID_NAME_USE peUse) -{ - /* Currently not needed. */ - return FALSE; -} - - -BOOL -IsValidSid (PSID psid) -{ - /* Currently not needed. */ - return FALSE; -} - - -HANDLE -CreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile) -{ - wchar_t *filename; - HANDLE result; - int err; - - filename = _dbus_win_utf8_to_utf16 (lpFileName, NULL); - if (!filename) - return INVALID_HANDLE_VALUE; - - result = CreateFileW (filename, dwDesiredAccess, dwSharedMode, - lpSecurityAttributes, dwCreationDisposition, - dwFlagsAndAttributes, hTemplateFile); - - err = GetLastError (); - dbus_free (filename); - SetLastError (err); - return result; -} - - -BOOL -DeleteFileA (LPCSTR lpFileName) -{ - wchar_t *filename; - BOOL result; - int err; - - filename = _dbus_win_utf8_to_utf16 (lpFileName, NULL); - if (!filename) - return FALSE; - - result = DeleteFileW (filename); - - err = GetLastError (); - dbus_free (filename); - SetLastError (err); - return result; -} - - -BOOL -MoveFileA (LPCSTR lpExistingFileName, LPCSTR lpNewFileName) -{ - wchar_t *existing_filename; - wchar_t *new_filename; - BOOL result; - int err; - - existing_filename = _dbus_win_utf8_to_utf16 (lpExistingFileName, NULL); - if (! existing_filename) - return FALSE; - - new_filename = _dbus_win_utf8_to_utf16 (lpNewFileName, NULL); - if (! new_filename) - { - dbus_free (existing_filename); - return FALSE; - } - - result = MoveFileW (existing_filename, new_filename); - - err = GetLastError (); - dbus_free (existing_filename); - dbus_free (new_filename); - SetLastError (err); - return result; -} - - -DWORD -GetFileAttributesA(LPCSTR lpFileName) -{ - wchar_t *filename; - DWORD result; - int err; - - filename = _dbus_win_utf8_to_utf16 (lpFileName, NULL); - if (!filename) - return INVALID_FILE_ATTRIBUTES; - - result = GetFileAttributesW (filename); - - err = GetLastError (); - dbus_free (filename); - SetLastError (err); - return result; -} - - -BOOL -GetFileAttributesExA (LPCSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, - PVOID lpFileInformation) -{ - wchar_t *filename; - DWORD result; - int err; - - filename = _dbus_win_utf8_to_utf16 (lpFileName, NULL); - if (!filename) - return INVALID_FILE_ATTRIBUTES; - - result = GetFileAttributesExW (filename, fInfoLevelId, lpFileInformation); - - err = GetLastError (); - dbus_free (filename); - SetLastError (err); - return result; -} - - -HANDLE -CreateFileMappingA (HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, - DWORD flProtect, DWORD dwMaximumSizeHigh, - DWORD dwMaximumSizeLow, LPCSTR lpName) -{ - wchar_t *name; - HANDLE result; - int err; - - if (lpName) - { - name = _dbus_win_utf8_to_utf16 (lpName, NULL); - if (!name) - return INVALID_HANDLE_VALUE; - } - else - name = NULL; - - result = CreateFileMappingW (hFile, lpAttributes, flProtect, - dwMaximumSizeHigh, dwMaximumSizeLow, - name); - - err = GetLastError (); - dbus_free (name); - SetLastError (err); - return result; -} - - -BOOL -CreateDirectoryA (LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) -{ - wchar_t *pathname; - BOOL result; - int err; - - pathname = _dbus_win_utf8_to_utf16 (lpPathName, NULL); - if (!pathname) - return FALSE; - - result = CreateDirectoryW (pathname, lpSecurityAttributes); - - err = GetLastError (); - dbus_free (pathname); - SetLastError (err); - return result; -} - - -BOOL -RemoveDirectoryA (LPCSTR lpPathName) -{ - wchar_t *pathname; - BOOL result; - int err; - - pathname = _dbus_win_utf8_to_utf16 (lpPathName, NULL); - if (!pathname) - return FALSE; - - result = RemoveDirectoryW (pathname); - - err = GetLastError (); - dbus_free (pathname); - SetLastError (err); - return result; -} - - -static BOOL -convert_find_data (LPWIN32_FIND_DATAW fdw, LPWIN32_FIND_DATAA fda) -{ - char *filename; - int len; - - fda->dwFileAttributes = fdw->dwFileAttributes; - fda->ftCreationTime = fdw->ftCreationTime; - fda->ftLastAccessTime = fdw->ftLastAccessTime; - fda->ftLastWriteTime = fdw->ftLastWriteTime; - fda->nFileSizeHigh = fdw->nFileSizeHigh; - fda->nFileSizeLow = fdw->nFileSizeLow; - - filename = _dbus_win_utf16_to_utf8 (fdw->cFileName, NULL); - if (!filename) - return FALSE; - - len = sizeof (fda->cFileName); - strncpy (fda->cFileName, filename, len); - fda->cFileName[len - 1] = '\0'; - - return TRUE; -} - - -HANDLE -FindFirstFileA (LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) -{ - wchar_t *pathname; - WIN32_FIND_DATAW find_file_data; - HANDLE result; - int err; - - pathname = _dbus_win_utf8_to_utf16 (lpFileName, NULL); - if (!pathname) - return INVALID_HANDLE_VALUE; - - result = FindFirstFileW (pathname, &find_file_data); - if (result != INVALID_HANDLE_VALUE) - { - BOOL res = convert_find_data (&find_file_data, lpFindFileData); - if (! res) - { - err = GetLastError (); - FindClose (result); - SetLastError (err); - result = INVALID_HANDLE_VALUE; - } - } - - err = GetLastError (); - dbus_free (pathname); - SetLastError (err); - return result; -} - - -BOOL -FindNextFileA (HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) -{ - WIN32_FIND_DATAW find_file_data; - BOOL result; - int err; - - result = FindNextFileW (hFindFile, &find_file_data); - if (result) - result = convert_find_data (&find_file_data, lpFindFileData); - - return result; -} - - -HANDLE -CreateMutexA (LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, - LPCSTR lpName) -{ - wchar_t *name; - HANDLE result; - int err; - - if (lpName) - { - name = _dbus_win_utf8_to_utf16 (lpName, NULL); - if (!name) - return INVALID_HANDLE_VALUE; - } - else - name = NULL; - - result = CreateMutexW (lpMutexAttributes, bInitialOwner, name); - - err = GetLastError (); - dbus_free (name); - SetLastError (err); - return result; -} - - -BOOL -CreateProcessA (LPCSTR pszImageName, LPSTR pszCmdLine, - LPSECURITY_ATTRIBUTES psaProcess, - LPSECURITY_ATTRIBUTES psaThread, BOOL fInheritHandles, - DWORD fdwCreate, PVOID pvEnvironment, LPCSTR pszCurDir, - LPSTARTUPINFOA psiStartInfo, - LPPROCESS_INFORMATION pProcInfo) -{ - wchar_t *image_name = NULL; - wchar_t *cmd_line = NULL; - BOOL result; - int err; - - _dbus_assert (psaProcess == NULL); - _dbus_assert (psaThread == NULL); - _dbus_assert (fInheritHandles == FALSE); - _dbus_assert (pvEnvironment == NULL); - _dbus_assert (pszCurDir == NULL); - /* psiStartInfo is generally not NULL. */ - - if (pszImageName) - { - image_name = _dbus_win_utf8_to_utf16 (pszImageName, NULL); - if (!image_name) - return 0; - } - if (pszCmdLine) - { - cmd_line = _dbus_win_utf8_to_utf16 (pszCmdLine, NULL); - if (!cmd_line) - { - if (image_name) - dbus_free (image_name); - return 0; - } - } - - result = CreateProcessW (image_name, cmd_line, NULL, NULL, FALSE, - fdwCreate, NULL, NULL, NULL, pProcInfo); - - err = GetLastError (); - dbus_free (image_name); - dbus_free (cmd_line); - SetLastError (err); - return result; -} - - -LONG -RegOpenKeyExA (HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, - REGSAM samDesired, PHKEY phkResult) -{ - wchar_t *subkey; - LONG result; - int err; - - if (lpSubKey) - { - subkey = _dbus_win_utf8_to_utf16 (lpSubKey, NULL); - if (!subkey) - return 0; - } - else - subkey = NULL; - - result = RegOpenKeyEx (hKey, subkey, ulOptions, samDesired, phkResult); - - err = GetLastError (); - dbus_free (subkey); - SetLastError (err); - return result; -} - - -LONG -RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, - LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData) -{ - wchar_t *name; - LONG err; - BYTE *data; - DWORD data_len; - DWORD type; - - if (lpValueName) - { - name = _dbus_win_utf8_to_utf16 (lpValueName, NULL); - if (!name) - return GetLastError (); - } - else - name = NULL; - - data_len = 0; - err = RegQueryValueExW (hKey, name, lpReserved, lpType, NULL, &data_len); - if (err || !lpcbData) - { - dbus_free (name); - return err; - } - - data = malloc (data_len + sizeof (wchar_t)); - if (!data) - { - dbus_free (name); - return ERROR_NOT_ENOUGH_MEMORY; - } - - err = RegQueryValueExW (hKey, name, lpReserved, &type, data, &data_len); - if (lpType) - *lpType = type; - dbus_free (name); - /* If err is ERROR_MORE_DATA, there probably was a race condition. - We can punt this to the caller just as well. */ - if (err) - { - free (data); - return err; - } - - /* NOTE: REG_MULTI_SZ and REG_EXPAND_SZ not supported, because they - are not needed in this module. */ - if (type == REG_SZ) - { - char *data_c; - int data_c_len; - - /* This is valid since we allocated one more above. */ - data[data_len] = '\0'; - data[data_len + 1] = '\0'; - - /* The cast is valid because malloc guarantees alignment of - basic types. */ - data_c = _dbus_win_utf16_to_utf8 ((wchar_t*) data, NULL); - if (!data_c) - { - free (data); - return GetLastError(); - } - - data_c_len = strlen (data_c) + 1; - _dbus_assert (data_c_len <= data_len + sizeof (wchar_t)); - memcpy (data, data_c, data_c_len); - data_len = data_c_len; - dbus_free (data_c); - } - - /* DATA and DATA_LEN now contain the result. */ - if (lpData) - { - if (data_len > *lpcbData) - err = ERROR_MORE_DATA; - else - memcpy (lpData, data, data_len); - } - free (data); - *lpcbData = data_len; - return err; -} - - -DWORD -FormatMessageA (DWORD dwFlags, PCVOID lpSource, DWORD dwMessageId, - DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, - va_list* Arguments) -{ - LPWSTR buffer_w = NULL; - LPSTR buffer_c; - DWORD len; - char *buffer_new; - DWORD buffer_new_len; - BOOL buffer_w_free; - - len = FormatMessageW (dwFlags | FORMAT_MESSAGE_ALLOCATE_BUFFER, - lpSource, dwMessageId, dwLanguageId, - (LPWSTR) &buffer_w, 0, Arguments); - if (len == 0) - return 0; - - buffer_c = _dbus_win_utf16_to_utf8 (buffer_w, NULL); - if (! buffer_c) - { - LocalFree (buffer_w); - return 0; - } - - if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) - { - /* We need to return a buffer that's freeable with LocalFree. */ - buffer_new = (char *) buffer_w; - buffer_new_len = sizeof (wchar_t) * (len + 1); - buffer_w_free = FALSE; - /* Avoid alignment issue by using memcpy. */ - memcpy (lpBuffer, &buffer_new, sizeof (buffer_new)); - } - else - { - buffer_new = lpBuffer; - buffer_new_len = nSize; - buffer_w_free = TRUE; - } - - strncpy (buffer_new, buffer_c, buffer_new_len); - dbus_free (buffer_c); - buffer_new[buffer_new_len - 1] = '\0'; - if (buffer_w_free) - LocalFree (buffer_w); - - /* strlen is correct (not _mbstrlen), because we want storage and - not string length. */ - return strlen (buffer_new); -} - - -DWORD -GetModuleFileNameA (HINSTANCE hModule, LPSTR lpFilename, DWORD nSize) -{ - wchar_t *filename_w; - char *filename_c; - DWORD len; - - if (nSize == 0) - { - /* Windows XP/2000. */ - SetLastError (0); - return 0; - } - - filename_w = malloc (sizeof (wchar_t) * nSize); - if (! filename_w) - return 0; - - len = GetModuleFileNameW (hModule, filename_w, nSize); - if (len == 0) - { - /* Note: If we fail with ERROR_INSUFFICIENT_BUFFER, this is still - (approximately) correct. */ - free (filename_w); - return 0; - } - - filename_w[nSize - 1] = '\0'; - filename_c = _dbus_win_utf16_to_utf8 (filename_w, NULL); - free (filename_w); - if (! filename_c) - return 0; - - strncpy (lpFilename, filename_c, nSize); - dbus_free (filename_c); - lpFilename[nSize - 1] = '\0'; - /* strlen is correct (not _mbstrlen), because we want storage and - not string length. */ - return strlen (lpFilename); -} - - -DWORD -GetTempPathA (DWORD nBufferLength, LPSTR lpBuffer) -{ - wchar_t dummy[1]; - DWORD len; - - len = GetTempPathW (0, dummy); - if (len == 0) - return 0; - - _dbus_assert (len <= MAX_PATH); - - /* Better be safe than sorry. MSDN doesn't say if len is with or - without terminating 0. */ - len++; - - { - wchar_t *buffer_w; - DWORD len_w; - char *buffer_c; - DWORD len_c; - - buffer_w = malloc (sizeof (wchar_t) * len); - if (! buffer_w) - return 0; - - len_w = GetTempPathW (len, buffer_w); - /* Give up if we still can't get at it. */ - if (len_w == 0 || len_w >= len) - { - free (buffer_w); - return 0; - } - - /* Better be really safe. */ - buffer_w[len_w] = '\0'; - - buffer_c = _dbus_win_utf16_to_utf8 (buffer_w, NULL); - free (buffer_w); - if (! buffer_c) - return 0; - - /* strlen is correct (not _mbstrlen), because we want storage and - not string length. */ - len_c = strlen (buffer_c) + 1; - if (len_c > nBufferLength) - return len_c; - - strcpy (lpBuffer, buffer_c); - dbus_free (buffer_c); - return len_c - 1; - } -} - - -BOOL -SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder, - BOOL fCreate) -{ - wchar_t path[MAX_PATH]; - char *path_c; - BOOL result; - - path[0] = (wchar_t) 0; - result = SHGetSpecialFolderPathW (hwndOwner, path, nFolder, fCreate); - /* Note: May return false even if succeeds. */ - - path[MAX_PATH - 1] = (wchar_t) 0; - path_c = _dbus_win_utf16_to_utf8 (path, NULL); - if (! path_c) - return 0; - - strncpy (lpszPath, path_c, MAX_PATH); - dbus_free (path_c); - lpszPath[MAX_PATH - 1] = '\0'; - return result; -} - - -void -OutputDebugStringA (LPCSTR lpOutputString) -{ - wchar_t *str; - HANDLE result; - int err; - - str = _dbus_win_utf8_to_utf16 (lpOutputString, NULL); - if (!str) - return; - - OutputDebugStringW (str); - - err = GetLastError (); - dbus_free (str); - SetLastError (err); -} |