1 /*
2  *  gensetup.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 
76 #include "gui.h"
77 
78 static char* STRCONN = "DSN=%s\0Description=%s\0\0";
79 static int STRCONN_NB_TOKENS = 2;
80 
81 static char *szKeysColumnNames[] = {
82   "Keyword",
83   "Value"
84 };
85 
86 static char *szKeysButtons[] = {
87   "_Add",
88   "_Update"
89 };
90 
91 
92 static void
93 addkeywords_to_list(GtkWidget* widget, LPCSTR attrs, TGENSETUP *gensetup_t)
94 {
95   char *curr, *cour;
SQLBindCol_Internal(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLSMALLINT fCType,SQLPOINTER rgbValue,SQLLEN cbValueMax,SQLLEN * pcbValue)96   char *data[2];
97 
98   if (!GTK_IS_CLIST (widget))
99     return;
100   gtk_clist_clear (GTK_CLIST (widget));
101 
102   for (curr = (LPSTR) attrs; *curr; curr += (STRLEN (curr) + 1))
103     {
104       if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")) ||
105 	  !strncasecmp (curr, "Driver=", STRLEN ("Driver=")) ||
106 	  !strncasecmp (curr, "Description=", STRLEN ("Description=")))
107 	continue;
108 
109       if ((cour = strchr (curr, '=')))
110 	{
111 	  *cour = '\0';
112 	  data[0] = curr;
113 	  data[1] = cour + 1;
114 	  gtk_clist_append (GTK_CLIST (widget), data);
115 	  *cour = '=';
116 	}
117       else
118 	{
119 	  data[0] = "";
120 	  gtk_clist_append (GTK_CLIST (widget), data);
121 	}
122     }
123 
124   if (GTK_CLIST (widget)->rows > 0)
125     gtk_clist_sort (GTK_CLIST (widget));
126 }
127 
128 
129 static void
130 parse_attribute_line(TGENSETUP *gensetup_t, LPCSTR dsn, LPCSTR attrs, BOOL add)
131 {
132   if (dsn && gensetup_t->dsn_entry)
133     {
134       gtk_entry_set_text (GTK_ENTRY (gensetup_t->dsn_entry), dsn);
135       if (add)
136 	gtk_widget_set_sensitive (gensetup_t->dsn_entry, TRUE);
137       else
138 	gtk_widget_set_sensitive (gensetup_t->dsn_entry, FALSE);
139     }
140 
141   addkeywords_to_list (gensetup_t->key_list, attrs, gensetup_t);
142 }
143 
144 
145 static void
146 gensetup_add_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
147 {
148   char *szKey;
149   char *data[2];
150   int i = 0;
151 
152   if (gensetup_t)
153     {
154       data[0] = (char*)gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry));
155       if (STRLEN (data[0]))
156 	{
157 	  data[1] = (char*)gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry));
158 
159 	  /* Try to see if the keyword already exists */
160 	  for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++)
161 	    {
162 	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0,
163 		  &szKey);
164 	      if (STREQ (data[0], szKey))
165 		goto done;
166 	    }
167 
168 	  /* An update operation */
169 	  if (i < GTK_CLIST (gensetup_t->key_list)->rows)
170 	    {
171 	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1,
172 		  data[1]);
173 	    }
174 	  else if (STRLEN (data[1]))
175 	    {
176 	      gtk_clist_append (GTK_CLIST (gensetup_t->key_list), data);
177 	    }
178 	}
179 
180       gtk_clist_sort (GTK_CLIST (gensetup_t->key_list));
181 
182     done:
183       gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
184       gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
185     }
186 }
187 
188 
189 static void
190 gensetup_update_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
191 {
192   char *data[2];
193   int i;
194 
195   if (gensetup_t)
196     {
197       data[0] = (char*)gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry));
198       if (STRLEN (data[0]))
199 	{
200 	  data[1] = (char*)gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry));
201 
202 	  if (GTK_CLIST (gensetup_t->key_list)->selection != NULL)
203 	    i = GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->
204 		data);
205 	  else
206 	    i = 0;
207 
208 	  /* An update operation */
209 	  if (i < GTK_CLIST (gensetup_t->key_list)->rows)
210 	    {
211 	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 0,
212 		  data[0]);
213 	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1,
214 		  data[1]);
215 	    }
216 	}
217 
218       gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
219       gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
220     }
221 }
222 
223 
224 static void
225 gensetup_list_select(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t)
226 {
227   char *szKey, *szValue;
228 
229   if (gensetup_t && GTK_CLIST (gensetup_t->key_list)->selection != NULL)
230     {
231       gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list),
SQLBindCol(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLSMALLINT fCType,SQLPOINTER rgbValue,SQLLEN cbValueMax,SQLLEN * pcbValue)232 	  GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data),
233 	  0, &szKey);
234       gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list),
235 	  GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data),
236 	  1, &szValue);
237       gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), szKey);
238       gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), szValue);
239       gtk_widget_set_sensitive (gensetup_t->bupdate, TRUE);
240     }
241 }
242 
243 
244 static void
245 gensetup_list_unselect(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t)
246 {
247   if (gensetup_t)
248     {
249       gtk_widget_set_sensitive (gensetup_t->bupdate, FALSE);
250       gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
251       gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
252     }
253 }
SQLGetCursorName_Internal(SQLHSTMT hstmt,SQLCHAR * szCursor,SQLSMALLINT cbCursorMax,SQLSMALLINT * pcbCursor,char waMode)254 
255 
256 static void
257 gensetup_ok_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
258 {
259   char *curr, *cour, *szKey, *szValue;
260   int i = 0, size = 0;
261 
262   if (gensetup_t)
263     {
264       /* What is the size of the block to malloc */
265       if (gensetup_t->dsn_entry)
266         {
267           size +=
268 	      STRLEN (gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry))) +
269 	      STRLEN ("DSN=") + 1;
270           size += STRLEN ("Description=") + 1;
271         }
272       else
273         {
274           size = 1;
275         }
276       /* Malloc it (+1 for list-terminating NUL) */
277       if ((gensetup_t->connstr = (char *) calloc (sizeof(char), ++size)))
278 	{
279 	  if (gensetup_t->dsn_entry)
280 	    {
281 	      for (curr = STRCONN, cour = gensetup_t->connstr;
282 	           i < STRCONN_NB_TOKENS; i++, curr += (STRLEN (curr) + 1))
283 	        switch (i)
284 	          {
285 	          case 0:
286 		    sprintf (cour, curr,
287 		        gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry)));
288 		    cour += (STRLEN (cour) + 1);
289 		    break;
290 	          case 1:
291 		    sprintf (cour, curr, "");
292 		    cour += (STRLEN (cour) + 1);
293 		    break;
294 	          };
295 	    }
296 	  else
297 	    size = 1;
298 
299 	  for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++)
300 	    {
301 	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0,
302 		  &szKey);
303 	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 1,
304 		  &szValue);
305 
306 	      cour = gensetup_t->connstr;
307 	      gensetup_t->connstr =
308 		  (char *) malloc (size + STRLEN (szKey) + STRLEN (szValue) +
309 		  2);
310 	      if (gensetup_t->connstr)
311 		{
312 		  memcpy (gensetup_t->connstr, cour, size);
313 		  sprintf (gensetup_t->connstr + size - 1, "%s=%s", szKey, szValue);
314 		  free (cour);
315 		  size += STRLEN (szKey) + STRLEN (szValue) + 2;
316 		}
317 	      else
318 		gensetup_t->connstr = cour;
319 	    }
320 
321 	  /* add list-terminating NUL */
322 	  gensetup_t->connstr[size - 1] = '\0';
323 	}
324 
325       gensetup_t->dsn_entry = NULL;
326       gensetup_t->key_list = NULL;
327       gensetup_t->verify_conn = gtk_toggle_button_get_active((GtkToggleButton*)gensetup_t->verify_conn_cb);
328 
329       gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd),
330 	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
331       gtk_main_quit ();
332       gtk_widget_destroy (gensetup_t->mainwnd);
333     }
334 }
335 
336 
337 static void
338 gensetup_cancel_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
339 {
340   if (gensetup_t)
341     {
342       gensetup_t->connstr = (LPSTR) -1L;
343 
344       gensetup_t->dsn_entry = NULL;
345       gensetup_t->key_list = NULL;
346 
347       gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd),
348 	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
349       gtk_main_quit ();
350       gtk_widget_destroy (gensetup_t->mainwnd);
351     }
352 }
353 
354 
355 static gint delete_event( GtkWidget *widget,
356 	GdkEvent *event, TGENSETUP *gensetup_t)
357 {
358   gensetup_cancel_clicked (widget, gensetup_t);
359 
360   return FALSE;
361 }
362 
363 
364 LPSTR
365 create_fgensetup (HWND hwnd, LPCSTR dsn, LPCSTR attrs, BOOL add, BOOL *verify_conn)
366 {
367   GdkPixmap *pixmap;
368   GdkBitmap *mask;
SQLGetCursorName(SQLHSTMT hstmt,SQLCHAR * szCursor,SQLSMALLINT cbCursorMax,SQLSMALLINT * pcbCursor)369   GtkStyle *style;
370 
371   GtkWidget *gensetup;
372   GtkWidget *dialog_vbox5;
373   GtkWidget *vbox25;
374   GtkWidget *frame56;
375   GtkWidget *alignment48;
376   GtkWidget *hbox35;
377   GtkWidget *label93;
378   GtkWidget *t_dsn;
379   GtkWidget *frame55;
380   GtkWidget *alignment47;
381   GtkWidget *label92;
382   GtkWidget *frame54;
383   GtkWidget *alignment46;
384   GtkWidget *scrolledwindow15;
385   GtkWidget *clist1;
386   GtkWidget *l_key;
387   GtkWidget *l_value;
388   GtkWidget *frame53;
389   GtkWidget *alignment45;
390   GtkWidget *hbox34;
391   GtkWidget *table4;
392   GtkWidget *label88;
393   GtkWidget *t_value;
SQLGetCursorNameA(SQLHSTMT hstmt,SQLCHAR * szCursor,SQLSMALLINT cbCursorMax,SQLSMALLINT * pcbCursor)394   GtkWidget *b_update;
395   GtkWidget *b_add;
396   GtkWidget *t_keyword;
397   GtkWidget *label89;
398   GtkWidget *frame52;
399   GtkWidget *alignment44;
400   GtkWidget *hbox33;
401   GtkWidget *cb_verify;
402   GtkWidget *dialog_action_area5;
403   GtkWidget *b_cancel;
404   GtkWidget *b_ok;
405   TGENSETUP gensetup_t;
406   char buff[1024];
407 
408   if (hwnd == NULL || !GTK_IS_WIDGET (hwnd))
409     return (LPSTR) attrs;
410 
411   gensetup = gtk_dialog_new ();
412   gtk_widget_set_name (gensetup, "gensetup");
413   gtk_widget_set_size_request (gensetup, 354, 471);
414   gtk_window_set_title (GTK_WINDOW (gensetup), _("File DSN Generic Setup"));
415   gtk_window_set_position (GTK_WINDOW (gensetup), GTK_WIN_POS_CENTER);
416   gtk_window_set_modal (GTK_WINDOW (gensetup), TRUE);
417   gtk_window_set_type_hint (GTK_WINDOW (gensetup), GDK_WINDOW_TYPE_HINT_DIALOG);
SQLGetCursorNameW(SQLHSTMT hstmt,SQLWCHAR * szCursor,SQLSMALLINT cbCursorMax,SQLSMALLINT * pcbCursor)418 
419 #if GTK_CHECK_VERSION(2,0,0)
420   gtk_widget_show (gensetup);
421 #endif
422 
423   dialog_vbox5 = GTK_DIALOG (gensetup)->vbox;
424   gtk_widget_set_name (dialog_vbox5, "dialog_vbox5");
425   gtk_widget_show (dialog_vbox5);
426 
427   vbox25 = gtk_vbox_new (FALSE, 0);
428   gtk_widget_set_name (vbox25, "vbox25");
429   gtk_widget_show (vbox25);
430   gtk_box_pack_start (GTK_BOX (dialog_vbox5), vbox25, TRUE, TRUE, 0);
431 
432   frame56 = gtk_frame_new (NULL);
433   gtk_widget_set_name (frame56, "frame56");
434   gtk_widget_show (frame56);
435   gtk_box_pack_start (GTK_BOX (vbox25), frame56, FALSE, TRUE, 0);
436   gtk_frame_set_shadow_type (GTK_FRAME (frame56), GTK_SHADOW_NONE);
437 
438   alignment48 = gtk_alignment_new (0.5, 0.5, 1, 1);
439   gtk_widget_set_name (alignment48, "alignment48");
440   gtk_widget_show (alignment48);
441   gtk_container_add (GTK_CONTAINER (frame56), alignment48);
SQLRowCount_Internal(SQLHSTMT hstmt,SQLLEN * pcrow)442   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment48), 4, 0, 0, 0);
443 
444   hbox35 = gtk_hbox_new (FALSE, 0);
445   gtk_widget_set_name (hbox35, "hbox35");
446   gtk_widget_show (hbox35);
447   gtk_container_add (GTK_CONTAINER (alignment48), hbox35);
448 
449   label93 = gtk_label_new (_("File Data Source Name :    "));
450   gtk_widget_set_name (label93, "label93");
451   gtk_widget_show (label93);
452   gtk_box_pack_start (GTK_BOX (hbox35), label93, FALSE, FALSE, 0);
453 
454   t_dsn = gtk_entry_new ();
455   gtk_widget_set_name (t_dsn, "t_dsn");
456   gtk_widget_show (t_dsn);
457   gtk_box_pack_start (GTK_BOX (hbox35), t_dsn, TRUE, TRUE, 0);
458 
459   frame55 = gtk_frame_new (NULL);
460   gtk_widget_set_name (frame55, "frame55");
461   gtk_widget_show (frame55);
462   gtk_box_pack_start (GTK_BOX (vbox25), frame55, FALSE, TRUE, 0);
463   gtk_frame_set_shadow_type (GTK_FRAME (frame55), GTK_SHADOW_NONE);
464 
465   alignment47 = gtk_alignment_new (0.5, 0.5, 1, 1);
466   gtk_widget_set_name (alignment47, "alignment47");
467   gtk_widget_show (alignment47);
468   gtk_container_add (GTK_CONTAINER (frame55), alignment47);
469   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment47), 4, 4, 0, 0);
470 
471   label92 = gtk_label_new (_("If you know the driver-specific keywords for this data\nsource, you can type them and their values here. For\nmore information on driver-specific keywords, please\nconsult your ODBC driver documentation."));
472   gtk_widget_set_name (label92, "label92");
473   gtk_widget_show (label92);
474   gtk_container_add (GTK_CONTAINER (alignment47), label92);
475 
476   frame54 = gtk_frame_new (NULL);
477   gtk_widget_set_name (frame54, "frame54");
SQLRowCount(SQLHSTMT hstmt,SQLLEN * pcrow)478   gtk_widget_show (frame54);
479   gtk_box_pack_start (GTK_BOX (vbox25), frame54, TRUE, TRUE, 0);
480   gtk_widget_set_size_request (frame54, -1, 180);
481   gtk_frame_set_shadow_type (GTK_FRAME (frame54), GTK_SHADOW_NONE);
482 
483   alignment46 = gtk_alignment_new (0.5, 0.5, 1, 1);
484   gtk_widget_set_name (alignment46, "alignment46");
485   gtk_widget_show (alignment46);
486   gtk_container_add (GTK_CONTAINER (frame54), alignment46);
487 
488   scrolledwindow15 = gtk_scrolled_window_new (NULL, NULL);
489   gtk_widget_set_name (scrolledwindow15, "scrolledwindow15");
490   gtk_widget_show (scrolledwindow15);
491   gtk_container_add (GTK_CONTAINER (alignment46), scrolledwindow15);
492 
_iodbcdm_NumResultCols(SQLHSTMT hstmt,SQLSMALLINT * pccol)493   clist1 = gtk_clist_new (2);
494   gtk_widget_set_name (clist1, "clist1");
495   gtk_widget_show (clist1);
496   gtk_container_add (GTK_CONTAINER (scrolledwindow15), clist1);
497   gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 80);
498   gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80);
499   gtk_clist_column_titles_show (GTK_CLIST (clist1));
500 
501   l_key = gtk_label_new (_("Keyword"));
502   gtk_widget_set_name (l_key, "l_key");
503   gtk_widget_show (l_key);
504   gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key);
505   gtk_widget_set_size_request (l_key, 137, -1);
506 
507   l_value = gtk_label_new (_("Value"));
508   gtk_widget_set_name (l_value, "l_value");
509   gtk_widget_show (l_value);
510   gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value);
511 
512   frame53 = gtk_frame_new (NULL);
513   gtk_widget_set_name (frame53, "frame53");
514   gtk_widget_show (frame53);
515   gtk_box_pack_start (GTK_BOX (vbox25), frame53, FALSE, TRUE, 0);
516   gtk_frame_set_shadow_type (GTK_FRAME (frame53), GTK_SHADOW_NONE);
517 
518   alignment45 = gtk_alignment_new (0.5, 0.5, 1, 1);
519   gtk_widget_set_name (alignment45, "alignment45");
520   gtk_widget_show (alignment45);
521   gtk_container_add (GTK_CONTAINER (frame53), alignment45);
522   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment45), 3, 0, 0, 0);
523 
524   hbox34 = gtk_hbox_new (FALSE, 0);
525   gtk_widget_set_name (hbox34, "hbox34");
526   gtk_widget_show (hbox34);
527   gtk_container_add (GTK_CONTAINER (alignment45), hbox34);
528 
529   table4 = gtk_table_new (2, 3, FALSE);
530   gtk_widget_set_name (table4, "table4");
531   gtk_widget_show (table4);
532   gtk_box_pack_start (GTK_BOX (hbox34), table4, TRUE, TRUE, 0);
533 
534   label88 = gtk_label_new (_("Value : "));
535   gtk_widget_set_name (label88, "label88");
536   gtk_widget_show (label88);
537   gtk_table_attach (GTK_TABLE (table4), label88, 0, 1, 1, 2,
538                     (GtkAttachOptions) (GTK_FILL),
539                     (GtkAttachOptions) (0), 0, 0);
540 
541   t_value = gtk_entry_new ();
542   gtk_widget_set_name (t_value, "t_value");
543   gtk_widget_show (t_value);
544   gtk_table_attach (GTK_TABLE (table4), t_value, 1, 2, 1, 2,
545                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
546                     (GtkAttachOptions) (0), 0, 0);
547 
548   b_update = gtk_button_new_with_mnemonic (_("    _Update    "));
549   gtk_widget_set_name (b_update, "b_update");
550   gtk_widget_show (b_update);
551   gtk_table_attach (GTK_TABLE (table4), b_update, 2, 3, 1, 2,
552                     (GtkAttachOptions) (GTK_FILL),
553                     (GtkAttachOptions) (0), 0, 0);
554   gtk_container_set_border_width (GTK_CONTAINER (b_update), 6);
555   gtk_widget_set_sensitive(b_update, FALSE);
556 
557   b_add = gtk_button_new_from_stock ("gtk-add");
558   gtk_widget_set_name (b_add, "b_add");
559   gtk_widget_show (b_add);
560   gtk_table_attach (GTK_TABLE (table4), b_add, 2, 3, 0, 1,
561                     (GtkAttachOptions) (GTK_FILL),
562                     (GtkAttachOptions) (0), 0, 0);
563   gtk_container_set_border_width (GTK_CONTAINER (b_add), 6);
564 
565   t_keyword = gtk_entry_new ();
566   gtk_widget_set_name (t_keyword, "t_keyword");
567   gtk_widget_show (t_keyword);
568   gtk_table_attach (GTK_TABLE (table4), t_keyword, 1, 2, 0, 1,
569                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
570                     (GtkAttachOptions) (0), 0, 0);
571 
572   label89 = gtk_label_new (_("Keyword : "));
573   gtk_widget_set_name (label89, "label89");
SQLNumResultCols(SQLHSTMT hstmt,SQLSMALLINT * pccol)574   gtk_widget_show (label89);
575   gtk_table_attach (GTK_TABLE (table4), label89, 0, 1, 0, 1,
576                     (GtkAttachOptions) (GTK_FILL),
577                     (GtkAttachOptions) (0), 0, 0);
578 
579   frame52 = gtk_frame_new (NULL);
580   gtk_widget_set_name (frame52, "frame52");
581   gtk_widget_show (frame52);
582   gtk_box_pack_start (GTK_BOX (vbox25), frame52, FALSE, TRUE, 0);
583   gtk_frame_set_shadow_type (GTK_FRAME (frame52), GTK_SHADOW_NONE);
584 
585   alignment44 = gtk_alignment_new (0.5, 0.5, 1, 1);
586   gtk_widget_set_name (alignment44, "alignment44");
587   gtk_widget_show (alignment44);
588   gtk_container_add (GTK_CONTAINER (frame52), alignment44);
_iodbcdm_map_sql_type(int type,int odbcver)589   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment44), 0, 3, 12, 0);
590 
591   hbox33 = gtk_hbox_new (FALSE, 0);
592   gtk_widget_set_name (hbox33, "hbox33");
593   gtk_widget_show (hbox33);
594   gtk_container_add (GTK_CONTAINER (alignment44), hbox33);
595 
596   cb_verify = gtk_check_button_new_with_mnemonic (_("Verify this connection (recommended)"));
597   gtk_widget_set_name (cb_verify, "cb_verify");
598   gtk_widget_show (cb_verify);
599   gtk_box_pack_start (GTK_BOX (hbox33), cb_verify, FALSE, FALSE, 0);
600   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_verify), TRUE);
601 
602   dialog_action_area5 = GTK_DIALOG (gensetup)->action_area;
603   gtk_widget_set_name (dialog_action_area5, "dialog_action_area5");
604   gtk_widget_show (dialog_action_area5);
605   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END);
606 
607   b_cancel = gtk_button_new_from_stock ("gtk-cancel");
608   gtk_widget_set_name (b_cancel, "b_cancel");
609   gtk_widget_show (b_cancel);
610   gtk_dialog_add_action_widget (GTK_DIALOG (gensetup), b_cancel, GTK_RESPONSE_CANCEL);
_iodbcdm_map_c_type(int type,int odbcver)611   GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT);
612 
613   b_ok = gtk_button_new_from_stock ("gtk-ok");
614   gtk_widget_set_name (b_ok, "b_ok");
615   gtk_widget_show (b_ok);
616   gtk_dialog_add_action_widget (GTK_DIALOG (gensetup), b_ok, GTK_RESPONSE_OK);
617   GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT);
618 
619   /* Store pointers to all widgets, for use by lookup_widget(). */
620   GLADE_HOOKUP_OBJECT_NO_REF (gensetup, gensetup, "gensetup");
621   GLADE_HOOKUP_OBJECT_NO_REF (gensetup, dialog_vbox5, "dialog_vbox5");
622   GLADE_HOOKUP_OBJECT (gensetup, vbox25, "vbox25");
623   GLADE_HOOKUP_OBJECT (gensetup, frame56, "frame56");
624   GLADE_HOOKUP_OBJECT (gensetup, alignment48, "alignment48");
625   GLADE_HOOKUP_OBJECT (gensetup, hbox35, "hbox35");
626   GLADE_HOOKUP_OBJECT (gensetup, label93, "label93");
627   GLADE_HOOKUP_OBJECT (gensetup, t_dsn, "t_dsn");
628   GLADE_HOOKUP_OBJECT (gensetup, frame55, "frame55");
629   GLADE_HOOKUP_OBJECT (gensetup, alignment47, "alignment47");
630   GLADE_HOOKUP_OBJECT (gensetup, label92, "label92");
631   GLADE_HOOKUP_OBJECT (gensetup, frame54, "frame54");
632   GLADE_HOOKUP_OBJECT (gensetup, alignment46, "alignment46");
SQLDescribeCol_Internal(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLPOINTER szColName,SQLSMALLINT cbColNameMax,SQLSMALLINT * pcbColName,SQLSMALLINT * pfSqlType,SQLULEN * pcbColDef,SQLSMALLINT * pibScale,SQLSMALLINT * pfNullable,SQLCHAR waMode)633   GLADE_HOOKUP_OBJECT (gensetup, scrolledwindow15, "scrolledwindow15");
634   GLADE_HOOKUP_OBJECT (gensetup, clist1, "clist1");
635   GLADE_HOOKUP_OBJECT (gensetup, l_key, "l_key");
636   GLADE_HOOKUP_OBJECT (gensetup, l_value, "l_value");
637   GLADE_HOOKUP_OBJECT (gensetup, frame53, "frame53");
638   GLADE_HOOKUP_OBJECT (gensetup, alignment45, "alignment45");
639   GLADE_HOOKUP_OBJECT (gensetup, hbox34, "hbox34");
640   GLADE_HOOKUP_OBJECT (gensetup, table4, "table4");
641   GLADE_HOOKUP_OBJECT (gensetup, label88, "label88");
642   GLADE_HOOKUP_OBJECT (gensetup, t_value, "t_value");
643   GLADE_HOOKUP_OBJECT (gensetup, b_update, "b_update");
644   GLADE_HOOKUP_OBJECT (gensetup, b_add, "b_add");
645   GLADE_HOOKUP_OBJECT (gensetup, t_keyword, "t_keyword");
646   GLADE_HOOKUP_OBJECT (gensetup, label89, "label89");
647   GLADE_HOOKUP_OBJECT (gensetup, frame52, "frame52");
648   GLADE_HOOKUP_OBJECT (gensetup, alignment44, "alignment44");
649   GLADE_HOOKUP_OBJECT (gensetup, hbox33, "hbox33");
650   GLADE_HOOKUP_OBJECT (gensetup, cb_verify, "cb_verify");
651   GLADE_HOOKUP_OBJECT_NO_REF (gensetup, dialog_action_area5, "dialog_action_area5");
652   GLADE_HOOKUP_OBJECT (gensetup, b_cancel, "b_cancel");
653   GLADE_HOOKUP_OBJECT (gensetup, b_ok, "b_ok");
654 
655   /* Ok button events */
656   gtk_signal_connect (GTK_OBJECT (b_ok), "clicked",
657       GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t);
658   /* Cancel button events */
659   gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked",
660       GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t);
661   /* Add button events */
662   gtk_signal_connect (GTK_OBJECT (b_add), "clicked",
663       GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t);
664   /* Update button events */
665   gtk_signal_connect (GTK_OBJECT (b_update), "clicked",
666       GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t);
667   /* Close window button events */
668   gtk_signal_connect (GTK_OBJECT (gensetup), "delete_event",
669       GTK_SIGNAL_FUNC (delete_event), &gensetup_t);
670   gtk_signal_connect (GTK_OBJECT (gensetup), "destroy",
671       GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
672   /* List events */
673   gtk_signal_connect (GTK_OBJECT (clist1), "select_row",
674       GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t);
675   gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row",
676       GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t);
677 
678   gensetup_t.dsn_entry = t_dsn;
679   gensetup_t.key_list = clist1;
680   gensetup_t.bupdate = b_update;
681   gensetup_t.key_entry = t_keyword;
682   gensetup_t.value_entry = t_value;
683   gensetup_t.mainwnd = gensetup;
684   gensetup_t.verify_conn_cb = cb_verify;
685   gensetup_t.verify_conn = *verify_conn;
686 
687   gtk_toggle_button_set_active((GtkToggleButton*)cb_verify, *verify_conn);
688 
689   /* Parse the attributes line */
690   parse_attribute_line (&gensetup_t, dsn, attrs, add);
691 
692   gtk_widget_show_all (gensetup);
693   gtk_main ();
694 
695   *verify_conn = gensetup_t.verify_conn;
696 
697   return gensetup_t.connstr;
698 }
699 
700 
701 
702 LPSTR
703 create_keyval (HWND hwnd, LPCSTR attrs, BOOL *verify_conn)
704 {
705   GdkPixmap *pixmap;
706   GdkBitmap *mask;
707   GtkStyle *style;
708 
709   GtkWidget *genkeyval;
710   GtkWidget *dialog_vbox4;
711   GtkWidget *vbox24;
712   GtkWidget *frame48;
713   GtkWidget *alignment40;
714   GtkWidget *label81;
715   GtkWidget *frame49;
716   GtkWidget *alignment41;
717   GtkWidget *scrolledwindow14;
718   GtkWidget *clist1;
719   GtkWidget *l_key;
720   GtkWidget *l_value;
721   GtkWidget *frame50;
722   GtkWidget *alignment42;
723   GtkWidget *hbox31;
724   GtkWidget *table3;
725   GtkWidget *label86;
726   GtkWidget *t_value;
727   GtkWidget *b_update;
728   GtkWidget *b_add;
729   GtkWidget *t_keyword;
730   GtkWidget *label87;
731   GtkWidget *frame51;
732   GtkWidget *alignment43;
733   GtkWidget *hbox32;
734   GtkWidget *cb_verify;
735   GtkWidget *dialog_action_area4;
736   GtkWidget *cancelbutton2;
737   GtkWidget *okbutton2;
738 
739   TGENSETUP gensetup_t;
740   char buff[1024];
741 
742   if (hwnd == NULL || !GTK_IS_WIDGET (hwnd))
743     return (LPSTR) attrs;
744 
745   genkeyval = gtk_dialog_new ();
746   gtk_widget_set_name (genkeyval, "genkeyval");
747   gtk_widget_set_size_request (genkeyval, 355, 430);
748   gtk_window_set_title (GTK_WINDOW (genkeyval), _("Advanced File DSN Creation Settings"));
749   gtk_window_set_position (GTK_WINDOW (genkeyval), GTK_WIN_POS_CENTER);
750   gtk_window_set_modal (GTK_WINDOW (genkeyval), TRUE);
751   gtk_window_set_default_size (GTK_WINDOW (genkeyval), 355, 430);
752   gtk_window_set_type_hint (GTK_WINDOW (genkeyval), GDK_WINDOW_TYPE_HINT_DIALOG);
753 
754 #if GTK_CHECK_VERSION(2,0,0)
755   gtk_widget_show (genkeyval);
756 #endif
757 
758   dialog_vbox4 = GTK_DIALOG (genkeyval)->vbox;
759   gtk_widget_set_name (dialog_vbox4, "dialog_vbox4");
760   gtk_widget_show (dialog_vbox4);
761 
762   vbox24 = gtk_vbox_new (FALSE, 0);
763   gtk_widget_set_name (vbox24, "vbox24");
764   gtk_widget_show (vbox24);
765   gtk_box_pack_start (GTK_BOX (dialog_vbox4), vbox24, TRUE, TRUE, 0);
766 
767   frame48 = gtk_frame_new (NULL);
768   gtk_widget_set_name (frame48, "frame48");
769   gtk_widget_show (frame48);
770   gtk_box_pack_start (GTK_BOX (vbox24), frame48, FALSE, TRUE, 0);
771   gtk_frame_set_shadow_type (GTK_FRAME (frame48), GTK_SHADOW_NONE);
772 
773   alignment40 = gtk_alignment_new (0.5, 0.5, 1, 1);
774   gtk_widget_set_name (alignment40, "alignment40");
775   gtk_widget_show (alignment40);
776   gtk_container_add (GTK_CONTAINER (frame48), alignment40);
777   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment40), 4, 4, 0, 0);
778 
779   label81 = gtk_label_new (_("If you know the driver-specific keywords for this data\nsource, you can type them and their values here. For\nmore information on driver-specific keywords, please\nconsult your ODBC driver documentation."));
780   gtk_widget_set_name (label81, "label81");
781   gtk_widget_show (label81);
782   gtk_container_add (GTK_CONTAINER (alignment40), label81);
783 
784   frame49 = gtk_frame_new (NULL);
785   gtk_widget_set_name (frame49, "frame49");
786   gtk_widget_show (frame49);
787   gtk_box_pack_start (GTK_BOX (vbox24), frame49, TRUE, TRUE, 0);
788   gtk_frame_set_shadow_type (GTK_FRAME (frame49), GTK_SHADOW_NONE);
789 
790   alignment41 = gtk_alignment_new (0.5, 0.5, 1, 1);
791   gtk_widget_set_name (alignment41, "alignment41");
792   gtk_widget_show (alignment41);
793   gtk_container_add (GTK_CONTAINER (frame49), alignment41);
794 
795   scrolledwindow14 = gtk_scrolled_window_new (NULL, NULL);
796   gtk_widget_set_name (scrolledwindow14, "scrolledwindow14");
797   gtk_widget_show (scrolledwindow14);
798   gtk_container_add (GTK_CONTAINER (alignment41), scrolledwindow14);
799 
800   clist1 = gtk_clist_new (2);
801   gtk_widget_set_name (clist1, "clist1");
802   gtk_widget_show (clist1);
803   gtk_container_add (GTK_CONTAINER (scrolledwindow14), clist1);
804   gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 80);
805   gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80);
806   gtk_clist_column_titles_show (GTK_CLIST (clist1));
807 
808   l_key = gtk_label_new (_("Keyword"));
809   gtk_widget_set_name (l_key, "l_key");
810   gtk_widget_show (l_key);
811   gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key);
812   gtk_widget_set_size_request (l_key, 137, -1);
813 
814   l_value = gtk_label_new (_("Value"));
815   gtk_widget_set_name (l_value, "l_value");
SQLDescribeCol(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLCHAR * szColName,SQLSMALLINT cbColNameMax,SQLSMALLINT * pcbColName,SQLSMALLINT * pfSqlType,SQLULEN * pcbColDef,SQLSMALLINT * pibScale,SQLSMALLINT * pfNullable)816   gtk_widget_show (l_value);
817   gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value);
818 
819   frame50 = gtk_frame_new (NULL);
820   gtk_widget_set_name (frame50, "frame50");
821   gtk_widget_show (frame50);
822   gtk_box_pack_start (GTK_BOX (vbox24), frame50, FALSE, TRUE, 0);
823   gtk_frame_set_shadow_type (GTK_FRAME (frame50), GTK_SHADOW_NONE);
824 
825   alignment42 = gtk_alignment_new (0.5, 0.5, 1, 1);
826   gtk_widget_set_name (alignment42, "alignment42");
827   gtk_widget_show (alignment42);
828   gtk_container_add (GTK_CONTAINER (frame50), alignment42);
829   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment42), 3, 0, 0, 0);
830 
831   hbox31 = gtk_hbox_new (FALSE, 0);
832   gtk_widget_set_name (hbox31, "hbox31");
833   gtk_widget_show (hbox31);
834   gtk_container_add (GTK_CONTAINER (alignment42), hbox31);
835 
836   table3 = gtk_table_new (2, 3, FALSE);
837   gtk_widget_set_name (table3, "table3");
838   gtk_widget_show (table3);
839   gtk_box_pack_start (GTK_BOX (hbox31), table3, TRUE, TRUE, 0);
840 
841   label86 = gtk_label_new (_("Value : "));
842   gtk_widget_set_name (label86, "label86");
843   gtk_widget_show (label86);
844   gtk_table_attach (GTK_TABLE (table3), label86, 0, 1, 1, 2,
845                     (GtkAttachOptions) (GTK_FILL),
846                     (GtkAttachOptions) (0), 0, 0);
847 
848   t_value = gtk_entry_new ();
849   gtk_widget_set_name (t_value, "t_value");
850   gtk_widget_show (t_value);
851   gtk_table_attach (GTK_TABLE (table3), t_value, 1, 2, 1, 2,
852                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
853                     (GtkAttachOptions) (0), 0, 0);
854 
855   b_update = gtk_button_new_with_mnemonic (_("    _Update    "));
856   gtk_widget_set_name (b_update, "b_update");
857   gtk_widget_show (b_update);
858   gtk_table_attach (GTK_TABLE (table3), b_update, 2, 3, 1, 2,
859                     (GtkAttachOptions) (GTK_FILL),
SQLDescribeColA(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLCHAR * szColName,SQLSMALLINT cbColNameMax,SQLSMALLINT * pcbColName,SQLSMALLINT * pfSqlType,SQLULEN * pcbColDef,SQLSMALLINT * pibScale,SQLSMALLINT * pfNullable)860                     (GtkAttachOptions) (0), 0, 0);
861   gtk_container_set_border_width (GTK_CONTAINER (b_update), 6);
862   gtk_widget_set_sensitive(b_update, FALSE);
863 
864   b_add = gtk_button_new_from_stock ("gtk-add");
865   gtk_widget_set_name (b_add, "b_add");
866   gtk_widget_show (b_add);
867   gtk_table_attach (GTK_TABLE (table3), b_add, 2, 3, 0, 1,
868                     (GtkAttachOptions) (GTK_FILL),
869                     (GtkAttachOptions) (0), 0, 0);
870   gtk_container_set_border_width (GTK_CONTAINER (b_add), 6);
871 
872   t_keyword = gtk_entry_new ();
873   gtk_widget_set_name (t_keyword, "t_keyword");
874   gtk_widget_show (t_keyword);
875   gtk_table_attach (GTK_TABLE (table3), t_keyword, 1, 2, 0, 1,
876                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
877                     (GtkAttachOptions) (0), 0, 0);
878 
879   label87 = gtk_label_new (_("Keyword : "));
880   gtk_widget_set_name (label87, "label87");
881   gtk_widget_show (label87);
882   gtk_table_attach (GTK_TABLE (table3), label87, 0, 1, 0, 1,
883                     (GtkAttachOptions) (GTK_FILL),
884                     (GtkAttachOptions) (0), 0, 0);
885 
886   frame51 = gtk_frame_new (NULL);
887   gtk_widget_set_name (frame51, "frame51");
888   gtk_widget_show (frame51);
889   gtk_box_pack_start (GTK_BOX (vbox24), frame51, FALSE, TRUE, 0);
890   gtk_frame_set_shadow_type (GTK_FRAME (frame51), GTK_SHADOW_NONE);
891 
892   alignment43 = gtk_alignment_new (0.5, 0.5, 1, 1);
893   gtk_widget_set_name (alignment43, "alignment43");
894   gtk_widget_show (alignment43);
895   gtk_container_add (GTK_CONTAINER (frame51), alignment43);
896   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment43), 0, 3, 12, 0);
897 
898   hbox32 = gtk_hbox_new (FALSE, 0);
899   gtk_widget_set_name (hbox32, "hbox32");
900   gtk_widget_show (hbox32);
901   gtk_container_add (GTK_CONTAINER (alignment43), hbox32);
902 
SQLDescribeColW(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLWCHAR * szColName,SQLSMALLINT cbColNameMax,SQLSMALLINT * pcbColName,SQLSMALLINT * pfSqlType,SQLULEN * pcbColDef,SQLSMALLINT * pibScale,SQLSMALLINT * pfNullable)903   cb_verify = gtk_check_button_new_with_mnemonic (_("Verify this connection (recommended)"));
904   gtk_widget_set_name (cb_verify, "cb_verify");
905   gtk_widget_show (cb_verify);
906   gtk_box_pack_start (GTK_BOX (hbox32), cb_verify, FALSE, FALSE, 0);
907   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_verify), TRUE);
908 
909   dialog_action_area4 = GTK_DIALOG (genkeyval)->action_area;
910   gtk_widget_set_name (dialog_action_area4, "dialog_action_area4");
911   gtk_widget_show (dialog_action_area4);
912   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area4), GTK_BUTTONBOX_END);
913 
914   cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel");
915   gtk_widget_set_name (cancelbutton2, "cancelbutton2");
916   gtk_widget_show (cancelbutton2);
917   gtk_dialog_add_action_widget (GTK_DIALOG (genkeyval), cancelbutton2, GTK_RESPONSE_CANCEL);
918   GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT);
919 
920   okbutton2 = gtk_button_new_from_stock ("gtk-ok");
921   gtk_widget_set_name (okbutton2, "okbutton2");
922   gtk_widget_show (okbutton2);
923   gtk_dialog_add_action_widget (GTK_DIALOG (genkeyval), okbutton2, GTK_RESPONSE_OK);
924   GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT);
925 
926   /* Store pointers to all widgets, for use by lookup_widget(). */
927   GLADE_HOOKUP_OBJECT_NO_REF (genkeyval, genkeyval, "genkeyval");
928   GLADE_HOOKUP_OBJECT_NO_REF (genkeyval, dialog_vbox4, "dialog_vbox4");
929   GLADE_HOOKUP_OBJECT (genkeyval, vbox24, "vbox24");
930   GLADE_HOOKUP_OBJECT (genkeyval, frame48, "frame48");
931   GLADE_HOOKUP_OBJECT (genkeyval, alignment40, "alignment40");
932   GLADE_HOOKUP_OBJECT (genkeyval, label81, "label81");
933   GLADE_HOOKUP_OBJECT (genkeyval, frame49, "frame49");
934   GLADE_HOOKUP_OBJECT (genkeyval, alignment41, "alignment41");
935   GLADE_HOOKUP_OBJECT (genkeyval, scrolledwindow14, "scrolledwindow14");
936   GLADE_HOOKUP_OBJECT (genkeyval, clist1, "clist1");
937   GLADE_HOOKUP_OBJECT (genkeyval, l_key, "l_key");
938   GLADE_HOOKUP_OBJECT (genkeyval, l_value, "l_value");
939   GLADE_HOOKUP_OBJECT (genkeyval, frame50, "frame50");
940   GLADE_HOOKUP_OBJECT (genkeyval, alignment42, "alignment42");
941   GLADE_HOOKUP_OBJECT (genkeyval, hbox31, "hbox31");
942   GLADE_HOOKUP_OBJECT (genkeyval, table3, "table3");
943   GLADE_HOOKUP_OBJECT (genkeyval, label86, "label86");
944   GLADE_HOOKUP_OBJECT (genkeyval, t_value, "t_value");
945   GLADE_HOOKUP_OBJECT (genkeyval, b_update, "b_update");
946   GLADE_HOOKUP_OBJECT (genkeyval, b_add, "b_add");
947   GLADE_HOOKUP_OBJECT (genkeyval, t_keyword, "t_keyword");
SQLColAttributes_Internal(SQLHSTMT hstmt,SQLUSMALLINT icol,SQLUSMALLINT fDescType,SQLPOINTER rgbDesc,SQLSMALLINT cbDescMax,SQLSMALLINT * pcbDesc,SQLLEN * pfDesc,SQLCHAR waMode)948   GLADE_HOOKUP_OBJECT (genkeyval, label87, "label87");
949   GLADE_HOOKUP_OBJECT (genkeyval, frame51, "frame51");
950   GLADE_HOOKUP_OBJECT (genkeyval, alignment43, "alignment43");
951   GLADE_HOOKUP_OBJECT (genkeyval, hbox32, "hbox32");
952   GLADE_HOOKUP_OBJECT (genkeyval, cb_verify, "cb_verify");
953   GLADE_HOOKUP_OBJECT_NO_REF (genkeyval, dialog_action_area4, "dialog_action_area4");
954   GLADE_HOOKUP_OBJECT (genkeyval, cancelbutton2, "cancelbutton2");
955   GLADE_HOOKUP_OBJECT (genkeyval, okbutton2, "okbutton2");
956 
957   /* Ok button events */
958   gtk_signal_connect (GTK_OBJECT (okbutton2), "clicked",
959       GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t);
960   /* Cancel button events */
961   gtk_signal_connect (GTK_OBJECT (cancelbutton2), "clicked",
962       GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t);
963   /* Add button events */
964   gtk_signal_connect (GTK_OBJECT (b_add), "clicked",
965       GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t);
966   /* Update button events */
967   gtk_signal_connect (GTK_OBJECT (b_update), "clicked",
968       GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t);
969   /* Close window button events */
970   gtk_signal_connect (GTK_OBJECT (genkeyval), "delete_event",
971       GTK_SIGNAL_FUNC (delete_event), &gensetup_t);
972   gtk_signal_connect (GTK_OBJECT (genkeyval), "destroy",
973       GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
974   /* List events */
975   gtk_signal_connect (GTK_OBJECT (clist1), "select_row",
976       GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t);
977   gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row",
978       GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t);
979 
980 //  gtk_window_add_accel_group (GTK_WINDOW (gensetup), accel_group);
981 
982   gensetup_t.dsn_entry = NULL;
983   gensetup_t.key_list = clist1;
984   gensetup_t.bupdate = b_update;
985   gensetup_t.key_entry = t_keyword;
986   gensetup_t.value_entry = t_value;
987   gensetup_t.mainwnd = genkeyval;
988   gensetup_t.verify_conn_cb = cb_verify;
989   gensetup_t.verify_conn = *verify_conn;
990 
991   gtk_toggle_button_set_active((GtkToggleButton*)cb_verify, *verify_conn);
992 
993   /* Parse the attributes line */
994   parse_attribute_line (&gensetup_t, NULL, attrs, TRUE);
995 
996   gtk_widget_show_all (genkeyval);
997   gtk_main ();
998 
999   *verify_conn = gensetup_t.verify_conn;
1000 
1001   return gensetup_t.connstr;
1002 }
1003