/[winpt]/trunk/Src/wptW32API.cpp
ViewVC logotype

Annotation of /trunk/Src/wptW32API.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 175 - (hide annotations)
Tue Feb 7 08:58:04 2006 UTC (19 years ago) by twoaday
File size: 14210 byte(s)
2006-02-04  Timo Schulz  <ts@g10code.de>
                                                                                                                            
        * wptKeyManagerDlg.cpp (keymanager_dlg_proc): Check for
        at least one ultimately trusted key.
        * wptKeyManager.cpp (km_refresh_key_from_keyserver):
        Only check inet connection if we refresh all keys.
        * wptGPGUtil.cpp (gpg_extract_keys): New.
        * wptClipEncryptDlg.cpp (clip_encrypt_dlg_proc): Use textmode.
        * wptClipSignEncDlg.cpp (clip_signenc_dlg_proc): Likewise.
        * wptClipSignDlg.cpp (get_selected_key): New.
        (one_key_proc): Use it here.
        (count_useable_seckeys): New.
        * wptSigTreeDlg.cpp (sigtree_dlg_proc): New.
        * wptKeyEditDlgs.cpp (diff_time): Removed.
        (w32_mktime): New.
        (keyedit_addsubkey_dlg_proc): Use it here.
                                                                                                                            
2006-02-02  Timo Schulz  <ts@g10code.de>
                                                                                                                            
        * wptW32API.cpp (get_temp_name): New.
        * wptKeyserver.cpp (ldap_recvkey): Use it here.
        * wptKeyPropsDlg.cpp (get_photo_tmpname): Likewise.
        * wptGPGUtil.cpp (create_tempfile): Likewise.
        * wptImportList.cpp (implist_load): Likewise.
        * wptKeyCache.cpp (parse_attr_data): Likewise.
        (w32_tempfile): Removed.
        * wptGPGME.cpp (check_ultimate_trusted_key): New.
                                                                                                                            

