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

Annotation of /trunk/Src/wptW32API.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 137 - (hide annotations)
Mon Jan 9 14:01:51 2006 UTC (19 years, 1 month ago) by twoaday
File size: 12988 byte(s)
2006-01-09  Timo Schulz  <ts@g10code.com>
 
        * WinPT.cpp (load_gettext): Remove file locking.
        (WinMain): Use pre-defined autoconf constants.
        * wptW32API.cpp (init_file_lock, release_file_lock): Deleted.
        * wptGPG.cpp (check_gnupg_engine): Add param @need_gpg_ver.
        Change all callers.

Remove all static version constants. The only place for
constants is now configure.c (config.h).


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     filter = _("All Files (*.*)\0*.*\0\0");
123     /* 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 121 /* return 0 if the file @fname exists, otherwise >0. */
313 werner 36 int
314 twoaday 121 file_exist_check (const char *fname)
315 werner 36 {
316     struct stat st;
317     if (stat (fname, &st) == -1)
318     return WPTERR_FILE_EXIST;
319     return 0;
320     }
321    
322    
323     /* Check if the current folder exists.
324     Return 0 for success. */
325     int
326     dir_exist_check (const char *dir)
327     {
328     struct stat statbuf;
329    
330 twoaday 105 if (stat (dir, &statbuf) == -1)
331 werner 36 return WPTERR_GENERAL;
332 twoaday 105 if (statbuf.st_mode & _S_IFDIR)
333 werner 36 return 0;
334     return WPTERR_GENERAL;
335     }
336    
337    
338 twoaday 77 /* Return the file size of the given file @fname. */
339     DWORD
340 werner 36 get_file_size (const char *fname)
341     {
342 twoaday 77 DWORD fsize;
343 werner 36 HANDLE fh;
344    
345 twoaday 77 fh = CreateFile (fname, GENERIC_READ, FILE_SHARE_READ,
346     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
347     if (fh == INVALID_HANDLE_VALUE)
348 werner 36 return 0;
349 twoaday 77 fsize = GetFileSize (fh, NULL);
350     if (fsize == 0xFFFFFFFF)
351 werner 36 fsize = 0;
352 twoaday 77 CloseHandle (fh);
353 werner 36 return fsize;
354 twoaday 77 }
355 werner 36
356    
357     /* Start a dialog with the exception that before it is checked that the
358     dialog is not already openened. */
359     int
360 twoaday 105 dialog_box_param (HINSTANCE hinst, LPCTSTR name, HWND parent, DLGPROC fnc,
361     LPARAM param, LPCTSTR title, int title_id)
362 werner 36 {
363 twoaday 105 if (FindWindowEx (GetDesktopWindow (), NULL, NULL, title))
364 werner 36 return -1;
365 twoaday 105 return DialogBoxParam (hinst, name, parent, fnc, param);
366     }
367 werner 36
368    
369     /* Wrapper for message box which forces the message box into the
370     foreground and it is displayed always on top. */
371     int
372     msg_box (HWND hwnd, const char *text, const char *title, int mode)
373     {
374     mode |= MB_SETFOREGROUND;
375     mode |= MB_TASKMODAL;
376     mode |= MB_TOPMOST;
377     return MessageBox(hwnd, text, title, mode);
378     }
379    
380    
381 twoaday 121 /* Safe strdup version (C++ version). */
382 werner 36 char*
383     m_strdup (const char *str)
384     {
385 twoaday 121 char *p = new char[strlen (str) + 1];
386     if (!p)
387     BUG (NULL);
388     strcpy (p, str);
389 werner 36 return p;
390 twoaday 121 }
391 werner 36
392    
393     /* Center the hwndChild relative to parent.
394     The style param allows to specificy additional styles (like topmost). */
395     void
396     center_window2 (HWND hwndChild, HWND parent, HWND style)
397     {
398     HWND hwndParent;
399     RECT rChild, rParent;
400     HDC hdc;
401     int wChild, hChild, wParent, hParent;
402     int wScreen, hScreen, xNew, yNew;
403     int flags = SWP_NOSIZE | SWP_NOZORDER;
404    
405     hwndParent = parent;
406     if (hwndParent == NULL)
407     hwndParent = GetDesktopWindow ();
408     GetWindowRect (hwndChild, &rChild);
409     wChild = rChild.right - rChild.left;
410     hChild = rChild.bottom - rChild.top;
411    
412     GetWindowRect (hwndParent, &rParent);
413     wParent = rParent.right - rParent.left;
414     hParent = rParent.bottom - rParent.top;
415    
416     hdc = GetDC (hwndChild);
417     wScreen = GetDeviceCaps (hdc, HORZRES);
418     hScreen = GetDeviceCaps (hdc, VERTRES);
419     ReleaseDC (hwndChild, hdc);
420     xNew = rParent.left + ((wParent - wChild) /2);
421     if (xNew < 0)
422     xNew = 0;
423     else if ((xNew+wChild) > wScreen)
424     xNew = wScreen - wChild;
425     yNew = rParent.top + ((hParent - hChild) /2);
426     if (yNew < 0)
427     yNew = 0;
428     else if ((yNew+hChild) > hScreen)
429     yNew = hScreen - hChild;
430     if (style == HWND_TOPMOST || style == HWND_NOTOPMOST)
431     flags = SWP_NOMOVE | SWP_NOSIZE;
432     SetWindowPos (hwndChild, style? style : NULL, xNew, yNew, 0, 0, flags);
433     }
434    
435    
436     /* Center the given hwndChild window with no special style. */
437     void
438     center_window (HWND hwndChild, HWND hwndParent)
439     {
440     center_window2 (hwndChild, hwndParent, NULL);
441     }
442 twoaday 121
443    
444     /* Retrieve the product verion of the given file @fname.
445     Format: MAJOR.MINOR.PATCH1.PATCH2
446     Return value: 0 on success. */
447     int
448     get_file_version (const char *fname, WORD *major, WORD *minor,
449     WORD *patch1, WORD *patch2)
450     {
451     VS_FIXEDFILEINFO *inf = {0};
452     char file[MAX_PATH+1] = {0};
453     LPVOID buf, data;
454     DWORD arg;
455     DWORD size;
456     UINT qlen;
457    
458     strncpy (file, fname, MAX_PATH);
459     size = GetFileVersionInfoSize (file, &arg);
460     if (!size)
461     return -1;
462     buf = (LPVOID)new CHAR[size];
463     if (!buf)
464     BUG (NULL);
465     GetFileVersionInfo (file, 0, size, buf);
466    
467     qlen=0;
468     VerQueryValue (buf, "\\", &data, &qlen);
469     if (!qlen) {
470     delete [] (char*)buf;
471     return -1;
472     }
473     inf = (VS_FIXEDFILEINFO*)data;
474    
475     if (major)
476     *major = HIWORD (inf->dwProductVersionMS);
477     if (minor)
478     *minor = LOWORD (inf->dwProductVersionMS);
479     if (patch1)
480     *patch1 = HIWORD (inf->dwProductVersionLS);
481     if (patch2)
482     *patch2 = LOWORD (inf->dwProductVersionLS);
483    
484     delete [] (char*)buf;
485     return 0;
486     }
487    
488    
489 twoaday 129 /* Return date in a format which complies with the
490     system locale settings. */
491     const char*
492     get_locale_date (long tm_t, char *buf, DWORD buflen)
493     {
494     SYSTEMTIME st;
495     struct tm *ptm;
496 twoaday 121
497 twoaday 129 ptm = localtime (&tm_t);
498     st.wYear = (WORD)ptm->tm_year;
499     st.wMonth = (WORD)ptm->tm_mon;
500     st.wDay = (WORD)ptm->tm_mday;
501     st.wYear += 1900;
502     st.wMonth += 1;
503     if (!GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st,
504     NULL, buf, buflen))
505     return NULL;
506     return buf;
507     }
508 twoaday 121
509    
510 twoaday 129 struct reminder_hd_s {
511     int msecs;
512     HWND dlg;
513     HANDLE hd;
514     };
515 twoaday 121
516    
517 twoaday 129 static DWORD CALLBACK
518     foreground_reminder_thread (void *c)
519     {
520     struct reminder_hd_s *ctx = (struct reminder_hd_s *)c;
521     Sleep (ctx->msecs);
522     SetForegroundWindow (ctx->dlg);
523     CloseHandle (ctx->hd);
524     delete ctx;
525     ExitThread (0);
526 twoaday 121 return 0;
527 twoaday 129 }
528 twoaday 121
529 twoaday 129 /* Try to force the window @dlg to the foreground.
530     On NT5 or later this will not work if the user
531     is working in another window (console for example). */
532     void
533     force_foreground_window (HWND dlg, int msecs)
534     {
535     struct reminder_hd_s *hd;
536     DWORD tid;
537 twoaday 121
538 twoaday 129 hd = new reminder_hd_s;
539     hd->dlg = dlg;
540     hd->msecs = msecs;
541     hd->hd = CreateThread (NULL, 0, foreground_reminder_thread,
542     hd, NULL, &tid);
543     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26