* pinentry/pinentry.c: New variable THIS_PGMNAME.
[pinentry.git] / qt / main.cpp
1 /* main.cpp - Secure KDE dialog for PIN entry.
2    Copyright (C) 2002 Klarälvdalens Datakonsult AB
3    Copyright (C) 2003 g10 Code GmbH
4    Written by Steffen Hansen <steffen@klaralvdalens-datakonsult.se>.
5    Modified by Marcus Brinkmann <marcus@g10code.de>.
6    
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 2 of the
10    License, or (at your option) any later version.
11  
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA  */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include <stdlib.h>
27
28 #include <qapplication.h>
29 #include <qwidget.h>
30 #include <qmessagebox.h>
31 #include "secqstring.h"
32
33 #include "pinentrydialog.h"
34
35 #include <pinentry.h>
36
37 #ifdef FALLBACK_CURSES
38 #include <pinentry-curses.h>
39 #endif
40
41 /* Hack for creating a QWidget with a "foreign" window ID */
42 class ForeignWidget : public QWidget
43 {
44 public:
45   ForeignWidget( WId wid ) : QWidget( 0 )
46   {
47     QWidget::destroy();
48     create( wid, false, false );
49   }
50  
51   ~ForeignWidget()
52   {
53     destroy( false, false );
54   }
55 };
56
57 static int
58 qt_cmd_handler (pinentry_t pe)
59 {
60   QWidget *parent = 0;
61
62   int want_pass = !!pe->pin;
63
64   if (want_pass)
65     {
66       /* FIXME: Add parent window ID to pinentry and GTK.  */
67       if (pe->parent_wid)
68         parent = new ForeignWidget (pe->parent_wid);
69
70       PinEntryDialog pinentry (parent, 0, true);
71
72       pinentry.setPrompt (QString::fromUtf8 (pe->prompt));
73       pinentry.setDescription (QString::fromUtf8 (pe->description));
74       /* If we reuse the same dialog window.  */
75 #if 0
76       pinentry.setText (SecQString::null);
77 #endif
78
79       if (pe->ok)
80         pinentry.setOkText (QString::fromUtf8 (pe->ok));
81       if (pe->cancel)
82         pinentry.setCancelText (QString::fromUtf8 (pe->cancel));
83       if (pe->error)
84         pinentry.setError (QString::fromUtf8 (pe->error));
85
86       bool ret = pinentry.exec ();
87       if (!ret)
88         return -1;
89
90       char *pin = (char *) pinentry.text().utf8();
91       if (!pin)
92         return -1;
93
94       int len = strlen (pin);
95       if (len >= 0)
96         {
97           pinentry_setbufferlen (pe, len + 1);
98           if (pe->pin)
99             {
100               strcpy (pe->pin, pin);
101               ::secmem_free (pin);
102               return len;
103             }
104         }
105       ::secmem_free (pin);
106       return -1;
107     }
108   else
109     {
110       bool ret = QMessageBox::information (parent, "", pe->description,
111                                            pe->ok ? pe->ok : "OK",
112                                            pe->cancel ? pe->cancel : "Cancel");
113       return !ret;
114     }
115 }
116
117 pinentry_cmd_handler_t pinentry_cmd_handler = qt_cmd_handler;
118
119 int 
120 main (int argc, char *argv[])
121 {
122   pinentry_init ("pinentry-qt");
123
124 #ifdef FALLBACK_CURSES
125   if (!pinentry_have_display (argc, argv))
126     pinentry_cmd_handler = curses_cmd_handler;
127   else
128 #endif
129     /* We use a modal dialog window, so we don't need the application
130        window anymore.  */
131     new QApplication (argc, argv);
132
133
134   /* Consumes all arguments.  */
135   if (pinentry_parse_opts (argc, argv))
136     {
137       printf ("pinentry-qt (pinentry) " VERSION "\n");
138       exit (EXIT_SUCCESS);
139     }
140
141   if (pinentry_loop ())
142     return 1;
143
144   return 0;
145 }