1/*
2 *  gensetup.c
3 *
4 *  $Id: gensetup.c,v 1.5 2007/02/02 11:58:14 source Exp $
5 *
6 *  The iODBC driver manager.
7 *
8 *  Copyright (C) 1996-2006 by 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
79static char* STRCONN = "DSN=%s\0Description=%s\0\0";
80static int STRCONN_NB_TOKENS = 2;
81
82static char *szKeysColumnNames[] = {
83  "Keyword",
84  "Value"
85};
86
87static char *szKeysButtons[] = {
88  "_Add",
89  "_Update"
90};
91
92
93static void
94addkeywords_to_list(GtkWidget* widget, LPCSTR attrs, TGENSETUP *gensetup_t)
95{
96  char *curr, *cour;
97  char *data[2];
98
99  if (!GTK_IS_CLIST (widget))
100    return;
101  gtk_clist_clear (GTK_CLIST (widget));
102
103  for (curr = (LPSTR) attrs; *curr; curr += (STRLEN (curr) + 1))
104    {
105      if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")) ||
106	  !strncasecmp (curr, "Driver=", STRLEN ("Driver=")) ||
107	  !strncasecmp (curr, "Description=", STRLEN ("Description=")))
108	continue;
109
110      if ((cour = strchr (curr, '=')))
111	{
112	  *cour = '\0';
113	  data[0] = curr;
114	  data[1] = cour + 1;
115	  gtk_clist_append (GTK_CLIST (widget), data);
116	  *cour = '=';
117	}
118      else
119	{
120	  data[0] = "";
121	  gtk_clist_append (GTK_CLIST (widget), data);
122	}
123    }
124
125  if (GTK_CLIST (widget)->rows > 0)
126    gtk_clist_sort (GTK_CLIST (widget));
127}
128
129
130static void
131parse_attribute_line(TGENSETUP *gensetup_t, LPCSTR dsn, LPCSTR attrs, BOOL add)
132{
133  if (dsn && gensetup_t->dsn_entry)
134    {
135      gtk_entry_set_text (GTK_ENTRY (gensetup_t->dsn_entry), dsn);
136      if (add)
137	gtk_widget_set_sensitive (gensetup_t->dsn_entry, TRUE);
138      else
139	gtk_widget_set_sensitive (gensetup_t->dsn_entry, FALSE);
140    }
141
142  addkeywords_to_list (gensetup_t->key_list, attrs, gensetup_t);
143}
144
145
146static void
147gensetup_add_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
148{
149  char *szKey;
150  char *data[2];
151  int i = 0;
152
153  if (gensetup_t)
154    {
155      data[0] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry));
156      if (STRLEN (data[0]))
157	{
158	  data[1] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry));
159
160	  /* Try to see if the keyword already exists */
161	  for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++)
162	    {
163	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0,
164		  &szKey);
165	      if (STREQ (data[0], szKey))
166		goto done;
167	    }
168
169	  /* An update operation */
170	  if (i < GTK_CLIST (gensetup_t->key_list)->rows)
171	    {
172	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1,
173		  data[1]);
174	    }
175	  else if (STRLEN (data[1]))
176	    {
177	      gtk_clist_append (GTK_CLIST (gensetup_t->key_list), data);
178	    }
179	}
180
181      gtk_clist_sort (GTK_CLIST (gensetup_t->key_list));
182
183    done:
184      gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
185      gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
186    }
187}
188
189
190static void
191gensetup_update_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
192{
193  char *data[2];
194  int i;
195
196  if (gensetup_t)
197    {
198      data[0] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry));
199      if (STRLEN (data[0]))
200	{
201	  data[1] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry));
202
203	  if (GTK_CLIST (gensetup_t->key_list)->selection != NULL)
204	    i = GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->
205		data);
206	  else
207	    i = 0;
208
209	  /* An update operation */
210	  if (i < GTK_CLIST (gensetup_t->key_list)->rows)
211	    {
212	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 0,
213		  data[0]);
214	      gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1,
215		  data[1]);
216	    }
217	}
218
219      gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
220      gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
221    }
222}
223
224
225static void
226gensetup_list_select(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t)
227{
228  char *szKey, *szValue;
229
230  if (gensetup_t && GTK_CLIST (gensetup_t->key_list)->selection != NULL)
231    {
232      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list),
233	  GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data),
234	  0, &szKey);
235      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list),
236	  GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data),
237	  1, &szValue);
238      gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), szKey);
239      gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), szValue);
240      gtk_widget_set_sensitive (gensetup_t->bupdate, TRUE);
241    }
242}
243
244
245static void
246gensetup_list_unselect(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t)
247{
248  if (gensetup_t)
249    {
250      gtk_widget_set_sensitive (gensetup_t->bupdate, FALSE);
251      gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), "");
252      gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), "");
253    }
254}
255
256
257static void
258gensetup_ok_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
259{
260  char *curr, *cour, *szKey, *szValue;
261  int i = 0, size = 0;
262
263  if (gensetup_t)
264    {
265      /* What is the size of the block to malloc */
266      if (gensetup_t->dsn_entry)
267        {
268          size +=
269	      STRLEN (gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry))) +
270	      STRLEN ("DSN=") + 1;
271          size += STRLEN ("Description=") + 1;
272        }
273      else
274        {
275          size = 1;
276        }
277      /* Malloc it (+1 for list-terminating NUL) */
278      if ((gensetup_t->connstr = (char *) calloc (sizeof(char), ++size)))
279	{
280	  if (gensetup_t->dsn_entry)
281	    {
282	      for (curr = STRCONN, cour = gensetup_t->connstr;
283	           i < STRCONN_NB_TOKENS; i++, curr += (STRLEN (curr) + 1))
284	        switch (i)
285	          {
286	          case 0:
287		    sprintf (cour, curr,
288		        gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry)));
289		    cour += (STRLEN (cour) + 1);
290		    break;
291	          case 1:
292		    sprintf (cour, curr, "");
293		    cour += (STRLEN (cour) + 1);
294		    break;
295	          };
296	    }
297	  else
298	    size = 1;
299
300	  for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++)
301	    {
302	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0,
303		  &szKey);
304	      gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 1,
305		  &szValue);
306
307	      cour = gensetup_t->connstr;
308	      gensetup_t->connstr =
309		  (char *) malloc (size + STRLEN (szKey) + STRLEN (szValue) +
310		  2);
311	      if (gensetup_t->connstr)
312		{
313		  memcpy (gensetup_t->connstr, cour, size);
314		  sprintf (gensetup_t->connstr + size - 1, "%s=%s", szKey, szValue);
315		  free (cour);
316		  size += STRLEN (szKey) + STRLEN (szValue) + 2;
317		}
318	      else
319		gensetup_t->connstr = cour;
320	    }
321
322	  /* add list-terminating NUL */
323	  gensetup_t->connstr[size - 1] = '\0';
324	}
325
326      gensetup_t->dsn_entry = NULL;
327      gensetup_t->key_list = NULL;
328      gensetup_t->verify_conn = gtk_toggle_button_get_active(gensetup_t->verify_conn_cb);
329
330      gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd),
331	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
332      gtk_main_quit ();
333      gtk_widget_destroy (gensetup_t->mainwnd);
334    }
335}
336
337
338static void
339gensetup_cancel_clicked(GtkWidget* widget, TGENSETUP *gensetup_t)
340{
341  if (gensetup_t)
342    {
343      gensetup_t->connstr = (LPSTR) -1L;
344
345      gensetup_t->dsn_entry = NULL;
346      gensetup_t->key_list = NULL;
347
348      gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd),
349	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
350      gtk_main_quit ();
351      gtk_widget_destroy (gensetup_t->mainwnd);
352    }
353}
354
355
356static gint delete_event( GtkWidget *widget,
357	GdkEvent *event, TGENSETUP *gensetup_t)
358{
359  gensetup_cancel_clicked (widget, gensetup_t);
360
361  return FALSE;
362}
363
364
365LPSTR
366create_fgensetup (HWND hwnd, LPCSTR dsn, LPCSTR attrs, BOOL add, BOOL *verify_conn)
367{
368  GtkWidget *gensetup, *dialog_vbox1, *fixed1, *t_dsn, *l_dsn;
369  GtkWidget *l_comment, *scrolledwindow1, *clist1;
370  GtkWidget *l_key, *l_value, *t_keyword, *t_value, *l_copyright;
371  GtkWidget *vbuttonbox1, *b_add, *b_update, *l_keyword, *l_valeur;
372  GtkWidget *dialog_action_area1, *hbuttonbox1, *b_ok, *b_cancel;
373  GtkWidget *cb_verify;
374  guint button_key;
375  GtkAccelGroup *accel_group;
376  TGENSETUP gensetup_t;
377  char buff[1024];
378
379  if (hwnd == NULL || !GTK_IS_WIDGET (hwnd))
380    return (LPSTR) attrs;
381
382  accel_group = gtk_accel_group_new ();
383
384  gensetup = gtk_dialog_new ();
385  gtk_object_set_data (GTK_OBJECT (gensetup), "gensetup", gensetup);
386  gtk_window_set_title (GTK_WINDOW (gensetup), "File DSN Generic Setup");
387  gtk_window_set_position (GTK_WINDOW (gensetup), GTK_WIN_POS_CENTER);
388  gtk_window_set_modal (GTK_WINDOW (gensetup), TRUE);
389  gtk_window_set_policy (GTK_WINDOW (gensetup), FALSE, FALSE, FALSE);
390
391#if GTK_CHECK_VERSION(2,0,0)
392  gtk_widget_show (gensetup);
393#endif
394
395  dialog_vbox1 = GTK_DIALOG (gensetup)->vbox;
396  gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_vbox1", dialog_vbox1);
397  gtk_widget_show (dialog_vbox1);
398
399  fixed1 = gtk_fixed_new ();
400  gtk_widget_ref (fixed1);
401  gtk_object_set_data_full (GTK_OBJECT (gensetup), "fixed1", fixed1,
402      (GtkDestroyNotify) gtk_widget_unref);
403  gtk_widget_show (fixed1);
404  gtk_box_pack_start (GTK_BOX (dialog_vbox1), fixed1, TRUE, TRUE, 0);
405  gtk_container_set_border_width (GTK_CONTAINER (fixed1), 6);
406
407  t_dsn = gtk_entry_new ();
408  gtk_widget_ref (t_dsn);
409  gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_dsn", t_dsn,
410      (GtkDestroyNotify) gtk_widget_unref);
411  gtk_widget_show (t_dsn);
412  gtk_fixed_put (GTK_FIXED (fixed1), t_dsn, 168, 16);
413  gtk_widget_set_uposition (t_dsn, 168, 16);
414  gtk_widget_set_usize (t_dsn, 0, 0);
415
416  l_dsn = gtk_label_new ("File Data Source Name : ");
417  gtk_widget_ref (l_dsn);
418  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_dsn", l_dsn,
419      (GtkDestroyNotify) gtk_widget_unref);
420  gtk_widget_show (l_dsn);
421  gtk_fixed_put (GTK_FIXED (fixed1), l_dsn, 8, 19);
422  gtk_widget_set_uposition (l_dsn, 8, 19);
423  gtk_widget_set_usize (l_dsn, 0, 0);
424  gtk_label_set_justify (GTK_LABEL (l_dsn), GTK_JUSTIFY_LEFT);
425
426  l_comment = gtk_label_new ("If you know the driver-specific keywords for this data source, you can type them and their values here. For more information on driver-specific keywords, please consult your ODBC driver documentation.");
427  gtk_widget_ref (l_comment);
428  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_comment", l_comment,
429      (GtkDestroyNotify) gtk_widget_unref);
430  gtk_widget_show (l_comment);
431  gtk_fixed_put (GTK_FIXED (fixed1), l_comment, 8, 47);
432  gtk_widget_set_uposition (l_comment, 8, 47);
433  gtk_widget_set_usize (l_comment, 330, 70);
434  gtk_label_set_justify (GTK_LABEL (l_comment), GTK_JUSTIFY_LEFT);
435  gtk_label_set_line_wrap (GTK_LABEL (l_comment), TRUE);
436
437  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
438  gtk_widget_ref (scrolledwindow1);
439  gtk_object_set_data_full (GTK_OBJECT (gensetup), "scrolledwindow1",
440      scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref);
441  gtk_widget_show (scrolledwindow1);
442  gtk_fixed_put (GTK_FIXED (fixed1), scrolledwindow1, 8, 128);
443  gtk_widget_set_uposition (scrolledwindow1, 8, 128);
444  gtk_widget_set_usize (scrolledwindow1, 320, 184);
445
446  clist1 = gtk_clist_new (2);
447  gtk_widget_ref (clist1);
448  gtk_object_set_data_full (GTK_OBJECT (gensetup), "clist1", clist1,
449      (GtkDestroyNotify) gtk_widget_unref);
450  gtk_widget_show (clist1);
451  gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist1);
452  gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 137);
453  gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80);
454  gtk_clist_column_titles_show (GTK_CLIST (clist1));
455
456  l_key = gtk_label_new (szKeysColumnNames[0]);
457  gtk_widget_ref (l_key);
458  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_key", l_key,
459      (GtkDestroyNotify) gtk_widget_unref);
460  gtk_widget_show (l_key);
461  gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key);
462
463  l_value = gtk_label_new (szKeysColumnNames[1]);
464  gtk_widget_ref (l_value);
465  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_value", l_value,
466      (GtkDestroyNotify) gtk_widget_unref);
467  gtk_widget_show (l_value);
468  gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value);
469
470  t_keyword = gtk_entry_new ();
471  gtk_widget_ref (t_keyword);
472  gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_keyword", t_keyword,
473      (GtkDestroyNotify) gtk_widget_unref);
474  gtk_widget_show (t_keyword);
475  gtk_fixed_put (GTK_FIXED (fixed1), t_keyword, 80, 328);
476  gtk_widget_set_uposition (t_keyword, 80, 328);
477  gtk_widget_set_usize (t_keyword, 158, 22);
478
479  t_value = gtk_entry_new ();
480  gtk_widget_ref (t_value);
481  gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_value", t_value,
482      (GtkDestroyNotify) gtk_widget_unref);
483  gtk_widget_show (t_value);
484  gtk_fixed_put (GTK_FIXED (fixed1), t_value, 80, 360);
485  gtk_widget_set_uposition (t_value, 80, 360);
486  gtk_widget_set_usize (t_value, 158, 22);
487
488
489  vbuttonbox1 = gtk_vbutton_box_new ();
490  gtk_widget_ref (vbuttonbox1);
491  gtk_object_set_data_full (GTK_OBJECT (gensetup), "vbuttonbox1", vbuttonbox1,
492      (GtkDestroyNotify) gtk_widget_unref);
493  gtk_widget_show (vbuttonbox1);
494  gtk_fixed_put (GTK_FIXED (fixed1), vbuttonbox1, 248, 320);
495  gtk_widget_set_uposition (vbuttonbox1, 248, 320);
496  gtk_widget_set_usize (vbuttonbox1, 85, 69);
497
498  b_add = gtk_button_new_with_label ("");
499  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_add)->child),
500      szKeysButtons[0]);
501  gtk_widget_add_accelerator (b_add, "clicked", accel_group,
502      button_key, GDK_MOD1_MASK, 0);
503  gtk_widget_ref (b_add);
504  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_add", b_add,
505      (GtkDestroyNotify) gtk_widget_unref);
506  gtk_widget_show (b_add);
507  gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_add);
508  GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT);
509  gtk_widget_add_accelerator (b_add, "clicked", accel_group,
510      'A', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
511
512  b_update = gtk_button_new_with_label ("");
513  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_update)->child),
514      szKeysButtons[1]);
515  gtk_widget_add_accelerator (b_update, "clicked", accel_group,
516      button_key, GDK_MOD1_MASK, 0);
517  gtk_widget_ref (b_update);
518  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_update", b_update,
519      (GtkDestroyNotify) gtk_widget_unref);
520  gtk_widget_show (b_update);
521  gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_update);
522  GTK_WIDGET_SET_FLAGS (b_update, GTK_CAN_DEFAULT);
523  gtk_widget_add_accelerator (b_update, "clicked", accel_group,
524      'U', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
525  gtk_widget_set_sensitive (b_update, FALSE);
526
527  l_keyword = gtk_label_new ("Keyword : ");
528  gtk_widget_ref (l_keyword);
529  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_keyword", l_keyword,
530      (GtkDestroyNotify) gtk_widget_unref);
531  gtk_widget_show (l_keyword);
532  gtk_fixed_put (GTK_FIXED (fixed1), l_keyword, 8, 330);
533  gtk_widget_set_uposition (l_keyword, 8, 330);
534  gtk_widget_set_usize (l_keyword, 69, 16);
535  gtk_label_set_justify (GTK_LABEL (l_keyword), GTK_JUSTIFY_LEFT);
536
537  l_valeur = gtk_label_new ("Value : ");
538  gtk_widget_ref (l_valeur);
539  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_valeur", l_valeur,
540      (GtkDestroyNotify) gtk_widget_unref);
541  gtk_widget_show (l_valeur);
542  gtk_fixed_put (GTK_FIXED (fixed1), l_valeur, 8, 363);
543  gtk_widget_set_uposition (l_valeur, 8, 363);
544  gtk_widget_set_usize (l_valeur, 51, 16);
545  gtk_label_set_justify (GTK_LABEL (l_valeur), GTK_JUSTIFY_LEFT);
546
547  cb_verify = gtk_check_button_new_with_label ("Verify this connection(recommended)");
548  gtk_widget_ref (cb_verify);
549  gtk_object_set_data_full (GTK_OBJECT (gensetup), "cb_verify",
550      cb_verify, (GtkDestroyNotify) gtk_widget_unref);
551  gtk_widget_show (cb_verify);
552  gtk_fixed_put (GTK_FIXED (fixed1), cb_verify, 8, 390);
553  gtk_widget_set_uposition (cb_verify, 8, 390);
554  gtk_widget_set_usize (cb_verify, 240, 24);
555
556  dialog_action_area1 = GTK_DIALOG (gensetup)->action_area;
557  gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_action_area1",
558      dialog_action_area1);
559  gtk_widget_show (dialog_action_area1);
560  gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 5);
561
562  hbuttonbox1 = gtk_hbutton_box_new ();
563  gtk_widget_ref (hbuttonbox1);
564  gtk_object_set_data_full (GTK_OBJECT (gensetup), "hbuttonbox1", hbuttonbox1,
565      (GtkDestroyNotify) gtk_widget_unref);
566  gtk_widget_show (hbuttonbox1);
567  gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbuttonbox1, TRUE, TRUE,
568      0);
569  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
570  gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox1), 10);
571
572  b_ok = gtk_button_new_with_label ("");
573  button_key =
574      gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_ok)->child), "_Ok");
575  gtk_widget_add_accelerator (b_ok, "clicked", accel_group, button_key,
576      GDK_MOD1_MASK, 0);
577  gtk_widget_ref (b_ok);
578  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_ok", b_ok,
579      (GtkDestroyNotify) gtk_widget_unref);
580  gtk_widget_show (b_ok);
581  gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_ok);
582  GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT);
583  gtk_widget_add_accelerator (b_ok, "clicked", accel_group,
584      'O', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
585
586  b_cancel = gtk_button_new_with_label ("");
587  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_cancel)->child),
588      "_Cancel");
589  gtk_widget_add_accelerator (b_cancel, "clicked", accel_group,
590      button_key, GDK_MOD1_MASK, 0);
591  gtk_widget_ref (b_cancel);
592  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_cancel", b_cancel,
593      (GtkDestroyNotify) gtk_widget_unref);
594  gtk_widget_show (b_cancel);
595  gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_cancel);
596  GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT);
597  gtk_widget_add_accelerator (b_cancel, "clicked", accel_group,
598      'C', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
599
600  /* Ok button events */
601  gtk_signal_connect (GTK_OBJECT (b_ok), "clicked",
602      GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t);
603  /* Cancel button events */
604  gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked",
605      GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t);
606  /* Add button events */
607  gtk_signal_connect (GTK_OBJECT (b_add), "clicked",
608      GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t);
609  /* Update button events */
610  gtk_signal_connect (GTK_OBJECT (b_update), "clicked",
611      GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t);
612  /* Close window button events */
613  gtk_signal_connect (GTK_OBJECT (gensetup), "delete_event",
614      GTK_SIGNAL_FUNC (delete_event), &gensetup_t);
615  gtk_signal_connect (GTK_OBJECT (gensetup), "destroy",
616      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
617  /* List events */
618  gtk_signal_connect (GTK_OBJECT (clist1), "select_row",
619      GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t);
620  gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row",
621      GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t);
622
623  gtk_window_add_accel_group (GTK_WINDOW (gensetup), accel_group);
624
625  gensetup_t.dsn_entry = t_dsn;
626  gensetup_t.key_list = clist1;
627  gensetup_t.bupdate = b_update;
628  gensetup_t.key_entry = t_keyword;
629  gensetup_t.value_entry = t_value;
630  gensetup_t.mainwnd = gensetup;
631  gensetup_t.verify_conn_cb = cb_verify;
632  gensetup_t.verify_conn = *verify_conn;
633
634  gtk_toggle_button_set_active(cb_verify, *verify_conn);
635
636  /* Parse the attributes line */
637  parse_attribute_line (&gensetup_t, dsn, attrs, add);
638
639  gtk_widget_show_all (gensetup);
640  gtk_main ();
641
642  *verify_conn = gensetup_t.verify_conn;
643
644  return gensetup_t.connstr;
645}
646
647
648
649LPSTR
650create_keyval (HWND hwnd, LPCSTR attrs, BOOL *verify_conn)
651{
652  GtkWidget *gensetup, *dialog_vbox1, *fixed1;
653  GtkWidget *l_comment, *scrolledwindow1, *clist1;
654  GtkWidget *l_key, *l_value, *t_keyword, *t_value, *l_copyright;
655  GtkWidget *vbuttonbox1, *b_add, *b_update, *l_keyword, *l_valeur;
656  GtkWidget *dialog_action_area1, *hbuttonbox1, *b_ok, *b_cancel;
657  GtkWidget *cb_verify;
658  guint button_key;
659  GtkAccelGroup *accel_group;
660  TGENSETUP gensetup_t;
661  char buff[1024];
662
663  if (hwnd == NULL || !GTK_IS_WIDGET (hwnd))
664    return (LPSTR) attrs;
665
666  accel_group = gtk_accel_group_new ();
667
668  gensetup = gtk_dialog_new ();
669  gtk_object_set_data (GTK_OBJECT (gensetup), "gensetup", gensetup);
670  gtk_window_set_title (GTK_WINDOW (gensetup), "Advanced File DSN Creation Settings");
671  gtk_window_set_position (GTK_WINDOW (gensetup), GTK_WIN_POS_CENTER);
672  gtk_window_set_modal (GTK_WINDOW (gensetup), TRUE);
673  gtk_window_set_policy (GTK_WINDOW (gensetup), FALSE, FALSE, FALSE);
674
675#if GTK_CHECK_VERSION(2,0,0)
676  gtk_widget_show (gensetup);
677#endif
678
679  dialog_vbox1 = GTK_DIALOG (gensetup)->vbox;
680  gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_vbox1", dialog_vbox1);
681  gtk_widget_show (dialog_vbox1);
682
683  fixed1 = gtk_fixed_new ();
684  gtk_widget_ref (fixed1);
685  gtk_object_set_data_full (GTK_OBJECT (gensetup), "fixed1", fixed1,
686      (GtkDestroyNotify) gtk_widget_unref);
687  gtk_widget_show (fixed1);
688  gtk_box_pack_start (GTK_BOX (dialog_vbox1), fixed1, TRUE, TRUE, 0);
689  gtk_container_set_border_width (GTK_CONTAINER (fixed1), 6);
690
691
692  l_comment = gtk_label_new ("If you know the driver-specific keywords for this data source, you can type them and their values here. For more information on driver-specific keywords, please consult your ODBC driver documentation.");
693  gtk_widget_ref (l_comment);
694  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_comment", l_comment,
695      (GtkDestroyNotify) gtk_widget_unref);
696  gtk_widget_show (l_comment);
697  gtk_fixed_put (GTK_FIXED (fixed1), l_comment, 8, 7);
698  gtk_widget_set_uposition (l_comment, 8, 7);
699  gtk_widget_set_usize (l_comment, 330, 70);
700  gtk_label_set_justify (GTK_LABEL (l_comment), GTK_JUSTIFY_LEFT);
701  gtk_label_set_line_wrap (GTK_LABEL (l_comment), TRUE);
702
703  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
704  gtk_widget_ref (scrolledwindow1);
705  gtk_object_set_data_full (GTK_OBJECT (gensetup), "scrolledwindow1",
706      scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref);
707  gtk_widget_show (scrolledwindow1);
708  gtk_fixed_put (GTK_FIXED (fixed1), scrolledwindow1, 8, 88);
709  gtk_widget_set_uposition (scrolledwindow1, 8, 88);
710  gtk_widget_set_usize (scrolledwindow1, 320, 184);
711
712  clist1 = gtk_clist_new (2);
713  gtk_widget_ref (clist1);
714  gtk_object_set_data_full (GTK_OBJECT (gensetup), "clist1", clist1,
715      (GtkDestroyNotify) gtk_widget_unref);
716  gtk_widget_show (clist1);
717  gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist1);
718  gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 137);
719  gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80);
720  gtk_clist_column_titles_show (GTK_CLIST (clist1));
721
722  l_key = gtk_label_new (szKeysColumnNames[0]);
723  gtk_widget_ref (l_key);
724  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_key", l_key,
725      (GtkDestroyNotify) gtk_widget_unref);
726  gtk_widget_show (l_key);
727  gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key);
728
729  l_value = gtk_label_new (szKeysColumnNames[1]);
730  gtk_widget_ref (l_value);
731  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_value", l_value,
732      (GtkDestroyNotify) gtk_widget_unref);
733  gtk_widget_show (l_value);
734  gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value);
735
736  t_keyword = gtk_entry_new ();
737  gtk_widget_ref (t_keyword);
738  gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_keyword", t_keyword,
739      (GtkDestroyNotify) gtk_widget_unref);
740  gtk_widget_show (t_keyword);
741  gtk_fixed_put (GTK_FIXED (fixed1), t_keyword, 80, 288);
742  gtk_widget_set_uposition (t_keyword, 80, 288);
743  gtk_widget_set_usize (t_keyword, 158, 22);
744
745  t_value = gtk_entry_new ();
746  gtk_widget_ref (t_value);
747  gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_value", t_value,
748      (GtkDestroyNotify) gtk_widget_unref);
749  gtk_widget_show (t_value);
750  gtk_fixed_put (GTK_FIXED (fixed1), t_value, 80, 320);
751  gtk_widget_set_uposition (t_value, 80, 320);
752  gtk_widget_set_usize (t_value, 158, 22);
753
754
755  vbuttonbox1 = gtk_vbutton_box_new ();
756  gtk_widget_ref (vbuttonbox1);
757  gtk_object_set_data_full (GTK_OBJECT (gensetup), "vbuttonbox1", vbuttonbox1,
758      (GtkDestroyNotify) gtk_widget_unref);
759  gtk_widget_show (vbuttonbox1);
760  gtk_fixed_put (GTK_FIXED (fixed1), vbuttonbox1, 248, 280);
761  gtk_widget_set_uposition (vbuttonbox1, 248, 280);
762  gtk_widget_set_usize (vbuttonbox1, 85, 69);
763
764  b_add = gtk_button_new_with_label ("");
765  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_add)->child),
766      szKeysButtons[0]);
767  gtk_widget_add_accelerator (b_add, "clicked", accel_group,
768      button_key, GDK_MOD1_MASK, 0);
769  gtk_widget_ref (b_add);
770  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_add", b_add,
771      (GtkDestroyNotify) gtk_widget_unref);
772  gtk_widget_show (b_add);
773  gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_add);
774  GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT);
775  gtk_widget_add_accelerator (b_add, "clicked", accel_group,
776      'A', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
777
778  b_update = gtk_button_new_with_label ("");
779  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_update)->child),
780      szKeysButtons[1]);
781  gtk_widget_add_accelerator (b_update, "clicked", accel_group,
782      button_key, GDK_MOD1_MASK, 0);
783  gtk_widget_ref (b_update);
784  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_update", b_update,
785      (GtkDestroyNotify) gtk_widget_unref);
786  gtk_widget_show (b_update);
787  gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_update);
788  GTK_WIDGET_SET_FLAGS (b_update, GTK_CAN_DEFAULT);
789  gtk_widget_add_accelerator (b_update, "clicked", accel_group,
790      'U', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
791  gtk_widget_set_sensitive (b_update, FALSE);
792
793  l_keyword = gtk_label_new ("Keyword : ");
794  gtk_widget_ref (l_keyword);
795  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_keyword", l_keyword,
796      (GtkDestroyNotify) gtk_widget_unref);
797  gtk_widget_show (l_keyword);
798  gtk_fixed_put (GTK_FIXED (fixed1), l_keyword, 8, 290);
799  gtk_widget_set_uposition (l_keyword, 8, 290);
800  gtk_widget_set_usize (l_keyword, 69, 16);
801  gtk_label_set_justify (GTK_LABEL (l_keyword), GTK_JUSTIFY_LEFT);
802
803  l_valeur = gtk_label_new ("Value : ");
804  gtk_widget_ref (l_valeur);
805  gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_valeur", l_valeur,
806      (GtkDestroyNotify) gtk_widget_unref);
807  gtk_widget_show (l_valeur);
808  gtk_fixed_put (GTK_FIXED (fixed1), l_valeur, 8, 323);
809  gtk_widget_set_uposition (l_valeur, 8, 323);
810  gtk_widget_set_usize (l_valeur, 51, 16);
811  gtk_label_set_justify (GTK_LABEL (l_valeur), GTK_JUSTIFY_LEFT);
812
813  cb_verify = gtk_check_button_new_with_label ("Verify this connection(recommended)");
814  gtk_widget_ref (cb_verify);
815  gtk_object_set_data_full (GTK_OBJECT (gensetup), "cb_verify",
816      cb_verify, (GtkDestroyNotify) gtk_widget_unref);
817  gtk_widget_show (cb_verify);
818  gtk_fixed_put (GTK_FIXED (fixed1), cb_verify, 8, 350);
819  gtk_widget_set_uposition (cb_verify, 8, 350);
820  gtk_widget_set_usize (cb_verify, 230, 24);
821
822  dialog_action_area1 = GTK_DIALOG (gensetup)->action_area;
823  gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_action_area1",
824      dialog_action_area1);
825  gtk_widget_show (dialog_action_area1);
826  gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 5);
827
828  hbuttonbox1 = gtk_hbutton_box_new ();
829  gtk_widget_ref (hbuttonbox1);
830  gtk_object_set_data_full (GTK_OBJECT (gensetup), "hbuttonbox1", hbuttonbox1,
831      (GtkDestroyNotify) gtk_widget_unref);
832  gtk_widget_show (hbuttonbox1);
833  gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbuttonbox1, TRUE, TRUE,
834      0);
835  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
836  gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox1), 10);
837
838  b_ok = gtk_button_new_with_label ("");
839  button_key =
840      gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_ok)->child), "_Ok");
841  gtk_widget_add_accelerator (b_ok, "clicked", accel_group, button_key,
842      GDK_MOD1_MASK, 0);
843  gtk_widget_ref (b_ok);
844  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_ok", b_ok,
845      (GtkDestroyNotify) gtk_widget_unref);
846  gtk_widget_show (b_ok);
847  gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_ok);
848  GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT);
849  gtk_widget_add_accelerator (b_ok, "clicked", accel_group,
850      'O', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
851
852  b_cancel = gtk_button_new_with_label ("");
853  button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_cancel)->child),
854      "_Cancel");
855  gtk_widget_add_accelerator (b_cancel, "clicked", accel_group,
856      button_key, GDK_MOD1_MASK, 0);
857  gtk_widget_ref (b_cancel);
858  gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_cancel", b_cancel,
859      (GtkDestroyNotify) gtk_widget_unref);
860  gtk_widget_show (b_cancel);
861  gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_cancel);
862  GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT);
863  gtk_widget_add_accelerator (b_cancel, "clicked", accel_group,
864      'C', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
865
866  /* Ok button events */
867  gtk_signal_connect (GTK_OBJECT (b_ok), "clicked",
868      GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t);
869  /* Cancel button events */
870  gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked",
871      GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t);
872  /* Add button events */
873  gtk_signal_connect (GTK_OBJECT (b_add), "clicked",
874      GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t);
875  /* Update button events */
876  gtk_signal_connect (GTK_OBJECT (b_update), "clicked",
877      GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t);
878  /* Close window button events */
879  gtk_signal_connect (GTK_OBJECT (gensetup), "delete_event",
880      GTK_SIGNAL_FUNC (delete_event), &gensetup_t);
881  gtk_signal_connect (GTK_OBJECT (gensetup), "destroy",
882      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
883  /* List events */
884  gtk_signal_connect (GTK_OBJECT (clist1), "select_row",
885      GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t);
886  gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row",
887      GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t);
888
889  gtk_window_add_accel_group (GTK_WINDOW (gensetup), accel_group);
890
891  gensetup_t.dsn_entry = NULL;
892  gensetup_t.key_list = clist1;
893  gensetup_t.bupdate = b_update;
894  gensetup_t.key_entry = t_keyword;
895  gensetup_t.value_entry = t_value;
896  gensetup_t.mainwnd = gensetup;
897  gensetup_t.verify_conn_cb = cb_verify;
898  gensetup_t.verify_conn = *verify_conn;
899
900  gtk_toggle_button_set_active(cb_verify, *verify_conn);
901
902  /* Parse the attributes line */
903  parse_attribute_line (&gensetup_t, NULL, attrs, TRUE);
904
905  gtk_widget_show_all (gensetup);
906  gtk_main ();
907
908  *verify_conn = gensetup_t.verify_conn;
909
910  return gensetup_t.connstr;
911}
912