You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/core/EmailTemplate.cpp

237 lines
5.4 KiB

/*
* $Id: EmailTemplate.cpp,v 1.3.2.2 2005/08/25 06:55:12 rco Exp $
*
* Copyright (C) 2002-2003 Fhg Fokus
*
* This file is part of sems, a free SIP media server.
*
* sems is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* For a license to use the ser software under conditions
* other than those described here, or to purchase support for this
* software, please contact iptel.org by e-mail at the following addresses:
* info@iptel.org
*
* sems is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "EmailTemplate.h"
#include "AmMail.h"
#include "AmCmd.h"
#include "log.h"
#include <string.h>
#include <errno.h>
#include <stdio.h>
int EmailTemplate::load(const string& filename)
{
tmpl_file = filename;
FILE* fp = fopen(tmpl_file.c_str(),"r");
if(!fp){
ERROR("EmailTemplate: could not open mail template '%s': %s\n",
tmpl_file.c_str(),strerror(errno));
return -1;
}
unsigned int file_size = 0;
fseek(fp,0L,SEEK_END);
file_size = ftell(fp);
fseek(fp,0L,SEEK_SET);
file_size -= ftell(fp);
char* buffer = new char[file_size+1];
if(!buffer){
fclose(fp);
ERROR("EmailTemplate: not enough memory to load template\n");
ERROR("(file=%s,size=%u)\n",tmpl_file.c_str(),file_size);
return -1;
}
fread(buffer,1,file_size,fp);
fclose(fp);
buffer[file_size] = '\0';
int ret = parse(buffer);
delete [] buffer;
return ret;
}
#define P_SUBJECT 1
#define P_TO 2
#define P_FROM 3
int EmailTemplate::parse(char* buffer)
{
char* s=buffer;
int state=0;
while(1){
while( (*s==' ') || (*s=='\r') ) s++;
if(!(*s)){
ERROR("EmailTemplate: parsing failed: end of file reached\n");
return -1;
}
if(*s=='\n'){ // empty line -> EOH
s++;
break;
}
char* begin = s;
while( (*s!=':') && (*s!='\0') && (*s!='\n') ) s++;
if(!strncmp(begin,"subject",7)){
state = P_SUBJECT;
}
else if(!strncmp(begin,"to",2)){
state = P_TO;
}
else if(!strncmp(begin,"from",4)){
state = P_FROM;
}
else
state = 0;
if(!state){
ERROR("EmailTemplate: parsing failed: unknown token: '%s'\n",begin);
return -1;
}
begin = ++s;
while( *s && (*s != '\n') ) s++;
*s = '\0';
switch(state){
case P_SUBJECT:
subject = begin;
break;
case P_TO:
to = begin;
break;
case P_FROM:
from = begin;
break;
}
begin = ++s;
}
if(subject.empty()){
ERROR("EmailTemplate: invalid template: empty or no 'subject' line\n");
return -1;
}
if(to.empty()){
ERROR("EmailTemplate: invalid template: empty or no 'to' line\n");
return -1;
}
if(from.empty()){
ERROR("EmailTemplate: invalid template: empty or no 'from' line\n");
return -1;
}
if(*s)
body = s;
if(body.empty()){
ERROR("EmailTemplate: invalid template: empty body\n");
return -1;
}
return 0;
}
string EmailTemplate::replaceVars(const string& str,const EmailTmplDict& dict) const
{
const char* s = str.c_str();
const char* last = s;
string res;
while(1){
last = s;
while( *s && (*s != '%') ) s++;
if(!(*s)) break;
if(*(s+1) == '%'){
res.append(last,(++s)-last);
last = ++s;
continue;
}
res.append(last,s-last);
last = ++s;
while( *s && (*s != '%') ) s++;
if(!(*s)) break; // should throw a parser error...
string var = string(last,s-last);
// if(var == "user") // local user
// res.append(cmd.user);
// else if(var == "email") // local user's email
// res.append(cmd.getHeader("P-Email-Address"));
// else if(var == "domain") // local user's domain
// res.append(cmd.domain);
// else if(var == "from") // remote SIP address
// res.append(cmd.from);
// else if(var == "to") // local SIP address
// res.append(cmd.to);
// else if(var == "from_user"){
// string from_user;
// string::size_type pos1 = cmd.from.rfind("<sip:");
// string::size_type pos2 = cmd.from.find("@",pos1);
// if(pos1 != string::npos && pos2 != string::npos)
// res.append(cmd.from.substr(pos1+5,pos2-pos1-5));
// }
// else if(var == "from_domain"){
// string from_domain;
// string::size_type pos1 = cmd.from.rfind("@");
// string::size_type pos2 = cmd.from.find(">",pos1);
// if(pos1 != string::npos && pos2 != string::npos)
// res.append(cmd.from.substr(pos1+1,pos2-pos1-1));
// }
EmailTmplDict::const_iterator it = dict.find(var);
if(it != dict.end()){
res.append(it->second);
}
else {
string err = "unknown variable: '";
err += var + "'";
throw err;
}
s++;
}
res.append(last,s-last);
return res;
}
AmMail EmailTemplate::getEmail(const EmailTmplDict& dict) const
{
try {
return AmMail(replaceVars(from,dict),
replaceVars(subject,dict),
replaceVars(to,dict),
replaceVars(body,dict));
}
catch(const string& err){
throw string("EmailTemplate: error in template '" + tmpl_file + "': " + err);
}
}