1 /* 2 * dsnchooser.c 3 * 4 * $Id$ 5 * 6 * The iODBC driver manager. 7 * 8 * Copyright (C) 1996-2021 OpenLink Software <iodbc@openlinksw.com> 9 * All Rights Reserved. 10 * 11 * This software is released under the terms of either of the following 12 * licenses: 13 * 14 * - GNU Library General Public License (see LICENSE.LGPL) 15 * - The BSD License (see LICENSE.BSD). 16 * 17 * Note that the only valid version of the LGPL license as far as this 18 * project is concerned is the original GNU Library General Public License 19 * Version 2, dated June 1991. 20 * 21 * While not mandated by the BSD license, any patches you make to the 22 * iODBC source code may be contributed back into the iODBC project 23 * at your discretion. Contributions will benefit the Open Source and 24 * Data Access community as a whole. Submissions may be made at: 25 * 26 * http://www.iodbc.org 27 * 28 * 29 * GNU Library Generic Public License Version 2 30 * ============================================ 31 * This library is free software; you can redistribute it and/or 32 * modify it under the terms of the GNU Library General Public 33 * License as published by the Free Software Foundation; only 34 * Version 2 of the License dated June 1991. 35 * 36 * This library is distributed in the hope that it will be useful, 37 * but WITHOUT ANY WARRANTY; without even the implied warranty of 38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 39 * Library General Public License for more details. 40 * 41 * You should have received a copy of the GNU Library General Public 42 * License along with this library; if not, write to the Free 43 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 44 * 45 * 46 * The BSD License 47 * =============== 48 * Redistribution and use in source and binary forms, with or without 49 * modification, are permitted provided that the following conditions 50 * are met: 51 * 52 * 1. Redistributions of source code must retain the above copyright 53 * notice, this list of conditions and the following disclaimer. 54 * 2. Redistributions in binary form must reproduce the above copyright 55 * notice, this list of conditions and the following disclaimer in 56 * the documentation and/or other materials provided with the 57 * distribution. 58 * 3. Neither the name of OpenLink Software Inc. nor the names of its 59 * contributors may be used to endorse or promote products derived 60 * from this software without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 63 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 64 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 65 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR 66 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 67 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 68 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 69 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 70 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 71 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 72 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 73 */ 74 75 #include <iodbc.h> 76 #include <iodbcext.h> 77 78 #include <stdio.h> 79 #include <sys/types.h> 80 #include <sys/stat.h> 81 #include <sys/param.h> 82 #include <dirent.h> 83 #include <errno.h> 84 85 #include <sqltypes.h> 86 #include <dlproc.h> 87 88 #include "../gui.h" 89 #include "odbc4.xpm" 90 91 92 #ifndef MAXPATHLEN 93 #define MAXPATHLEN 1024 94 #endif 95 96 /* 97 * Linux glibc has the function, but does not have the prototype 98 * with the default header files. 99 */ 100 #if defined(HAVE_ASPRINTF) && defined(__GLIBC__) 101 extern int asprintf (char **ret, const char *format, ...); 102 #endif 103 104 105 char *szDSNColumnNames[] = { 106 "Name", mbc_case_fold(OnigCaseFoldType flag,const UChar ** pp,const UChar * end ARG_UNUSED,UChar * lower)107 "Description", 108 "Driver" 109 }; 110 111 char *szTabNames[] = { 112 "User DSN", 113 "System DSN", 114 "File DSN", 115 "ODBC Drivers", 116 "Connection Pooling", 117 "Tracing", 118 "About" 119 }; 120 121 char *szDSNButtons[] = { 122 "_Add", 123 "_Remove", 124 "Confi_gure", is_code_ctype(OnigCodePoint code,unsigned int ctype)125 "_Test", 126 "_Set Dir", 127 }; 128 129 130 void 131 addlistofdir_to_optionmenu (GtkWidget *widget, LPCSTR path, 132 TDSNCHOOSER *choose_t) 133 { 134 GtkWidget *menu, *menu_item; 135 char *curr_dir, *prov, *dir; 136 void **array; 137 138 if (!path || !GTK_IS_OPTION_MENU (widget) || !(prov = strdup (path))) 139 return; 140 141 if (prov[STRLEN (prov) - 1] == '/' && STRLEN (prov) > 1) 142 prov[STRLEN (prov) - 1] = 0; 143 144 /* Add the root directory */ 145 menu = gtk_menu_new (); 146 menu_item = gtk_menu_item_new_with_label ("/"); 147 gtk_widget_show (menu_item); 148 gtk_menu_prepend (GTK_MENU (menu), menu_item); 149 if (!(array = (void **) malloc (sizeof (void *) * 2))) 150 return; 151 array[0] = g_strdup ("/"); 152 array[1] = choose_t; 153 gtk_signal_connect (GTK_OBJECT (menu_item), "activate", 154 GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array); 155 156 for (curr_dir = prov, dir = NULL; curr_dir; 157 curr_dir = strchr (curr_dir + 1, '/')) 158 { 159 if (strchr (curr_dir + 1, '/')) 160 { 161 dir = strchr (curr_dir + 1, '/'); 162 *dir = 0; 163 } 164 165 menu_item = gtk_menu_item_new_with_label (prov); 166 gtk_widget_show (menu_item); 167 gtk_menu_prepend (GTK_MENU (menu), menu_item); apply_all_case_fold(OnigCaseFoldType flag,OnigApplyAllCaseFoldFunc f,void * arg)168 if (!(array = (void **) malloc (sizeof (void *) * 2))) 169 return; 170 array[0] = g_strdup (prov); 171 array[1] = choose_t; 172 gtk_signal_connect (GTK_OBJECT (menu_item), "activate", 173 GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array); 174 if (dir) 175 *dir = '/'; 176 } get_case_fold_codes_by_str(OnigCaseFoldType flag,const OnigUChar * p,const OnigUChar * end,OnigCaseFoldCodeItem items[])177 178 gtk_option_menu_remove_menu (GTK_OPTION_MENU (widget)); 179 gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu); 180 181 free (prov); 182 } 183 184 185 void 186 adddirectories_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path) 187 { 188 DIR *dir; 189 #if defined (HAVE_ASPRINTF) 190 char *path_buf; 191 #else 192 char path_buf[MAXPATHLEN]; 193 #endif 194 struct dirent *dir_entry; 195 struct stat fstat; 196 char *data[1]; 197 198 if (!path || !GTK_IS_CLIST (widget)) 199 return; 200 201 if ((dir = opendir (path))) 202 { 203 /* Remove all the entries */ 204 gtk_clist_clear (GTK_CLIST (widget)); 205 206 while ((dir_entry = readdir (dir))) 207 { 208 #if defined (HAVE_ASPRINTF) 209 asprintf (&path_buf, "%s/%s", path, dir_entry->d_name); 210 #elif defined (HAVE_SNPRINTF) 211 snprintf (path_buf, sizeof (path_buf), "%s/%s", 212 path, dir_entry->d_name); 213 #else 214 STRCPY (path_buf, path); 215 if (path[STRLEN (path) - 1] != '/') 216 STRCAT (path_buf, "/"); 217 STRCAT (path_buf, dir_entry->d_name); 218 #endif 219 220 if (stat ((LPCSTR) path_buf, &fstat) >= 0 221 && S_ISDIR (fstat.st_mode)) 222 if (strcmp (path, "/") || strcmp (dir_entry->d_name, "..")) 223 { 224 data[0] = dir_entry->d_name; 225 gtk_clist_append (GTK_CLIST (widget), data); 226 } 227 228 #if defined (HAVE_ASPRINTF) 229 free (path_buf); 230 #endif 231 } 232 233 /* Close the directory entry */ 234 closedir (dir); 235 236 if (GTK_CLIST (widget)->rows > 0) 237 gtk_clist_sort (GTK_CLIST (widget)); 238 } 239 else 240 create_error (hwnd, NULL, "Error during accessing directory information:", 241 strerror (errno)); 242 } 243 244 245 void 246 addfiles_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path) 247 { 248 DIR *dir; 249 #if defined (HAVE_ASPRINTF) 250 char *path_buf; 251 #else 252 char path_buf[MAXPATHLEN]; 253 #endif 254 struct dirent *dir_entry; 255 struct stat fstat; 256 char *data[1]; 257 258 if (!path || !GTK_IS_CLIST (widget)) 259 return; 260 261 if ((dir = opendir (path))) 262 { 263 /* Remove all the entries */ 264 gtk_clist_clear (GTK_CLIST (widget)); 265 266 while ((dir_entry = readdir (dir))) 267 { 268 #if defined (HAVE_ASPRINTF) 269 asprintf (&path_buf, "%s/%s", path, dir_entry->d_name); 270 #elif defined (HAVE_SNPRINTF) 271 snprintf (path_buf, sizeof (path_buf), "%s/%s", 272 path, dir_entry->d_name); 273 #else 274 STRCPY (path_buf, path); 275 if (path[STRLEN (path) - 1] != '/') 276 STRCAT (path_buf, "/"); 277 STRCAT (path_buf, dir_entry->d_name); 278 #endif 279 280 if (stat ((LPCSTR) path_buf, &fstat) >= 0 281 && !S_ISDIR (fstat.st_mode) 282 && strstr (dir_entry->d_name, ".dsn")) 283 { 284 data[0] = dir_entry->d_name; 285 gtk_clist_append (GTK_CLIST (widget), data); 286 } 287 288 #if defined (HAVE_ASPRINTF) 289 free (path_buf); 290 #endif 291 } 292 293 /* Close the directory entry */ 294 closedir (dir); 295 296 if (GTK_CLIST (widget)->rows > 0) 297 gtk_clist_sort (GTK_CLIST (widget)); 298 } 299 } 300 301 302 void 303 adddsns_to_list (GtkWidget *widget, BOOL systemDSN) 304 { 305 char *curr, *buffer = (char *) malloc (sizeof (char) * 65536); 306 char diz[1024], driver[1024]; 307 char *data[3]; 308 int len, _case = 0; 309 310 if (!buffer || !GTK_IS_CLIST (widget)) 311 return; 312 gtk_clist_clear (GTK_CLIST (widget)); 313 314 /* Get the list of DSN in the user context */ 315 SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); 316 len = 317 SQLGetPrivateProfileString ("ODBC Data Sources", NULL, "", buffer, 318 65536, NULL); 319 if (len) 320 goto process; 321 322 _case = 1; 323 SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); 324 len = 325 SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", NULL, "", 326 buffer, 65536, NULL); 327 if (len) 328 goto process; 329 330 goto end; 331 332 process: 333 for (curr = buffer; *curr; curr += (STRLEN (curr) + 1)) 334 { 335 SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); 336 SQLGetPrivateProfileString (curr, "Description", "", diz, sizeof (diz), 337 NULL); 338 SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); 339 switch (_case) 340 { 341 case 0: 342 SQLGetPrivateProfileString ("ODBC Data Sources", curr, "", driver, 343 sizeof (driver), NULL); 344 break; 345 case 1: 346 SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", curr, "", 347 driver, sizeof (driver), NULL); 348 break; 349 }; 350 351 if (STRLEN (curr) && STRLEN (driver)) 352 { 353 data[0] = curr; 354 data[1] = diz; 355 data[2] = driver; 356 gtk_clist_append (GTK_CLIST (widget), data); 357 } 358 } 359 360 end: 361 SQLSetConfigMode (ODBC_BOTH_DSN); 362 363 if (GTK_CLIST (widget)->rows > 0) 364 { 365 gtk_clist_columns_autosize (GTK_CLIST (widget)); 366 gtk_clist_sort (GTK_CLIST (widget)); 367 } 368 369 /* Make the clean up */ 370 free (buffer); 371 } 372 373 374 static void 375 dsnchooser_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, 376 gint page_num, TDSNCHOOSER *choose_t) 377 { 378 switch (page_num) 379 { 380 case 0: 381 if (choose_t) 382 { 383 choose_t->type_dsn = USER_DSN; 384 adddsns_to_list (choose_t->udsnlist, FALSE); 385 } 386 break; 387 388 case 1: 389 if (choose_t) 390 { 391 choose_t->type_dsn = SYSTEM_DSN; 392 adddsns_to_list (choose_t->sdsnlist, TRUE); 393 } 394 break; 395 396 case 2: 397 if (choose_t) 398 { 399 choose_t->type_dsn = FILE_DSN; 400 addlistofdir_to_optionmenu(choose_t->dir_combo, 401 choose_t->curr_dir, choose_t); 402 adddirectories_to_list(choose_t->mainwnd, 403 choose_t->dir_list, choose_t->curr_dir); 404 addfiles_to_list(choose_t->mainwnd, 405 choose_t->file_list, choose_t->curr_dir); 406 } 407 break; 408 }; 409 410 if (choose_t) 411 { 412 if (choose_t->uremove) 413 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 414 if (choose_t->uconfigure) 415 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 416 if (choose_t->utest) 417 gtk_widget_set_sensitive (choose_t->utest, FALSE); 418 if (choose_t->sremove) 419 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 420 if (choose_t->sconfigure) 421 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 422 if (choose_t->stest) 423 gtk_widget_set_sensitive (choose_t->stest, FALSE); 424 if (choose_t->fremove) 425 gtk_widget_set_sensitive(choose_t->fremove, FALSE); 426 if (choose_t->fconfigure) 427 gtk_widget_set_sensitive(choose_t->fconfigure, FALSE); 428 if (choose_t->ftest) 429 gtk_widget_set_sensitive(choose_t->ftest, FALSE); 430 } 431 } 432 433 434 static BOOL 435 test_driver_connect (TDSNCHOOSER *choose_t, char *connstr) 436 { 437 HENV henv; 438 HDBC hdbc; 439 440 #if (ODBCVER < 0x300) 441 if (SQLAllocEnv (&henv) != SQL_SUCCESS) 442 #else 443 if (SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv) != SQL_SUCCESS) 444 #endif 445 { 446 _iodbcdm_nativeerrorbox (choose_t->mainwnd, 447 henv, SQL_NULL_HDBC, SQL_NULL_HSTMT); 448 return FALSE; 449 } 450 451 SQLSetEnvAttr (henv, SQL_ATTR_APP_UNICODE_TYPE, 452 (SQLPOINTER) SQL_DM_CP_DEF, SQL_IS_UINTEGER); 453 454 #if (ODBCVER < 0x300) 455 if (SQLAllocConnect (henv, &hdbc) != SQL_SUCCESS) 456 #else 457 SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, 458 (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER); 459 if (SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc) != SQL_SUCCESS) 460 #endif 461 { 462 _iodbcdm_nativeerrorbox (choose_t->mainwnd, henv, hdbc, SQL_NULL_HSTMT); 463 SQLFreeEnv (henv); 464 return FALSE; 465 } 466 467 switch (choose_t->type_dsn) 468 { 469 case USER_DSN: 470 SQLSetConfigMode (ODBC_USER_DSN); 471 break; 472 case SYSTEM_DSN: 473 SQLSetConfigMode (ODBC_SYSTEM_DSN); 474 break; 475 case FILE_DSN: 476 SQLSetConfigMode (ODBC_BOTH_DSN); 477 break; 478 } 479 if (SQLDriverConnect (hdbc, choose_t->mainwnd, connstr, SQL_NTS, 480 NULL, 0, NULL, SQL_DRIVER_PROMPT) != SQL_SUCCESS) 481 { 482 _iodbcdm_nativeerrorbox (choose_t->mainwnd, henv, hdbc, SQL_NULL_HSTMT); 483 SQLFreeEnv (henv); 484 return FALSE; 485 } 486 else 487 SQLDisconnect (hdbc); 488 489 #if (ODBCVER < 0x300) 490 SQLFreeConnect (hdbc); 491 SQLFreeEnv (henv); 492 #else 493 SQLFreeHandle (SQL_HANDLE_DBC, hdbc); 494 SQLFreeHandle (SQL_HANDLE_ENV, henv); 495 #endif 496 497 return TRUE; 498 } 499 500 501 void 502 userdsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 503 { 504 char connstr[4096] = { "" }; 505 char drv[1024] = { ""}; 506 int sqlstat; 507 DWORD error; 508 509 if (choose_t) 510 { 511 /* Try first to get the driver name */ 512 SQLSetConfigMode (ODBC_USER_DSN); 513 if (_iodbcdm_drvchoose_dialbox (choose_t->mainwnd, drv, 514 sizeof (drv), &sqlstat) == SQL_SUCCESS) 515 { 516 SQLSetConfigMode (ODBC_USER_DSN); 517 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_ADD_DSN, 518 drv + STRLEN ("DRIVER="), connstr)) 519 { 520 if (SQLInstallerError (1, &error, connstr, 521 sizeof (connstr), NULL) != SQL_NO_DATA) 522 _iodbcdm_errorbox (choose_t->mainwnd, NULL, 523 "An error occurred when trying to add the DSN : "); 524 goto done; 525 } 526 527 adddsns_to_list (choose_t->udsnlist, FALSE); 528 } 529 530 done: 531 if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) 532 { 533 if (choose_t->uremove) 534 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 535 if (choose_t->uconfigure) 536 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 537 if (choose_t->utest) 538 gtk_widget_set_sensitive (choose_t->utest, FALSE); 539 } 540 } 541 542 return; 543 } 544 545 546 void 547 userdsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 548 { 549 char dsn[1024] = { "\0" }; 550 char *szDSN = NULL, *szDriver = NULL; 551 552 if (choose_t) 553 { 554 /* Retrieve the DSN name */ 555 if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) 556 { 557 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 558 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> 559 data), 0, &szDSN); 560 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 561 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> 562 data), 2, &szDriver); 563 } 564 565 /* Call the right function */ 566 if (szDSN 567 && create_confirm (choose_t->mainwnd, szDSN, 568 "Are you sure you want to remove this DSN ?")) 569 { 570 sprintf (dsn, "DSN=%s", szDSN); 571 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_REMOVE_DSN, 572 szDriver, dsn)) 573 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 574 "An error occurred when trying to remove the DSN : "); 575 adddsns_to_list (choose_t->udsnlist, FALSE); 576 } 577 578 if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) 579 { 580 if (choose_t->uremove) 581 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 582 if (choose_t->uconfigure) 583 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 584 if (choose_t->utest) 585 gtk_widget_set_sensitive (choose_t->utest, FALSE); 586 } 587 } 588 } 589 590 591 void 592 userdsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 593 { 594 char connstr[4096] = { 0 }; 595 char tokenstr[4096] = { 0 }; 596 char *szDSN = NULL, *szDriver = NULL, *curr, *cour; 597 int size = sizeof (connstr); 598 DWORD error; 599 600 if (choose_t) 601 { 602 /* Retrieve the DSN name */ 603 if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) 604 { 605 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 606 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> 607 data), 0, &szDSN); 608 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 609 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> 610 data), 2, &szDriver); 611 } 612 613 /* Call the right function */ 614 if (szDSN) 615 { 616 sprintf (connstr, "DSN=%s", szDSN); 617 size -= (STRLEN (connstr) + 1); 618 619 SQLSetConfigMode (ODBC_USER_DSN); 620 if (!SQLGetPrivateProfileString (szDSN, NULL, "", tokenstr, 621 sizeof (tokenstr), NULL)) 622 { 623 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 624 "An error occurred when trying to configure the DSN : "); 625 goto done; 626 } 627 628 for (curr = tokenstr, cour = connstr + STRLEN (connstr) + 1; *curr; 629 curr += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1)) 630 { 631 STRCPY (cour, curr); 632 cour[STRLEN (curr)] = '='; 633 SQLSetConfigMode (ODBC_USER_DSN); 634 SQLGetPrivateProfileString (szDSN, curr, "", 635 cour + STRLEN (curr) + 1, size - STRLEN (curr) - 1, NULL); 636 size -= (STRLEN (cour) + 1); 637 } 638 639 *cour = 0; 640 641 SQLSetConfigMode (ODBC_USER_DSN); 642 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_CONFIG_DSN, 643 szDriver, connstr)) 644 { 645 if (SQLInstallerError (1, &error, connstr, sizeof (connstr), 646 NULL) != SQL_NO_DATA 647 && error != ODBC_ERROR_REQUEST_FAILED) 648 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 649 "An error occurred when trying to configure the DSN : "); 650 goto done; 651 } 652 653 adddsns_to_list (choose_t->udsnlist, FALSE); 654 } 655 656 done: 657 if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) 658 { 659 if (choose_t->uremove) 660 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 661 if (choose_t->uconfigure) 662 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 663 if (choose_t->utest) 664 gtk_widget_set_sensitive (choose_t->utest, FALSE); 665 } 666 } 667 668 return; 669 } 670 671 672 void 673 userdsn_test_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 674 { 675 HENV henv; 676 HDBC hdbc; 677 SWORD buflen; 678 char connstr[4096] = { 0 }; 679 char outconnstr[4096] = { 0 }; 680 char *szDSN; 681 682 if (choose_t) 683 { 684 /* Retrieve the DSN name */ 685 if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) 686 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 687 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->data), 688 0, &szDSN); 689 690 if (szDSN && STRLEN (szDSN)) 691 { 692 snprintf (connstr, sizeof (connstr), "DSN=%s", szDSN); 693 if (test_driver_connect (choose_t, connstr)) 694 { 695 _iodbcdm_messagebox (choose_t->mainwnd, szDSN, 696 "The connection DSN was tested successfully, and can be used at this time."); 697 } 698 } 699 700 if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) 701 { 702 if (choose_t->uremove) 703 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 704 if (choose_t->uconfigure) 705 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 706 if (choose_t->utest) 707 gtk_widget_set_sensitive (choose_t->utest, FALSE); 708 } 709 } 710 } 711 712 713 void 714 systemdsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 715 { 716 char connstr[4096] = { 0 }; 717 char drv[1024] = { 0 }; 718 int sqlstat; 719 DWORD error; 720 721 if (choose_t) 722 { 723 /* Try first to get the driver name */ 724 SQLSetConfigMode (ODBC_SYSTEM_DSN); 725 if (_iodbcdm_drvchoose_dialbox (choose_t->mainwnd, drv, sizeof (drv), 726 &sqlstat) == SQL_SUCCESS) 727 { 728 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_ADD_SYS_DSN, 729 drv + STRLEN ("DRIVER="), connstr)) 730 { 731 if (SQLInstallerError (1, &error, connstr, sizeof (connstr), 732 NULL) != SQL_NO_DATA) 733 _iodbcdm_errorbox (choose_t->mainwnd, NULL, 734 "An error occurred when trying to add the DSN : "); 735 goto done; 736 } 737 738 adddsns_to_list (choose_t->sdsnlist, TRUE); 739 } 740 741 done: 742 if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL) 743 { 744 if (choose_t->sremove) 745 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 746 if (choose_t->sconfigure) 747 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 748 if (choose_t->stest) 749 gtk_widget_set_sensitive (choose_t->stest, FALSE); 750 } 751 } 752 753 return; 754 } 755 756 757 void 758 systemdsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 759 { 760 char dsn[1024] = { 0 }; 761 char *szDSN = NULL, *szDriver = NULL; 762 763 if (choose_t) 764 { 765 /* Retrieve the DSN name */ 766 if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL) 767 { 768 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 769 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection-> 770 data), 0, &szDSN); 771 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 772 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection-> 773 data), 2, &szDriver); 774 } 775 776 /* Call the right function */ 777 if (szDSN 778 && create_confirm (choose_t->mainwnd, szDSN, 779 "Are you sure you want to remove this DSN ?")) 780 { 781 sprintf (dsn, "DSN=%s", szDSN); 782 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_REMOVE_SYS_DSN, 783 szDriver, dsn)) 784 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 785 "An error occurred when trying to remove the DSN : "); 786 adddsns_to_list (choose_t->sdsnlist, TRUE); 787 } 788 789 if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL) 790 { 791 if (choose_t->sremove) 792 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 793 if (choose_t->sconfigure) 794 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 795 if (choose_t->stest) 796 gtk_widget_set_sensitive (choose_t->stest, FALSE); 797 } 798 } 799 } 800 801 802 void 803 systemdsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 804 { 805 char connstr[4096] = { 0 }; 806 char tokenstr[4096] = { 0 }; 807 char *szDSN = NULL, *szDriver = NULL, *curr, *cour; 808 int size = sizeof (connstr); 809 DWORD error; 810 811 if (choose_t) 812 { 813 /* Retrieve the DSN name */ 814 if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL) 815 { 816 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 817 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection-> 818 data), 0, &szDSN); 819 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 820 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection-> 821 data), 2, &szDriver); 822 } 823 824 /* Call the right function */ 825 if (szDSN) 826 { 827 sprintf (connstr, "DSN=%s", szDSN); 828 size -= (STRLEN (connstr) + 1); 829 830 SQLSetConfigMode (ODBC_SYSTEM_DSN); 831 if (!SQLGetPrivateProfileString (szDSN, NULL, "", tokenstr, 832 sizeof (tokenstr), NULL)) 833 { 834 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 835 "An error occurred when trying to configure the DSN : "); 836 goto done; 837 } 838 839 for (curr = tokenstr, cour = connstr + STRLEN (connstr) + 1; *curr; 840 curr += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1)) 841 { 842 STRCPY (cour, curr); 843 cour[STRLEN (curr)] = '='; 844 SQLSetConfigMode (ODBC_SYSTEM_DSN); 845 SQLGetPrivateProfileString (szDSN, curr, "", 846 cour + STRLEN (curr) + 1, size - STRLEN (curr) - 1, NULL); 847 size -= (STRLEN (cour) + 1); 848 } 849 850 *cour = 0; 851 852 if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_CONFIG_SYS_DSN, 853 szDriver, connstr)) 854 { 855 if (SQLInstallerError (1, &error, connstr, sizeof (connstr), 856 NULL) != SQL_NO_DATA 857 && error != ODBC_ERROR_REQUEST_FAILED) 858 _iodbcdm_errorbox (choose_t->mainwnd, szDSN, 859 "An error occurred when trying to configure the DSN : "); 860 goto done; 861 } 862 863 adddsns_to_list (choose_t->sdsnlist, TRUE); 864 } 865 866 done: 867 if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL) 868 { 869 if (choose_t->sremove) 870 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 871 if (choose_t->sconfigure) 872 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 873 if (choose_t->stest) 874 gtk_widget_set_sensitive (choose_t->stest, FALSE); 875 } 876 } 877 878 return; 879 } 880 881 882 void 883 systemdsn_test_clicked (GtkWidget * widget, TDSNCHOOSER * choose_t) 884 { 885 HENV henv; 886 HDBC hdbc; 887 SWORD buflen; 888 SQLCHAR connstr[4096] = { 0 }; 889 SQLCHAR outconnstr[4096] = { 0 }; 890 char *szDSN = NULL; 891 892 if (choose_t) 893 { 894 /* Retrieve the DSN name */ 895 if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL) 896 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 897 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->data), 898 0, &szDSN); 899 900 if (szDSN && STRLEN (szDSN)) 901 { 902 snprintf (connstr, sizeof (connstr), "DSN=%s", szDSN); 903 if (test_driver_connect (choose_t, connstr)) 904 { 905 _iodbcdm_messagebox (choose_t->mainwnd, szDSN, 906 "The connection DSN was tested successfully, and can be used at this time."); 907 } 908 } 909 910 if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL) 911 { 912 if (choose_t->sremove) 913 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 914 if (choose_t->sconfigure) 915 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 916 if (choose_t->stest) 917 gtk_widget_set_sensitive (choose_t->stest, FALSE); 918 } 919 920 } 921 } 922 923 924 static void 925 filedsn_get_dsn (char *filename, char *dsn, size_t dsn_sz) 926 { 927 char *p; 928 929 /* Cut everything up to the last slash */ 930 p = strrchr (filename, '/'); 931 if (p != NULL) 932 p++; 933 else 934 p = filename; 935 snprintf (dsn, dsn_sz, "%s", p); 936 937 /* Cut .dsn extension */ 938 p = strrchr (dsn, '.'); 939 if (p != NULL && !strcasecmp (p, ".dsn")) 940 *p = '\0'; 941 } 942 943 944 static BOOL _CheckDriverLoginDlg (char *drv); 945 946 static void 947 filedsn_configure (TDSNCHOOSER *choose_t, char *drv, char *dsn, char *in_attrs, 948 BOOL b_add, BOOL verify_conn) 949 { 950 char *connstr = NULL; 951 size_t len; /* current connstr len */ 952 size_t add_len; /* len of appended string */ 953 LPSTR attrs = NULL, curr, tmp, attr_lst = NULL; 954 BOOL b_Save = TRUE; 955 956 attrs = in_attrs; 957 958 if (!b_add && !_CheckDriverLoginDlg(drv + STRLEN("DRIVER="))) 959 { 960 /* Get DSN name and additional attributes */ 961 attr_lst = create_fgensetup (choose_t->mainwnd, dsn, in_attrs, 962 b_add, &verify_conn); 963 attrs = attr_lst; 964 } 965 966 if (!attrs) 967 { 968 create_error (choose_t->mainwnd, NULL, "Error adding File DSN:", 969 strerror (ENOMEM)); 970 return; 971 } 972 if (attrs == (LPSTR) - 1L) 973 return; 974 975 /* Build the connection string */ 976 connstr = strdup (drv); 977 len = strlen (connstr); 978 for (curr = attrs; *curr; curr += (STRLEN (curr) + 1)) 979 { 980 if (!strncasecmp (curr, "DSN=", STRLEN ("DSN="))) 981 { 982 if (dsn == NULL) 983 { 984 /* got dsn name */ 985 dsn = curr + STRLEN ("DSN="); 986 } 987 continue; 988 } 989 990 /* append attr */ 991 add_len = 1 + strlen (curr); /* +1 for ';' */ 992 tmp = realloc (connstr, len + add_len + 1); /* +1 for NUL */ 993 if (tmp == NULL) 994 { 995 create_error (choose_t->mainwnd, NULL, "Error adding File DSN:", 996 strerror (errno)); 997 goto done; 998 } 999 connstr = tmp; 1000 snprintf (connstr + len, add_len + 1, ";%s", curr); 1001 len += add_len; 1002 } 1003 1004 /* Nothing to do if no DSN */ 1005 if (!dsn || STRLEN (dsn) == 0) 1006 goto done; 1007 1008 if (verify_conn) 1009 { 1010 BOOL ret; 1011 1012 /* Append SAVEFILE */ 1013 add_len = strlen (";SAVEFILE=") + strlen (dsn); 1014 tmp = realloc (connstr, len + add_len + 1); /* +1 for NUL */ 1015 if (tmp == NULL) 1016 { 1017 create_error (choose_t->mainwnd, NULL, "Error adding file DSN:", 1018 strerror (errno)); 1019 goto done; 1020 } 1021 connstr = tmp; 1022 snprintf (connstr + len, add_len + 1, ";SAVEFILE=%s", dsn); 1023 len += add_len; 1024 1025 /* Connect to data source */ 1026 ret = test_driver_connect (choose_t, connstr); 1027 if (!ret && b_add) 1028 { 1029 if (create_confirm (choose_t->mainwnd, dsn, 1030 "Can't check the connection. Do you want to store the FileDSN without verification ?")) 1031 b_Save = TRUE; 1032 else 1033 b_Save = FALSE; 1034 } 1035 else 1036 b_Save = FALSE; 1037 } 1038 1039 if (b_Save) 1040 { 1041 char key[512]; 1042 char *p; 1043 size_t sz; 1044 1045 if (drv) 1046 { 1047 p = strchr(drv, '='); 1048 if (!SQLWriteFileDSN (dsn, "ODBC", "DRIVER", p + 1)) 1049 { 1050 create_error (choose_t->mainwnd, NULL, "Error writing File DSN:", 1051 strerror (errno)); 1052 goto done; 1053 } 1054 } 1055 1056 for (curr = attrs; *curr; curr += (STRLEN (curr) + 1)) 1057 { 1058 if (!strncasecmp (curr, "DSN=", STRLEN ("DSN="))) 1059 continue; 1060 else if (!strncasecmp (curr, "PWD=", STRLEN ("PWD="))) 1061 continue; 1062 else if (!strncasecmp (curr, "SAVEFILE=", STRLEN ("SAVEFILE="))) 1063 continue; 1064 else if (!strncasecmp (curr, "FILEDSN=", STRLEN ("FILEDSN="))) 1065 continue; 1066 1067 p = strchr(curr, '='); 1068 sz = p - curr < sizeof(key) ? p - curr : sizeof(key); 1069 memset(key, 0, sizeof(key)); 1070 strncpy(key, curr, sz); 1071 1072 if (!SQLWriteFileDSN (dsn, "ODBC", key, p + 1)) 1073 { 1074 create_error (choose_t->mainwnd, NULL, "Error writing File DSN:", 1075 strerror (errno)); 1076 goto done; 1077 } 1078 } 1079 } 1080 1081 1082 done: 1083 if (attr_lst != NULL) 1084 free (attr_lst); 1085 if (connstr != NULL) 1086 free (connstr); 1087 } 1088 1089 1090 static void 1091 filedsn_update_file_list (TDSNCHOOSER *choose_t) 1092 { 1093 /* Reset current file */ 1094 gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), ""); 1095 if (choose_t->fremove) 1096 gtk_widget_set_sensitive(choose_t->fremove, FALSE); 1097 if (choose_t->fconfigure) 1098 gtk_widget_set_sensitive(choose_t->fconfigure, FALSE); 1099 if (choose_t->ftest) 1100 gtk_widget_set_sensitive(choose_t->ftest, FALSE); 1101 1102 /* Update file list */ 1103 addfiles_to_list (choose_t->mainwnd, choose_t->file_list, 1104 choose_t->curr_dir); 1105 } 1106 1107 1108 void 1109 filedsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1110 { 1111 SQLCHAR drv[1024] = { 0 }; 1112 int sqlstat; 1113 LPSTR s, attrs; 1114 TFDRIVERCHOOSER drvchoose_t; 1115 1116 if (!choose_t) 1117 return; 1118 1119 /* Try first to get the driver name */ 1120 SQLSetConfigMode (ODBC_USER_DSN); 1121 1122 drvchoose_t.attrs = NULL; 1123 drvchoose_t.dsn = NULL; 1124 drvchoose_t.driver = NULL; 1125 drvchoose_t.curr_dir = choose_t->curr_dir; 1126 1127 create_fdriverchooser (choose_t->mainwnd, &drvchoose_t); 1128 1129 /* Check output parameters */ 1130 if (drvchoose_t.ok) 1131 { 1132 if (sizeof(drv) > WCSLEN(drvchoose_t.driver) + strlen("DRIVER=")) 1133 { 1134 s = strcpy(drv, "DRIVER="); 1135 s += strlen("DRIVER="); 1136 dm_strcpy_W2A(s, drvchoose_t.driver); 1137 attrs = drvchoose_t.attrs; 1138 1139 filedsn_configure(choose_t, drv, drvchoose_t.dsn, 1140 attrs ? attrs :"\0\0", TRUE, drvchoose_t.verify_conn); 1141 filedsn_update_file_list(choose_t); 1142 } 1143 } 1144 1145 if (drvchoose_t.driver) 1146 free (drvchoose_t.driver); 1147 if (drvchoose_t.attrs) 1148 free (drvchoose_t.attrs); 1149 if (drvchoose_t.dsn) 1150 free (drvchoose_t.dsn); 1151 1152 1153 } 1154 1155 1156 void 1157 filedsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1158 { 1159 char msg[4096]; 1160 char *filedsn; 1161 1162 if (!choose_t) 1163 return; 1164 1165 /* Retrieve filedsn file name */ 1166 filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry)); 1167 1168 /* Confirm removing a file dsn */ 1169 snprintf (msg, sizeof (msg), 1170 "Are you sure you want to remove the '%s' data source?", 1171 filedsn); 1172 if (!create_confirm (choose_t->mainwnd, NULL, msg)) 1173 return; 1174 1175 /* Remove file */ 1176 if (unlink (filedsn) < 0) 1177 { 1178 create_error (choose_t->mainwnd, NULL, "Error removing file DSN:", 1179 strerror (errno)); 1180 return; 1181 } 1182 1183 /* Update file list */ 1184 filedsn_update_file_list(choose_t); 1185 } 1186 1187 1188 void 1189 filedsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1190 { 1191 char dsn[1024]; 1192 char *filedsn; 1193 char *drv = NULL; 1194 char *attrs = NULL; 1195 char *_attrs = NULL; /* attr list */ 1196 size_t len = 0; /* current attr list length (w/o list-terminating NUL) */ 1197 char *p, *p_next; 1198 WORD read_len; 1199 char entries[1024]; 1200 1201 if (!choose_t) 1202 return; 1203 1204 /* Retrieve filedsn file name */ 1205 filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry)); 1206 filedsn_get_dsn (filedsn, dsn, sizeof (dsn)); 1207 1208 /* Get list of entries in .dsn file */ 1209 if (!SQLReadFileDSN (filedsn, "ODBC", NULL, 1210 entries, sizeof (entries), &read_len)) 1211 { 1212 create_error (choose_t->mainwnd, NULL, "SQLReadFileDSN failed", NULL); 1213 goto done; 1214 } 1215 1216 /* add params from the .dsn file */ 1217 for (p = entries; *p != '\0'; p = p_next) 1218 { 1219 char *tmp; 1220 size_t add_len; /* length of added attribute */ 1221 char value[1024]; 1222 1223 /* get next entry */ 1224 p_next = strchr (p, ';'); 1225 if (p_next) 1226 *p_next++ = '\0'; 1227 1228 if (!SQLReadFileDSN (filedsn, "ODBC", p, value, sizeof(value), &read_len)) 1229 { 1230 create_error (choose_t->mainwnd, NULL, "SQLReadFileDSN failed", NULL); 1231 goto done; 1232 } 1233 1234 if (!strcasecmp (p, "DRIVER")) 1235 { 1236 /* got driver keyword */ 1237 add_len = strlen ("DRIVER=") + strlen (value) + 1; 1238 drv = malloc (add_len); 1239 snprintf (drv, add_len, "DRIVER=%s", value); 1240 continue; 1241 } 1242 1243 /* +1 for '=', +1 for NUL */ 1244 add_len = strlen (p) + 1 + strlen (value) + 1; 1245 /* +1 for list-terminating NUL */; 1246 tmp = realloc (attrs, len + add_len + 1); 1247 if (tmp == NULL) 1248 { 1249 create_error (choose_t->mainwnd, NULL, "Error adding file DSN:", 1250 strerror (errno)); 1251 goto done; 1252 } 1253 attrs = tmp; 1254 snprintf (attrs + len, add_len, "%s=%s", p, value); 1255 len += add_len; 1256 } 1257 1258 if (drv == NULL) 1259 { 1260 /* no driver found, probably unshareable file data source */ 1261 create_error (choose_t->mainwnd, NULL, 1262 "Can't configure file DSN without DRIVER keyword (probably unshareable data source?)", NULL); 1263 goto done; 1264 } 1265 1266 if (attrs == NULL) 1267 attrs = "\0\0"; 1268 else 1269 { 1270 /* NUL-terminate the list */ 1271 attrs[len] = '\0'; 1272 _attrs = attrs; 1273 } 1274 1275 /* Configure file DSN */ 1276 filedsn_configure (choose_t, drv, dsn, attrs, FALSE, TRUE); 1277 1278 done: 1279 if (drv != NULL) 1280 free (drv); 1281 if (_attrs != NULL) 1282 free (_attrs); 1283 } 1284 1285 1286 void 1287 filedsn_test_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1288 { 1289 char dsn[1024]; 1290 char connstr[4096] = { 0 }; 1291 char *filedsn; 1292 1293 if (!choose_t) 1294 return; 1295 1296 /* Retrieve filedsn file name */ 1297 filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry)); 1298 filedsn_get_dsn (filedsn, dsn, sizeof (dsn)); 1299 1300 /* Create connection string and connect to data source */ 1301 snprintf (connstr, sizeof (connstr), "FILEDSN=%s", filedsn); 1302 if (test_driver_connect(choose_t, connstr)) 1303 { 1304 _iodbcdm_messagebox (choose_t->mainwnd, filedsn, 1305 "The connection DSN was tested successfully, and can be used at this time."); 1306 } 1307 } 1308 1309 1310 void 1311 filedsn_setdir_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1312 { 1313 char msg[4096]; 1314 1315 if (!choose_t) 1316 return; 1317 1318 /* confirm setting a directory */ 1319 snprintf (msg, sizeof (msg), 1320 "Are you sure that you want to make '%s' the default file DSN directory?", 1321 choose_t->curr_dir); 1322 if (!create_confirm (choose_t->mainwnd, NULL, msg)) 1323 return; 1324 1325 /* write FileDSNPath value */ 1326 if (!SQLWritePrivateProfileString ("ODBC", "FileDSNPath", 1327 choose_t->curr_dir, "odbcinst.ini")) 1328 { 1329 create_error (choose_t->mainwnd, NULL, 1330 "Error setting default file DSN directory", NULL); 1331 return; 1332 } 1333 } 1334 1335 1336 void 1337 filedsn_filelist_select (GtkWidget *widget, gint row, gint column, 1338 GdkEvent *event, TDSNCHOOSER *choose_t) 1339 { 1340 LPSTR filename = NULL, temp = NULL; 1341 1342 if (choose_t) 1343 { 1344 /* Get the file name */ 1345 gtk_clist_get_text (GTK_CLIST (choose_t->file_list), row, 0, &filename); 1346 1347 /* Update the directory and file list */ 1348 temp = 1349 (LPSTR) malloc (STRLEN (filename) + STRLEN (choose_t->curr_dir) + 1350 2); 1351 1352 if (temp) 1353 { 1354 STRCPY (temp, choose_t->curr_dir); 1355 if (temp[STRLEN (temp) - 1] != '/') 1356 STRCAT (temp, "/"); 1357 STRCAT (temp, filename); 1358 1359 /* Check if it's a valid file */ 1360 gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), temp); 1361 1362 /* And activate buttons */ 1363 if (choose_t->fremove) 1364 gtk_widget_set_sensitive (choose_t->fremove, TRUE); 1365 if (choose_t->fconfigure) 1366 gtk_widget_set_sensitive (choose_t->fconfigure, TRUE); 1367 if (choose_t->ftest) 1368 gtk_widget_set_sensitive (choose_t->ftest, TRUE); 1369 1370 free (temp); 1371 } 1372 } 1373 } 1374 1375 1376 void 1377 filedsn_filelist_unselect (GtkWidget *widget, gint row, gint column, 1378 GdkEvent *event, TDSNCHOOSER *choose_t) 1379 { 1380 if (choose_t) 1381 { 1382 /* Check if it's a valid file */ 1383 gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), ""); 1384 1385 /* And des-activate buttons */ 1386 if (choose_t->fremove) 1387 gtk_widget_set_sensitive (choose_t->fremove, FALSE); 1388 if (choose_t->fconfigure) 1389 gtk_widget_set_sensitive (choose_t->fconfigure, FALSE); 1390 if (choose_t->ftest) 1391 gtk_widget_set_sensitive (choose_t->ftest, FALSE); 1392 } 1393 } 1394 1395 1396 void 1397 filedsn_dirlist_select (GtkWidget *widget, gint row, gint column, 1398 GdkEvent *event, TDSNCHOOSER *choose_t) 1399 { 1400 LPSTR filename = NULL, temp = NULL; 1401 int i; 1402 1403 if (choose_t) 1404 { 1405 /* Get the directory name */ 1406 gtk_clist_get_text (GTK_CLIST (choose_t->dir_list), row, 0, &filename); 1407 1408 if (filename && event && event->type == GDK_2BUTTON_PRESS) 1409 { 1410 /* Update the directory and file list */ 1411 temp = 1412 (LPSTR) malloc (STRLEN (filename) + 1413 STRLEN (choose_t->curr_dir) + 2); 1414 1415 if (temp) 1416 { 1417 if (!strcmp (filename, ".")) 1418 STRCPY (temp, choose_t->curr_dir); 1419 else if (!strcmp (filename, "..")) 1420 { 1421 STRCPY (temp, choose_t->curr_dir); 1422 for (i = STRLEN (temp) - 1; i - 1 && temp[i] != '/'; i--); 1423 temp[i] = 0; 1424 } 1425 else 1426 { 1427 STRCPY (temp, choose_t->curr_dir); 1428 if (temp[STRLEN (temp) - 1] != '/') 1429 STRCAT (temp, "/"); 1430 STRCAT (temp, filename); 1431 } 1432 1433 strncpy(choose_t->curr_dir, temp, sizeof(choose_t->curr_dir)); 1434 addlistofdir_to_optionmenu (choose_t->dir_combo, 1435 choose_t->curr_dir, choose_t); 1436 adddirectories_to_list (choose_t->mainwnd, choose_t->dir_list, 1437 choose_t->curr_dir); 1438 addfiles_to_list (choose_t->mainwnd, choose_t->file_list, 1439 choose_t->curr_dir); 1440 } 1441 } 1442 } 1443 } 1444 1445 1446 void 1447 filedsn_lookin_clicked (GtkWidget *widget, void **array) 1448 { 1449 if (array && array[0] && array[1] && ((TDSNCHOOSER *) array[1])->curr_dir 1450 && strcmp (((TDSNCHOOSER *) array[1])->curr_dir, array[0])) 1451 { 1452 TDSNCHOOSER *choose_t = (TDSNCHOOSER *) array[1]; 1453 /* Update the directory and file list */ 1454 strncpy(choose_t->curr_dir, array[0], sizeof(choose_t->curr_dir)); 1455 addlistofdir_to_optionmenu (choose_t->dir_combo, 1456 (LPCSTR) array[0], choose_t); 1457 adddirectories_to_list (choose_t->mainwnd, 1458 choose_t->dir_list, (LPCSTR) array[0]); 1459 addfiles_to_list (choose_t->mainwnd, choose_t->file_list, (LPCSTR) array[0]); 1460 } 1461 } 1462 1463 1464 void 1465 userdsn_list_select (GtkWidget *widget, gint row, gint column, 1466 GdkEvent *event, TDSNCHOOSER *choose_t) 1467 { 1468 char *szDSN = NULL; 1469 1470 if (choose_t) 1471 { 1472 if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) 1473 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 1474 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->data), 1475 0, &szDSN); 1476 1477 if (szDSN && event && event->type == GDK_2BUTTON_PRESS) 1478 gtk_signal_emit_by_name (GTK_OBJECT (choose_t->uconfigure), "clicked", 1479 choose_t); 1480 1481 gtk_widget_set_sensitive (choose_t->uremove, TRUE); 1482 gtk_widget_set_sensitive (choose_t->uconfigure, TRUE); 1483 gtk_widget_set_sensitive (choose_t->utest, TRUE); 1484 } 1485 } 1486 1487 1488 void 1489 userdsn_list_unselect (GtkWidget *widget, gint row, gint column, 1490 GdkEvent *event, TDSNCHOOSER *choose_t) 1491 { 1492 if (choose_t) 1493 { 1494 gtk_widget_set_sensitive (choose_t->uremove, FALSE); 1495 gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); 1496 gtk_widget_set_sensitive (choose_t->utest, FALSE); 1497 } 1498 } 1499 1500 1501 void 1502 systemdsn_list_select (GtkWidget *widget, gint row, gint column, 1503 GdkEvent *event, TDSNCHOOSER *choose_t) 1504 { 1505 char *szDSN = NULL; 1506 1507 if (choose_t) 1508 { 1509 if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL) 1510 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 1511 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->data), 1512 0, &szDSN); 1513 1514 if (szDSN && event && event->type == GDK_2BUTTON_PRESS) 1515 gtk_signal_emit_by_name (GTK_OBJECT (choose_t->sconfigure), "clicked", 1516 choose_t); 1517 1518 gtk_widget_set_sensitive (choose_t->sremove, TRUE); 1519 gtk_widget_set_sensitive (choose_t->sconfigure, TRUE); 1520 gtk_widget_set_sensitive (choose_t->stest, TRUE); 1521 } 1522 } 1523 1524 1525 void 1526 systemdsn_list_unselect (GtkWidget *widget, gint row, gint column, 1527 GdkEvent *event, TDSNCHOOSER *choose_t) 1528 { 1529 if (choose_t) 1530 { 1531 gtk_widget_set_sensitive (choose_t->sremove, FALSE); 1532 gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); 1533 gtk_widget_set_sensitive (choose_t->stest, FALSE); 1534 } 1535 } 1536 1537 1538 static void 1539 dsnchooser_ok_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1540 { 1541 char *szDSN; 1542 1543 if (choose_t) 1544 { 1545 switch (choose_t->type_dsn) 1546 { 1547 case USER_DSN: 1548 if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) 1549 { 1550 gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), 1551 GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> 1552 data), 0, &szDSN); 1553 choose_t->dsn = dm_SQL_A2W(szDSN, SQL_NTS); 1554 } 1555 else 1556 choose_t->dsn = NULL; 1557 break; 1558 1559 case SYSTEM_DSN: 1560 if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL) 1561 { 1562 gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist), 1563 GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection-> 1564 data), 0, &szDSN); 1565 choose_t->dsn = dm_SQL_A2W (szDSN, SQL_NTS); 1566 } 1567 else 1568 choose_t->dsn = NULL; 1569 break; 1570 1571 default: 1572 choose_t->dsn = NULL; 1573 break; 1574 }; 1575 1576 done: 1577 choose_t->udsnlist = choose_t->sdsnlist = NULL; 1578 choose_t->uadd = choose_t->uremove = choose_t->utest = 1579 choose_t->uconfigure = NULL; 1580 choose_t->sadd = choose_t->sremove = choose_t->stest = 1581 choose_t->sconfigure = NULL; 1582 1583 gtk_signal_disconnect_by_func (GTK_OBJECT (choose_t->mainwnd), 1584 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 1585 gtk_main_quit (); 1586 gtk_widget_destroy (choose_t->mainwnd); 1587 } 1588 } 1589 1590 1591 static void 1592 dsnchooser_cancel_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t) 1593 { 1594 if (choose_t) 1595 { 1596 choose_t->udsnlist = choose_t->sdsnlist = NULL; 1597 choose_t->uadd = choose_t->uremove = choose_t->utest = 1598 choose_t->uconfigure = NULL; 1599 choose_t->sadd = choose_t->sremove = choose_t->stest = 1600 choose_t->sconfigure = NULL; 1601 choose_t->type_dsn = -1; 1602 choose_t->dsn = NULL; 1603 1604 gtk_signal_disconnect_by_func (GTK_OBJECT (choose_t->mainwnd), 1605 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 1606 gtk_main_quit (); 1607 gtk_widget_destroy (choose_t->mainwnd); 1608 } 1609 } 1610 1611 1612 static gint 1613 delete_event (GtkWidget *widget, GdkEvent *event, TDSNCHOOSER *choose_t) 1614 { 1615 dsnchooser_cancel_clicked (widget, choose_t); 1616 1617 return FALSE; 1618 } 1619 1620 1621 void 1622 create_dsnchooser (HWND hwnd, TDSNCHOOSER * choose_t) 1623 { 1624 GdkPixmap *pixmap; 1625 GdkBitmap *mask; 1626 GtkStyle *style; 1627 1628 GtkWidget *dsnchooser; 1629 GtkWidget *vbox27; 1630 GtkWidget *notebook1; 1631 GtkWidget *vbox28; 1632 GtkWidget *frame60; 1633 GtkWidget *alignment52; 1634 GtkWidget *hbox36; 1635 GtkWidget *scrolledwindow17; 1636 GtkWidget *clist1; 1637 GtkWidget *label104; 1638 GtkWidget *label105; 1639 GtkWidget *label106; 1640 GtkWidget *vbox29; 1641 GtkWidget *b_add; 1642 GtkWidget *b_remove; 1643 GtkWidget *b_configure; 1644 GtkWidget *b_test; 1645 GtkWidget *frame61; 1646 GtkWidget *alignment53; 1647 GtkWidget *label107; 1648 GtkWidget *frame62; 1649 GtkWidget *alignment54; 1650 GtkWidget *hbox37; 1651 GtkWidget *pixmap1; 1652 GtkWidget *label108; 1653 GtkWidget *label109; 1654 GtkWidget *vbox30; 1655 GtkWidget *frame63; 1656 GtkWidget *alignment55; 1657 GtkWidget *hbox38; 1658 GtkWidget *scrolledwindow18; 1659 GtkWidget *clist2; 1660 GtkWidget *label110; 1661 GtkWidget *label111; 1662 GtkWidget *label112; 1663 GtkWidget *vbox31; 1664 GtkWidget *bs_add; 1665 GtkWidget *bs_remove; 1666 GtkWidget *bs_configure; 1667 GtkWidget *bs_test; 1668 GtkWidget *frame64; 1669 GtkWidget *alignment56; 1670 GtkWidget *label113; 1671 GtkWidget *frame65; 1672 GtkWidget *alignment57; 1673 GtkWidget *hbox39; 1674 GtkWidget *pixmap2; 1675 GtkWidget *label114; 1676 GtkWidget *label115; 1677 GtkWidget *vbox32; 1678 GtkWidget *frame66; 1679 GtkWidget *alignment58; 1680 GtkWidget *hbox40; 1681 GtkWidget *vbox33; 1682 GtkWidget *hbox41; 1683 GtkWidget *frame67; 1684 GtkWidget *alignment59; 1685 GtkWidget *hbox42; 1686 GtkWidget *label116; 1687 GtkWidget *optionmenu1; 1688 GtkWidget *menu2; 1689 GtkWidget *hbox43; 1690 GtkWidget *scrolledwindow19; 1691 GtkWidget *clist3; 1692 GtkWidget *label117; 1693 GtkWidget *scrolledwindow20; 1694 GtkWidget *clist4; 1695 GtkWidget *label118; 1696 GtkWidget *frame68; 1697 GtkWidget *alignment60; 1698 GtkWidget *hbox44; 1699 GtkWidget *label119; 1700 GtkWidget *t_fileselected; 1701 GtkWidget *vbox34; 1702 GtkWidget *bf_add; 1703 GtkWidget *bf_remove; 1704 GtkWidget *bf_configure; 1705 GtkWidget *bf_test; 1706 GtkWidget *bf_setdir; 1707 GtkWidget *frame69; 1708 GtkWidget *alignment61; 1709 GtkWidget *frame70; 1710 GtkWidget *alignment62; 1711 GtkWidget *hbox45; 1712 GtkWidget *pixmap3; 1713 GtkWidget *label120; 1714 GtkWidget *label121; 1715 GtkWidget *hbuttonbox2; 1716 GtkWidget *b_cancel; 1717 GtkWidget *b_ok; 1718 GtkAccelGroup *accel_group; 1719 1720 if (!GTK_IS_WIDGET (hwnd)) 1721 { 1722 gtk_init (0, NULL); 1723 hwnd = gtk_window_new (GTK_WINDOW_TOPLEVEL); 1724 } 1725 1726 if (hwnd == NULL || !GTK_IS_WIDGET (hwnd)) 1727 return; 1728 1729 accel_group = gtk_accel_group_new (); 1730 1731 dsnchooser = gtk_dialog_new (); 1732 gtk_widget_set_name (dsnchooser, "dsnchooser"); 1733 gtk_widget_set_size_request (dsnchooser, 570, 420); 1734 gtk_window_set_title (GTK_WINDOW (dsnchooser), _("Select Data Source")); 1735 gtk_window_set_position (GTK_WINDOW (dsnchooser), GTK_WIN_POS_CENTER); 1736 gtk_window_set_modal (GTK_WINDOW (dsnchooser), TRUE); 1737 gtk_window_set_default_size (GTK_WINDOW (dsnchooser), 600, 450); 1738 gtk_window_set_type_hint (GTK_WINDOW (dsnchooser), GDK_WINDOW_TYPE_HINT_DIALOG); 1739 1740 #if GTK_CHECK_VERSION(2,0,0) 1741 gtk_widget_show (dsnchooser); 1742 #endif 1743 1744 vbox27 = GTK_DIALOG (dsnchooser)->vbox; 1745 gtk_widget_set_name (vbox27, "vbox27"); 1746 gtk_widget_show (vbox27); 1747 1748 notebook1 = gtk_notebook_new (); 1749 gtk_widget_set_name (notebook1, "notebook1"); 1750 gtk_widget_show (notebook1); 1751 gtk_box_pack_start (GTK_BOX (vbox27), notebook1, TRUE, TRUE, 0); 1752 1753 vbox28 = gtk_vbox_new (FALSE, 0); 1754 gtk_widget_set_name (vbox28, "vbox28"); 1755 gtk_widget_show (vbox28); 1756 gtk_container_add (GTK_CONTAINER (notebook1), vbox28); 1757 1758 frame60 = gtk_frame_new (NULL); 1759 gtk_widget_set_name (frame60, "frame60"); 1760 gtk_widget_show (frame60); 1761 gtk_box_pack_start (GTK_BOX (vbox28), frame60, TRUE, TRUE, 0); 1762 gtk_frame_set_shadow_type (GTK_FRAME (frame60), GTK_SHADOW_NONE); 1763 1764 alignment52 = gtk_alignment_new (0.5, 0.5, 1, 1); 1765 gtk_widget_set_name (alignment52, "alignment52"); 1766 gtk_widget_show (alignment52); 1767 gtk_container_add (GTK_CONTAINER (frame60), alignment52); 1768 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment52), 0, 0, 4, 0); 1769 1770 hbox36 = gtk_hbox_new (FALSE, 0); 1771 gtk_widget_set_name (hbox36, "hbox36"); 1772 gtk_widget_show (hbox36); 1773 gtk_container_add (GTK_CONTAINER (alignment52), hbox36); 1774 1775 scrolledwindow17 = gtk_scrolled_window_new (NULL, NULL); 1776 gtk_widget_set_name (scrolledwindow17, "scrolledwindow17"); 1777 gtk_widget_show (scrolledwindow17); 1778 gtk_box_pack_start (GTK_BOX (hbox36), scrolledwindow17, TRUE, TRUE, 0); 1779 gtk_widget_set_size_request (scrolledwindow17, 440, 219); 1780 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow17), GTK_SHADOW_IN); 1781 1782 clist1 = gtk_clist_new (3); 1783 gtk_widget_set_name (clist1, "clist1"); 1784 gtk_widget_show (clist1); 1785 gtk_container_add (GTK_CONTAINER (scrolledwindow17), clist1); 1786 gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 100); 1787 gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 162); 1788 gtk_clist_set_column_width (GTK_CLIST (clist1), 2, 80); 1789 gtk_clist_column_titles_show (GTK_CLIST (clist1)); 1790 1791 label104 = gtk_label_new (_("Name")); 1792 gtk_widget_set_name (label104, "label104"); 1793 gtk_widget_show (label104); 1794 gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, label104); 1795 gtk_widget_set_size_request (label104, 100, -1); 1796 1797 label105 = gtk_label_new (_("Description")); 1798 gtk_widget_set_name (label105, "label105"); 1799 gtk_widget_show (label105); 1800 gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, label105); 1801 gtk_widget_set_size_request (label105, 162, -1); 1802 1803 label106 = gtk_label_new (_("Driver")); 1804 gtk_widget_set_name (label106, "label106"); 1805 gtk_widget_show (label106); 1806 gtk_clist_set_column_widget (GTK_CLIST (clist1), 2, label106); 1807 gtk_widget_set_size_request (label106, 80, -1); 1808 1809 vbox29 = gtk_vbox_new (FALSE, 0); 1810 gtk_widget_set_name (vbox29, "vbox29"); 1811 gtk_widget_show (vbox29); 1812 gtk_box_pack_start (GTK_BOX (hbox36), vbox29, FALSE, TRUE, 0); 1813 1814 b_add = gtk_button_new_from_stock ("gtk-add"); 1815 gtk_widget_set_name (b_add, "b_add"); 1816 gtk_widget_show (b_add); 1817 gtk_box_pack_start (GTK_BOX (vbox29), b_add, FALSE, TRUE, 0); 1818 gtk_container_set_border_width (GTK_CONTAINER (b_add), 4); 1819 GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT); 1820 gtk_widget_add_accelerator (b_add, "clicked", accel_group, 1821 GDK_A, (GdkModifierType) GDK_MOD1_MASK, 1822 GTK_ACCEL_VISIBLE); 1823 1824 b_remove = gtk_button_new_from_stock ("gtk-remove"); 1825 gtk_widget_set_name (b_remove, "b_remove"); 1826 gtk_widget_show (b_remove); 1827 gtk_box_pack_start (GTK_BOX (vbox29), b_remove, FALSE, TRUE, 0); 1828 gtk_container_set_border_width (GTK_CONTAINER (b_remove), 4); 1829 gtk_widget_set_sensitive (b_remove, FALSE); 1830 GTK_WIDGET_SET_FLAGS (b_remove, GTK_CAN_DEFAULT); 1831 gtk_widget_add_accelerator (b_remove, "clicked", accel_group, 1832 GDK_R, (GdkModifierType) GDK_MOD1_MASK, 1833 GTK_ACCEL_VISIBLE); 1834 1835 b_configure = gtk_button_new_with_mnemonic (_("Confi_gure")); 1836 gtk_widget_set_name (b_configure, "b_configure"); 1837 gtk_widget_show (b_configure); 1838 gtk_box_pack_start (GTK_BOX (vbox29), b_configure, FALSE, TRUE, 0); 1839 gtk_container_set_border_width (GTK_CONTAINER (b_configure), 4); 1840 gtk_widget_set_sensitive (b_configure, FALSE); 1841 GTK_WIDGET_SET_FLAGS (b_configure, GTK_CAN_DEFAULT); 1842 gtk_widget_add_accelerator (b_configure, "clicked", accel_group, 1843 GDK_G, (GdkModifierType) GDK_MOD1_MASK, 1844 GTK_ACCEL_VISIBLE); 1845 gtk_widget_add_accelerator (b_configure, "clicked", accel_group, 1846 GDK_g, (GdkModifierType) GDK_MOD1_MASK, 1847 GTK_ACCEL_VISIBLE); 1848 1849 b_test = gtk_button_new_with_mnemonic (_("_Test")); 1850 gtk_widget_set_name (b_test, "b_test"); 1851 gtk_widget_show (b_test); 1852 gtk_box_pack_start (GTK_BOX (vbox29), b_test, FALSE, TRUE, 0); 1853 gtk_container_set_border_width (GTK_CONTAINER (b_test), 4); 1854 gtk_widget_set_sensitive (b_test, FALSE); 1855 GTK_WIDGET_SET_FLAGS (b_test, GTK_CAN_DEFAULT); 1856 gtk_widget_add_accelerator (b_test, "clicked", accel_group, 1857 GDK_T, (GdkModifierType) GDK_MOD1_MASK, 1858 GTK_ACCEL_VISIBLE); 1859 1860 frame61 = gtk_frame_new (NULL); 1861 gtk_widget_set_name (frame61, "frame61"); 1862 gtk_widget_show (frame61); 1863 gtk_box_pack_start (GTK_BOX (vbox29), frame61, TRUE, TRUE, 0); 1864 gtk_widget_set_size_request (frame61, -1, 80); 1865 gtk_frame_set_shadow_type (GTK_FRAME (frame61), GTK_SHADOW_NONE); 1866 1867 alignment53 = gtk_alignment_new (0.5, 0.5, 1, 1); 1868 gtk_widget_set_name (alignment53, "alignment53"); 1869 gtk_widget_show (alignment53); 1870 gtk_container_add (GTK_CONTAINER (frame61), alignment53); 1871 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment53), 0, 0, 12, 0); 1872 1873 label107 = gtk_label_new (_(" User Data Sources:")); 1874 gtk_widget_set_name (label107, "label107"); 1875 gtk_widget_show (label107); 1876 gtk_frame_set_label_widget (GTK_FRAME (frame60), label107); 1877 gtk_label_set_use_markup (GTK_LABEL (label107), TRUE); 1878 1879 frame62 = gtk_frame_new (NULL); 1880 gtk_widget_set_name (frame62, "frame62"); 1881 gtk_widget_show (frame62); 1882 gtk_box_pack_start (GTK_BOX (vbox28), frame62, FALSE, TRUE, 0); 1883 gtk_container_set_border_width (GTK_CONTAINER (frame62), 3); 1884 1885 alignment54 = gtk_alignment_new (0.5, 0.5, 1, 1); 1886 gtk_widget_set_name (alignment54, "alignment54"); 1887 gtk_widget_show (alignment54); 1888 gtk_container_add (GTK_CONTAINER (frame62), alignment54); 1889 1890 hbox37 = gtk_hbox_new (FALSE, 0); 1891 gtk_widget_set_name (hbox37, "hbox37"); 1892 gtk_widget_show (hbox37); 1893 gtk_container_add (GTK_CONTAINER (alignment54), hbox37); 1894 1895 #if GTK_CHECK_VERSION(2,0,0) 1896 style = gtk_widget_get_style (dsnchooser); 1897 pixmap = 1898 gdk_pixmap_create_from_xpm_d (dsnchooser->window, &mask, 1899 &style->bg[GTK_STATE_NORMAL], (gchar **) odbc4_xpm); 1900 #else 1901 style = gtk_widget_get_style (GTK_WIDGET (hwnd)); 1902 pixmap = 1903 gdk_pixmap_create_from_xpm_d (GTK_WIDGET (hwnd)->window, &mask, 1904 &style->bg[GTK_STATE_NORMAL], (gchar **) odbc4_xpm); 1905 #endif 1906 1907 pixmap1 = gtk_pixmap_new (pixmap, mask); 1908 gtk_widget_set_name (pixmap1, "pixmap1"); 1909 gtk_widget_show (pixmap1); 1910 gtk_box_pack_start (GTK_BOX (hbox37), pixmap1, FALSE, TRUE, 10); 1911 1912 label108 = gtk_label_new (_("An ODBC User data source stores information about to connect to\nthe indicated data provider. A User data source is only available to you,\nand can only be used on the current machine.")); 1913 gtk_widget_set_name (label108, "label108"); 1914 gtk_widget_show (label108); 1915 gtk_box_pack_start (GTK_BOX (hbox37), label108, FALSE, TRUE, 0); 1916 gtk_label_set_justify (GTK_LABEL (label108), GTK_JUSTIFY_FILL); 1917 1918 label109 = gtk_label_new (_("User DSN")); 1919 gtk_widget_set_name (label109, "label109"); 1920 gtk_widget_show (label109); 1921 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label109); 1922 1923 1924 choose_t->uadd = b_add; 1925 choose_t->uremove = b_remove; 1926 choose_t->utest = b_test; 1927 choose_t->uconfigure = b_configure; 1928 1929 1930 1931 vbox30 = gtk_vbox_new (FALSE, 0); 1932 gtk_widget_set_name (vbox30, "vbox30"); 1933 gtk_widget_show (vbox30); 1934 gtk_container_add (GTK_CONTAINER (notebook1), vbox30); 1935 1936 frame63 = gtk_frame_new (NULL); 1937 gtk_widget_set_name (frame63, "frame63"); 1938 gtk_widget_show (frame63); 1939 gtk_box_pack_start (GTK_BOX (vbox30), frame63, TRUE, TRUE, 0); 1940 gtk_frame_set_shadow_type (GTK_FRAME (frame63), GTK_SHADOW_NONE); 1941 1942 alignment55 = gtk_alignment_new (0.5, 0.5, 1, 1); 1943 gtk_widget_set_name (alignment55, "alignment55"); 1944 gtk_widget_show (alignment55); 1945 gtk_container_add (GTK_CONTAINER (frame63), alignment55); 1946 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment55), 0, 0, 4, 0); 1947 1948 hbox38 = gtk_hbox_new (FALSE, 0); 1949 gtk_widget_set_name (hbox38, "hbox38"); 1950 gtk_widget_show (hbox38); 1951 gtk_container_add (GTK_CONTAINER (alignment55), hbox38); 1952 1953 scrolledwindow18 = gtk_scrolled_window_new (NULL, NULL); 1954 gtk_widget_set_name (scrolledwindow18, "scrolledwindow18"); 1955 gtk_widget_show (scrolledwindow18); 1956 gtk_box_pack_start (GTK_BOX (hbox38), scrolledwindow18, TRUE, TRUE, 0); 1957 gtk_widget_set_size_request (scrolledwindow18, 440, 219); 1958 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow18), GTK_SHADOW_IN); 1959 1960 clist2 = gtk_clist_new (3); 1961 gtk_widget_set_name (clist2, "clist2"); 1962 gtk_widget_show (clist2); 1963 gtk_container_add (GTK_CONTAINER (scrolledwindow18), clist2); 1964 gtk_clist_set_column_width (GTK_CLIST (clist2), 0, 100); 1965 gtk_clist_set_column_width (GTK_CLIST (clist2), 1, 163); 1966 gtk_clist_set_column_width (GTK_CLIST (clist2), 2, 80); 1967 gtk_clist_column_titles_show (GTK_CLIST (clist2)); 1968 1969 label110 = gtk_label_new (_("Name")); 1970 gtk_widget_set_name (label110, "label110"); 1971 gtk_widget_show (label110); 1972 gtk_clist_set_column_widget (GTK_CLIST (clist2), 0, label110); 1973 gtk_widget_set_size_request (label110, 100, -1); 1974 1975 label111 = gtk_label_new (_("Description")); 1976 gtk_widget_set_name (label111, "label111"); 1977 gtk_widget_show (label111); 1978 gtk_clist_set_column_widget (GTK_CLIST (clist2), 1, label111); 1979 gtk_widget_set_size_request (label111, 162, -1); 1980 1981 label112 = gtk_label_new (_("Driver")); 1982 gtk_widget_set_name (label112, "label112"); 1983 gtk_widget_show (label112); 1984 gtk_clist_set_column_widget (GTK_CLIST (clist2), 2, label112); 1985 gtk_widget_set_size_request (label112, 80, -1); 1986 1987 vbox31 = gtk_vbox_new (FALSE, 0); 1988 gtk_widget_set_name (vbox31, "vbox31"); 1989 gtk_widget_show (vbox31); 1990 gtk_box_pack_start (GTK_BOX (hbox38), vbox31, FALSE, TRUE, 0); 1991 1992 bs_add = gtk_button_new_from_stock ("gtk-add"); 1993 gtk_widget_set_name (bs_add, "bs_add"); 1994 gtk_widget_show (bs_add); 1995 gtk_box_pack_start (GTK_BOX (vbox31), bs_add, FALSE, TRUE, 0); 1996 gtk_container_set_border_width (GTK_CONTAINER (bs_add), 4); 1997 GTK_WIDGET_SET_FLAGS (bs_add, GTK_CAN_DEFAULT); 1998 gtk_widget_add_accelerator (bs_add, "clicked", accel_group, 1999 GDK_A, (GdkModifierType) GDK_MOD1_MASK, 2000 GTK_ACCEL_VISIBLE); 2001 2002 bs_remove = gtk_button_new_from_stock ("gtk-remove"); 2003 gtk_widget_set_name (bs_remove, "bs_remove"); 2004 gtk_widget_show (bs_remove); 2005 gtk_box_pack_start (GTK_BOX (vbox31), bs_remove, FALSE, TRUE, 0); 2006 gtk_container_set_border_width (GTK_CONTAINER (bs_remove), 4); 2007 gtk_widget_set_sensitive (bs_remove, FALSE); 2008 GTK_WIDGET_SET_FLAGS (bs_remove, GTK_CAN_DEFAULT); 2009 gtk_widget_add_accelerator (bs_remove, "clicked", accel_group, 2010 GDK_R, (GdkModifierType) GDK_MOD1_MASK, 2011 GTK_ACCEL_VISIBLE); 2012 2013 bs_configure = gtk_button_new_with_mnemonic (_("Confi_gure")); 2014 gtk_widget_set_name (bs_configure, "bs_configure"); 2015 gtk_widget_show (bs_configure); 2016 gtk_box_pack_start (GTK_BOX (vbox31), bs_configure, FALSE, TRUE, 0); 2017 gtk_container_set_border_width (GTK_CONTAINER (bs_configure), 4); 2018 gtk_widget_set_sensitive (bs_configure, FALSE); 2019 GTK_WIDGET_SET_FLAGS (bs_configure, GTK_CAN_DEFAULT); 2020 gtk_widget_add_accelerator (bs_configure, "clicked", accel_group, 2021 GDK_G, (GdkModifierType) GDK_MOD1_MASK, 2022 GTK_ACCEL_VISIBLE); 2023 gtk_widget_add_accelerator (bs_configure, "clicked", accel_group, 2024 GDK_g, (GdkModifierType) GDK_MOD1_MASK, 2025 GTK_ACCEL_VISIBLE); 2026 2027 bs_test = gtk_button_new_with_mnemonic (_("_Test")); 2028 gtk_widget_set_name (bs_test, "bs_test"); 2029 gtk_widget_show (bs_test); 2030 gtk_box_pack_start (GTK_BOX (vbox31), bs_test, FALSE, TRUE, 0); 2031 gtk_container_set_border_width (GTK_CONTAINER (bs_test), 4); 2032 gtk_widget_set_sensitive (bs_test, FALSE); 2033 GTK_WIDGET_SET_FLAGS (bs_test, GTK_CAN_DEFAULT); 2034 gtk_widget_add_accelerator (bs_test, "clicked", accel_group, 2035 GDK_T, (GdkModifierType) GDK_MOD1_MASK, 2036 GTK_ACCEL_VISIBLE); 2037 2038 frame64 = gtk_frame_new (NULL); 2039 gtk_widget_set_name (frame64, "frame64"); 2040 gtk_widget_show (frame64); 2041 gtk_box_pack_start (GTK_BOX (vbox31), frame64, TRUE, TRUE, 0); 2042 gtk_widget_set_size_request (frame64, -1, 80); 2043 gtk_frame_set_shadow_type (GTK_FRAME (frame64), GTK_SHADOW_NONE); 2044 2045 alignment56 = gtk_alignment_new (0.5, 0.5, 1, 1); 2046 gtk_widget_set_name (alignment56, "alignment56"); 2047 gtk_widget_show (alignment56); 2048 gtk_container_add (GTK_CONTAINER (frame64), alignment56); 2049 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment56), 0, 0, 12, 0); 2050 2051 label113 = gtk_label_new (_(" System Data Sources:")); 2052 gtk_widget_set_name (label113, "label113"); 2053 gtk_widget_show (label113); 2054 gtk_frame_set_label_widget (GTK_FRAME (frame63), label113); 2055 gtk_label_set_use_markup (GTK_LABEL (label113), TRUE); 2056 2057 frame65 = gtk_frame_new (NULL); 2058 gtk_widget_set_name (frame65, "frame65"); 2059 gtk_widget_show (frame65); 2060 gtk_box_pack_start (GTK_BOX (vbox30), frame65, FALSE, TRUE, 0); 2061 gtk_container_set_border_width (GTK_CONTAINER (frame65), 3); 2062 2063 alignment57 = gtk_alignment_new (0.5, 0.5, 1, 1); 2064 gtk_widget_set_name (alignment57, "alignment57"); 2065 gtk_widget_show (alignment57); 2066 gtk_container_add (GTK_CONTAINER (frame65), alignment57); 2067 2068 hbox39 = gtk_hbox_new (FALSE, 0); 2069 gtk_widget_set_name (hbox39, "hbox39"); 2070 gtk_widget_show (hbox39); 2071 gtk_container_add (GTK_CONTAINER (alignment57), hbox39); 2072 gtk_container_set_border_width (GTK_CONTAINER (hbox39), 10); 2073 2074 pixmap2 = gtk_pixmap_new (pixmap, mask); 2075 gtk_widget_set_name (pixmap2, "pixmap2"); 2076 gtk_widget_show (pixmap2); 2077 gtk_box_pack_start (GTK_BOX (hbox39), pixmap2, FALSE, TRUE, 10); 2078 2079 label114 = gtk_label_new (_("An ODBC System data source stores information about to connect to\nthe indicated data provider. A System data source is visible to all\nusers on this machine, including daemons.")); 2080 gtk_widget_set_name (label114, "label114"); 2081 gtk_widget_show (label114); 2082 gtk_box_pack_start (GTK_BOX (hbox39), label114, FALSE, TRUE, 0); 2083 gtk_label_set_justify (GTK_LABEL (label114), GTK_JUSTIFY_FILL); 2084 2085 label115 = gtk_label_new (_("System DSN")); 2086 gtk_widget_set_name (label115, "label115"); 2087 gtk_widget_show (label115); 2088 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label115); 2089 2090 2091 2092 choose_t->sadd = bs_add; 2093 choose_t->sremove = bs_remove; 2094 choose_t->stest = bs_test; 2095 choose_t->sconfigure = bs_configure; 2096 2097 2098 2099 vbox32 = gtk_vbox_new (FALSE, 0); 2100 gtk_widget_set_name (vbox32, "vbox32"); 2101 gtk_widget_show (vbox32); 2102 gtk_container_add (GTK_CONTAINER (notebook1), vbox32); 2103 2104 frame66 = gtk_frame_new (NULL); 2105 gtk_widget_set_name (frame66, "frame66"); 2106 gtk_widget_show (frame66); 2107 gtk_box_pack_start (GTK_BOX (vbox32), frame66, TRUE, TRUE, 0); 2108 gtk_container_set_border_width (GTK_CONTAINER (frame66), 2); 2109 gtk_frame_set_shadow_type (GTK_FRAME (frame66), GTK_SHADOW_NONE); 2110 2111 alignment58 = gtk_alignment_new (0.5, 0.5, 1, 1); 2112 gtk_widget_set_name (alignment58, "alignment58"); 2113 gtk_widget_show (alignment58); 2114 gtk_container_add (GTK_CONTAINER (frame66), alignment58); 2115 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment58), 0, 0, 4, 0); 2116 2117 hbox40 = gtk_hbox_new (FALSE, 0); 2118 gtk_widget_set_name (hbox40, "hbox40"); 2119 gtk_widget_show (hbox40); 2120 gtk_container_add (GTK_CONTAINER (alignment58), hbox40); 2121 2122 vbox33 = gtk_vbox_new (FALSE, 0); 2123 gtk_widget_set_name (vbox33, "vbox33"); 2124 gtk_widget_show (vbox33); 2125 gtk_box_pack_start (GTK_BOX (hbox40), vbox33, TRUE, TRUE, 0); 2126 gtk_widget_set_size_request (vbox33, 436, 250); 2127 2128 hbox41 = gtk_hbox_new (FALSE, 0); 2129 gtk_widget_set_name (hbox41, "hbox41"); 2130 gtk_widget_show (hbox41); 2131 gtk_box_pack_start (GTK_BOX (vbox33), hbox41, FALSE, FALSE, 0); 2132 2133 frame67 = gtk_frame_new (NULL); 2134 gtk_widget_set_name (frame67, "frame67"); 2135 gtk_widget_show (frame67); 2136 gtk_box_pack_start (GTK_BOX (hbox41), frame67, TRUE, TRUE, 0); 2137 gtk_container_set_border_width (GTK_CONTAINER (frame67), 4); 2138 gtk_frame_set_shadow_type (GTK_FRAME (frame67), GTK_SHADOW_NONE); 2139 2140 alignment59 = gtk_alignment_new (0.5, 0.5, 1, 1); 2141 gtk_widget_set_name (alignment59, "alignment59"); 2142 gtk_widget_show (alignment59); 2143 gtk_container_add (GTK_CONTAINER (frame67), alignment59); 2144 gtk_container_set_border_width (GTK_CONTAINER (alignment59), 2); 2145 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment59), 0, 0, 6, 0); 2146 2147 hbox42 = gtk_hbox_new (FALSE, 0); 2148 gtk_widget_set_name (hbox42, "hbox42"); 2149 gtk_widget_show (hbox42); 2150 gtk_container_add (GTK_CONTAINER (alignment59), hbox42); 2151 2152 label116 = gtk_label_new (_("Look in : ")); 2153 gtk_widget_set_name (label116, "label116"); 2154 gtk_widget_show (label116); 2155 gtk_box_pack_start (GTK_BOX (hbox42), label116, FALSE, FALSE, 0); 2156 2157 optionmenu1 = gtk_option_menu_new (); 2158 gtk_widget_set_name (optionmenu1, "optionmenu1"); 2159 gtk_widget_show (optionmenu1); 2160 gtk_box_pack_start (GTK_BOX (hbox42), optionmenu1, TRUE, TRUE, 0); 2161 2162 menu2 = gtk_menu_new (); 2163 gtk_widget_set_name (menu2, "menu2"); 2164 2165 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), menu2); 2166 2167 hbox43 = gtk_hbox_new (FALSE, 0); 2168 gtk_widget_set_name (hbox43, "hbox43"); 2169 gtk_widget_show (hbox43); 2170 gtk_box_pack_start (GTK_BOX (vbox33), hbox43, TRUE, TRUE, 0); 2171 2172 scrolledwindow19 = gtk_scrolled_window_new (NULL, NULL); 2173 gtk_widget_set_name (scrolledwindow19, "scrolledwindow19"); 2174 gtk_widget_show (scrolledwindow19); 2175 gtk_box_pack_start (GTK_BOX (hbox43), scrolledwindow19, TRUE, TRUE, 0); 2176 gtk_widget_set_size_request (scrolledwindow19, 96, -1); 2177 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow19), 4); 2178 2179 clist3 = gtk_clist_new (1); 2180 gtk_widget_set_name (clist3, "clist3"); 2181 gtk_widget_show (clist3); 2182 gtk_container_add (GTK_CONTAINER (scrolledwindow19), clist3); 2183 gtk_clist_set_column_width (GTK_CLIST (clist3), 0, 80); 2184 gtk_clist_column_titles_show (GTK_CLIST (clist3)); 2185 2186 label117 = gtk_label_new (_("Directories")); 2187 gtk_widget_set_name (label117, "label117"); 2188 gtk_widget_show (label117); 2189 gtk_clist_set_column_widget (GTK_CLIST (clist3), 0, label117); 2190 2191 scrolledwindow20 = gtk_scrolled_window_new (NULL, NULL); 2192 gtk_widget_set_name (scrolledwindow20, "scrolledwindow20"); 2193 gtk_widget_show (scrolledwindow20); 2194 gtk_box_pack_start (GTK_BOX (hbox43), scrolledwindow20, TRUE, TRUE, 0); 2195 gtk_widget_set_size_request (scrolledwindow20, 102, -1); 2196 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow20), 4); 2197 2198 clist4 = gtk_clist_new (1); 2199 gtk_widget_set_name (clist4, "clist4"); 2200 gtk_widget_show (clist4); 2201 gtk_container_add (GTK_CONTAINER (scrolledwindow20), clist4); 2202 gtk_clist_set_column_width (GTK_CLIST (clist4), 0, 80); 2203 gtk_clist_column_titles_show (GTK_CLIST (clist4)); 2204 2205 label118 = gtk_label_new (_("Files")); 2206 gtk_widget_set_name (label118, "label118"); 2207 gtk_widget_show (label118); 2208 gtk_clist_set_column_widget (GTK_CLIST (clist4), 0, label118); 2209 2210 frame68 = gtk_frame_new (NULL); 2211 gtk_widget_set_name (frame68, "frame68"); 2212 gtk_widget_show (frame68); 2213 gtk_box_pack_start (GTK_BOX (vbox33), frame68, FALSE, TRUE, 0); 2214 gtk_container_set_border_width (GTK_CONTAINER (frame68), 4); 2215 gtk_frame_set_shadow_type (GTK_FRAME (frame68), GTK_SHADOW_NONE); 2216 2217 alignment60 = gtk_alignment_new (0.5, 0.5, 1, 1); 2218 gtk_widget_set_name (alignment60, "alignment60"); 2219 gtk_widget_show (alignment60); 2220 gtk_container_add (GTK_CONTAINER (frame68), alignment60); 2221 gtk_container_set_border_width (GTK_CONTAINER (alignment60), 2); 2222 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment60), 0, 0, 6, 0); 2223 2224 hbox44 = gtk_hbox_new (FALSE, 0); 2225 gtk_widget_set_name (hbox44, "hbox44"); 2226 gtk_widget_show (hbox44); 2227 gtk_container_add (GTK_CONTAINER (alignment60), hbox44); 2228 2229 label119 = gtk_label_new (_("File selected:")); 2230 gtk_widget_set_name (label119, "label119"); 2231 gtk_widget_show (label119); 2232 gtk_box_pack_start (GTK_BOX (hbox44), label119, FALSE, FALSE, 0); 2233 2234 t_fileselected = gtk_entry_new (); 2235 gtk_widget_set_name (t_fileselected, "t_fileselected"); 2236 gtk_widget_show (t_fileselected); 2237 gtk_box_pack_start (GTK_BOX (hbox44), t_fileselected, TRUE, TRUE, 0); 2238 2239 vbox34 = gtk_vbox_new (FALSE, 0); 2240 gtk_widget_set_name (vbox34, "vbox34"); 2241 gtk_widget_show (vbox34); 2242 gtk_box_pack_start (GTK_BOX (hbox40), vbox34, FALSE, TRUE, 0); 2243 2244 bf_add = gtk_button_new_from_stock ("gtk-add"); 2245 gtk_widget_set_name (bf_add, "bf_add"); 2246 gtk_widget_show (bf_add); 2247 gtk_box_pack_start (GTK_BOX (vbox34), bf_add, FALSE, TRUE, 0); 2248 gtk_container_set_border_width (GTK_CONTAINER (bf_add), 4); 2249 GTK_WIDGET_SET_FLAGS (bf_add, GTK_CAN_DEFAULT); 2250 gtk_widget_add_accelerator (bf_add, "clicked", accel_group, 2251 GDK_A, (GdkModifierType) GDK_MOD1_MASK, 2252 GTK_ACCEL_VISIBLE); 2253 2254 bf_remove = gtk_button_new_from_stock ("gtk-remove"); 2255 gtk_widget_set_name (bf_remove, "bf_remove"); 2256 gtk_widget_show (bf_remove); 2257 gtk_box_pack_start (GTK_BOX (vbox34), bf_remove, FALSE, TRUE, 0); 2258 gtk_container_set_border_width (GTK_CONTAINER (bf_remove), 4); 2259 GTK_WIDGET_SET_FLAGS (bf_remove, GTK_CAN_DEFAULT); 2260 gtk_widget_add_accelerator (bf_remove, "clicked", accel_group, 2261 GDK_R, (GdkModifierType) GDK_MOD1_MASK, 2262 GTK_ACCEL_VISIBLE); 2263 2264 bf_configure = gtk_button_new_with_mnemonic (_("Confi_gure")); 2265 gtk_widget_set_name (bf_configure, "bf_configure"); 2266 gtk_widget_show (bf_configure); 2267 gtk_box_pack_start (GTK_BOX (vbox34), bf_configure, FALSE, TRUE, 0); 2268 gtk_container_set_border_width (GTK_CONTAINER (bf_configure), 4); 2269 GTK_WIDGET_SET_FLAGS (bf_configure, GTK_CAN_DEFAULT); 2270 gtk_widget_add_accelerator (bf_configure, "clicked", accel_group, 2271 GDK_G, (GdkModifierType) GDK_MOD1_MASK, 2272 GTK_ACCEL_VISIBLE); 2273 gtk_widget_add_accelerator (bf_configure, "clicked", accel_group, 2274 GDK_g, (GdkModifierType) GDK_MOD1_MASK, 2275 GTK_ACCEL_VISIBLE); 2276 2277 bf_test = gtk_button_new_with_mnemonic (_("_Test")); 2278 gtk_widget_set_name (bf_test, "bf_test"); 2279 gtk_widget_show (bf_test); 2280 gtk_box_pack_start (GTK_BOX (vbox34), bf_test, FALSE, TRUE, 0); 2281 gtk_container_set_border_width (GTK_CONTAINER (bf_test), 4); 2282 GTK_WIDGET_SET_FLAGS (bf_test, GTK_CAN_DEFAULT); 2283 gtk_widget_add_accelerator (bf_test, "clicked", accel_group, 2284 GDK_T, (GdkModifierType) GDK_MOD1_MASK, 2285 GTK_ACCEL_VISIBLE); 2286 2287 bf_setdir = gtk_button_new_with_mnemonic (_("_Set Dir")); 2288 gtk_widget_set_name (bf_setdir, "bf_setdir"); 2289 gtk_widget_show (bf_setdir); 2290 gtk_box_pack_start (GTK_BOX (vbox34), bf_setdir, FALSE, TRUE, 0); 2291 gtk_container_set_border_width (GTK_CONTAINER (bf_setdir), 4); 2292 GTK_WIDGET_SET_FLAGS (bf_setdir, GTK_CAN_DEFAULT); 2293 gtk_widget_add_accelerator (bf_setdir, "clicked", accel_group, 2294 GDK_S, (GdkModifierType) GDK_MOD1_MASK, 2295 GTK_ACCEL_VISIBLE); 2296 2297 frame69 = gtk_frame_new (NULL); 2298 gtk_widget_set_name (frame69, "frame69"); 2299 gtk_widget_show (frame69); 2300 gtk_box_pack_start (GTK_BOX (vbox34), frame69, TRUE, TRUE, 0); 2301 gtk_widget_set_size_request (frame69, -1, 80); 2302 gtk_frame_set_shadow_type (GTK_FRAME (frame69), GTK_SHADOW_NONE); 2303 2304 alignment61 = gtk_alignment_new (0.5, 0.5, 1, 1); 2305 gtk_widget_set_name (alignment61, "alignment61"); 2306 gtk_widget_show (alignment61); 2307 gtk_container_add (GTK_CONTAINER (frame69), alignment61); 2308 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment61), 0, 0, 12, 0); 2309 2310 frame70 = gtk_frame_new (NULL); 2311 gtk_widget_set_name (frame70, "frame70"); 2312 gtk_widget_show (frame70); 2313 gtk_box_pack_start (GTK_BOX (vbox32), frame70, FALSE, TRUE, 0); 2314 gtk_container_set_border_width (GTK_CONTAINER (frame70), 3); 2315 2316 alignment62 = gtk_alignment_new (0.5, 0.5, 1, 1); 2317 gtk_widget_set_name (alignment62, "alignment62"); 2318 gtk_widget_show (alignment62); 2319 gtk_container_add (GTK_CONTAINER (frame70), alignment62); 2320 2321 hbox45 = gtk_hbox_new (FALSE, 0); 2322 gtk_widget_set_name (hbox45, "hbox45"); 2323 gtk_widget_show (hbox45); 2324 gtk_container_add (GTK_CONTAINER (alignment62), hbox45); 2325 gtk_container_set_border_width (GTK_CONTAINER (hbox45), 10); 2326 2327 pixmap3 = gtk_pixmap_new (pixmap, mask); 2328 gtk_widget_set_name (pixmap3, "pixmap3"); 2329 gtk_widget_show (pixmap3); 2330 gtk_box_pack_start (GTK_BOX (hbox45), pixmap3, FALSE, TRUE, 10); 2331 2332 label120 = gtk_label_new (_("Select the file data source that describes the driver that you wish to\nconnect to. You can use any file data source that refers to an ODBC\ndriver which is installed on your machine.")); 2333 gtk_widget_set_name (label120, "label120"); 2334 gtk_widget_show (label120); 2335 gtk_box_pack_start (GTK_BOX (hbox45), label120, FALSE, TRUE, 0); 2336 gtk_label_set_justify (GTK_LABEL (label120), GTK_JUSTIFY_FILL); 2337 2338 label121 = gtk_label_new (_("File DSN")); 2339 gtk_widget_set_name (label121, "label121"); 2340 gtk_widget_show (label121); 2341 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label121); 2342 2343 2344 2345 choose_t->fadd = bf_add; 2346 choose_t->fremove = bf_remove; 2347 choose_t->fconfigure = bf_configure; 2348 choose_t->ftest = bf_test; 2349 choose_t->dir_list = clist3; 2350 choose_t->dir_combo = optionmenu1; 2351 choose_t->file_list = clist4; 2352 choose_t->file_entry = t_fileselected; 2353 choose_t->fsetdir = bf_setdir; 2354 2355 2356 hbuttonbox2 = GTK_DIALOG (dsnchooser)->action_area; 2357 gtk_widget_set_name (hbuttonbox2, "hbuttonbox2"); 2358 gtk_widget_show (hbuttonbox2); 2359 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_END); 2360 2361 b_cancel = gtk_button_new_from_stock ("gtk-cancel"); 2362 gtk_widget_set_name (b_cancel, "b_cancel"); 2363 gtk_widget_show (b_cancel); 2364 gtk_dialog_add_action_widget (GTK_DIALOG (dsnchooser), b_cancel, GTK_RESPONSE_CANCEL); 2365 GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT); 2366 2367 b_ok = gtk_button_new_from_stock ("gtk-ok"); 2368 gtk_widget_set_name (b_ok, "b_ok"); 2369 gtk_widget_show (b_ok); 2370 gtk_dialog_add_action_widget (GTK_DIALOG (dsnchooser), b_ok, GTK_RESPONSE_OK); 2371 GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT); 2372 2373 /* Store pointers to all widgets, for use by lookup_widget(). */ 2374 GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, dsnchooser, "dsnchooser"); 2375 GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, vbox27, "vbox27"); 2376 GLADE_HOOKUP_OBJECT (dsnchooser, notebook1, "notebook1"); 2377 GLADE_HOOKUP_OBJECT (dsnchooser, vbox28, "vbox28"); 2378 GLADE_HOOKUP_OBJECT (dsnchooser, frame60, "frame60"); 2379 GLADE_HOOKUP_OBJECT (dsnchooser, alignment52, "alignment52"); 2380 GLADE_HOOKUP_OBJECT (dsnchooser, hbox36, "hbox36"); 2381 GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow17, "scrolledwindow17"); 2382 GLADE_HOOKUP_OBJECT (dsnchooser, clist1, "clist1"); 2383 GLADE_HOOKUP_OBJECT (dsnchooser, label104, "label104"); 2384 GLADE_HOOKUP_OBJECT (dsnchooser, label105, "label105"); 2385 GLADE_HOOKUP_OBJECT (dsnchooser, label106, "label106"); 2386 GLADE_HOOKUP_OBJECT (dsnchooser, vbox29, "vbox29"); 2387 GLADE_HOOKUP_OBJECT (dsnchooser, b_add, "b_add"); 2388 GLADE_HOOKUP_OBJECT (dsnchooser, b_remove, "b_remove"); 2389 GLADE_HOOKUP_OBJECT (dsnchooser, b_configure, "b_configure"); 2390 GLADE_HOOKUP_OBJECT (dsnchooser, b_test, "b_test"); 2391 GLADE_HOOKUP_OBJECT (dsnchooser, frame61, "frame61"); 2392 GLADE_HOOKUP_OBJECT (dsnchooser, alignment53, "alignment53"); 2393 GLADE_HOOKUP_OBJECT (dsnchooser, label107, "label107"); 2394 GLADE_HOOKUP_OBJECT (dsnchooser, frame62, "frame62"); 2395 GLADE_HOOKUP_OBJECT (dsnchooser, alignment54, "alignment54"); 2396 GLADE_HOOKUP_OBJECT (dsnchooser, hbox37, "hbox37"); 2397 GLADE_HOOKUP_OBJECT (dsnchooser, pixmap1, "pixmap1"); 2398 GLADE_HOOKUP_OBJECT (dsnchooser, label108, "label108"); 2399 GLADE_HOOKUP_OBJECT (dsnchooser, label109, "label109"); 2400 GLADE_HOOKUP_OBJECT (dsnchooser, vbox30, "vbox30"); 2401 GLADE_HOOKUP_OBJECT (dsnchooser, frame63, "frame63"); 2402 GLADE_HOOKUP_OBJECT (dsnchooser, alignment55, "alignment55"); 2403 GLADE_HOOKUP_OBJECT (dsnchooser, hbox38, "hbox38"); 2404 GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow18, "scrolledwindow18"); 2405 GLADE_HOOKUP_OBJECT (dsnchooser, clist2, "clist2"); 2406 GLADE_HOOKUP_OBJECT (dsnchooser, label110, "label110"); 2407 GLADE_HOOKUP_OBJECT (dsnchooser, label111, "label111"); 2408 GLADE_HOOKUP_OBJECT (dsnchooser, label112, "label112"); 2409 GLADE_HOOKUP_OBJECT (dsnchooser, vbox31, "vbox31"); 2410 GLADE_HOOKUP_OBJECT (dsnchooser, bs_add, "bs_add"); 2411 GLADE_HOOKUP_OBJECT (dsnchooser, bs_remove, "bs_remove"); 2412 GLADE_HOOKUP_OBJECT (dsnchooser, bs_configure, "bs_configure"); 2413 GLADE_HOOKUP_OBJECT (dsnchooser, bs_test, "bs_test"); 2414 GLADE_HOOKUP_OBJECT (dsnchooser, frame64, "frame64"); 2415 GLADE_HOOKUP_OBJECT (dsnchooser, alignment56, "alignment56"); 2416 GLADE_HOOKUP_OBJECT (dsnchooser, label113, "label113"); 2417 GLADE_HOOKUP_OBJECT (dsnchooser, frame65, "frame65"); 2418 GLADE_HOOKUP_OBJECT (dsnchooser, alignment57, "alignment57"); 2419 GLADE_HOOKUP_OBJECT (dsnchooser, hbox39, "hbox39"); 2420 GLADE_HOOKUP_OBJECT (dsnchooser, pixmap2, "pixmap2"); 2421 GLADE_HOOKUP_OBJECT (dsnchooser, label114, "label114"); 2422 GLADE_HOOKUP_OBJECT (dsnchooser, label115, "label115"); 2423 GLADE_HOOKUP_OBJECT (dsnchooser, vbox32, "vbox32"); 2424 GLADE_HOOKUP_OBJECT (dsnchooser, frame66, "frame66"); 2425 GLADE_HOOKUP_OBJECT (dsnchooser, alignment58, "alignment58"); 2426 GLADE_HOOKUP_OBJECT (dsnchooser, hbox40, "hbox40"); 2427 GLADE_HOOKUP_OBJECT (dsnchooser, vbox33, "vbox33"); 2428 GLADE_HOOKUP_OBJECT (dsnchooser, hbox41, "hbox41"); 2429 GLADE_HOOKUP_OBJECT (dsnchooser, frame67, "frame67"); 2430 GLADE_HOOKUP_OBJECT (dsnchooser, alignment59, "alignment59"); 2431 GLADE_HOOKUP_OBJECT (dsnchooser, hbox42, "hbox42"); 2432 GLADE_HOOKUP_OBJECT (dsnchooser, label116, "label116"); 2433 GLADE_HOOKUP_OBJECT (dsnchooser, optionmenu1, "optionmenu1"); 2434 GLADE_HOOKUP_OBJECT (dsnchooser, menu2, "menu2"); 2435 GLADE_HOOKUP_OBJECT (dsnchooser, hbox43, "hbox43"); 2436 GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow19, "scrolledwindow19"); 2437 GLADE_HOOKUP_OBJECT (dsnchooser, clist3, "clist3"); 2438 GLADE_HOOKUP_OBJECT (dsnchooser, label117, "label117"); 2439 GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow20, "scrolledwindow20"); 2440 GLADE_HOOKUP_OBJECT (dsnchooser, clist4, "clist4"); 2441 GLADE_HOOKUP_OBJECT (dsnchooser, label118, "label118"); 2442 GLADE_HOOKUP_OBJECT (dsnchooser, frame68, "frame68"); 2443 GLADE_HOOKUP_OBJECT (dsnchooser, alignment60, "alignment60"); 2444 GLADE_HOOKUP_OBJECT (dsnchooser, hbox44, "hbox44"); 2445 GLADE_HOOKUP_OBJECT (dsnchooser, label119, "label119"); 2446 GLADE_HOOKUP_OBJECT (dsnchooser, t_fileselected, "t_fileselected"); 2447 GLADE_HOOKUP_OBJECT (dsnchooser, vbox34, "vbox34"); 2448 GLADE_HOOKUP_OBJECT (dsnchooser, bf_add, "bf_add"); 2449 GLADE_HOOKUP_OBJECT (dsnchooser, bf_remove, "bf_remove"); 2450 GLADE_HOOKUP_OBJECT (dsnchooser, bf_configure, "bf_configure"); 2451 GLADE_HOOKUP_OBJECT (dsnchooser, bf_test, "bf_test"); 2452 GLADE_HOOKUP_OBJECT (dsnchooser, bf_setdir, "bf_setdir"); 2453 GLADE_HOOKUP_OBJECT (dsnchooser, frame69, "frame69"); 2454 GLADE_HOOKUP_OBJECT (dsnchooser, alignment61, "alignment61"); 2455 GLADE_HOOKUP_OBJECT (dsnchooser, frame70, "frame70"); 2456 GLADE_HOOKUP_OBJECT (dsnchooser, alignment62, "alignment62"); 2457 GLADE_HOOKUP_OBJECT (dsnchooser, hbox45, "hbox45"); 2458 GLADE_HOOKUP_OBJECT (dsnchooser, pixmap3, "pixmap3"); 2459 GLADE_HOOKUP_OBJECT (dsnchooser, label120, "label120"); 2460 GLADE_HOOKUP_OBJECT (dsnchooser, label121, "label121"); 2461 GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, hbuttonbox2, "hbuttonbox2"); 2462 GLADE_HOOKUP_OBJECT (dsnchooser, b_cancel, "b_cancel"); 2463 GLADE_HOOKUP_OBJECT (dsnchooser, b_ok, "b_ok"); 2464 2465 /* Notebook events */ 2466 gtk_signal_connect_after (GTK_OBJECT (notebook1), "switch_page", 2467 GTK_SIGNAL_FUNC (dsnchooser_switch_page), choose_t); 2468 /* Ok button events */ 2469 gtk_signal_connect (GTK_OBJECT (b_ok), "clicked", 2470 GTK_SIGNAL_FUNC (dsnchooser_ok_clicked), choose_t); 2471 /* Cancel button events */ 2472 gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked", 2473 GTK_SIGNAL_FUNC (dsnchooser_cancel_clicked), choose_t); 2474 /* Close window button events */ 2475 gtk_signal_connect (GTK_OBJECT (dsnchooser), "delete_event", 2476 GTK_SIGNAL_FUNC (delete_event), choose_t); 2477 gtk_signal_connect (GTK_OBJECT (dsnchooser), "destroy", 2478 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 2479 /* Add user DSN button events */ 2480 gtk_signal_connect (GTK_OBJECT (choose_t->uadd), "clicked", 2481 GTK_SIGNAL_FUNC (userdsn_add_clicked), choose_t); 2482 /* Remove user DSN button events */ 2483 gtk_signal_connect (GTK_OBJECT (choose_t->uremove), "clicked", 2484 GTK_SIGNAL_FUNC (userdsn_remove_clicked), choose_t); 2485 /* Test user DSN button events */ 2486 gtk_signal_connect (GTK_OBJECT (choose_t->utest), "clicked", 2487 GTK_SIGNAL_FUNC (userdsn_test_clicked), choose_t); 2488 /* Configure user DSN button events */ 2489 gtk_signal_connect (GTK_OBJECT (choose_t->uconfigure), "clicked", 2490 GTK_SIGNAL_FUNC (userdsn_configure_clicked), choose_t); 2491 /* Add system DSN button events */ 2492 gtk_signal_connect (GTK_OBJECT (choose_t->sadd), "clicked", 2493 GTK_SIGNAL_FUNC (systemdsn_add_clicked), choose_t); 2494 /* Remove system DSN button events */ 2495 gtk_signal_connect (GTK_OBJECT (choose_t->sremove), "clicked", 2496 GTK_SIGNAL_FUNC (systemdsn_remove_clicked), choose_t); 2497 /* Test system DSN button events */ 2498 gtk_signal_connect (GTK_OBJECT (choose_t->stest), "clicked", 2499 GTK_SIGNAL_FUNC (systemdsn_test_clicked), choose_t); 2500 /* Configure system DSN button events */ 2501 gtk_signal_connect (GTK_OBJECT (choose_t->sconfigure), "clicked", 2502 GTK_SIGNAL_FUNC (systemdsn_configure_clicked), choose_t); 2503 /* User DSN list events */ 2504 gtk_signal_connect (GTK_OBJECT (clist1), "select_row", 2505 GTK_SIGNAL_FUNC (userdsn_list_select), choose_t); 2506 gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row", 2507 GTK_SIGNAL_FUNC (userdsn_list_unselect), choose_t); 2508 /* System DSN list events */ 2509 gtk_signal_connect (GTK_OBJECT (clist2), "select_row", 2510 GTK_SIGNAL_FUNC (systemdsn_list_select), choose_t); 2511 gtk_signal_connect (GTK_OBJECT (clist2), "unselect_row", 2512 GTK_SIGNAL_FUNC (systemdsn_list_unselect), choose_t); 2513 2514 /* Add file DSN button events */ 2515 gtk_signal_connect (GTK_OBJECT (choose_t->fadd), "clicked", 2516 GTK_SIGNAL_FUNC (filedsn_add_clicked), 2517 choose_t); 2518 /* Remove file DSN button events */ 2519 gtk_signal_connect (GTK_OBJECT (choose_t->fremove), "clicked", 2520 GTK_SIGNAL_FUNC (filedsn_remove_clicked), 2521 choose_t); 2522 /* Test file DSN button events */ 2523 gtk_signal_connect (GTK_OBJECT (choose_t->ftest), "clicked", 2524 GTK_SIGNAL_FUNC (filedsn_test_clicked), 2525 choose_t); 2526 /* Configure file DSN button events */ 2527 gtk_signal_connect (GTK_OBJECT (choose_t->fconfigure), "clicked", 2528 GTK_SIGNAL_FUNC (filedsn_configure_clicked), 2529 choose_t); 2530 /* Configure file DSN button events */ 2531 gtk_signal_connect (GTK_OBJECT (choose_t->fsetdir), "clicked", 2532 GTK_SIGNAL_FUNC (filedsn_setdir_clicked), 2533 choose_t); 2534 /* Directories file DSN list events */ 2535 gtk_signal_connect (GTK_OBJECT (clist3), "select_row", 2536 GTK_SIGNAL_FUNC (filedsn_dirlist_select), 2537 choose_t); 2538 /* Files file DSN list events */ 2539 gtk_signal_connect (GTK_OBJECT (clist4), "select_row", 2540 GTK_SIGNAL_FUNC (filedsn_filelist_select), 2541 choose_t); 2542 gtk_signal_connect (GTK_OBJECT (clist4), "unselect_row", 2543 GTK_SIGNAL_FUNC (filedsn_filelist_unselect), 2544 choose_t); 2545 2546 gtk_window_add_accel_group (GTK_WINDOW (dsnchooser), accel_group); 2547 2548 SQLSetConfigMode (ODBC_BOTH_DSN); 2549 if (!SQLGetPrivateProfileString("ODBC", "FileDSNPath", "", 2550 choose_t->curr_dir, sizeof(choose_t->curr_dir), "odbcinst.ini")) 2551 strcpy(choose_t->curr_dir, DEFAULT_FILEDSNPATH); 2552 2553 adddsns_to_list (clist1, FALSE); 2554 2555 choose_t->udsnlist = clist1; 2556 choose_t->sdsnlist = clist2; 2557 choose_t->type_dsn = USER_DSN; 2558 choose_t->mainwnd = dsnchooser; 2559 2560 gtk_widget_show_all (dsnchooser); 2561 gtk_main (); 2562 } 2563 2564 2565 #define CHECK_DRVCONN_DIALBOX(path) \ 2566 { \ 2567 if ((handle = DLL_OPEN(path)) != NULL) \ 2568 { \ 2569 if (DLL_PROC(handle, "_iodbcdm_drvconn_dialboxw") != NULL) \ 2570 { \ 2571 DLL_CLOSE(handle); \ 2572 retVal = TRUE; \ 2573 goto quit; \ 2574 } \ 2575 else \ 2576 { \ 2577 if (DLL_PROC(handle, "_iodbcdm_drvconn_dialbox") != NULL) \ 2578 { \ 2579 DLL_CLOSE(handle); \ 2580 retVal = TRUE; \ 2581 goto quit; \ 2582 } \ 2583 } \ 2584 DLL_CLOSE(handle); \ 2585 } \ 2586 } 2587 2588 2589 2590 static BOOL 2591 _CheckDriverLoginDlg ( 2592 char *drv 2593 ) 2594 { 2595 char drvbuf[4096] = { L'\0'}; 2596 HDLL handle; 2597 BOOL retVal = FALSE; 2598 2599 2600 if (!drv) 2601 return FALSE; 2602 2603 SQLSetConfigMode (ODBC_USER_DSN); 2604 if (!access (drv, X_OK)) 2605 { CHECK_DRVCONN_DIALBOX (drv); } 2606 if (SQLGetPrivateProfileString (drv, "Driver", "", drvbuf, 2607 sizeof (drvbuf), "odbcinst.ini")) 2608 { CHECK_DRVCONN_DIALBOX (drvbuf); } 2609 if (SQLGetPrivateProfileString (drv, "Setup", "", drvbuf, 2610 sizeof (drvbuf), "odbcinst.ini")) 2611 { CHECK_DRVCONN_DIALBOX (drvbuf); } 2612 2613 SQLSetConfigMode (ODBC_SYSTEM_DSN); 2614 if (!access (drv, X_OK)) 2615 { CHECK_DRVCONN_DIALBOX (drv); } 2616 if (SQLGetPrivateProfileString (drv, "Driver", "", drvbuf, 2617 sizeof (drvbuf), "odbcinst.ini")) 2618 { CHECK_DRVCONN_DIALBOX (drvbuf); } 2619 if (SQLGetPrivateProfileString (drv, "Setup", "", drvbuf, 2620 sizeof (drvbuf), "odbcinst.ini")) 2621 { CHECK_DRVCONN_DIALBOX (drvbuf); } 2622 2623 quit: 2624 return retVal; 2625 } 2626