comparison src/win32/win32dep.c @ 10589:0f7452b1f777

[gaim-migrate @ 11994] Use GLib 2.6's gstdio functions. This should fix gaim not liking non-ascii filenames in win32. committer: Tailor Script <tailor@pidgin.im>
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 11 Feb 2005 05:10:40 +0000
parents 20e750dd21a0
children 179b0245a2f7
comparison
equal deleted inserted replaced
10588:529111933c9c 10589:0f7452b1f777
25 #include <windows.h> 25 #include <windows.h>
26 #include <io.h> 26 #include <io.h>
27 #include <stdlib.h> 27 #include <stdlib.h>
28 #include <stdio.h> 28 #include <stdio.h>
29 #include <winuser.h> 29 #include <winuser.h>
30 #include <shlobj.h>
30 31
31 #include <gtk/gtk.h> 32 #include <gtk/gtk.h>
32 #include <glib.h> 33 #include <glib.h>
34 #if GLIB_CHECK_VERSION(2,6,0)
35 # include <glib/gstdio.h>
36 #else
37 # define g_fopen fopen
38 # define g_unlink unlink
39 #endif
33 #include <gdk/gdkwin32.h> 40 #include <gdk/gdkwin32.h>
34 41
35 #include "gaim.h" 42 #include "gaim.h"
36 #include "debug.h" 43 #include "debug.h"
37 #include "notify.h" 44 #include "notify.h"
54 /* 61 /*
55 * DATA STRUCTS 62 * DATA STRUCTS
56 */ 63 */
57 64
58 /* For shfolder.dll */ 65 /* For shfolder.dll */
59 typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR); 66 typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHA)(HWND, int, HANDLE, DWORD, LPSTR);
67 typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHW)(HWND, int, HANDLE, DWORD, LPWSTR);
60 68
61 typedef enum { 69 typedef enum {
62 SHGFP_TYPE_CURRENT = 0, // current value for user, verify it exists 70 SHGFP_TYPE_CURRENT = 0, // current value for user, verify it exists
63 SHGFP_TYPE_DEFAULT = 1, // default value, may not exist 71 SHGFP_TYPE_DEFAULT = 1, // default value, may not exist
64 } SHGFP_TYPE; 72 } SHGFP_TYPE;
65
66 #define CSIDL_APPDATA 0x001a
67 #define CSIDL_FLAG_CREATE 0x8000
68 73
69 /* flash info */ 74 /* flash info */
70 typedef BOOL (CALLBACK* LPFNFLASHWINDOWEX)(PFLASHWINFO); 75 typedef BOOL (CALLBACK* LPFNFLASHWINDOWEX)(PFLASHWINFO);
71 76
72 struct _WGAIM_FLASH_INFO { 77 struct _WGAIM_FLASH_INFO {
76 typedef struct _WGAIM_FLASH_INFO WGAIM_FLASH_INFO; 81 typedef struct _WGAIM_FLASH_INFO WGAIM_FLASH_INFO;
77 82
78 /* 83 /*
79 * LOCALS 84 * LOCALS
80 */ 85 */
81 static char app_data_dir[MAX_PATH] = "C:"; 86 static char app_data_dir[MAX_PATH + 1] = "C:";
82 static char install_dir[MAXPATHLEN]; 87 static char install_dir[MAXPATHLEN];
83 static char lib_dir[MAXPATHLEN]; 88 static char lib_dir[MAXPATHLEN];
84 static char locale_dir[MAXPATHLEN]; 89 static char locale_dir[MAXPATHLEN];
85 static gboolean blink_turned_on = TRUE; 90 static gboolean blink_turned_on = TRUE;
86 91
92 97
93 /* 98 /*
94 * PROTOS 99 * PROTOS
95 */ 100 */
96 LPFNFLASHWINDOWEX MyFlashWindowEx = NULL; 101 LPFNFLASHWINDOWEX MyFlashWindowEx = NULL;
97 LPFNSHGETFOLDERPATH MySHGetFolderPath = NULL; 102 LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL;
103 LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL;
98 104
99 FARPROC wgaim_find_and_loadproc(char*, char*); 105 FARPROC wgaim_find_and_loadproc(char*, char*);
100 extern void wgaim_gtkspell_init(); 106 extern void wgaim_gtkspell_init();
101 char* wgaim_data_dir(void); 107 char* wgaim_data_dir(void);
102 108
140 static void load_winver_specific_procs(void) { 146 static void load_winver_specific_procs(void) {
141 /* Used for Win98+ and WinNT5+ */ 147 /* Used for Win98+ and WinNT5+ */
142 MyFlashWindowEx = (LPFNFLASHWINDOWEX)wgaim_find_and_loadproc("user32.dll", "FlashWindowEx" ); 148 MyFlashWindowEx = (LPFNFLASHWINDOWEX)wgaim_find_and_loadproc("user32.dll", "FlashWindowEx" );
143 } 149 }
144 150
145 #if 0
146 static char* base_name(char* path) {
147 char *tmp = path;
148 char *prev = NULL;
149
150 while((tmp=strchr(tmp, '\\'))) {
151 prev = tmp;
152 tmp += 1;
153 }
154 if(prev)
155 return ++prev;
156 else
157 return NULL;
158 }
159 #endif
160
161 BOOL folder_exists(char *folder) {
162 BOOL ret = FALSE;
163 WIN32_FIND_DATA fileinfo;
164 HANDLE fh;
165
166 memset(&fileinfo, 0, sizeof(WIN32_FIND_DATA));
167 if((fh=FindFirstFile(folder, &fileinfo))) {
168 if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
169 ret = TRUE;
170 SetLastError(ERROR_SUCCESS);
171 }
172 else
173 SetLastError(ERROR_FILE_EXISTS);
174 FindClose(fh);
175 }
176 return ret;
177 }
178
179 /* Recursively create directories in the dest path */
180 static BOOL CreateDirectoryR(char *dest) {
181 static BOOL start = TRUE;
182 BOOL ret = FALSE;
183
184 if(!dest)
185 return ret;
186
187 if(start) {
188 char *str = g_strdup(dest);
189 start = FALSE;
190 ret = CreateDirectoryR(str);
191 g_free(str);
192 start = TRUE;
193 }
194 else {
195 char *tmp1 = dest;
196 char *tmp=NULL;
197
198 while((tmp1=strchr(tmp1, '\\'))) {
199 tmp = tmp1;
200 tmp1+=1;
201 }
202
203 if(tmp) {
204 tmp[0] = '\0';
205 CreateDirectoryR(dest);
206 tmp[0] = '\\';
207 if(CreateDirectory(dest, NULL) == 0 && GetLastError() != ERROR_ALREADY_EXISTS) {
208 gaim_debug(GAIM_DEBUG_ERROR, "wgaim",
209 "Error creating directory: %s. Errno: %u\n",
210 dest, (UINT)GetLastError());
211 }
212 else
213 ret = TRUE;
214 }
215 }
216 return ret;
217 }
218
219 #if 0
220 static BOOL move_folder(char *src, char* dest, char* copytitle, BOOL overwrite) {
221 char *tsrc, *tdest;
222 SHFILEOPSTRUCT dirmove;
223 BOOL ret = FALSE;
224
225 g_return_val_if_fail(src!=NULL, ret);
226 g_return_val_if_fail(dest!=NULL, ret);
227
228 if(!folder_exists(src)) {
229 gaim_debug(GAIM_DEBUG_WARNING, "wgaim",
230 "move_folder: Source folder %s, does not exist\n", src);
231 return ret;
232 }
233 if(!overwrite) {
234 char *dstpath = g_strdup_printf("%s\\%s", dest, base_name(src));
235
236 if(folder_exists(dstpath)) {
237 gaim_debug(GAIM_DEBUG_WARNING, "wgaim",
238 "move_folder: Destination Folder %s, already exists\n", dstpath);
239 g_free(dstpath);
240 return ret;
241 }
242 g_free(dstpath);
243 }
244
245 /* Create dest folder if it doesn't exist */
246 if(!CreateDirectoryR(dest)) {
247 gaim_debug(GAIM_DEBUG_ERROR, "wgaim", "Error creating directory: %s\n", dest);
248 return ret;
249 }
250
251 tsrc = g_strdup_printf("%s%c", src, '\0');
252 tdest = g_strdup_printf("%s%c", dest, '\0');
253
254 memset(&dirmove, 0, sizeof(SHFILEOPSTRUCT));
255 dirmove.wFunc = FO_MOVE;
256 dirmove.pFrom = tsrc;
257 dirmove.pTo = tdest;
258 dirmove.fFlags = FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS;
259 dirmove.hNameMappings = 0;
260 dirmove.lpszProgressTitle = copytitle;
261
262 if(SHFileOperation(&dirmove)==0)
263 ret = TRUE;
264
265 g_free(tsrc);
266 g_free(tdest);
267 return ret;
268 }
269 #endif
270
271 static void wgaim_debug_print(GaimDebugLevel level, const char *category, const char *format, va_list args) { 151 static void wgaim_debug_print(GaimDebugLevel level, const char *category, const char *format, va_list args) {
272 char *str = g_strdup_vprintf(format, args); 152 char *str = NULL;
273 printf("%s%s%s", category?category:"", category?": ":"",str); 153 if (args != NULL) {
274 g_free(str); 154 str = g_strdup_vprintf(format, args);
155 } else {
156 str = g_strdup(format);
157 }
158 printf("%s%s%s", category?category:"", category?": ":"",str);
159 g_free(str);
275 } 160 }
276 161
277 static GaimDebugUiOps ops = { 162 static GaimDebugUiOps ops = {
278 wgaim_debug_print 163 wgaim_debug_print
279 }; 164 };
446 FILE *fout; 331 FILE *fout;
447 char buf[1024]; 332 char buf[1024];
448 int ret; 333 int ret;
449 334
450 if((fin = gzopen(in, "rb"))) { 335 if((fin = gzopen(in, "rb"))) {
451 if(!(fout = fopen(out, "wb"))) { 336 if(!(fout = g_fopen(out, "wb"))) {
452 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "Error opening file: %s\n", out); 337 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "Error opening file: %s\n", out);
453 gzclose(fin); 338 gzclose(fin);
454 return 0; 339 return 0;
455 } 340 }
456 } 341 }
489 ret=1; 374 ret=1;
490 else { 375 else {
491 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failure untaring %s\n", tmpfile); 376 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failure untaring %s\n", tmpfile);
492 ret=0; 377 ret=0;
493 } 378 }
494 unlink(tmpfile); 379 g_unlink(tmpfile);
495 return ret; 380 return ret;
496 } 381 }
497 else { 382 else {
498 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failed to gz decompress %s\n", filename); 383 gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failed to gz decompress %s\n", filename);
499 return 0; 384 return 0;
567 g_free(newenv); 452 g_free(newenv);
568 453
569 /* Set app data dir, used by gaim_home_dir */ 454 /* Set app data dir, used by gaim_home_dir */
570 newenv = (char*)g_getenv("GAIMHOME"); 455 newenv = (char*)g_getenv("GAIMHOME");
571 if(!newenv) { 456 if(!newenv) {
572 if((MySHGetFolderPath = (LPFNSHGETFOLDERPATH)wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"))) { 457 #if GLIB_CHECK_VERSION(2,6,0)
573 MySHGetFolderPath(NULL, 458 if ((MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathW"))) {
574 CSIDL_APPDATA, 459 wchar_t utf_16_dir[MAX_PATH +1];
575 NULL, SHGFP_TYPE_CURRENT, app_data_dir); 460 char *temp;
576 } 461 MySHGetFolderPathW(NULL, CSIDL_APPDATA, NULL,
577 else 462 SHGFP_TYPE_CURRENT, utf_16_dir);
578 strcpy(app_data_dir, "C:"); 463 temp = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL);
464 g_strlcpy(app_data_dir, temp, sizeof(app_data_dir));
465 g_free(temp);
466 } else if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"))) {
467 char locale_dir[MAX_PATH + 1];
468 char *temp;
469 MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL,
470 SHGFP_TYPE_CURRENT, locale_dir);
471 temp = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL);
472 g_strlcpy(app_data_dir, temp, sizeof(app_data_dir));
473 g_free(temp);
474 }
475 #else
476 if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"))) {
477 MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL,
478 SHGFP_TYPE_CURRENT, app_data_dir);
479 }
480 #endif
481 else {
482 strcpy(app_data_dir, "C:");
483 }
579 } 484 }
580 else { 485 else {
581 g_strlcpy(app_data_dir, newenv, sizeof(app_data_dir)); 486 g_strlcpy(app_data_dir, newenv, sizeof(app_data_dir));
582 } 487 }
583 gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Gaim settings dir: %s\n", app_data_dir); 488 gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Gaim settings dir: %s\n", app_data_dir);