/******************************************************
  @Sample program for NXP LPC2300 Series LPC2388

 *****************************************************/

#include "kernel.h"
#include "kernel_id.h"
#include "LPC2300.h"
#include "net_hdr.h"
#include "net_id.h"
#include <string.h>
#include <stdlib.h>

#define CGI_VALUE_MAX   (80)

/**
 * global variables 
 */

/* return messages */
const char connect_error[]  = "<html><body><center><H1>SMTP Sever connect Error!<H1></center></body></html>";
const char send_success[]  = "<html><body><center><H1>Send Success!<H1></center></body></html>";
const char send_failure[]  = "<html><body><center><H1>Send Error!<H1></center></body></html>";
 
/**
 *  mail data
 */
typedef struct T_MAIL_PARAM {
    VB smtp_ip[16];
    UH port;
    VB from[33];
    VB to[33];
    VB subject[41];
    VB msg[81];
} t_mail_param;
static t_mail_param mailp;
static VB command[256];

/******************************************************
    ُ튄荞ݏ
        ݃nh̒`݃T[rX[`
        ĂȂ̂Ɋ݂󂯕tꍇ
        B
 *****************************************************/

void int_abort(void)
{
    for(;;);
}

/******************************************************
    SMTP function
 *****************************************************/


ER smtp_command(ID id, const char *com, char *res)
{
    char data[128];

    snd_soc(id, (VP)com, strlen(com));
    rcv_soc(id, data, 128);
    if(memcmp(data, "250", 3))
        return -1;

    return E_OK;
}

ER smtp_connect(ID id, T_NODE *remote)
{
    char data[128];
    ER ercd;
    
    /* [T[o[ւ̐ڑ */

     ercd = con_soc(id, remote, SOC_CLI);
    if (ercd != E_OK) {
        return ercd;
    }
    rcv_soc(id, data, 128);
    if(memcmp(data, "220", 3))
        return -1;

    snd_soc(id, "HELO LPC2388\r\n", 18);
    rcv_soc(id, data, 128);
    if(memcmp(data, "250", 3))
        return -1;

    snd_soc(id, "RSET\r\n", 6);
    rcv_soc(id, data, 128);

    return E_OK;
}

ER smtp_close(ID id)
{
    smtp_command(id, "QUIT\r\n", "221");

    return cls_soc(id, SOC_TCP_CLS);
}

/*******************************
        CGI Script
 *******************************/

/**
 * "%40"'@'ɕϊ
 * CGI@"%40"ɂ΂Ă
 */
void ReplaceAtMark(VB *dest, VB *src)
{
    VB *p = src;
    VB *tok = NULL;
    
    while (*p != NULL) {
        if (*p == '%') {
            tok = p;
            break;
        }
        p++;
    }
    
    if (tok != NULL) {
        strncpy(dest, src, p-src);
        strcat(dest, "@");
        strcat(dest, tok+3);
    } else {
        strcpy(dest, src);
    }
}

/**
 * get cgi parameter
 */
ER GetMailData(T_HTTP_SERVER *http, t_mail_param *mail)
{
    char *cgi_name[6];
    char *cgi_value[6];
    int  cgi_cnt;
    int i;
    T_HTTP_HEADER *env = &http->hdr;
    VB value[32];
    
    /* Parse the query string to argument list */
    CgiGetParam(env->Content, env->ContentLen, cgi_name, cgi_value, &cgi_cnt);
    
    for (i = 0; i < cgi_cnt; i++) {
        if (strcmp(cgi_name[i], "smtp_srv") == 0) {
            strcpy(mail->smtp_ip, cgi_value[i]);
        }
        if (strcmp(cgi_name[i], "port") == 0) {
            mail->port = atoi(cgi_value[i]);
        }
        if (strcmp(cgi_name[i], "from") == 0) {
            strcpy(value, cgi_value[i]);
            ReplaceAtMark(mail->from, value);
        }
        if (strcmp(cgi_name[i], "to") == 0) {
            strcpy(value, cgi_value[i]);
            ReplaceAtMark(mail->to, value);
        }
        if (strcmp(cgi_name[i], "subject") == 0) {
            strcpy(mail->subject, cgi_value[i]);
        }
        if (strcmp(cgi_name[i], "msg") == 0) {
            strcpy(mail->msg, cgi_value[i]);
        }
    }
    
    return E_OK;
}

BOOL IsValid(t_mail_param *mail)
{
    if (strlen(mail->smtp_ip) <= 0) {
        return FALSE;
    }
    if (mail->port == 0) {
        return FALSE;
    }
    if (strlen(mail->from) <= 0) {
        return FALSE;
    }
    if (strlen(mail->to) <= 0) {
        return FALSE;
    }
    
    return TRUE;
}


/**
 * CGI function
 */
void CgiSendMail(T_HTTP_SERVER *http)
{
    T_NODE remote = {0};
    ER ercd = E_OK;
    
    /* parse cgi param */
    memset(&mailp, 0x00, sizeof(mailp));
    GetMailData(http, &mailp);
    if (IsValid(&mailp) == FALSE) {
        /* Response Page: Error */
        HttpSendText(http, (char *)send_failure, sizeof(send_failure));
        return;
    }
    
    /* connetct RemoteHost */
    remote.port = mailp.port; /* SMTP Port No. */
    remote.ver = IP_VER4;
    remote.num = 0;
    remote.ipa = ip_aton(mailp.smtp_ip);
    ercd = smtp_connect(ID_SMTP_SOCK, &remote);
    if (ercd != E_OK) {
        smtp_close(ID_SMTP_SOCK);
        /* Response Page: Error */
        HttpSendText(http, (char *)connect_error, sizeof(connect_error));
        return;
    }
    
    memset(command, 0x00, sizeof(command));

    /* from */
    strcpy(command, "MAIL FROM:<");
    strcat(command, mailp.from);
    strcat(command, ">\r\n");
    smtp_command(ID_SMTP_SOCK, command, "250");
    
    /* to */
    strcpy(command, "RCPT TO:<");
    strcat(command, mailp.to);
    strcat(command, ">\r\n");
    smtp_command(ID_SMTP_SOCK, command, "250");
    
    /* build message */
    strcpy(command, "From: <");
    strcat(command, mailp.from);
    strcat(command, ">\r\n");
    strcat(command, "To: <");
    strcat(command, mailp.to);
    strcat(command, ">\r\n");
    strcat(command, "Subject: ");
    strcat(command, mailp.subject);
    strcat(command, "\r\n\r\n");
    strcat(command, mailp.msg);
    strcat(command, "\r\n\r\n.\r\n");
    smtp_command(ID_SMTP_SOCK, "DATA\r\n", "354");
    smtp_command(ID_SMTP_SOCK, command, "250");
   
    smtp_close(ID_SMTP_SOCK);
    
    /* Response Page: Success */
    HttpSendText(http, (char *)send_success, sizeof(send_success));
}

/*******************************
        MainTask
 *******************************/
extern ER net_setup(void);
void MainTask(VP_INT exinf)
{
    /* lbg[N̏ */
    net_setup();

    for (;;) {
        /* HTTPD^XNɏo邾CPUԂ^邽
         * ̃^XN͖点 
         */
        slp_tsk();
    }
}

`ȉȗ`
