Sat, 18 Nov 2006 05:30:57 +0000
[gaim-migrate @ 17774]
The data for "plugin_action" is set with a destructor function. So freeing it
twice would cause a crash. The reason it's not crashing is, the children of the
container are not the menuitems, but GtkAccelLabel (or some such thing). So all
we are doing is freeing null. Also, when the menu is destroyed, all the
menuitems are also destroyed anyway. So get rid of the unrequired loop.
Also, isdigit expects a character, not a string.
| 14286 | 1 | /* |
| 2 | * win_gaim.c | |
| 3 | * | |
| 4 | * Date: June, 2002 | |
| 5 | * Description: Entry point for win32 gaim, and various win32 dependant | |
| 6 | * routines. | |
| 7 | * | |
| 8 | * Gaim is the legal property of its developers, whose names are too numerous | |
| 9 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 10 | * source distribution. | |
| 11 | * | |
| 12 | * This program is free software; you can redistribute it and/or modify | |
| 13 | * it under the terms of the GNU General Public License as published by | |
| 14 | * the Free Software Foundation; either version 2 of the License, or | |
| 15 | * (at your option) any later version. | |
| 16 | * | |
| 17 | * This program is distributed in the hope that it will be useful, | |
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 20 | * GNU General Public License for more details. | |
| 21 | * | |
| 22 | * You should have received a copy of the GNU General Public License | |
| 23 | * along with this program; if not, write to the Free Software | |
| 24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 25 | * | |
| 26 | */ | |
| 27 | ||
| 28 | /* This is for ATTACH_PARENT_PROCESS */ | |
| 29 | #ifndef _WIN32_WINNT | |
| 30 | #define _WIN32_WINNT 0x501 | |
| 31 | #endif | |
| 32 | #include <windows.h> | |
| 33 | #include <fcntl.h> | |
| 34 | #include <stdlib.h> | |
| 35 | #include <string.h> | |
| 36 | #include <stdio.h> | |
| 37 | ||
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
38 | /* These will hopefully be in the win32api next time it is updated - at which point, we'll remove them */ |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
39 | #ifndef LANG_PERSIAN |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
40 | #define LANG_PERSIAN 0x29 |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
41 | #endif |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
42 | #ifndef LANG_BOSNIAN |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
43 | #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
44 | #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
45 | #endif |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
46 | #ifndef SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
47 | #define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
48 | #endif |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
49 | #ifndef LANG_XHOSA |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
50 | #define LANG_XHOSA 0x34 |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
51 | #endif |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
52 | |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
53 | |
| 14286 | 54 | typedef int (CALLBACK* LPFNGAIMMAIN)(HINSTANCE, int, char**); |
| 55 | typedef void (CALLBACK* LPFNSETDLLDIRECTORY)(LPCTSTR); | |
| 56 | typedef BOOL (CALLBACK* LPFNATTACHCONSOLE)(DWORD); | |
| 57 | ||
| 58 | /* | |
| 59 | * PROTOTYPES | |
| 60 | */ | |
| 61 | static LPFNGAIMMAIN gaim_main = NULL; | |
| 62 | static LPFNSETDLLDIRECTORY MySetDllDirectory = NULL; | |
| 63 | ||
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
64 | static const char *get_win32_error_message(DWORD err) { |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
65 | static char err_msg[512]; |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
66 | |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
67 | FormatMessage( |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
68 | FORMAT_MESSAGE_FROM_SYSTEM, |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
69 | NULL, err, |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
70 | MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
71 | (LPTSTR) &err_msg, sizeof(err_msg), NULL); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
72 | |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
73 | return err_msg; |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
74 | } |
| 14286 | 75 | |
| 76 | static BOOL read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) { | |
| 77 | HKEY hkey; | |
| 78 | BOOL ret = FALSE; | |
| 79 | LONG retv; | |
| 80 | ||
| 81 | if (ERROR_SUCCESS == (retv = RegOpenKeyEx(key, sub_key, 0, | |
| 82 | KEY_QUERY_VALUE, &hkey))) { | |
| 83 | if (ERROR_SUCCESS == (retv = RegQueryValueEx(hkey, val_name, | |
| 84 | NULL, NULL, data, data_len))) | |
| 85 | ret = TRUE; | |
| 86 | else { | |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
87 | const char *err_msg = get_win32_error_message(retv); |
| 14286 | 88 | |
|
14810
7ee46e25e9d8
[gaim-migrate @ 17505]
Daniel Atallah <datallah@pidgin.im>
parents:
14657
diff
changeset
|
89 | printf("Could not read reg key '%s' subkey '%s' value: '%s'.\nMessage: (%ld) %s\n", |
| 14286 | 90 | ((key == HKEY_LOCAL_MACHINE) ? "HKLM" : |
| 91 | (key == HKEY_CURRENT_USER) ? "HKCU" : | |
| 92 | "???"), | |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
93 | sub_key, val_name, retv, err_msg); |
| 14286 | 94 | } |
| 95 | RegCloseKey(hkey); | |
| 96 | } | |
| 97 | else { | |
| 98 | TCHAR szBuf[80]; | |
| 99 | ||
| 100 | FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, retv, 0, | |
| 101 | (LPTSTR) &szBuf, sizeof(szBuf), NULL); | |
| 102 | printf("Could not open reg subkey: %s\nError: (%ld) %s\n", | |
| 103 | sub_key, retv, szBuf); | |
| 104 | } | |
| 105 | ||
| 106 | return ret; | |
| 107 | } | |
| 108 | ||
| 109 | static void dll_prep() { | |
| 110 | char path[MAX_PATH + 1]; | |
| 111 | HMODULE hmod; | |
| 112 | HKEY hkey; | |
| 113 | #ifdef PORTABLE | |
| 114 | /* We assume that GTK+ is installed under \\path\to\Gaim\..\GTK | |
| 115 | * First we find \\path\to | |
| 116 | */ | |
| 117 | if (GetModuleFileName(NULL, path, MAX_PATH) != 0) { | |
| 118 | char *tmp = path; | |
| 119 | char *prev = NULL; | |
| 120 | char *prev2 = NULL; | |
| 121 | ||
| 122 | while ((tmp = strchr(tmp, '\\'))) { | |
| 123 | prev2 = prev; | |
| 124 | prev = tmp; | |
| 125 | tmp++; | |
| 126 | } | |
| 127 | ||
| 128 | if (prev2) { | |
| 129 | prev2[0] = '\0'; | |
| 130 | } | |
| 131 | } else { | |
| 132 | printf("Unable to determine current executable path. \n" | |
| 133 | "This will prevent the settings dir from being set.\n" | |
| 134 | "Assuming GTK+ is in the PATH.\n"); | |
| 135 | } | |
| 136 | ||
| 137 | if (path) { | |
| 138 | /* Set up the settings dir base to be \\path\to | |
| 139 | * The actual settings dir will be \\path\to\.gaim */ | |
| 140 | char settingsdir[strlen(path) + strlen("GAIMHOME=") + 1]; | |
| 141 | char aspelldir[strlen(path) + strlen("GAIM_ASPELL_DIR=\\Aspell\\bin") + 1]; | |
| 142 | ||
| 143 | snprintf(settingsdir, sizeof(settingsdir), "GAIMHOME=%s", path); | |
| 144 | printf("Setting settings dir: %s\n", settingsdir); | |
| 145 | putenv(settingsdir); | |
| 146 | ||
| 147 | snprintf(aspelldir, sizeof(aspelldir), "GAIM_ASPELL_DIR=%s\\Aspell\\bin", path); | |
| 148 | printf(aspelldir); | |
| 149 | putenv(aspelldir); | |
| 150 | ||
| 151 | /* set the GTK+ path to be \\path\to\GTK\bin */ | |
| 152 | strcat(path, "\\GTK\\bin"); | |
| 153 | } else | |
| 154 | return; | |
| 155 | #else /* PORTABLE */ | |
| 156 | char gtkpath[MAX_PATH + 1]; | |
| 157 | DWORD plen; | |
| 158 | ||
| 159 | plen = sizeof(gtkpath); | |
| 160 | hkey = HKEY_CURRENT_USER; | |
| 161 | if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path", | |
| 162 | (LPBYTE) >kpath, &plen)) { | |
| 163 | hkey = HKEY_LOCAL_MACHINE; | |
| 164 | if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path", | |
| 165 | (LPBYTE) >kpath, &plen)) { | |
| 166 | printf("GTK+ Path Registry Key not found. " | |
| 167 | "Assuming GTK+ is in the PATH.\n"); | |
| 168 | return; | |
| 169 | } | |
| 170 | } | |
| 171 | ||
| 172 | /* this value is replaced during a successful RegQueryValueEx() */ | |
| 173 | plen = sizeof(path); | |
| 174 | /* Determine GTK+ dll path .. */ | |
| 175 | if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "DllPath", | |
| 176 | (LPBYTE) &path, &plen)) { | |
| 177 | strcpy(path, gtkpath); | |
| 178 | strcat(path, "\\bin"); | |
| 179 | } | |
| 180 | #endif | |
| 181 | printf("GTK+ path found: %s\n", path); | |
| 182 | ||
| 183 | if ((hmod = GetModuleHandle("kernel32.dll"))) { | |
| 184 | MySetDllDirectory = (LPFNSETDLLDIRECTORY) GetProcAddress( | |
| 185 | hmod, "SetDllDirectoryA"); | |
| 186 | if (!MySetDllDirectory) | |
| 187 | printf("SetDllDirectory not supported\n"); | |
| 188 | } else | |
| 189 | printf("Error getting kernel32.dll module handle\n"); | |
| 190 | ||
| 191 | /* For Windows XP SP1+ / Server 2003 we use SetDllDirectory to avoid dll hell */ | |
| 192 | if (MySetDllDirectory) { | |
| 193 | printf("Using SetDllDirectory\n"); | |
| 194 | MySetDllDirectory(path); | |
| 195 | } | |
| 196 | ||
| 197 | /* For the rest, we set the current directory and make sure | |
| 198 | * SafeDllSearch is set to 0 where needed. */ | |
| 199 | else { | |
| 200 | OSVERSIONINFO osinfo; | |
| 201 | ||
| 202 | printf("Setting current directory to GTK+ dll directory\n"); | |
| 203 | SetCurrentDirectory(path); | |
| 204 | /* For Windows 2000 (SP3+) / WinXP (No SP): | |
| 205 | * If SafeDllSearchMode is set to 1, Windows system directories are | |
| 206 | * searched for dlls before the current directory. Therefore we set it | |
| 207 | * to 0. | |
| 208 | */ | |
| 209 | osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | |
| 210 | GetVersionEx(&osinfo); | |
| 211 | if ((osinfo.dwMajorVersion == 5 && | |
| 212 | osinfo.dwMinorVersion == 0 && | |
| 213 | strcmp(osinfo.szCSDVersion, "Service Pack 3") >= 0) || | |
| 214 | (osinfo.dwMajorVersion == 5 && | |
| 215 | osinfo.dwMinorVersion == 1 && | |
| 216 | strcmp(osinfo.szCSDVersion, "") >= 0) | |
| 217 | ) { | |
| 218 | DWORD regval = 1; | |
| 219 | DWORD reglen = sizeof(DWORD); | |
| 220 | ||
| 221 | printf("Using Win2k (SP3+) / WinXP (No SP)... Checking SafeDllSearch\n"); | |
| 222 | read_reg_string(HKEY_LOCAL_MACHINE, | |
| 223 | "System\\CurrentControlSet\\Control\\Session Manager", | |
| 224 | "SafeDllSearchMode", | |
| 225 | (LPBYTE) ®val, | |
| 226 | ®len); | |
| 227 | ||
| 228 | if (regval != 0) { | |
| 229 | printf("Trying to set SafeDllSearchMode to 0\n"); | |
| 230 | regval = 0; | |
| 231 | if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, | |
|
14657
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
232 | "System\\CurrentControlSet\\Control\\Session Manager", |
| 14286 | 233 | 0, KEY_SET_VALUE, &hkey |
| 234 | ) == ERROR_SUCCESS) { | |
| 235 | if (RegSetValueEx(hkey, | |
| 236 | "SafeDllSearchMode", 0, | |
| 237 | REG_DWORD, (LPBYTE) ®val, | |
| 238 | sizeof(DWORD) | |
| 239 | ) != ERROR_SUCCESS) | |
| 240 | printf("Error writing SafeDllSearchMode. Error: %u\n", | |
| 241 | (UINT) GetLastError()); | |
| 242 | RegCloseKey(hkey); | |
| 243 | } else | |
| 244 | printf("Error opening Session Manager key for writing. Error: %u\n", | |
| 245 | (UINT) GetLastError()); | |
| 246 | } else | |
| 247 | printf("SafeDllSearchMode is set to 0\n"); | |
| 248 | }/*end else*/ | |
| 249 | } | |
| 250 | } | |
| 251 | ||
| 252 | static char* wgaim_lcid_to_posix(LCID lcid) { | |
| 253 | char *posix = NULL; | |
| 254 | int lang_id = PRIMARYLANGID(lcid); | |
| 255 | int sub_id = SUBLANGID(lcid); | |
| 256 | ||
| 257 | switch (lang_id) { | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
258 | case LANG_ARABIC: posix = "ar"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
259 | case LANG_AZERI: posix = "az"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
260 | case LANG_BENGALI: posix = "bn"; break; |
| 14286 | 261 | case LANG_BULGARIAN: posix = "bg"; break; |
| 262 | case LANG_CATALAN: posix = "ca"; break; | |
| 263 | case LANG_CHINESE: | |
| 264 | switch (sub_id) { | |
| 265 | case SUBLANG_CHINESE_SIMPLIFIED: | |
| 266 | posix = "zh_CN"; break; | |
| 267 | case SUBLANG_CHINESE_TRADITIONAL: | |
| 268 | posix = "zh_TW"; break; | |
| 269 | default: | |
| 270 | posix = "zh"; break; | |
| 271 | } | |
| 272 | break; | |
| 273 | case LANG_CZECH: posix = "cs"; break; | |
| 274 | case LANG_DANISH: posix = "da"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
275 | case LANG_ESTONIAN: posix = "et"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
276 | case LANG_PERSIAN: posix = "fa"; break; |
| 14286 | 277 | case LANG_GERMAN: posix = "de"; break; |
| 278 | case LANG_GREEK: posix = "el"; break; | |
| 279 | case LANG_ENGLISH: | |
| 280 | switch (sub_id) { | |
| 281 | case SUBLANG_ENGLISH_UK: | |
| 282 | posix = "en_GB"; break; | |
| 283 | case SUBLANG_ENGLISH_AUS: | |
| 284 | posix = "en_AU"; break; | |
| 285 | case SUBLANG_ENGLISH_CAN: | |
| 286 | posix = "en_CA"; break; | |
| 287 | default: | |
| 288 | posix = "en"; break; | |
| 289 | } | |
| 290 | break; | |
| 291 | case LANG_SPANISH: posix = "es"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
292 | case LANG_BASQUE: posix = "eu"; break; |
| 14286 | 293 | case LANG_FINNISH: posix = "fi"; break; |
| 294 | case LANG_FRENCH: posix = "fr"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
295 | case LANG_GALICIAN: posix = "gl"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
296 | case LANG_GUJARATI: posix = "gu"; break; |
| 14286 | 297 | case LANG_HEBREW: posix = "he"; break; |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
298 | case LANG_HINDI: posix = "hi"; break; |
| 14286 | 299 | case LANG_HUNGARIAN: posix = "hu"; break; |
| 300 | case LANG_ICELANDIC: break; | |
| 301 | case LANG_ITALIAN: posix = "it"; break; | |
| 302 | case LANG_JAPANESE: posix = "ja"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
303 | case LANG_GEORGIAN: posix = "ka"; break; |
| 14286 | 304 | case LANG_KOREAN: posix = "ko"; break; |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
305 | case LANG_LITHUANIAN: posix = "lt"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
306 | case LANG_MACEDONIAN: posix = "mk"; break; |
| 14286 | 307 | case LANG_DUTCH: posix = "nl"; break; |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
308 | case LANG_NEPALI: posix = "ne"; break; |
| 14286 | 309 | case LANG_NORWEGIAN: |
| 310 | switch (sub_id) { | |
| 311 | case SUBLANG_NORWEGIAN_BOKMAL: | |
| 312 | posix = "nb"; break; | |
| 313 | case SUBLANG_NORWEGIAN_NYNORSK: | |
| 314 | posix = "nn"; break; | |
| 315 | } | |
| 316 | break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
317 | case LANG_PUNJABI: posix = "pa"; break; |
| 14286 | 318 | case LANG_POLISH: posix = "pl"; break; |
| 319 | case LANG_PORTUGUESE: | |
| 320 | switch (sub_id) { | |
| 321 | case SUBLANG_PORTUGUESE_BRAZILIAN: | |
| 322 | posix = "pt_BR"; break; | |
| 323 | default: | |
| 324 | posix = "pt"; break; | |
| 325 | } | |
| 326 | break; | |
| 327 | case LANG_ROMANIAN: posix = "ro"; break; | |
| 328 | case LANG_RUSSIAN: posix = "ru"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
329 | /* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN */ |
| 14286 | 330 | case LANG_SERBIAN: |
| 331 | switch (sub_id) { | |
| 332 | case SUBLANG_SERBIAN_LATIN: | |
| 333 | posix = "sr@Latn"; break; | |
| 334 | case SUBLANG_SERBIAN_CYRILLIC: | |
| 335 | posix = "sr"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
336 | case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC: |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
337 | case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN: |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
338 | posix = "bs"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
339 | case SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN: |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
340 | posix = "hr"; break; |
| 14286 | 341 | } |
| 342 | break; | |
| 343 | case LANG_SLOVAK: posix = "sk"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
344 | case LANG_SLOVENIAN: posix = "sl"; break; |
| 14286 | 345 | case LANG_ALBANIAN: posix = "sq"; break; |
| 346 | case LANG_SWEDISH: posix = "sv"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
347 | case LANG_TAMIL: posix = "ta"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
348 | case LANG_TELUGU: posix = "te"; break; |
| 14286 | 349 | case LANG_THAI: posix = "th"; break; |
| 350 | case LANG_TURKISH: posix = "tr"; break; | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
351 | case LANG_UKRAINIAN: posix = "uk"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
352 | case LANG_VIETNAMESE: posix = "vi"; break; |
|
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
353 | case LANG_XHOSA: posix = "xh"; break; |
| 14286 | 354 | case LANG_URDU: break; |
| 355 | case LANG_INDONESIAN: break; | |
| 356 | case LANG_BELARUSIAN: break; | |
| 357 | case LANG_LATVIAN: break; | |
| 358 | case LANG_ARMENIAN: break; | |
| 359 | case LANG_AFRIKAANS: break; | |
| 360 | case LANG_FAEROESE: break; | |
| 361 | case LANG_MALAY: break; | |
| 362 | case LANG_KAZAK: break; | |
| 363 | case LANG_KYRGYZ: break; | |
| 364 | case LANG_SWAHILI: break; | |
| 365 | case LANG_UZBEK: break; | |
| 366 | case LANG_TATAR: break; | |
| 367 | case LANG_ORIYA: break; | |
| 368 | case LANG_KANNADA: break; | |
| 369 | case LANG_MALAYALAM: break; | |
| 370 | case LANG_ASSAMESE: break; | |
| 371 | case LANG_MARATHI: break; | |
| 372 | case LANG_SANSKRIT: break; | |
| 373 | case LANG_MONGOLIAN: break; | |
| 374 | case LANG_KONKANI: break; | |
| 375 | case LANG_MANIPURI: break; | |
| 376 | case LANG_SINDHI: break; | |
| 377 | case LANG_SYRIAC: break; | |
| 378 | case LANG_KASHMIRI: break; | |
| 379 | case LANG_DIVEHI: break; | |
| 380 | } | |
| 381 | ||
| 382 | /* Deal with exceptions */ | |
| 383 | if (posix == NULL) { | |
| 384 | switch (lcid) { | |
|
14596
4d361c1416ca
[gaim-migrate @ 17255]
Daniel Atallah <datallah@pidgin.im>
parents:
14319
diff
changeset
|
385 | case 0x0455: posix = "my_MM"; break; /* Myanmar (Burmese) */ |
| 14286 | 386 | case 9999: posix = "ku"; break; /* Kurdish (from NSIS) */ |
| 387 | } | |
| 388 | } | |
| 389 | ||
| 390 | return posix; | |
| 391 | } | |
| 392 | ||
| 393 | /* Determine and set Gaim locale as follows (in order of priority): | |
| 394 | - Check GAIMLANG env var | |
| 395 | - Check NSIS Installer Language reg value | |
| 396 | - Use default user locale | |
| 397 | */ | |
| 398 | static const char *wgaim_get_locale() { | |
| 399 | const char *locale = NULL; | |
| 400 | LCID lcid; | |
| 401 | #ifndef PORTABLE | |
| 402 | char data[10]; | |
| 403 | DWORD datalen = 10; | |
| 404 | #endif | |
| 405 | ||
| 406 | /* Check if user set GAIMLANG env var */ | |
| 407 | if ((locale = getenv("GAIMLANG"))) | |
| 408 | return locale; | |
| 409 | ||
| 410 | #ifndef PORTABLE | |
| 411 | if (read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\gaim", | |
| 412 | "Installer Language", (LPBYTE) &data, &datalen)) { | |
| 413 | if ((locale = wgaim_lcid_to_posix(atoi(data)))) | |
| 414 | return locale; | |
| 415 | } | |
| 416 | #endif | |
| 417 | ||
| 418 | lcid = GetUserDefaultLCID(); | |
| 419 | if ((locale = wgaim_lcid_to_posix(lcid))) | |
| 420 | return locale; | |
| 421 | ||
| 422 | return "en"; | |
| 423 | } | |
| 424 | ||
| 425 | static void wgaim_set_locale() { | |
| 426 | const char *locale = NULL; | |
| 427 | char envstr[25]; | |
| 428 | ||
| 429 | locale = wgaim_get_locale(); | |
| 430 | ||
| 431 | snprintf(envstr, 25, "LANG=%s", locale); | |
| 432 | printf("Setting locale: %s\n", envstr); | |
| 433 | putenv(envstr); | |
| 434 | } | |
| 435 | ||
|
14319
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
436 | #define WM_FOCUS_REQUEST (WM_APP + 13) |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
437 | |
| 14286 | 438 | static BOOL wgaim_set_running() { |
| 439 | HANDLE h; | |
| 440 | ||
| 441 | if ((h = CreateMutex(NULL, FALSE, "gaim_is_running"))) { | |
| 442 | if (GetLastError() == ERROR_ALREADY_EXISTS) { | |
|
14319
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
443 | HWND msg_win; |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
444 | |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
445 | if((msg_win = FindWindow(TEXT("WingaimMsgWinCls"), NULL))) |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
446 | if(SendMessage(msg_win, WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL)) |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
447 | return FALSE; |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
448 | |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
449 | /* If we get here, the focus request wasn't successful */ |
|
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
450 | |
| 14286 | 451 | MessageBox(NULL, |
| 452 | "An instance of Gaim is already running", | |
| 453 | NULL, MB_OK | MB_TOPMOST); | |
|
14319
b9a35c4948dc
[gaim-migrate @ 16939]
Daniel Atallah <datallah@pidgin.im>
parents:
14286
diff
changeset
|
454 | |
| 14286 | 455 | return FALSE; |
| 456 | } | |
| 457 | } | |
| 458 | return TRUE; | |
| 459 | } | |
| 460 | ||
| 461 | ||
| 462 | #ifdef __GNUC__ | |
| 463 | # ifndef _stdcall | |
| 464 | # define _stdcall __attribute__((stdcall)) | |
| 465 | # endif | |
| 466 | #endif | |
| 467 | ||
| 468 | int _stdcall | |
| 469 | WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance, | |
| 470 | char *lpszCmdLine, int nCmdShow) { | |
| 471 | char errbuf[512]; | |
| 472 | char gaimdir[MAX_PATH]; | |
| 473 | HMODULE hmod; | |
| 474 | ||
| 475 | /* If debug or help or version flag used, create console for output */ | |
| 476 | if (strstr(lpszCmdLine, "-d") || strstr(lpszCmdLine, "-h") || strstr(lpszCmdLine, "-v")) { | |
|
14657
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
477 | /* If stdout hasn't been redirected to a file, alloc a console |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
478 | * (_istty() doesn't work for stuff using the GUI subsystem) */ |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
479 | if (_fileno(stdout) == -1) { |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
480 | LPFNATTACHCONSOLE MyAttachConsole = NULL; |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
481 | if ((hmod = GetModuleHandle("kernel32.dll"))) { |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
482 | MyAttachConsole = |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
483 | (LPFNATTACHCONSOLE) |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
484 | GetProcAddress(hmod, "AttachConsole"); |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
485 | } |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
486 | if ((MyAttachConsole && MyAttachConsole(ATTACH_PARENT_PROCESS)) |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
487 | || AllocConsole()) { |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
488 | freopen("CONOUT$", "w", stdout); |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
489 | freopen("CONOUT$", "w", stderr); |
|
f4ecf21c51bb
[gaim-migrate @ 17322]
Daniel Atallah <datallah@pidgin.im>
parents:
14596
diff
changeset
|
490 | } |
| 14286 | 491 | } |
| 492 | } | |
| 493 | ||
| 494 | /* Load exception handler if we have it */ | |
| 495 | if (GetModuleFileName(NULL, gaimdir, MAX_PATH) != 0) { | |
| 496 | char *tmp = gaimdir; | |
| 497 | char *prev = NULL; | |
| 498 | ||
| 499 | while ((tmp = strchr(tmp, '\\'))) { | |
| 500 | prev = tmp; | |
| 501 | tmp++; | |
| 502 | } | |
| 503 | ||
| 504 | if (prev) { | |
| 505 | prev[0] = '\0'; | |
| 506 | strcat(gaimdir, "\\exchndl.dll"); | |
| 507 | if (LoadLibrary(gaimdir)) | |
| 508 | printf("Loaded exchndl.dll\n"); | |
| 509 | } | |
| 510 | } else { | |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
511 | DWORD dw = GetLastError(); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
512 | const char *err_msg = get_win32_error_message(dw); |
| 14286 | 513 | snprintf(errbuf, 512, |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
514 | "Error getting module filename.\nError: (%u) %s", |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
515 | (UINT) dw, err_msg); |
|
15004
c8c52251273c
[gaim-migrate @ 17714]
Daniel Atallah <datallah@pidgin.im>
parents:
15003
diff
changeset
|
516 | printf(errbuf); |
| 14286 | 517 | MessageBox(NULL, errbuf, NULL, MB_OK | MB_TOPMOST); |
| 518 | } | |
| 519 | ||
| 520 | #ifndef PORTABLE | |
| 521 | if (!getenv("GAIM_NO_DLL_CHECK")) | |
| 522 | #endif | |
| 523 | dll_prep(); | |
| 524 | ||
| 525 | wgaim_set_locale(); | |
| 526 | /* If help or version flag used, do not check Mutex */ | |
| 527 | if (!strstr(lpszCmdLine, "-h") && !strstr(lpszCmdLine, "-v")) | |
| 528 | if (!getenv("GAIM_MULTI_INST") && !wgaim_set_running()) | |
| 529 | return 0; | |
| 530 | ||
| 531 | /* Now we are ready for Gaim .. */ | |
| 532 | if ((hmod = LoadLibrary("gtkgaim.dll"))) { | |
| 533 | gaim_main = (LPFNGAIMMAIN) GetProcAddress(hmod, "gaim_main"); | |
| 534 | } | |
| 535 | ||
| 536 | if (!gaim_main) { | |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
537 | DWORD dw = GetLastError(); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
538 | BOOL mod_not_found = (dw == ERROR_MOD_NOT_FOUND || dw == ERROR_DLL_NOT_FOUND); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
539 | const char *err_msg = get_win32_error_message(dw); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
540 | |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
541 | snprintf(errbuf, 512, "Error loading gtkgaim.dll.\nError: (%u) %s%s%s", |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
542 | (UINT) dw, err_msg, |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
543 | mod_not_found ? "\n" : "", |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
544 | mod_not_found ? "This probably means that GTK+ can't be found." : ""); |
|
15004
c8c52251273c
[gaim-migrate @ 17714]
Daniel Atallah <datallah@pidgin.im>
parents:
15003
diff
changeset
|
545 | printf(errbuf); |
|
15003
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
546 | MessageBox(NULL, errbuf, TEXT("Error"), MB_OK | MB_TOPMOST); |
|
bd5c5a545632
[gaim-migrate @ 17713]
Daniel Atallah <datallah@pidgin.im>
parents:
14810
diff
changeset
|
547 | |
| 14286 | 548 | return 0; |
| 549 | } | |
| 550 | ||
| 551 | return gaim_main (hInstance, __argc, __argv); | |
| 552 | } |