summaryrefslogtreecommitdiff
path: root/src/exportcsv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/exportcsv.c')
-rw-r--r--src/exportcsv.c607
1 files changed, 607 insertions, 0 deletions
diff --git a/src/exportcsv.c b/src/exportcsv.c
new file mode 100644
index 0000000..3fa35ee
--- /dev/null
+++ b/src/exportcsv.c
@@ -0,0 +1,607 @@
1/*
2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2017 Hiroyuki Yamamoto
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20#ifdef HAVE_CONFIG_H
21# include "config.h"
22#endif
23
24#include "defs.h"
25
26#include <glib.h>
27#include <glib/gi18n.h>
28#include <gdk/gdkkeysyms.h>
29#include <gtk/gtkwindow.h>
30#include <gtk/gtksignal.h>
31#include <gtk/gtkvbox.h>
32#include <gtk/gtklabel.h>
33#include <gtk/gtkentry.h>
34#include <gtk/gtktable.h>
35#include <gtk/gtkbutton.h>
36#include <gtk/gtkradiobutton.h>
37#include <gtk/gtkhbbox.h>
38#include <gtk/gtkcheckbutton.h>
39#include <gtk/gtktogglebutton.h>
40#include <gtk/gtkstatusbar.h>
41#include <gtk/gtknotebook.h>
42#include <gtk/gtkstock.h>
43
44#include <stdio.h>
45
46#include "addrbook.h"
47#include "addressbook.h"
48#include "addressitem.h"
49#include "filesel.h"
50#include "gtkutils.h"
51#include "stock_pixmap.h"
52#include "prefs_common.h"
53#include "manage_window.h"
54#include "mgutils.h"
55#include "exportcsv.h"
56#include "utils.h"
57
58#define PAGE_FILE_INFO 0
59#define PAGE_FINISH 1
60
61#define EXPORTCSV_WIDTH 480
62#define EXPORTCSV_HEIGHT 320
63
64static struct _ExpCSVDlg {
65 GtkWidget *window;
66 GtkWidget *notebook;
67 GtkWidget *file_entry;
68 GtkWidget *comma_radiobtn;
69 GtkWidget *tab_radiobtn;
70 GtkWidget *labelFile;
71 GtkWidget *labelRecords;
72 GtkWidget *btnNext;
73 GtkWidget *btnCancel;
74 GtkWidget *statusbar;
75 gint status_cid;
76 gint rowCount;
77 gchar *fileName;
78 gchar delimiter;
79 gboolean cancelled;
80} expcsv_dlg;
81
82static AddressObject *_exp_object_;
83static gint exportCount = 0;
84static gint result;
85
86static void exp_csv_status_show( gchar *msg ) {
87 if( expcsv_dlg.statusbar != NULL ) {
88 gtk_statusbar_pop( GTK_STATUSBAR(expcsv_dlg.statusbar), expcsv_dlg.status_cid );
89 if( msg ) {
90 gtk_statusbar_push( GTK_STATUSBAR(expcsv_dlg.statusbar), expcsv_dlg.status_cid, msg );
91 }
92 }
93}
94
95static void exp_csv_message( void ) {
96 gchar *sMsg = NULL;
97 gint pageNum;
98
99 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) );
100 if( pageNum == PAGE_FILE_INFO ) {
101 sMsg = _( "Please specify file to export." );
102 }
103 else if( pageNum == PAGE_FINISH ) {
104 sMsg = _( "File exported." );
105 }
106 exp_csv_status_show( sMsg );
107}
108
109static gint exp_csv_write_email_record( ItemPerson *person, ItemEMail *email, FILE *fp ) {
110 gchar *sName, *sAddress, *sAlias, *sNickName;
111 gchar *sFirstName, *sLastName;
112 gchar *sRemarks;
113 gchar *csv;
114
115 g_return_val_if_fail(person != NULL, MGU_BAD_ARGS);
116
117 sName = ADDRITEM_NAME(person) ? ADDRITEM_NAME(person) : "";
118 sFirstName = person->firstName ? person->firstName : "";
119 sLastName = person->lastName ? person->lastName : "";
120 sNickName = person->nickName ? person->nickName : "";
121
122 if (email) {
123 sAddress = email->address ? email->address : "";
124 sRemarks = email->remarks ? email->remarks : "";
125 sAlias = ADDRITEM_NAME(email) ? ADDRITEM_NAME(email) : "";
126 } else {
127 sAddress = "";
128 sRemarks = "";
129 sAlias = "";
130 }
131
132 csv = strconcat_csv(expcsv_dlg.delimiter, sFirstName, sLastName, sName, sNickName, sAddress, sRemarks, sAlias, NULL);
133 debug_print("%s\n", csv);
134 fputs(csv, fp);
135 fputc('\n', fp);
136 g_free(csv);
137
138 return MGU_SUCCESS;
139}
140
141static gint exp_csv_export_folder_recursive( ItemFolder *itemFolder, FILE *fp ) {
142 GList *items;
143 GList *cur;
144 gint count = 0;
145
146 g_return_val_if_fail(itemFolder != NULL, MGU_BAD_ARGS);
147
148 debug_print("exp_csv_export_folder_recursive: export folder: %s\n", ADDRITEM_NAME(itemFolder) ? ADDRITEM_NAME(itemFolder) : "(root)");
149
150 items = addritem_folder_get_person_list(itemFolder);
151 for (cur = items; cur != NULL; cur = cur->next) {
152 ItemPerson *person;
153 ItemEMail *email;
154 GList *node;
155
156 person = (ItemPerson *)cur->data;
157 if (!person) {
158 continue;
159 }
160
161 node = person->listEMail;
162 if (!node) {
163 if (exp_csv_write_email_record(person, NULL, fp) == MGU_SUCCESS) {
164 count++;
165 }
166 } else {
167 while (node) {
168 email = node->data;
169 node = g_list_next(node);
170 if (exp_csv_write_email_record(person, email, fp) == MGU_SUCCESS) {
171 count++;
172 }
173 }
174 }
175 }
176 g_list_free(items);
177
178 exportCount += count;
179
180 /* Export subfolders */
181 items = itemFolder->listFolder;
182 for (cur = items; cur != NULL; cur = cur->next) {
183 ItemFolder *item = cur->data;
184 exp_csv_export_folder_recursive(item, fp);
185 }
186
187 return MGU_SUCCESS;
188}
189
190static gint exp_csv_export_data( gchar *csvFile ) {
191 FILE *fp;
192 ItemFolder *itemFolder = NULL;
193 ItemGroup *itemGroup = NULL;
194 GList *items;
195 GList *cur;
196 gchar *csv;
197 gint count = 0;
198
199 g_return_val_if_fail(csvFile != NULL, MGU_BAD_ARGS);
200
201 if (_exp_object_->type == ADDR_INTERFACE) {
202 return MGU_BAD_ARGS;
203 }
204
205 if ((fp = g_fopen(csvFile, "w")) == NULL) {
206 return MGU_OPEN_FILE;
207 }
208
209 if (_exp_object_->type == ADDR_DATASOURCE) {
210 AddressDataSource *ds = ADAPTER_DSOURCE(_exp_object_)->dataSource;
211
212 if (ds) {
213 itemFolder = addrindex_ds_get_root_folder(ds);
214 }
215 } else if (_exp_object_->type == ADDR_ITEM_FOLDER) {
216 itemFolder = ADAPTER_FOLDER(_exp_object_)->itemFolder;
217 } else if (_exp_object_->type == ADDR_ITEM_GROUP) {
218 itemGroup = ADAPTER_GROUP(_exp_object_)->itemGroup;
219 }
220
221 csv = strconcat_csv(expcsv_dlg.delimiter, _("First Name"), _("Last Name"), _("Display Name"), _("Nick Name"), _("E-Mail Address"), _("Remarks"), _("Alias"), NULL);
222 debug_print("%s\n", csv);
223 fputs(csv, fp);
224 fputc('\n', fp);
225 g_free(csv);
226
227 if (itemFolder) {
228 exp_csv_export_folder_recursive(itemFolder, fp);
229 } else if (itemGroup) {
230 items = itemGroup->listEMail;
231 for (cur = items; cur != NULL; cur = cur->next) {
232 ItemEMail *email = (ItemEMail *)cur->data;
233 ItemPerson *person;
234
235 if (!email) {
236 continue;
237 }
238 person = (ItemPerson *)ADDRITEM_PARENT(email);
239 if (!person) {
240 continue;
241 }
242
243 if (exp_csv_write_email_record(person, email, fp) == MGU_SUCCESS) {
244 count++;
245 }
246 }
247 exportCount = count;
248 }
249
250 fclose(fp);
251
252 return MGU_SUCCESS;
253}
254
255/*
256* Move off file page.
257* return: TRUE if OK to move off page.
258*/
259static gboolean exp_csv_file_move() {
260 gboolean retVal = FALSE;
261 gchar *sFile;
262 gchar *sMsg = NULL;
263 gboolean errFlag = FALSE;
264
265 sFile = gtk_editable_get_chars( GTK_EDITABLE(expcsv_dlg.file_entry), 0, -1 );
266 g_strchug( sFile ); g_strchomp( sFile );
267
268 g_free( expcsv_dlg.fileName );
269 expcsv_dlg.fileName = sFile;
270
271 gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), sFile );
272
273 if (gtk_toggle_button_get_active
274 (GTK_TOGGLE_BUTTON(expcsv_dlg.comma_radiobtn))) {
275 expcsv_dlg.delimiter = ',';
276 } else {
277 expcsv_dlg.delimiter = '\t';
278 }
279
280 if( *sFile == '\0'|| strlen( sFile ) < 1 ) {
281 sMsg = _( "Please select a file." );
282 gtk_widget_grab_focus(expcsv_dlg.file_entry);
283 errFlag = TRUE;
284 }
285
286 if( ! errFlag ) {
287 if( exp_csv_export_data( sFile ) == MGU_SUCCESS ) {
288 retVal = TRUE;
289 } else {
290 sMsg = _( "Cannot write to file." );
291 }
292 }
293 exp_csv_status_show( sMsg );
294
295 return retVal;
296}
297
298/*
299 * Display finish page.
300 */
301static void exp_csv_finish_show() {
302 gchar *sMsg;
303
304 gtk_label_set_text( GTK_LABEL(expcsv_dlg.labelFile), expcsv_dlg.fileName );
305 gtk_label_set_text( GTK_LABEL(expcsv_dlg.labelRecords), itos( exportCount ) );
306 gtk_widget_set_sensitive( expcsv_dlg.btnNext, FALSE );
307 if( result == MGU_SUCCESS ) {
308 sMsg = _( "CSV file exported successfully." );
309 }
310 else {
311 sMsg = mgu_error2string( result );
312 }
313 exp_csv_status_show( sMsg );
314 gtk_button_set_label(GTK_BUTTON(expcsv_dlg.btnCancel), GTK_STOCK_CLOSE);
315 gtk_widget_grab_focus(expcsv_dlg.btnCancel);
316}
317
318static void exp_csv_next( GtkWidget *widget ) {
319 gint pageNum;
320
321 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) );
322 if( pageNum == PAGE_FILE_INFO ) {
323 if( exp_csv_file_move() ) {
324 gtk_notebook_set_current_page(
325 GTK_NOTEBOOK(expcsv_dlg.notebook), PAGE_FINISH );
326 exp_csv_finish_show();
327 }
328 }
329}
330
331static void exp_csv_cancel( GtkWidget *widget, gpointer data ) {
332 gint pageNum;
333
334 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) );
335 if( pageNum != PAGE_FINISH ) {
336 expcsv_dlg.cancelled = TRUE;
337 }
338 gtk_main_quit();
339}
340
341static void exp_csv_file_select( void ) {
342 gchar *sSelFile;
343
344 sSelFile = filesel_select_file( _("Enter CSV File Name"), NULL,
345 GTK_FILE_CHOOSER_ACTION_SAVE );
346 if (sSelFile) {
347 gchar *sUTF8File;
348 sUTF8File = conv_filename_to_utf8( sSelFile );
349 gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), sUTF8File );
350 g_free( sUTF8File );
351 g_free( sSelFile );
352 }
353}
354
355static gint exp_csv_delete_event( GtkWidget *widget, GdkEventAny *event, gpointer data ) {
356 exp_csv_cancel( widget, data );
357 return TRUE;
358}
359
360static gboolean exp_csv_key_pressed( GtkWidget *widget, GdkEventKey *event, gpointer data ) {
361 if (event && event->keyval == GDK_Escape) {
362 exp_csv_cancel( widget, data );
363 }
364 return FALSE;
365}
366
367static void exp_csv_page_file( gint pageNum, gchar *pageLbl ) {
368 GtkWidget *vbox;
369 GtkWidget *table;
370 GtkWidget *label;
371 GtkWidget *file_entry;
372 GtkWidget *file_btn;
373 GtkWidget *hbox;
374 GtkWidget *comma_radiobtn;
375 GtkWidget *tab_radiobtn;
376 gint top;
377
378 vbox = gtk_vbox_new(FALSE, 4);
379 gtk_container_add( GTK_CONTAINER( expcsv_dlg.notebook ), vbox );
380 gtk_container_set_border_width( GTK_CONTAINER (vbox), 4 );
381
382 label = gtk_label_new( pageLbl );
383 gtk_widget_show( label );
384 gtk_notebook_set_tab_label(
385 GTK_NOTEBOOK( expcsv_dlg.notebook ),
386 gtk_notebook_get_nth_page(
387 GTK_NOTEBOOK( expcsv_dlg.notebook ), pageNum ),
388 label );
389
390 table = gtk_table_new(2, 3, FALSE);
391 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
392 gtk_container_set_border_width( GTK_CONTAINER(table), 6 );
393 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
394 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
395
396 /* First row */
397 top = 0;
398 label = gtk_label_new(_("File Name"));
399 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
400 GTK_FILL, 0, 0, 0);
401 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
402
403 file_entry = gtk_entry_new();
404 gtk_table_attach(GTK_TABLE(table), file_entry, 1, 2, top, (top + 1),
405 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
406
407 file_btn = gtk_button_new_with_label(_(" ... "));
408 gtk_table_attach(GTK_TABLE(table), file_btn, 2, 3, top, (top + 1),
409 GTK_FILL, 0, 3, 0);
410
411 hbox = gtk_hbox_new(FALSE, 8);
412 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
413 gtk_container_set_border_width( GTK_CONTAINER (hbox), 4 );
414
415 comma_radiobtn = gtk_radio_button_new_with_label
416 (NULL, _("Comma-separated"));
417 gtk_box_pack_start(GTK_BOX(hbox), comma_radiobtn, FALSE, FALSE, 0);
418
419 tab_radiobtn = gtk_radio_button_new_with_label_from_widget
420 (GTK_RADIO_BUTTON(comma_radiobtn), _("Tab-separated"));
421 gtk_box_pack_start(GTK_BOX(hbox), tab_radiobtn, FALSE, FALSE, 0);
422
423 gtk_widget_show_all(vbox);
424
425 /* Button handler */
426 g_signal_connect(G_OBJECT(file_btn), "clicked",
427 G_CALLBACK(exp_csv_file_select), NULL);
428
429 expcsv_dlg.file_entry = file_entry;
430 expcsv_dlg.comma_radiobtn = comma_radiobtn;
431 expcsv_dlg.tab_radiobtn = tab_radiobtn;
432}
433
434static void exp_csv_page_finish( gint pageNum, gchar *pageLbl ) {
435 GtkWidget *vbox;
436 GtkWidget *table;
437 GtkWidget *label;
438 GtkWidget *labelFile;
439 GtkWidget *labelRecs;
440 gint top;
441
442 vbox = gtk_vbox_new(FALSE, 8);
443 gtk_container_add( GTK_CONTAINER( expcsv_dlg.notebook ), vbox );
444 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
445
446 label = gtk_label_new( pageLbl );
447 gtk_widget_show( label );
448 gtk_notebook_set_tab_label(
449 GTK_NOTEBOOK( expcsv_dlg.notebook ),
450 gtk_notebook_get_nth_page( GTK_NOTEBOOK( expcsv_dlg.notebook ), pageNum ), label );
451
452 table = gtk_table_new(3, 2, FALSE);
453 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
454 gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
455 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
456 gtk_table_set_col_spacings(GTK_TABLE(table), 8 );
457
458 /* First row */
459 top = 0;
460 label = gtk_label_new(_("File Name :"));
461 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
462 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
463
464 labelFile = gtk_label_new("");
465 gtk_table_attach(GTK_TABLE(table), labelFile, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
466 gtk_misc_set_alignment(GTK_MISC(labelFile), 0, 0.5);
467 gtk_label_set_line_wrap(GTK_LABEL(labelFile), TRUE);
468
469 /* Secondrow */
470 top++;
471 label = gtk_label_new(_("Records :"));
472 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
473 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
474
475 labelRecs = gtk_label_new("");
476 gtk_table_attach(GTK_TABLE(table), labelRecs, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
477 gtk_misc_set_alignment(GTK_MISC(labelRecs), 0, 0.5);
478
479 expcsv_dlg.labelFile = labelFile;
480 expcsv_dlg.labelRecords = labelRecs;
481}
482
483static void exp_csv_dialog_create() {
484 GtkWidget *window;
485 GtkWidget *vbox;
486 GtkWidget *vnbox;
487 GtkWidget *notebook;
488 GtkWidget *hbbox;
489 GtkWidget *btnNext;
490 GtkWidget *btnCancel;
491 GtkWidget *hsbox;
492 GtkWidget *statusbar;
493
494 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
495 gtk_widget_set_size_request(window, EXPORTCSV_WIDTH, EXPORTCSV_HEIGHT );
496 gtk_window_set_title( GTK_WINDOW(window), _("Export Address Book into CSV file") );
497 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
498 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
499 g_signal_connect(G_OBJECT(window), "delete_event",
500 G_CALLBACK(exp_csv_delete_event), NULL);
501 g_signal_connect(G_OBJECT(window), "key_press_event",
502 G_CALLBACK(exp_csv_key_pressed), NULL);
503 MANAGE_WINDOW_SIGNALS_CONNECT(window);
504
505 vbox = gtk_vbox_new(FALSE, 4);
506 gtk_widget_show(vbox);
507 gtk_container_add(GTK_CONTAINER(window), vbox);
508
509 vnbox = gtk_vbox_new(FALSE, 4);
510 gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
511 gtk_widget_show(vnbox);
512 gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
513
514 /* Notebook */
515 notebook = gtk_notebook_new();
516 gtk_notebook_set_show_tabs( GTK_NOTEBOOK(notebook), FALSE );
517 gtk_widget_show(notebook);
518 gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
519 gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
520
521 /* Status line */
522 hsbox = gtk_hbox_new(FALSE, 0);
523 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0);
524 statusbar = gtk_statusbar_new();
525 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0);
526
527 /* Button panel */
528 gtkut_stock_button_set_create(&hbbox, &btnNext, _("Next"),
529 &btnCancel, GTK_STOCK_CANCEL,
530 NULL, NULL);
531 gtk_box_pack_end(GTK_BOX(vnbox), hbbox, FALSE, FALSE, 0);
532 gtk_widget_grab_default(btnNext);
533
534 /* Button handlers */
535 g_signal_connect(G_OBJECT(btnNext), "clicked",
536 G_CALLBACK(exp_csv_next), NULL);
537 g_signal_connect(G_OBJECT(btnCancel), "clicked",
538 G_CALLBACK(exp_csv_cancel), NULL);
539
540 gtk_widget_show_all(vbox);
541
542 expcsv_dlg.window = window;
543 expcsv_dlg.notebook = notebook;
544 expcsv_dlg.btnNext = btnNext;
545 expcsv_dlg.btnCancel = btnCancel;
546 expcsv_dlg.statusbar = statusbar;
547 expcsv_dlg.status_cid = gtk_statusbar_get_context_id(
548 GTK_STATUSBAR(statusbar), "Export CSV Dialog" );
549
550}
551
552static void exp_csv_create() {
553 exp_csv_dialog_create();
554 exp_csv_page_file( PAGE_FILE_INFO, _( "File Info" ) );
555 exp_csv_page_finish( PAGE_FINISH, _( "Finish" ) );
556 gtk_widget_show_all( expcsv_dlg.window );
557}
558
559gint addressbook_exp_csv( AddressObject *obj ) {
560 g_return_val_if_fail(obj != NULL, -1);
561
562 if (obj->type == ADDR_INTERFACE)
563 return -1;
564
565 _exp_object_ = obj;
566
567 if( ! expcsv_dlg.window )
568 exp_csv_create();
569 expcsv_dlg.cancelled = FALSE;
570 manage_window_set_transient(GTK_WINDOW(expcsv_dlg.window));
571 gtk_widget_grab_default(expcsv_dlg.btnNext);
572
573 gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), "" );
574 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(expcsv_dlg.comma_radiobtn), TRUE );
575 gtk_notebook_set_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook), PAGE_FILE_INFO );
576 gtk_widget_set_sensitive( expcsv_dlg.btnNext, TRUE );
577 gtk_button_set_label( GTK_BUTTON(expcsv_dlg.btnCancel), GTK_STOCK_CANCEL );
578 exp_csv_message();
579 gtk_widget_grab_focus(expcsv_dlg.file_entry);
580
581 expcsv_dlg.rowCount = 0;
582 g_free( expcsv_dlg.fileName );
583 expcsv_dlg.fileName = NULL;
584 expcsv_dlg.delimiter = ',';
585 exportCount = 0;
586
587 gtk_widget_show(expcsv_dlg.window);
588
589 gtk_main();
590 gtk_widget_hide(expcsv_dlg.window);
591
592 if (expcsv_dlg.cancelled == FALSE && expcsv_dlg.fileName) {
593 debug_print("addressbook_exp_csv: exported to %s\n", expcsv_dlg.fileName);
594 }
595
596 g_free( expcsv_dlg.fileName );
597 expcsv_dlg.fileName = NULL;
598 _exp_object_ = NULL;
599
600 if( expcsv_dlg.cancelled == TRUE ) return -1;
601 return 0;
602}
603
604/*
605* End of Source.
606*/
607