1 werner 36 /* wptW32API.cpp - Common W32 API functions
2 twoaday 121 * Copyright (C) 2001, 2002, 2003, 2005 Timo Schulz
3 werner 36 *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20 twoaday 121
21 werner 36 #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <windows.h>
26     #include <stdio.h>
27     #include <sys/types.h>
28     #include <sys/stat.h>
29     #include <shellapi.h>
30     #include <shlobj.h>
31     #include <commctrl.h>
32 twoaday 129 #include <time.h>
33 werner 36
34     #include "wptNLS.h"
35     #include "wptW32API.h"
36     #include "wptErrors.h"
37     #include "wptVersion.h"
38     #include "wptTypes.h"
39    
40    
41     extern "C" void _SHFree (void *p);
42    
43    
44     static void
45     set_menu_text_ext (HMENU menu, int by_pos, int m_uid, const char *text)
46     {
47     MENUITEMINFO mii;
48    
49     memset (&mii, 0, sizeof mii);
50     mii.cbSize = sizeof mii;
51     mii.fMask = MIIM_TYPE;
52     mii.fType = MFT_STRING;
53     mii.dwTypeData = (char *) text;
54     SetMenuItemInfo (menu, m_uid, by_pos? TRUE : FALSE, &mii);
55     }
56    
57    
58     /* Set the text of a menu item @m_uid to @text. */
59     void
60 twoaday 129 set_menu_text (HMENU menu, UINT m_uid, const char *text)
61 werner 36 {
62     set_menu_text_ext (menu, 0, m_uid, text);
63     }
64    
65    
66     /* Set the text of a menu item with the position @pos to @text. */
67     void
68 twoaday 129 set_menu_text_bypos (HMENU menu, UINT pos, const char *text)
69 werner 36 {
70     set_menu_text_ext (menu, 1, pos, text);
71     }
72    
73    
74     /* Set the state of a menu item @m_uid to @state. */
75     void
76 twoaday 129 set_menu_state (HMENU menu, UINT m_uid, UINT state)
77 werner 36 {
78     MENUITEMINFO mii;
79    
80 twoaday 121 memset (&mii, 0, sizeof (mii));
81 werner 36 mii.cbSize = sizeof (mii);
82     mii.fMask = MIIM_STATE;
83     mii.fState = state;
84     SetMenuItemInfo (menu, m_uid, FALSE, &mii);
85     }
86    
87    
88 twoaday 129 /* Retrieve the state of the menu item @m_uid and return it. */
89     UINT
90     get_menu_state (HMENU menu, UINT m_uid)
91     {
92     MENUITEMINFO mii;
93    
94     memset (&mii, 0, sizeof (mii));
95     mii.cbSize = sizeof (mii);
96     mii.fMask = MIIM_STATE;
97     GetMenuItemInfo (menu, m_uid, FALSE, &mii);
98     return mii.fState;
99     }
100    
101    
102 twoaday 77 enum {
103     CDLG_FILE_OPEN = 0,
104     CDLG_FILE_SAVE = 1
105     };
106 werner 36
107     /* Use the common dialog to request a file from the user.
108     id can be either FILE_OPEN or FILE_SAVE.
109     The return value is the file name or NULL if cancel was chosen. */
110     const char *
111     get_filename_dlg (HWND hwnd, int id, const char * title,
112     const char * filter, const char * name)
113     {
114     static char file[512] = "";
115     OPENFILENAME open;
116    
117     if (name && strlen (name) < (sizeof (file)-1))
118     strcpy (file, name);
119     else
120     memset (file, 0, sizeof (file));
121     if (!filter)
122 twoaday 167 filter = "All Files (*.*)\0*.*\0\0";
123 werner 36 /* XXX: problem with gettext because of the 'artificial'
124     double string termination!. */
125     memset (&open, 0, sizeof (open));
126     open.lStructSize = sizeof (OPENFILENAME);
127     open.hInstance = glob_hinst;
128     open.lpstrTitle = title;
129     open.lpstrFilter = filter;
130     open.hwndOwner = hwnd;
131     open.lpstrFile = file;
132     open.nMaxFile = sizeof (file) - 1;
133 twoaday 77 if (id == CDLG_FILE_OPEN)
134 werner 36 open.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
135     else
136     open.Flags = OFN_OVERWRITEPROMPT;
137    
138 twoaday 77 if (id == CDLG_FILE_OPEN && GetOpenFileName (&open))
139 werner 36 return open.lpstrFile;
140 twoaday 77 else if (id == CDLG_FILE_SAVE && GetSaveFileName (&open))
141 werner 36 return open.lpstrFile;
142    
143     return NULL;
144     }
145    
146     const char*
147     get_filesave_dlg (HWND hwnd, const char *title,
148     const char *filter, const char *name)
149     {
150 twoaday 77 return get_filename_dlg (hwnd, CDLG_FILE_SAVE, title, filter, name);
151 werner 36 }
152    
153 twoaday 121 const char*
154 werner 36 get_fileopen_dlg (HWND hwnd, const char *title, const char *filter,
155     const char *name)
156     {
157 twoaday 77 return get_filename_dlg (hwnd, CDLG_FILE_OPEN, title, filter, name);
158 werner 36 }
159    
160    
161     /* Use the common dialog to allow the user to select a folder.
162     The return value is either the folder path or NULL if cancel was chosen. */
163     const char*
164 twoaday 121 get_folder_dlg (HWND hwnd, const char *title, const char *name)
165 werner 36 {
166     static char folder[MAX_PATH+1] = "";
167     BROWSEINFO bi;
168 twoaday 121 ITEMIDLIST *il;
169 werner 36
170     memset (&bi, 0, sizeof (bi));
171     bi.hwndOwner = hwnd;
172     if (title)
173     bi.lpszTitle = title;
174     if (name && strlen (name) < MAX_PATH-1)
175     strcpy (folder, name);
176     else
177     memset (folder, 0, sizeof (folder));
178     il = SHBrowseForFolder (&bi);
179     if (il) {
180     SHGetPathFromIDList (il, folder);
181     _SHFree (il);
182     return folder;
183     }
184     return NULL;
185     }
186    
187    
188     /* Return the clipboard contents as a string or NULL
189     if the clipboard does not contain text. */
190     char*
191     get_clip_text (HWND hwnd)
192     {
193     HANDLE clipmem;
194     char *cliptxt, *p;
195     int len;
196    
197     if (OpenClipboard (hwnd) == FALSE)
198     return NULL;
199     clipmem = GetClipboardData (CF_TEXT);
200     if (clipmem == NULL) {
201     p = NULL;
202     goto leave;
203     }
204     cliptxt = (char *) GlobalLock (clipmem);
205     if (cliptxt == NULL) {
206     p = NULL;
207     goto leave;
208     }
209    
210     len = strlen (cliptxt);
211     p = new char[len + 1];
212     if (!p)
213     BUG (NULL);
214     memcpy (p, cliptxt, len);
215     p[len] = '\0';
216     GlobalUnlock (clipmem);
217    
218     leave:
219     CloseClipboard ();
220     return p;
221     }
222    
223    
224     /* Set @text as the new clipboard content. */
225     int
226     set_clip_text (HWND hwnd, const char *text, int nbytes)
227     {
228     HANDLE clipmem;
229     int rc = 0;
230     char *p;
231    
232     if (OpenClipboard (hwnd) == FALSE)
233     return WPTERR_CLIP_OPEN;
234     EmptyClipboard ();
235    
236     clipmem = GlobalAlloc (GHND, nbytes + 1);
237     if (clipmem == NULL)
238     BUG (NULL);
239     p = (char *) GlobalLock (clipmem);
240     if (p == NULL) {
241     rc = WPTERR_GENERAL;;
242     goto leave;
243     }
244     memcpy (p, text, nbytes);
245     p[nbytes] = '\0';
246    
247     GlobalUnlock (clipmem);
248     SetClipboardData (CF_TEXT, clipmem);
249    
250     leave:
251     CloseClipboard ();
252     return rc;
253     } /* set_clip_text */
254    
255    
256     /* Append or prepend some text to the clipboard contents.
257     If as_footer = 1, append the text otherwise prepend. */
258     int
259     set_clip_text2 (HWND hwnd, const char *text, int nbytes, int as_footer)
260     {
261     char *p, *new_text;
262    
263     p = get_clip_text (hwnd);
264     if (!p)
265     return WPTERR_CLIP_GET;
266     new_text = new char [strlen (p)+strlen (text)+8];
267     if (!new_text)
268     BUG (0);
269     if (as_footer == 0)
270     sprintf (new_text, "%s\r\n%s\r\n\r\n", text, p);
271     else
272     sprintf (new_text, "%s\n%s\n\n", p, text);
273     set_clip_text (hwnd, new_text, strlen (new_text)+1);
274     free_if_alloc (p);
275     free_if_alloc (new_text);
276     return 0;
277     }
278    
279    
280 twoaday 121 /* Make a file name out of the path @path, the file @file and
281     an extension. @ext.
282     Return value: the full file name on success. */
283 werner 36 char*
284     make_filename (const char *path, const char *file, const char *ext)
285     {
286     char *p;
287     size_t size = 0;
288    
289     if( path && *path )
290     size += strlen( path );
291     if( file && *file )
292     size += strlen( file );
293     if( ext && *ext )
294     size += strlen( ext );
295     p = new char[size + 4];
296     memset( p, 0, size );
297     if( path ) {
298     strcat( p, path );
299     if( path[strlen( path ) -1] != '\\' )
300     strcat( p, "\\" );
301     }
302     if( file )
303     strcat( p, file );
304     if( ext ) {
305     strcat( p, "." );
306     strcat( p, ext );
307     }
308     return p;
309 twoaday 121 }
310 werner 36
311    
312 twoaday 150 /* Generate a file name from a special dirctory. */
313     char*
314     make_special_filename (int folder, const char *file, const char *ext)
315     {
316     BOOL ec;
317     char path[MAX_PATH], *p;
318     size_t n=0;
319    
320     /* MSDN: buf must be at least MAX_PATH=256 bytes */
321     ec = SHGetSpecialFolderPath (HWND_DESKTOP, path, folder, TRUE);
322     if (ec != 1) {
323     log_debug ("SHGetSpecialFolderPath() failed\r\n", (int)GetLastError ());
324     return NULL;
325     }
326    
327     n = strlen (path)+1;
328     if (file)
329     n += strlen (file)+1;
330     if (ext)
331     n += strlen (ext)+1;
332     p = new char[n+2];
333     if (!p)
334     BUG (0);
335     memset (p, 0, n+2);
336     strcpy (p, path);
337     if (file) {
338     strcat (p, "\\");
339     strcat (p, file);
340     }
341     if (ext)
342     strcat (p, ext);
343     return p;
344     }
345    
346    
347 twoaday 121 /* return 0 if the file @fname exists, otherwise >0. */
348 werner 36 int
349 twoaday 121 file_exist_check (const char *fname)
350 werner 36 {
351     struct stat st;
352     if (stat (fname, &st) == -1)
353     return WPTERR_FILE_EXIST;
354     return 0;
355     }
356    
357    
358     /* Check if the current folder exists.
359     Return 0 for success. */
360     int
361     dir_exist_check (const char *dir)
362     {
363     struct stat statbuf;
364    
365 twoaday 105 if (stat (dir, &statbuf) == -1)
366 werner 36 return WPTERR_GENERAL;
367 twoaday 105 if (statbuf.st_mode & _S_IFDIR)
368 werner 36 return 0;
369     return WPTERR_GENERAL;
370     }
371    
372    
373 twoaday 77 /* Return the file size of the given file @fname. */
374     DWORD
375 werner 36 get_file_size (const char *fname)
376     {
377 twoaday 77 DWORD fsize;
378 werner 36 HANDLE fh;
379    
380 twoaday 77 fh = CreateFile (fname, GENERIC_READ, FILE_SHARE_READ,
381     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
382     if (fh == INVALID_HANDLE_VALUE)
383 werner 36 return 0;
384 twoaday 77 fsize = GetFileSize (fh, NULL);
385     if (fsize == 0xFFFFFFFF)
386 werner 36 fsize = 0;
387 twoaday 77 CloseHandle (fh);
388 werner 36 return fsize;
389 twoaday 77 }
390 werner 36
391    
392     /* Start a dialog with the exception that before it is checked that the
393     dialog is not already openened. */
394     int
395 twoaday 105 dialog_box_param (HINSTANCE hinst, LPCTSTR name, HWND parent, DLGPROC fnc,
396     LPARAM param, LPCTSTR title, int title_id)
397 werner 36 {
398 twoaday 105 if (FindWindowEx (GetDesktopWindow (), NULL, NULL, title))
399 werner 36 return -1;
400 twoaday 105 return DialogBoxParam (hinst, name, parent, fnc, param);
401     }
402 werner 36
403    
404     /* Wrapper for message box which forces the message box into the
405     foreground and it is displayed always on top. */
406     int
407     msg_box (HWND hwnd, const char *text, const char *title, int mode)
408     {
409     mode |= MB_SETFOREGROUND;
410     mode |= MB_TASKMODAL;
411     mode |= MB_TOPMOST;
412     return MessageBox(hwnd, text, title, mode);
413     }
414    
415    
416 twoaday 121 /* Safe strdup version (C++ version). */
417 werner 36 char*
418     m_strdup (const char *str)
419     {
420 twoaday 121 char *p = new char[strlen (str) + 1];
421     if (!p)
422     BUG (NULL);
423     strcpy (p, str);
424 werner 36 return p;
425 twoaday 121 }
426 werner 36
427    
428     /* Center the hwndChild relative to parent.
429     The style param allows to specificy additional styles (like topmost). */
430     void
431     center_window2 (HWND hwndChild, HWND parent, HWND style)
432     {
433     HWND hwndParent;
434     RECT rChild, rParent;
435     HDC hdc;
436     int wChild, hChild, wParent, hParent;
437     int wScreen, hScreen, xNew, yNew;
438     int flags = SWP_NOSIZE | SWP_NOZORDER;
439    
440     hwndParent = parent;
441     if (hwndParent == NULL)
442     hwndParent = GetDesktopWindow ();
443     GetWindowRect (hwndChild, &rChild);
444     wChild = rChild.right - rChild.left;
445     hChild = rChild.bottom - rChild.top;
446    
447     GetWindowRect (hwndParent, &rParent);
448     wParent = rParent.right - rParent.left;
449     hParent = rParent.bottom - rParent.top;
450    
451     hdc = GetDC (hwndChild);
452     wScreen = GetDeviceCaps (hdc, HORZRES);
453     hScreen = GetDeviceCaps (hdc, VERTRES);
454     ReleaseDC (hwndChild, hdc);
455     xNew = rParent.left + ((wParent - wChild) /2);
456     if (xNew < 0)
457     xNew = 0;
458     else if ((xNew+wChild) > wScreen)
459     xNew = wScreen - wChild;
460     yNew = rParent.top + ((hParent - hChild) /2);
461     if (yNew < 0)
462     yNew = 0;
463     else if ((yNew+hChild) > hScreen)
464     yNew = hScreen - hChild;
465     if (style == HWND_TOPMOST || style == HWND_NOTOPMOST)
466     flags = SWP_NOMOVE | SWP_NOSIZE;
467     SetWindowPos (hwndChild, style? style : NULL, xNew, yNew, 0, 0, flags);
468     }
469    
470    
471     /* Center the given hwndChild window with no special style. */
472     void
473     center_window (HWND hwndChild, HWND hwndParent)
474     {
475     center_window2 (hwndChild, hwndParent, NULL);
476     }
477 twoaday 121
478    
479     /* Retrieve the product verion of the given file @fname.
480     Format: MAJOR.MINOR.PATCH1.PATCH2
481     Return value: 0 on success. */
482     int
483     get_file_version (const char *fname, WORD *major, WORD *minor,
484     WORD *patch1, WORD *patch2)
485     {
486     VS_FIXEDFILEINFO *inf = {0};
487     char file[MAX_PATH+1] = {0};
488     LPVOID buf, data;
489     DWORD arg;
490     DWORD size;
491     UINT qlen;
492    
493     strncpy (file, fname, MAX_PATH);
494     size = GetFileVersionInfoSize (file, &arg);
495     if (!size)
496     return -1;
497     buf = (LPVOID)new CHAR[size];
498     if (!buf)
499     BUG (NULL);
500     GetFileVersionInfo (file, 0, size, buf);
501    
502     qlen=0;
503     VerQueryValue (buf, "\\", &data, &qlen);
504     if (!qlen) {
505     delete [] (char*)buf;
506     return -1;
507     }
508     inf = (VS_FIXEDFILEINFO*)data;
509    
510     if (major)
511     *major = HIWORD (inf->dwProductVersionMS);
512     if (minor)
513     *minor = LOWORD (inf->dwProductVersionMS);
514     if (patch1)
515     *patch1 = HIWORD (inf->dwProductVersionLS);
516     if (patch2)
517     *patch2 = LOWORD (inf->dwProductVersionLS);
518    
519     delete [] (char*)buf;
520     return 0;
521     }
522    
523    
524 twoaday 129 /* Return date in a format which complies with the
525     system locale settings. */
526     const char*
527     get_locale_date (long tm_t, char *buf, DWORD buflen)
528     {
529     SYSTEMTIME st;
530     struct tm *ptm;
531 twoaday 121
532 twoaday 129 ptm = localtime (&tm_t);
533     st.wYear = (WORD)ptm->tm_year;
534     st.wMonth = (WORD)ptm->tm_mon;
535     st.wDay = (WORD)ptm->tm_mday;
536     st.wYear += 1900;
537     st.wMonth += 1;
538     if (!GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st,
539     NULL, buf, buflen))
540     return NULL;
541     return buf;
542     }
543 twoaday 121
544    
545 twoaday 175 /* Generate a temporary file name by using the users
546     temp path and optionally a name @name provided by the caller.
547     Return value: 0 on success. */
548     int
549     get_temp_name (char *buf, DWORD buflen, const char *name)
550     {
551     char tmp[32];
552    
553     if (!name) {
554     sprintf (tmp, "%08lX", GetTickCount ());
555     name = tmp;
556     }
557     if (!GetTempPath (buflen - strlen (name) -2, buf)) {
558     log_debug ("GetTempPath() failed ec=%d\n", (int)GetLastError ());
559     return -1;
560     }
561     strcat (buf, name);
562     return 0;
563     }
564    
565    
566 twoaday 129 struct reminder_hd_s {
567     int msecs;
568     HWND dlg;
569     HANDLE hd;
570     };
571 twoaday 121
572    
573 twoaday 129 static DWORD CALLBACK
574     foreground_reminder_thread (void *c)
575     {
576     struct reminder_hd_s *ctx = (struct reminder_hd_s *)c;
577     Sleep (ctx->msecs);
578     SetForegroundWindow (ctx->dlg);
579     CloseHandle (ctx->hd);
580     delete ctx;
581     ExitThread (0);
582 twoaday 121 return 0;
583 twoaday 129 }
584 twoaday 121
585 twoaday 129 /* Try to force the window @dlg to the foreground.
586     On NT5 or later this will not work if the user
587     is working in another window (console for example). */
588     void
589     force_foreground_window (HWND dlg, int msecs)
590     {
591     struct reminder_hd_s *hd;
592     DWORD tid;
593 twoaday 121
594 twoaday 129 hd = new reminder_hd_s;
595     hd->dlg = dlg;
596     hd->msecs = msecs;
597     hd->hd = CreateThread (NULL, 0, foreground_reminder_thread,
598     hd, NULL, &tid);
599     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26