diff options
Diffstat (limited to '')
| -rw-r--r-- | src/ChangeLog | 17 | ||||
| -rw-r--r-- | src/w32-util.c | 189 | 
2 files changed, 101 insertions, 105 deletions
| diff --git a/src/ChangeLog b/src/ChangeLog index f9220bb8..e6728368 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,22 @@  2010-05-11  Marcus Brinkmann  <[email protected]> +	* w32-util.c: Include ath.h +	(HAVE_ALLOW_SET_FOREGROUND_WINDOW) [!HAVE_W32CE_SYSTEM]: Define +	it. +	(RTLD_LAZY, dlopen, dlsym, +	dlclose) [!HAVE_ALLOW_SET_FORGROUND_WINDOW]: Don't define anymore. +	(_gpgme_allow_set_foreground_window) [!HAVE_ALLOW_SET_FOREGROUND_WINDOW]: +	Make it a stub. +	(read_w32_registry_string): Use FooA variants of Windows functions +	instead of Foo (which dispatches depending on UNICODE). +	[!HAVE_W32CE_SYSTEM]: Don't check environment. +	(w32_shgetfolderpath): Remove. +	(find_program_at_standard_place): Call +	SHGetSpecialFolderPath (which is available on all Windows systems +	and also Windows CE). +	(mkstemp): Use ath_self instead of getpid. +	(_gpgme_mkstemp): Use GetTempPathA instead of GetTempPath. +  	* gpgme.h.in: Use _WIN32 instead of _MSC_VER.  Include time.h for  	time_t. diff --git a/src/w32-util.c b/src/w32-util.c index 498c6fb2..22c2a0f3 100644 --- a/src/w32-util.c +++ b/src/w32-util.c @@ -38,13 +38,22 @@  #include <shlobj.h>  #include <io.h> +#include "ath.h"  #include "util.h"  #include "sema.h"  #include "debug.h" + +#ifndef HAVE_W32CE_SYSTEM +#define HAVE_ALLOW_SET_FOREGROUND_WINDOW 1 +#endif + +  DEFINE_STATIC_LOCK (get_path_lock); +#ifdef HAVE_ALLOW_SET_FOREGROUND_WINDOW +  #define RTLD_LAZY 0  static __inline__ void * @@ -77,6 +86,52 @@ dlclose (void * hd)      }    return -1;  }   +#endif /* HAVE_ALLOW_SET_FOREGROUND_WINDOW */ + + +void  +_gpgme_allow_set_foreground_window (pid_t pid) +{ +#ifdef HAVE_ALLOW_SET_FOREGROUND_WINDOW +  static int initialized; +  static BOOL (WINAPI * func)(DWORD); +  void *handle; + +  if (!initialized) +    { +      /* Available since W2000; thus we dynload it.  */ +      initialized = 1; +      handle = dlopen ("user32.dll", RTLD_LAZY); +      if (handle) +        { +          func = dlsym (handle, "AllowSetForegroundWindow"); +          if (!func) +            { +              dlclose (handle); +              handle = NULL; +            } +        } +    } + +  if (!pid || pid == (pid_t)(-1)) +    { +      TRACE1 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, +	      "no action for pid %d", (int)pid); +    } +  else if (func) +    { +      int rc = func (pid); +      TRACE2 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, +	      "called for pid %d; result=%d", (int)pid, rc); + +    } +  else +    { +      TRACE0 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, +	      "function not available"); +    } +#endif /* HAVE_ALLOW_SET_FOREGROUND_WINDOW */ +}  /* Return a string from the W32 Registry or NULL in case of error. @@ -89,59 +144,64 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)    DWORD n1, nbytes, type;    char *result = NULL; -  if ( !root ) +  if (!root)      root_key = HKEY_CURRENT_USER; -  else if ( !strcmp( root, "HKEY_CLASSES_ROOT" ) ) +  else if (!strcmp( root, "HKEY_CLASSES_ROOT"))      root_key = HKEY_CLASSES_ROOT; -  else if ( !strcmp( root, "HKEY_CURRENT_USER" ) ) +  else if (!strcmp( root, "HKEY_CURRENT_USER"))      root_key = HKEY_CURRENT_USER; -  else if ( !strcmp( root, "HKEY_LOCAL_MACHINE" ) ) +  else if (!strcmp( root, "HKEY_LOCAL_MACHINE"))      root_key = HKEY_LOCAL_MACHINE; -  else if ( !strcmp( root, "HKEY_USERS" ) ) +  else if (!strcmp( root, "HKEY_USERS"))      root_key = HKEY_USERS; -  else if ( !strcmp( root, "HKEY_PERFORMANCE_DATA" ) ) +  else if (!strcmp( root, "HKEY_PERFORMANCE_DATA"))      root_key = HKEY_PERFORMANCE_DATA; -  else if ( !strcmp( root, "HKEY_CURRENT_CONFIG" ) ) +  else if (!strcmp( root, "HKEY_CURRENT_CONFIG"))      root_key = HKEY_CURRENT_CONFIG;    else      return NULL; -  if ( RegOpenKeyEx ( root_key, dir, 0, KEY_READ, &key_handle ) ) +  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 (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) ) +      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 ( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) +  if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))      {        if (root)          goto leave;        /* Try to fallback to HKLM also vor a missing value.  */        RegCloseKey (key_handle); -      if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) ) +      if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))          return NULL; /* Nope.  */ -      if (RegQueryValueEx ( key_handle, name, 0, NULL, NULL, &nbytes)) +      if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))          goto leave;      } -  result = malloc ( (n1=nbytes+1) ); -  if ( !result ) +  n1 = nbytes + 1; +  result = malloc (n1); +  if (!result)      goto leave; -  if ( RegQueryValueEx ( key_handle, name, 0, &type, result, &n1 ) ) +  if (RegQueryValueExA (key_handle, name, 0, &type, (LPBYTE) result, &n1))      { -      free(result); result = NULL; +      free (result); +      result = NULL;        goto leave;      }    result[nbytes] = 0; /* Make sure it is really a string.  */ + +#ifndef HAVE_W32CE_SYSTEM +  /* Windows CE does not have an environment.  */    if (type == REG_EXPAND_SZ && strchr (result, '%'))       {        char *tmp;        n1 += 1000; -      tmp = malloc (n1+1); +      tmp = malloc (n1 + 1);        if (!tmp)          goto leave;        nbytes = ExpandEnvironmentStrings (result, tmp, n1); @@ -179,51 +239,14 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)            free (tmp);          }      } +#endif   leave: -  RegCloseKey( key_handle ); +  RegCloseKey (key_handle);    return result;  } -/* This is a helper function to load and run a Windows function from -   either of one DLLs. */ -static HRESULT -w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e) -{ -  static int initialized; -  static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR); - -  if (!initialized) -    { -      static char *dllnames[] = { "shell32.dll", "shfolder.dll", NULL }; -      void *handle; -      int i; - -      initialized = 1; - -      for (i=0, handle = NULL; !handle && dllnames[i]; i++) -        { -          handle = dlopen (dllnames[i], RTLD_LAZY); -          if (handle) -            { -              func = dlsym (handle, "SHGetFolderPathA"); -              if (!func) -                { -                  dlclose (handle); -                  handle = NULL; -                } -            } -        } -    } - -  if (func) -    return func (a,b,c,d,e); -  else -    return -1; -} - -  #if 0  static char *  find_program_in_registry (const char *name) @@ -285,7 +308,8 @@ find_program_at_standard_place (const char *name)    char path[MAX_PATH];    char *result = NULL; -  if (w32_shgetfolderpath (NULL, CSIDL_PROGRAM_FILES, NULL, 0, path) >= 0)  +  /* See http://wiki.tcl.tk/17492 for details on compatibility.  */ +  if (SHGetSpecialFolderPathA (NULL, path, CSIDL_PROGRAM_FILES, 0))      {        result = malloc (strlen (path) + 1 + strlen (name) + 1);        if (result) @@ -383,7 +407,7 @@ const char *  _gpgme_get_uiserver_socket_path (void)  {    static char *socket_path; -  char *homedir; +  const char *homedir;    const char name[] = "S.uiserver";    if (socket_path) @@ -432,51 +456,6 @@ _gpgme_get_conf_int (const char *key, int *value)    return 1;  } - -void  -_gpgme_allow_set_foreground_window (pid_t pid) -{ -  static int initialized; -  static BOOL (WINAPI * func)(DWORD); -  void *handle; - -  if (!initialized) -    { -      /* Available since W2000; thus we dynload it.  */ -      initialized = 1; -      handle = dlopen ("user32.dll", RTLD_LAZY); -      if (handle) -        { -          func = dlsym (handle, "AllowSetForegroundWindow"); -          if (!func) -            { -              dlclose (handle); -              handle = NULL; -            } -        } -    } - -  if (!pid || pid == (pid_t)(-1)) -    { -      TRACE1 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, -	      "no action for pid %d", (int)pid); -    } -  else if (func) -    { -      int rc = func (pid); -      TRACE2 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, -	      "called for pid %d; result=%d", (int)pid, rc); - -    } -  else -    { -      TRACE0 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0, -	      "function not available"); -    } - -} - -  /* mkstemp extracted from libc/sysdeps/posix/tempname.c.  Copyright     (C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc. @@ -538,7 +517,7 @@ mkstemp (char *tmpl)      random_time_bits = (((uint64_t)ft.dwHighDateTime << 32)                          | (uint64_t)ft.dwLowDateTime);    } -  value += random_time_bits ^ getpid (); +  value += random_time_bits ^ ath_self ();    for (count = 0; count < attempts; value += 7777, ++count)      { @@ -583,7 +562,7 @@ _gpgme_mkstemp (int *fd, char **name)    *fd = -1;    *name = NULL; -  err = GetTempPath (MAX_PATH + 1, tmp); +  err = GetTempPathA (MAX_PATH + 1, tmp);    if (err == 0 || err > MAX_PATH + 1)      strcpy (tmp,"c:\\windows\\temp");    else | 
