diff options
| -rw-r--r-- | project2/sendmailTask.cpp | 45 | 
1 files changed, 44 insertions, 1 deletions
diff --git a/project2/sendmailTask.cpp b/project2/sendmailTask.cpp index 3fc0039..65d55d8 100644 --- a/project2/sendmailTask.cpp +++ b/project2/sendmailTask.cpp @@ -1,12 +1,15 @@  #include "sendmailTask.h"  #include <boost/foreach.hpp> -#include <stdexcept>  #include "xmlObjectLoader.h"  #include "appEngine.h"  #include "presenter.h"  #include <libxslt/transform.h> +#include <misc.h> +#include <stdexcept>  #include <libesmtp.h>  #include <libxslt/xsltutils.h> +#include <libxml/HTMLtree.h> +#include <sys/wait.h>  ElementLoaderImpl<_SendMailTask> sendmailLoader("sendmail"); @@ -80,6 +83,44 @@ class HtmlContent : public _SendMailTask::MailPart {  	private:  		const XmlDocumentPtr doc;  }; +class TextContent : public _SendMailTask::MailPart { +	public: +		TextContent(XmlDocumentPtr d) : doc(d) { +		} +		const char * write(char ** buf, int * pos) { +			int fds[2]; +			const char * callLynx[] = { +#ifdef STRACE_LYNX +				"/usr/bin/strace", "-o", "/tmp/lynx", +#endif +				"/usr/bin/lynx", "-dump", "-stdin", "-width=105", NULL }; +			popenrw(callLynx, fds); +			FILE * lynxIn = fdopen(fds[0], "w"); +			FILE * lynxOut = fdopen(fds[1], "r"); +			htmlNodeDumpFile(lynxIn, doc.get(), xmlDocGetRootElement(doc.get())); +			fclose(lynxIn); +			close(fds[0]); +			int len = 0; +			*pos = 0; +			for (int ch ; ((ch = fgetc(lynxOut)) >= 0); ) { +				if (*pos >= len) { +					len += BUFSIZ; +					*buf = (char*)realloc(*buf, len); +				} +				(*buf)[(*pos)++] = ch; +			} +			fclose(lynxOut); +			close(fds[1]); +			int status; +			wait(&status); +			if (status != 0) { +				throw std::runtime_error("Lynx failed"); +			} +			return *buf; +		} +	private: +		const XmlDocumentPtr doc; +};  void  _SendMailTask::execute() const @@ -105,6 +146,8 @@ _SendMailTask::execute() const  	parts.push_back(new Header("Content-Type", "multipart/alternative; boundary=\"<<divider>>\""));  	parts.push_back(new Header("MIME-Version", "1.0"));  	parts.push_back(new Header("Content-Transfer-Encoding", "binary")); +	parts.push_back(new BoundaryBegin("text/plain; utf-8")); +	parts.push_back(new TextContent(result));  	parts.push_back(new BoundaryBegin("text/html; utf-8"));  	parts.push_back(new HtmlContent(result));  	parts.push_back(new BoundaryEnd());  | 
