Mercurial > pidgin
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); |