blob: 3e6504d7a89b1218a735caefb349c8e3ecf647dd [file] [log] [blame]
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001/*
2 * Copyright (c) 2002, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer in the documentation and/or other materials provided
13 * with the distribution.
14 * 3. All advertising materials mentioning features or use of this
15 * software must display the following acknowledgement:
16 * This product includes software developed by Adam Dunkels.
17 * 4. The name of the author may not be used to endorse or promote
18 * products derived from this software without specific prior
19 * written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * This file is part of the Contiki desktop environment for the C64.
34 *
adamdunkelsdb300d22004-02-24 09:57:49 +000035 * $Id: email.c,v 1.12 2004/02/24 09:57:49 adamdunkels Exp $
adamdunkelsca9ddcb2003-03-19 14:13:31 +000036 *
37 */
38
39
40#include "ctk.h"
41#include "dispatcher.h"
42#include "smtp.h"
adamdunkelsdb300d22004-02-24 09:57:49 +000043#include "uiplib.h"
adamdunkelsca9ddcb2003-03-19 14:13:31 +000044#include "petsciiconv.h"
adamdunkels8af703e2003-04-08 11:50:20 +000045#include "loader.h"
46
adamdunkels3a30cde2003-08-11 22:23:24 +000047#include "ctk-textedit.h"
48
adamdunkelsca9ddcb2003-03-19 14:13:31 +000049
50#define MAXNUMMSGS 6
51
52static struct ctk_menu menu;
adamdunkels3a30cde2003-08-11 22:23:24 +000053unsigned char menuitem_compose, menuitem_setup, menuitem_quit;
adamdunkelsca9ddcb2003-03-19 14:13:31 +000054
55/* The main window. */
adamdunkels3a30cde2003-08-11 22:23:24 +000056static struct ctk_window composewindow;
adamdunkelsca9ddcb2003-03-19 14:13:31 +000057
adamdunkelsca9ddcb2003-03-19 14:13:31 +000058static struct ctk_separator sep1 =
adamdunkelsca9ddcb2003-03-19 14:13:31 +000059 {CTK_SEPARATOR(0, 20, 36)};
60static struct ctk_label statuslabel =
61 {CTK_LABEL(6, 21, 23, 1, "")};
62
63
64static struct ctk_label tolabel =
adamdunkels3a30cde2003-08-11 22:23:24 +000065 {CTK_LABEL(0, 0, 3, 1, "To:")};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000066static char to[40];
67static struct ctk_textentry totextentry =
adamdunkels3a30cde2003-08-11 22:23:24 +000068 {CTK_TEXTENTRY(8, 0, 26, 1, to, 38)};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000069
70static struct ctk_label cclabel =
adamdunkels3a30cde2003-08-11 22:23:24 +000071 {CTK_LABEL(0, 1, 3, 1, "Cc:")};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000072static char cc[40];
73static struct ctk_textentry cctextentry =
adamdunkels3a30cde2003-08-11 22:23:24 +000074 {CTK_TEXTENTRY(8, 1, 26, 1, cc, 38)};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000075
76static struct ctk_label subjectlabel =
adamdunkels3a30cde2003-08-11 22:23:24 +000077 {CTK_LABEL(0, 2, 8, 1, "Subject:")};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000078static char subject[40];
79static struct ctk_textentry subjecttextentry =
adamdunkels3a30cde2003-08-11 22:23:24 +000080 {CTK_TEXTENTRY(8, 2, 26, 1, subject, 38)};
adamdunkelsca9ddcb2003-03-19 14:13:31 +000081
adamdunkels01e7ba12003-08-11 23:01:56 +000082#define MAIL_WIDTH 36
83#define MAIL_HEIGHT 17
84
85static char mail[MAIL_WIDTH * MAIL_HEIGHT];
adamdunkels3a30cde2003-08-11 22:23:24 +000086struct ctk_textedit mailtextedit =
adamdunkels01e7ba12003-08-11 23:01:56 +000087 {CTK_TEXTEDIT(0, 3, MAIL_WIDTH, MAIL_HEIGHT, mail)};
adamdunkels3a30cde2003-08-11 22:23:24 +000088
adamdunkelsca9ddcb2003-03-19 14:13:31 +000089
90static struct ctk_button sendbutton =
91 {CTK_BUTTON(0, 21, 4, "Send")};
92static struct ctk_button erasebutton =
93 {CTK_BUTTON(29, 21, 5, "Erase")};
94
adamdunkels3a30cde2003-08-11 22:23:24 +000095/* The "Really erase message?" dialog. */
96static struct ctk_window erasedialog;
97static struct ctk_label erasedialoglabel1 =
98 {CTK_LABEL(2, 1, 22, 1, "Really erase message?")};
99static struct ctk_label erasedialoglabel2 =
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000100 {CTK_LABEL(0, 2, 26, 1, "All contents will be lost.")};
adamdunkels3a30cde2003-08-11 22:23:24 +0000101static struct ctk_button eraseyesbutton =
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000102 {CTK_BUTTON(4, 4, 3, "Yes")};
adamdunkels3a30cde2003-08-11 22:23:24 +0000103static struct ctk_button erasenobutton =
adamdunkelsc8809032003-04-11 20:13:33 +0000104 {CTK_BUTTON(18, 4, 2, "No")};
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000105
106/* The setup window. */
107static struct ctk_window setupwindow;
108static struct ctk_label fromaddresslabel =
109 {CTK_LABEL(0, 0, 25, 1, "Name and e-mail address")};
110static char fromaddress[40];
111static struct ctk_textentry fromaddresstextentry =
112 {CTK_TEXTENTRY(0, 1, 25, 1, fromaddress, 39)};
113
114static struct ctk_label smtpserverlabel =
115 {CTK_LABEL(0, 3, 20, 1, "Outgoing mailserver")};
116static char smtpserver[40];
117static struct ctk_textentry smtpservertextentry =
118 {CTK_TEXTENTRY(0, 4, 25, 1, smtpserver, 39)};
119
120static struct ctk_label pop3serverlabel =
121 {CTK_LABEL(0, 6, 20, 1, "Incoming mailserver")};
122static char pop3server[40];
123static struct ctk_textentry pop3servertextentry =
124 {CTK_TEXTENTRY(0, 7, 25, 1, pop3server, 39)};
125
126static struct ctk_label pop3userlabel =
127 {CTK_LABEL(0, 9, 20, 1, "Mailserver username")};
128static char pop3user[40];
129static struct ctk_textentry pop3usertextentry =
130 {CTK_TEXTENTRY(0, 10, 25, 1, pop3user, 39)};
131
132static struct ctk_label pop3passwordlabel =
133 {CTK_LABEL(0, 12, 20, 1, "Mailserver password")};
134static char pop3password[40];
135static struct ctk_textentry pop3passwordtextentry =
136 {CTK_TEXTENTRY(0, 13, 25, 1, pop3password, 39)};
137
138
139static struct ctk_button setupokbutton =
140 {CTK_BUTTON(24, 15, 2, "Ok")};
141
adamdunkels78c03dc2003-04-09 13:45:05 +0000142static DISPATCHER_SIGHANDLER(email_sighandler, s, data);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000143static struct dispatcher_proc p =
adamdunkels78c03dc2003-04-09 13:45:05 +0000144 {DISPATCHER_PROC("E-mail client", NULL, email_sighandler, smtp_appcall)};
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000145static ek_id_t id;
146
adamdunkels3a30cde2003-08-11 22:23:24 +0000147
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000148/*-----------------------------------------------------------------------------------*/
149static void
adamdunkels0137b442003-04-08 23:27:33 +0000150email_quit(void)
adamdunkels1cd53bd2003-04-08 19:24:55 +0000151{
152 ctk_window_close(&setupwindow);
adamdunkels3a30cde2003-08-11 22:23:24 +0000153 ctk_window_close(&composewindow);
adamdunkels1cd53bd2003-04-08 19:24:55 +0000154 ctk_menu_remove(&menu);
155 dispatcher_exit(&p);
156 id = EK_ID_NONE;
157 LOADER_UNLOAD();
158}
159/*-----------------------------------------------------------------------------------*/
adamdunkels8bb5cca2003-08-24 22:41:31 +0000160LOADER_INIT_FUNC(email_init, arg)
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000161{
adamdunkels8bb5cca2003-08-24 22:41:31 +0000162 arg_free(arg);
163
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000164 if(id == EK_ID_NONE) {
165 id = dispatcher_start(&p);
166
adamdunkels3a30cde2003-08-11 22:23:24 +0000167 /* Create the "Really erase message?" dialog. */
168 ctk_dialog_new(&erasedialog, 26, 6);
169 CTK_WIDGET_ADD(&erasedialog, &erasedialoglabel1);
170 CTK_WIDGET_ADD(&erasedialog, &erasedialoglabel2);
171 CTK_WIDGET_ADD(&erasedialog, &eraseyesbutton);
172 CTK_WIDGET_ADD(&erasedialog, &erasenobutton);
173 CTK_WIDGET_FOCUS(&erasedialog, &erasenobutton);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000174
175 /* Create setup window. */
176 ctk_window_new(&setupwindow, 28, 16, "E-mail setup");
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000177
178 CTK_WIDGET_ADD(&setupwindow, &fromaddresslabel);
179 CTK_WIDGET_ADD(&setupwindow, &fromaddresstextentry);
180 CTK_WIDGET_ADD(&setupwindow, &smtpserverlabel);
181 CTK_WIDGET_ADD(&setupwindow, &smtpservertextentry);
182 CTK_WIDGET_ADD(&setupwindow, &pop3serverlabel);
adamdunkels3a30cde2003-08-11 22:23:24 +0000183 /* CTK_WIDGET_ADD(&setupwindow, &pop3servertextentry);*/
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000184 CTK_WIDGET_ADD(&setupwindow, &pop3userlabel);
adamdunkels3a30cde2003-08-11 22:23:24 +0000185 /* CTK_WIDGET_ADD(&setupwindow, &pop3usertextentry);*/
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000186 CTK_WIDGET_ADD(&setupwindow, &pop3passwordlabel);
adamdunkels3a30cde2003-08-11 22:23:24 +0000187 /* CTK_WIDGET_ADD(&setupwindow, &pop3passwordtextentry);*/
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000188 CTK_WIDGET_ADD(&setupwindow, &setupokbutton);
189
190 CTK_WIDGET_FOCUS(&setupwindow, &fromaddresstextentry);
191
192
adamdunkels3a30cde2003-08-11 22:23:24 +0000193 /* Create compose window. */
194
195 ctk_window_new(&composewindow, 36, 22, "Compose e-mail");
196
197 CTK_WIDGET_ADD(&composewindow, &tolabel);
198 CTK_WIDGET_ADD(&composewindow, &cclabel);
199 CTK_WIDGET_ADD(&composewindow, &subjectlabel);
200
201 CTK_WIDGET_ADD(&composewindow, &totextentry);
202 CTK_WIDGET_FOCUS(&composewindow, &totextentry);
203 CTK_WIDGET_ADD(&composewindow, &cctextentry);
204 CTK_WIDGET_ADD(&composewindow, &subjecttextentry);
205
206 ctk_textedit_add(&composewindow, &mailtextedit);
207
208 CTK_WIDGET_ADD(&composewindow, &sep1);
209 CTK_WIDGET_ADD(&composewindow, &statuslabel);
210
211 CTK_WIDGET_ADD(&composewindow, &sendbutton);
212 CTK_WIDGET_ADD(&composewindow, &erasebutton);
213
214 memset(mail, ' ', sizeof(mail));
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000215
216 /* Create and add the menu */
217 ctk_menu_new(&menu, "E-mail");
218 menuitem_setup = ctk_menuitem_add(&menu, "Setup");
adamdunkels3a30cde2003-08-11 22:23:24 +0000219 menuitem_compose = ctk_menuitem_add(&menu, "Compose");
adamdunkels8af703e2003-04-08 11:50:20 +0000220 menuitem_quit = ctk_menuitem_add(&menu, "Quit");
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000221 ctk_menu_add(&menu);
222
223 /* Attach listeners to signals. */
adamdunkels3a30cde2003-08-11 22:23:24 +0000224 dispatcher_listen(ctk_signal_widget_activate);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000225 dispatcher_listen(ctk_signal_menu_activate);
adamdunkels8af703e2003-04-08 11:50:20 +0000226 dispatcher_listen(ctk_signal_window_close);
adamdunkels3a30cde2003-08-11 22:23:24 +0000227
228 dispatcher_listen(ctk_signal_keypress);
adamdunkels8af703e2003-04-08 11:50:20 +0000229
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000230 /* Open setup window */
231 ctk_window_open(&setupwindow);
232 } else {
adamdunkels3a30cde2003-08-11 22:23:24 +0000233 ctk_window_open(&composewindow);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000234 }
235}
236/*-----------------------------------------------------------------------------------*/
237static void
238applyconfig(void)
239{
240 u16_t addr[2];
241 char *cptr;
242
243 for(cptr = smtpserver; *cptr != ' ' && *cptr != 0; ++cptr);
244 *cptr = 0;
245
adamdunkelsdb300d22004-02-24 09:57:49 +0000246 if(uiplib_ipaddrconv(smtpserver, (unsigned char *)addr)) {
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000247 smtp_configure("contiki", addr);
248 }
249}
250/*-----------------------------------------------------------------------------------*/
251static void
252prepare_message(void)
253{
adamdunkels01e7ba12003-08-11 23:01:56 +0000254 int i;
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000255
256 /* Convert fields to ASCII. */
257 petsciiconv_toascii(to, sizeof(to));
258 petsciiconv_toascii(subject, sizeof(subject));
259 petsciiconv_toascii(mail, 255);
260 petsciiconv_toascii(mail + 255, sizeof(mail) - 255);
261
262 /* Insert line delimiters. */
adamdunkels01e7ba12003-08-11 23:01:56 +0000263 subject[sizeof(subject) - 2] = 0x0a;
264 subject[sizeof(subject) - 1] = 0x00;
265 for(i = 0; i < MAIL_HEIGHT; ++i) {
266 mail[MAIL_WIDTH - 1 + MAIL_WIDTH * i] = 0x0a;
267 }
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000268}
269/*-----------------------------------------------------------------------------------*/
adamdunkels78c03dc2003-04-09 13:45:05 +0000270static
271DISPATCHER_SIGHANDLER(email_sighandler, s, data)
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000272{
273 struct ctk_widget *w;
274 unsigned char i;
adamdunkels78c03dc2003-04-09 13:45:05 +0000275
276 DISPATCHER_SIGHANDLER_ARGS(s, data);
adamdunkels3a30cde2003-08-11 22:23:24 +0000277
278 ctk_textedit_sighandler(&mailtextedit, s, data);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000279
adamdunkels3a30cde2003-08-11 22:23:24 +0000280 if(s == ctk_signal_widget_activate) {
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000281 w = (struct ctk_widget *)data;
adamdunkels3a30cde2003-08-11 22:23:24 +0000282 if(w == (struct ctk_widget *)&sendbutton) {
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000283 prepare_message();
284 smtp_send(to, fromaddress, subject, mail, sizeof(mail));
285 ctk_label_set_text(&statuslabel, "Sending message...");
adamdunkelse9354c42003-06-30 20:39:53 +0000286 CTK_WIDGET_REDRAW(&statuslabel);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000287 } else if(w == (struct ctk_widget *)&erasebutton) {
adamdunkels3a30cde2003-08-11 22:23:24 +0000288 ctk_dialog_open(&erasedialog);
289 } else if(w == (struct ctk_widget *)&eraseyesbutton) {
290 memset(to, ' ', sizeof(to));
291 memset(cc, ' ', sizeof(cc));
292 memset(subject, ' ', sizeof(subject));
293 memset(mail, ' ', sizeof(mail));
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000294 ctk_dialog_close();
adamdunkels3a30cde2003-08-11 22:23:24 +0000295 } else if(w == (struct ctk_widget *)&erasenobutton) {
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000296 ctk_dialog_close();
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000297 } else if(w == (struct ctk_widget *)&setupokbutton) {
298 applyconfig();
299 ctk_window_close(&setupwindow);
adamdunkels3a30cde2003-08-11 22:23:24 +0000300 ctk_window_open(&composewindow);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000301 }
302 } else if(s == ctk_signal_menu_activate) {
303 if((struct ctk_menu *)data == &menu) {
adamdunkels3a30cde2003-08-11 22:23:24 +0000304 if(menu.active == menuitem_compose) {
305 ctk_window_open(&composewindow);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000306 } else if(menu.active == menuitem_setup) {
307 ctk_window_open(&setupwindow);
adamdunkels8af703e2003-04-08 11:50:20 +0000308 } else if(menu.active == menuitem_quit) {
adamdunkels0137b442003-04-08 23:27:33 +0000309 email_quit();
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000310 }
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000311 }
adamdunkels3a30cde2003-08-11 22:23:24 +0000312 } else if(s == dispatcher_signal_quit) {
adamdunkels0137b442003-04-08 23:27:33 +0000313 email_quit();
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000314 }
315}
316/*-----------------------------------------------------------------------------------*/
317void
318smtp_done(unsigned char error)
319{
adamdunkels01e7ba12003-08-11 23:01:56 +0000320 if(error == SMTP_ERR_OK) {
321 ctk_label_set_text(&statuslabel, "Mail sent");
322 memset(to, ' ', sizeof(to));
323 memset(cc, ' ', sizeof(cc));
324 memset(subject, ' ', sizeof(subject));
325 memset(mail, ' ', sizeof(mail));
326 ctk_window_open(&composewindow);
327 } else {
328 ctk_label_set_text(&statuslabel, "Mail error");
329 }
adamdunkelse9354c42003-06-30 20:39:53 +0000330 CTK_WIDGET_REDRAW(&statuslabel);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000331}
332/*-----------------------------------------------------------------------------------*/