| /* |
| * Copyright (c) 2002, Adam Dunkels. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * 3. The name of the author may not be used to endorse or promote |
| * products derived from this software without specific prior |
| * written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
| * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
| * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * This file is part of the Contiki desktop environment for the C64. |
| * |
| * $Id: email.c,v 1.21 2005/05/05 22:15:49 oliverschmidt Exp $ |
| * |
| */ |
| |
| |
| #include "ek.h" |
| #include "ctk.h" |
| #include "smtp.h" |
| #include "uiplib.h" |
| #include "resolv.h" |
| #include "petsciiconv.h" |
| #include "loader.h" |
| #include "tcpip.h" |
| |
| #include "ctk-textentry-multiline.h" |
| |
| #include "email-conf.h" |
| |
| #include <string.h> |
| |
| #define MAIL_WIDTH EMAIL_CONF_WIDTH |
| #define MAIL_HEIGHT EMAIL_CONF_HEIGHT |
| /* |
| #define MAIL_WIDTH 37 |
| #define MAIL_HEIGHT 17 |
| */ |
| |
| #if (MAIL_WIDTH - 9) < 39 |
| #define TEXTENTRY_WIDTH (MAIL_WIDTH - 9) |
| #else |
| #define TEXTENTRY_WIDTH 39 |
| #endif |
| |
| static struct ctk_menu menu; |
| unsigned char menuitem_compose, menuitem_setup, menuitem_quit; |
| |
| /* The main window. */ |
| static struct ctk_window composewindow; |
| |
| static struct ctk_separator sep1 = |
| {CTK_SEPARATOR(0, MAIL_HEIGHT + 3, MAIL_WIDTH + 1)}; |
| static struct ctk_label statuslabel = |
| {CTK_LABEL(7, MAIL_HEIGHT + 4, MAIL_WIDTH - 14, 1, "")}; |
| |
| |
| static struct ctk_label tolabel = |
| {CTK_LABEL(0, 0, 3, 1, "To:")}; |
| static char to[40]; |
| static struct ctk_textentry totextentry = |
| {CTK_TEXTENTRY(8, 0, TEXTENTRY_WIDTH, 1, to, 39)}; |
| |
| static struct ctk_label cclabel = |
| {CTK_LABEL(0, 1, 3, 1, "Cc:")}; |
| static char cc[40]; |
| static struct ctk_textentry cctextentry = |
| {CTK_TEXTENTRY(8, 1, TEXTENTRY_WIDTH, 1, cc, 39)}; |
| |
| static struct ctk_label subjectlabel = |
| {CTK_LABEL(0, 2, 8, 1, "Subject:")}; |
| static char subject[40]; |
| static struct ctk_textentry subjecttextentry = |
| {CTK_TEXTENTRY(8, 2, TEXTENTRY_WIDTH, 1, subject, 39)}; |
| |
| static char mail[MAIL_WIDTH * MAIL_HEIGHT]; |
| struct ctk_textentry mailtextentry = |
| {CTK_TEXTENTRY_INPUT(0, 3, MAIL_WIDTH - 1, MAIL_HEIGHT, mail, MAIL_WIDTH - 1, \ |
| ctk_textentry_multiline_input)}; |
| |
| |
| static struct ctk_button sendbutton = |
| {CTK_BUTTON(0, MAIL_HEIGHT + 4, 4, "Send")}; |
| static struct ctk_button erasebutton = |
| {CTK_BUTTON(MAIL_WIDTH - 6, MAIL_HEIGHT + 4, 5, "Erase")}; |
| |
| /* The "Really erase message?" dialog. */ |
| static struct ctk_window erasedialog; |
| static struct ctk_label erasedialoglabel1 = |
| {CTK_LABEL(2, 1, 22, 1, "Really erase message?")}; |
| static struct ctk_label erasedialoglabel2 = |
| {CTK_LABEL(0, 2, 26, 1, "All contents will be lost.")}; |
| static struct ctk_button eraseyesbutton = |
| {CTK_BUTTON(4, 4, 3, "Yes")}; |
| static struct ctk_button erasenobutton = |
| {CTK_BUTTON(18, 4, 2, "No")}; |
| |
| /* The setup window. */ |
| static struct ctk_window setupwindow; |
| static struct ctk_label fromaddresslabel = |
| {CTK_LABEL(0, 0, 25, 1, "Name and e-mail address")}; |
| static char fromaddress[40]; |
| static struct ctk_textentry fromaddresstextentry = |
| {CTK_TEXTENTRY(0, 1, 26, 1, fromaddress, 39)}; |
| |
| static struct ctk_label smtpserverlabel = |
| {CTK_LABEL(0, 3, 20, 1, "Outgoing mailserver")}; |
| static char smtpserver[40]; |
| static struct ctk_textentry smtpservertextentry = |
| {CTK_TEXTENTRY(0, 4, 26, 1, smtpserver, 39)}; |
| |
| static struct ctk_label pop3serverlabel = |
| {CTK_LABEL(0, 6, 20, 1, "Incoming mailserver")}; |
| static char pop3server[40]; |
| static struct ctk_textentry pop3servertextentry = |
| {CTK_TEXTENTRY(0, 7, 26, 1, pop3server, 39)}; |
| |
| static struct ctk_label pop3userlabel = |
| {CTK_LABEL(0, 9, 20, 1, "Mailserver username")}; |
| static char pop3user[40]; |
| static struct ctk_textentry pop3usertextentry = |
| {CTK_TEXTENTRY(0, 10, 26, 1, pop3user, 39)}; |
| |
| static struct ctk_label pop3passwordlabel = |
| {CTK_LABEL(0, 12, 20, 1, "Mailserver password")}; |
| static char pop3password[40]; |
| static struct ctk_textentry pop3passwordtextentry = |
| {CTK_TEXTENTRY(0, 13, 26, 1, pop3password, 39)}; |
| |
| |
| static struct ctk_button setupokbutton = |
| {CTK_BUTTON(24, 15, 2, "Ok")}; |
| |
| /* |
| static DISPATCHER_SIGHANDLER(email_sighandler, s, data); |
| static struct dispatcher_proc p = |
| {DISPATCHER_PROC("E-mail client", NULL, email_sighandler, smtp_appcall)}; |
| static ek_id_t id; |
| */ |
| EK_EVENTHANDLER(email_eventhandler, ev, data); |
| EK_PROCESS(p, "E-mail client", EK_PRIO_NORMAL, |
| email_eventhandler, NULL, NULL); |
| static ek_id_t id = EK_ID_NONE; |
| |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| email_quit(void) |
| { |
| ctk_window_close(&setupwindow); |
| ctk_window_close(&composewindow); |
| ctk_menu_remove(&menu); |
| ek_exit(); |
| id = EK_ID_NONE; |
| LOADER_UNLOAD(); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| LOADER_INIT_FUNC(email_init, arg) |
| { |
| arg_free(arg); |
| |
| if(id == EK_ID_NONE) { |
| id = ek_start(&p); |
| } else { |
| ctk_window_open(&composewindow); |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| applyconfig(void) |
| { |
| u16_t addr[2], *addrptr; |
| char *cptr; |
| |
| for(cptr = smtpserver; *cptr != ' ' && *cptr != 0; ++cptr); |
| *cptr = 0; |
| |
| addrptr = &addr[0]; |
| if(uiplib_ipaddrconv(smtpserver, (unsigned char *)addr) == 0) { |
| addrptr = resolv_lookup(smtpserver); |
| if(addrptr == NULL) { |
| resolv_query(smtpserver); |
| ctk_label_set_text(&statuslabel, "Resolving host..."); |
| return; |
| } |
| } |
| smtp_configure("contiki", addrptr); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| prepare_message(void) |
| { |
| /* Convert fields to ASCII. */ |
| petsciiconv_toascii(to, sizeof(to)); |
| petsciiconv_toascii(cc, sizeof(cc)); |
| petsciiconv_toascii(subject, sizeof(subject)); |
| petsciiconv_toascii(mail, sizeof(mail)); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| erase_message(void) |
| { |
| CTK_TEXTENTRY_CLEAR(&totextentry); |
| CTK_TEXTENTRY_CLEAR(&cctextentry); |
| CTK_TEXTENTRY_CLEAR(&subjecttextentry); |
| CTK_TEXTENTRY_CLEAR(&mailtextentry); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| /*static |
| DISPATCHER_SIGHANDLER(email_sighandler, s, data)*/ |
| EK_EVENTHANDLER(email_eventhandler, ev, data) |
| { |
| struct ctk_widget *w; |
| EK_EVENTHANDLER_ARGS(ev, data); |
| |
| if(ev == tcpip_event) { |
| smtp_appcall(data); |
| } else if(ev == EK_EVENT_INIT) { |
| |
| /* Create the "Really erase message?" dialog. */ |
| ctk_dialog_new(&erasedialog, 26, 6); |
| CTK_WIDGET_ADD(&erasedialog, &erasedialoglabel1); |
| CTK_WIDGET_ADD(&erasedialog, &erasedialoglabel2); |
| CTK_WIDGET_ADD(&erasedialog, &eraseyesbutton); |
| CTK_WIDGET_ADD(&erasedialog, &erasenobutton); |
| CTK_WIDGET_FOCUS(&erasedialog, &erasenobutton); |
| |
| /* Create setup window. */ |
| ctk_window_new(&setupwindow, 28, 16, "E-mail setup"); |
| |
| CTK_WIDGET_ADD(&setupwindow, &fromaddresslabel); |
| CTK_WIDGET_ADD(&setupwindow, &fromaddresstextentry); |
| CTK_WIDGET_ADD(&setupwindow, &smtpserverlabel); |
| CTK_WIDGET_ADD(&setupwindow, &smtpservertextentry); |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3serverlabel);*/ |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3servertextentry);*/ |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3userlabel);*/ |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3usertextentry);*/ |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3passwordlabel);*/ |
| /* CTK_WIDGET_ADD(&setupwindow, &pop3passwordtextentry);*/ |
| CTK_WIDGET_ADD(&setupwindow, &setupokbutton); |
| |
| CTK_WIDGET_FOCUS(&setupwindow, &fromaddresstextentry); |
| |
| |
| /* Create compose window. */ |
| |
| ctk_window_new(&composewindow, MAIL_WIDTH + 1, MAIL_HEIGHT + 5, "Compose e-mail"); |
| |
| CTK_WIDGET_ADD(&composewindow, &tolabel); |
| CTK_WIDGET_ADD(&composewindow, &cclabel); |
| CTK_WIDGET_ADD(&composewindow, &subjectlabel); |
| |
| CTK_WIDGET_ADD(&composewindow, &totextentry); |
| CTK_WIDGET_FOCUS(&composewindow, &totextentry); |
| CTK_WIDGET_ADD(&composewindow, &cctextentry); |
| CTK_WIDGET_ADD(&composewindow, &subjecttextentry); |
| |
| CTK_WIDGET_ADD(&composewindow, &mailtextentry); |
| |
| CTK_WIDGET_ADD(&composewindow, &sep1); |
| CTK_WIDGET_ADD(&composewindow, &statuslabel); |
| |
| CTK_WIDGET_ADD(&composewindow, &sendbutton); |
| CTK_WIDGET_ADD(&composewindow, &erasebutton); |
| |
| erase_message(); |
| |
| /* Create and add the menu */ |
| ctk_menu_new(&menu, "E-mail"); |
| menuitem_setup = ctk_menuitem_add(&menu, "Setup"); |
| menuitem_compose = ctk_menuitem_add(&menu, "Compose"); |
| menuitem_quit = ctk_menuitem_add(&menu, "Quit"); |
| ctk_menu_add(&menu); |
| |
| /* Attach listeners to signals. */ |
| /* dispatcher_listen(ctk_signal_widget_activate); |
| dispatcher_listen(ctk_signal_menu_activate); |
| dispatcher_listen(ctk_signal_window_close); |
| |
| dispatcher_listen(ctk_signal_keypress);*/ |
| |
| /* Open setup window */ |
| ctk_window_open(&setupwindow); |
| |
| } else if(ev == ctk_signal_widget_activate) { |
| w = (struct ctk_widget *)data; |
| if(w == (struct ctk_widget *)&sendbutton) { |
| prepare_message(); |
| smtp_send(to, cc, fromaddress, subject, mail, MAIL_WIDTH, MAIL_HEIGHT); |
| ctk_label_set_text(&statuslabel, "Sending message..."); |
| CTK_WIDGET_REDRAW(&statuslabel); |
| } else if(w == (struct ctk_widget *)&erasebutton) { |
| ctk_dialog_open(&erasedialog); |
| } else if(w == (struct ctk_widget *)&eraseyesbutton) { |
| erase_message(); |
| ctk_dialog_close(); |
| } else if(w == (struct ctk_widget *)&erasenobutton) { |
| ctk_dialog_close(); |
| } else if(w == (struct ctk_widget *)&setupokbutton) { |
| applyconfig(); |
| ctk_window_close(&setupwindow); |
| ctk_window_open(&composewindow); |
| } |
| } else if(ev == ctk_signal_menu_activate) { |
| if((struct ctk_menu *)data == &menu) { |
| if(menu.active == menuitem_compose) { |
| ctk_window_open(&composewindow); |
| } else if(menu.active == menuitem_setup) { |
| ctk_window_open(&setupwindow); |
| } else if(menu.active == menuitem_quit) { |
| email_quit(); |
| } |
| } |
| } else if(ev == resolv_event_found) { |
| if(strcmp(data, smtpserver) == 0) { |
| if(resolv_lookup(smtpserver) != NULL) { |
| applyconfig(); |
| ctk_label_set_text(&statuslabel, ""); |
| } else { |
| ctk_label_set_text(&statuslabel, "Host not found"); |
| } |
| CTK_WIDGET_REDRAW(&statuslabel); |
| } |
| } else if(ev == EK_EVENT_REQUEST_EXIT) { |
| email_quit(); |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| void |
| smtp_done(unsigned char error) |
| { |
| if(error == SMTP_ERR_OK) { |
| ctk_label_set_text(&statuslabel, "Mail sent"); |
| erase_message(); |
| ctk_window_open(&composewindow); |
| } else { |
| ctk_label_set_text(&statuslabel, "Mail error"); |
| } |
| CTK_WIDGET_REDRAW(&statuslabel); |
| } |
| /*-----------------------------------------------------------------------------------*/ |