亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? maildecoder.cpp

?? .net 方面的開發說明資料。
?? CPP
字號:
// =============================================================
// Multi-Purpose Internet Mail Extensions decoder
//
// Purpose: converts a mime encoded e-mail message from
//          a string and converts to a tree structure.
//
// This file is part of Eplug
//
// Copyright (c) 2002 - 2003 Pylon Software
// =============================================================

#pragma warning (disable : 4786)

// -------------------------------------------------------------

#include "Base64Decoder.h"
#include "MailDecoder.h"

// -------------------------------------------------------------

static Mime MimeKeywords[] = {
	Mime("Return-Path",               MIME_RETURNPATH),
	Mime("Message-ID",                MIME_MESSAGEID),
	Mime("From",                      MIME_FROM),
	Mime("To",                        MIME_TO),
	Mime("Cc",                        MIME_CC),
	Mime("Subject",                   MIME_SUBJECT),
	Mime("Date",                      MIME_DATE),
	Mime("MIME-Version",              MIME_VERSION),
	Mime("Content-Type",              MIME_CONTENTTYPE),
	Mime("Content-Transfer-Encoding", MIME_CONTENTTRANSFERENCODING),
	Mime("Content-Disposition",       MIME_CONTENTDISPOSITION),
};

// -------------------------------------------------------------

MailDecoder::MailDecoder() :
m_raw_text(),
m_pos(0),
m_section_pos(0),
m_decoded(NULL),
m_current_section(NULL),
m_current_block(NULL) {
}

bool
MailDecoder::open(std::string mail_content) {
	close();

	m_raw_text = mail_content;
	m_pos = 0;

	BlockHeading heading;
	DecodeHeadingSection(heading);
	DecodeMailSection(heading);
	LogMailContents();

	return true;
}

void
MailDecoder::close() {
	if (m_decoded) {
		delete m_decoded;

		m_decoded = NULL;
	}
}

MailDecoder::~MailDecoder() {
	close();
}

// -------------------------------------------------------------

void
MailDecoder::BeginSection() {
	MailSection *section = new MailSection;
	section->parent = m_current_section;

	if (m_current_section)
		m_current_section->children.push_back(section);
	else
		m_decoded = section;
	
	m_current_section = section;
}

void
MailDecoder::EndSection() {
	m_current_section = m_current_section->parent;
	m_current_block = (m_current_section) ? m_current_section->content.back() : NULL;
}

void
MailDecoder::NewBlock() {
	MailBlock *block = new MailBlock;
	memset(block, 0, sizeof(MailBlock));

	m_current_section->content.push_back(block);

	m_current_block = block;
}

void
MailDecoder::SkipWhite() {
	while ((m_pos < m_raw_text.length()) && (isspace(m_raw_text[m_pos])))
		++m_pos;
}

void
MailDecoder::CopyHeading(BlockHeading &a, BlockHeading &b) {
	a.m_boundary = b.m_boundary;
	a.m_charset = b.m_charset;
	a.m_content_encoding = b.m_content_encoding;
	a.m_content_type = b.m_content_type;
	a.m_date = b.m_date;
	a.m_from = b.m_from;
	a.m_message_id = b.m_message_id;
	a.m_mime_version = b.m_mime_version;
	a.m_return_path = b.m_return_path;
	a.m_subject = b.m_subject;
	a.m_to = b.m_to;
	a.m_cc = b.m_cc;
	a.m_content_disposition = b.m_content_disposition;
	a.m_filename = b.m_filename;
}

// -------------------------------------------------------------

MimeEnum
MailDecoder::MatchMimeString(std::string s) {
    for (int i = 0; i < sizeof(MimeKeywords) / sizeof(std::string); ++i)
		if (stricmp(MimeKeywords[i].m_s.c_str(), s.c_str()) == 0)
			return MimeKeywords[i].m_mime;

	return MIME_UNKNOWN;
}

std::string
MailDecoder::GetFieldName() {	
	SkipWhite();

	std::string tmp;

	while ((m_pos < m_raw_text.length()) && (isprint(m_raw_text[m_pos])) && (!isspace(m_raw_text[m_pos])) && (m_raw_text[m_pos] != ':'))
		tmp += m_raw_text[m_pos++];
	
	SkipWhite();

	return (m_raw_text[m_pos] == ':') ? tmp : "";
}

std::string
MailDecoder::GatherParameters() {
	std::string tmp;

	while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] != 0x0D) && (m_raw_text[m_pos] != 0x0A)))
		tmp += m_raw_text[m_pos++];

	while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] == 0x0D) || (m_raw_text[m_pos] == 0x0A)))
		++m_pos;

	while (isspace(m_raw_text[m_pos])) {
		if ((m_raw_text[m_pos] == 0x0D) || (m_raw_text[m_pos] == 0x0A))
			break;

		SkipWhite();

		tmp += ' ';

		while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] != 0x0D) && (m_raw_text[m_pos] != 0x0A)))
			tmp += m_raw_text[m_pos++];			

		while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] == 0x0D) || (m_raw_text[m_pos] == 0x0A)))
			++m_pos;
	}

	return tmp;
}

std::string
MailDecoder::DeQuoteString(std::string &s) {
	if (((s[0] == '\"') && (s[s.length() - 1] == '\"')) ||
		((s[0] == '<') && (s[s.length() - 1] == '>')))
		return s.substr(1, s.length() - 2);

	return s;
}

std::string
MailDecoder::ReadLine() {
	std::string tmp;

	while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] != 0x0D) && (m_raw_text[m_pos] != 0x0A)))
		tmp += m_raw_text[m_pos++];

	while ((m_pos < m_raw_text.length()) && ((m_raw_text[m_pos] == 0x0D) || (m_raw_text[m_pos] == 0x0A)))
		++m_pos;

	return tmp;
}

void
MailDecoder::DecodeHeadingSection(BlockHeading &heading) {
	SkipWhite();

	while ((m_pos < m_raw_text.length()) && (!isspace(m_raw_text[m_pos]))) {
		int prev_pos = m_pos;

		// field name

		std::string fieldname = GetFieldName();

		if (!fieldname.empty()) {
			m_pos++; // assume there is a : there
			SkipWhite();

			// field params

			std::string params = GatherParameters();

			// use fieldname with params

			switch(MatchMimeString(fieldname)) {
				case MIME_RETURNPATH :					
					DecodeParameters(MIME_RETURNPATH, params, heading, &heading.m_return_path);
					break;

				case MIME_MESSAGEID :
					DecodeParameters(MIME_MESSAGEID, params, heading, &heading.m_message_id);
					break;

				case MIME_FROM :
					DecodeParameters(MIME_FROM, params, heading, &heading.m_from);
					break;

				case MIME_TO :
					DecodeParameters(MIME_TO, params, heading, &heading.m_to);
					break;

				case MIME_CC :
					DecodeParameters(MIME_CC, params, heading, &heading.m_cc);
					break;

				case MIME_SUBJECT :
					DecodeParameters(MIME_SUBJECT, params, heading, &heading.m_subject);
					break;

				case MIME_DATE :
					DecodeParameters(MIME_DATE, params, heading, &heading.m_date);
					break;

				case MIME_VERSION :
					DecodeParameters(MIME_VERSION, params, heading, &heading.m_mime_version);
					break;

				case MIME_CONTENTTYPE :
					DecodeParameters(MIME_CONTENTTYPE, params, heading, &heading.m_content_type);
					break;

				case MIME_CONTENTTRANSFERENCODING :
					DecodeParameters(MIME_CONTENTTRANSFERENCODING, params, heading, &heading.m_content_encoding);
					break;

				case MIME_CONTENTDISPOSITION :
					DecodeParameters(MIME_CONTENTDISPOSITION, params, heading, &heading.m_content_disposition);
					break;
			}
		} else {
			m_pos = prev_pos;
			break;
		}
	}
}

void
MailDecoder::DecodeMailSection(BlockHeading &heading) {
	// allocate new section

	BeginSection();
	NewBlock();

	// copy heading

	CopyHeading(m_current_block->heading, heading);

	// handle subheadings and text

	if (heading.m_boundary.empty()) {
		// copy text

		while (m_pos < m_raw_text.length()) {
			m_current_block->content += ReadLine();
			m_current_block->content += 0x0D;
			m_current_block->content += 0x0A;
		}
	} else {
		// copy text and subheadings

		while (m_pos < m_raw_text.length()) {
			// copy lines until we find the first boundary line

			while (m_pos < m_raw_text.length()) {
				std::string line = ReadLine();

				if ((line[0] == '-') && (line[1] == '-') && (strncmp(line.c_str() + 2, heading.m_boundary.c_str(), heading.m_boundary.length()) == 0))
					break;

				m_current_block->content += line;
				m_current_block->content += 0x0D;
				m_current_block->content += 0x0A;
			}

			while (m_pos < m_raw_text.length()) {
				BlockHeading new_heading;

				DecodeHeadingSection(new_heading);

				// if this is a new section, allocate it and handle it recursively

				if (!new_heading.m_boundary.empty()) {
					DecodeMailSection(new_heading);
				} else {
					NewBlock();

					CopyHeading(m_current_block->heading, new_heading);
				}

				// continue copying until we find the last boundary line

				while (m_pos < m_raw_text.length()) {
					std::string line = ReadLine();

					if (strncmp(line.c_str() + 2, heading.m_boundary.c_str(), heading.m_boundary.length()) == 0) {
						if ((heading.m_boundary.length() == line.length() - 4) &&
							(line[line.length() - 2] == '-') && (line[line.length() - 1] == '-')) {
							EndSection();
							return;
						} else {
							break;
						}
					}

					m_current_block->content += line;
					m_current_block->content += 0x0D;
					m_current_block->content += 0x0A;
				}
			}
		}
	}
}

void
MailDecoder::DecodeParameters(MimeEnum mime, std::string &params, BlockHeading &heading, std::string *attribute) {
	int i = 0;
	std::string *tmp_string = attribute;

	// try to decode the following data

	switch(mime) {
		// multiple <> ids seperated by commas

		case MIME_TO :
		case MIME_CC :
		case MIME_MESSAGEID :
		case MIME_RETURNPATH :
			while (i < params.length()) {
				std::string tmp;

				while ((i < params.length()) && (params[i] != ','))
					tmp += params[i++];

				++i;
				
				while ((i < params.length()) && ((params[i] == ' ') || (params[i] == 0x0A) || (params[i] == 0x0D)))
					++i;

				if ((*tmp_string).empty())
					*tmp_string = DeQuoteString(tmp);
				else
					*tmp_string += "," + DeQuoteString(tmp);
			}

			break;

		// one descriptor, followed by ; and key/'='/value pairs

		case MIME_CONTENTTYPE :
		case MIME_CONTENTTRANSFERENCODING :
		case MIME_CONTENTDISPOSITION :
			while ((i < params.length()) && (params[i] != ';'))
				*tmp_string += params[i++];

			*tmp_string = DeQuoteString(*tmp_string);

			// read next parts

			while (i < params.length()) {
				// if a ; is there, skip it

				if (params[i] == ';')
					++i;

				// skip white

				while ((i < params.length()) && (params[i] == ' '))
					++i;

				// read l-value

				std::string w;

				while ((i < params.length()) && (params[i] != '='))
					w += params[i++];

				// move beyond the = sign

				++i;

				// if found, skip it

				if (strnicmp(w.c_str(), "boundary", 8) == 0)
					tmp_string = &heading.m_boundary;
				else if (strnicmp(w.c_str(), "charset", 7) == 0)
					tmp_string = &heading.m_charset;
				else if (strnicmp(w.c_str(), "filename", 8) == 0)
					tmp_string = &heading.m_filename;
				else
					tmp_string = NULL;

				// skip white

				while ((i < params.length()) && (params[i] == ' '))
					++i;

				// read the r-value

				std::string tmp;

				while (i < params.length())
					tmp += params[i++];

				// assign the tmp string

				if (tmp_string)
					*tmp_string = DeQuoteString(tmp);

				// skip white

				while ((i < params.length()) && (params[i] == ' '))
					++i;
			}

			break;

		// just copy the text

		default :
			while (i < params.length())
				*tmp_string += params[i++];

			break;
	}
}

// -------------------------------------------------------------

void
MailDecoder::LogMailContents() {
	FILE *f = fopen("log.txt", "a+");

	LogMailContents(f, m_decoded);

	fclose(f);
}

void
MailDecoder::LogMailContents(FILE *f, MailSection *block) {
	for (int j = 0; j < block->content.size(); ++j) {
		MailBlock *the_block = block->content[j];

		fprintf(f, "[section %d]\n", j);
		fprintf(f, "From: %s\n", the_block->heading.m_from.c_str());
		fprintf(f, "To: %s\n", the_block->heading.m_to.c_str());
		fprintf(f, "Cc: %s\n", the_block->heading.m_cc.c_str());
		fprintf(f, "Subject: %s\n", the_block->heading.m_subject.c_str());
		fprintf(f, "Content-Type: %s\n", the_block->heading.m_content_type.c_str());
		fprintf(f, "Content-Encoding: %s\n", the_block->heading.m_content_encoding.c_str());
		fprintf(f, "Content-Disposition: %s\n", the_block->heading.m_content_disposition.c_str());
		fprintf(f, "Content-Filename: %s\n", the_block->heading.m_filename.c_str());
		fprintf(f, "Content-Size: %d\n", the_block->content.length());
		fprintf(f, "Content-Data: \n%s\n\n", the_block->content.c_str());

		if (the_block->heading.m_content_encoding == "base64") {
			// decode mime data

			int size = DecodeFileBase64(NULL, the_block->content.c_str());

			unsigned char *s = new unsigned char[size];

			DecodeFileBase64(s, the_block->content.c_str());

			// save mime data

			if (!the_block->heading.m_filename.empty()) {
				FILE *f = fopen(the_block->heading.m_filename.c_str(), "wb");
				fwrite(s, size, 1, f);
				fclose(f);
			}

			// and get rid of the decoded data

			delete [] s;
		}
	}

	for (int i = 0; i < block->children.size(); ++i) {
		LogMailContents(f, block->children[i]);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月天激情综合| 丝袜亚洲另类欧美综合| 国产午夜精品福利| 国产欧美日韩中文久久| 亚洲精品一区二区精华| 久久久不卡网国产精品二区| 欧美成人精品3d动漫h| 久久久欧美精品sm网站| 中文字幕二三区不卡| 国产精品欧美久久久久一区二区| 久久老女人爱爱| 国产精品护士白丝一区av| 亚洲欧美日韩系列| 日本少妇一区二区| 国产成人精品免费在线| 国产精品白丝jk白祙喷水网站 | 一区二区三区视频在线看| 懂色av中文一区二区三区| 一区视频在线播放| 国产精品性做久久久久久| 国产欧美日韩在线观看| 国产成人亚洲综合a∨婷婷| 中文字幕精品一区二区三区精品 | 秋霞午夜鲁丝一区二区老狼| 欧美精品一卡两卡| 欧美性三三影院| 91福利视频在线| 国产精品天干天干在线综合| 奇米综合一区二区三区精品视频| 韩国av一区二区三区| 国产很黄免费观看久久| 欧美年轻男男videosbes| 欧美激情在线一区二区| 国产一区二区免费看| 日韩精品中文字幕在线一区| 免费xxxx性欧美18vr| 欧美一区二区三区电影| 久久精品国产免费看久久精品| 欧美日韩不卡一区| 裸体歌舞表演一区二区| 日韩一卡二卡三卡| 国产一区二区不卡在线| 国产精品视频yy9299一区| 北条麻妃一区二区三区| 亚洲色图视频免费播放| 在线免费观看日本欧美| 亚洲成人av免费| 日韩一区在线看| 欧美日韩一本到| 日韩免费高清av| 国产精品传媒视频| 91一区二区三区在线观看| 久久av资源站| 色婷婷精品久久二区二区蜜臀av| 国产精品天天看| 国产成人综合网| 国产日产欧美一区二区视频| 成人一级黄色片| 一区二区三区免费网站| 欧美精品在线视频| www.爱久久.com| 久久国产综合精品| 亚洲精选视频在线| 欧美精品一区二区三区蜜桃视频| av高清不卡在线| 奇米综合一区二区三区精品视频| 国产喂奶挤奶一区二区三区| 99久久精品国产一区二区三区| 亚洲观看高清完整版在线观看| 欧美老肥妇做.爰bbww| 成人黄色777网| 国产真实精品久久二三区| 一区二区三区中文免费| 亚洲国产精品成人久久综合一区| 在线视频一区二区免费| 成人黄色av网站在线| 亚洲精品免费电影| 国产精品理伦片| 日本一区二区三区在线不卡| 欧美一区二区三区四区久久 | 91福利精品第一导航| 成人高清免费观看| 成人免费视频caoporn| 久久精品国产亚洲aⅴ| 日韩精品国产精品| 午夜精品久久久久久久久久| 亚洲毛片av在线| 亚洲精品视频一区二区| 亚洲女女做受ⅹxx高潮| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 色综合天天狠狠| 91免费视频观看| 欧美做爰猛烈大尺度电影无法无天| gogo大胆日本视频一区| 99久免费精品视频在线观看| aaa欧美大片| 欧美性videosxxxxx| 欧美老肥妇做.爰bbww视频| 日韩免费高清电影| 国产欧美一区二区三区沐欲| √…a在线天堂一区| 香蕉av福利精品导航| 处破女av一区二区| 成人毛片老司机大片| 91丨porny丨国产| 欧美日韩不卡在线| 久久精品人人爽人人爽| 亚洲国产视频直播| 精品制服美女丁香| 色婷婷av一区二区三区gif| 日韩欧美中文字幕制服| 亚洲精品国产精品乱码不99| 久久国内精品自在自线400部| 91网页版在线| 久久久www成人免费无遮挡大片 | 一本久道中文字幕精品亚洲嫩| 777a∨成人精品桃花网| 亚洲精品五月天| 99久久国产免费看| 国产欧美一区二区精品秋霞影院 | 成人妖精视频yjsp地址| 精品三级在线看| 日本vs亚洲vs韩国一区三区| caoporen国产精品视频| 亚洲精品在线免费观看视频| 日本不卡一区二区三区高清视频| 成人av电影在线观看| 国产精品每日更新在线播放网址 | 91福利国产成人精品照片| 欧美一级国产精品| 日韩av高清在线观看| 欧美色图片你懂的| 亚洲超碰97人人做人人爱| 粉嫩av一区二区三区| 中文字幕精品一区| 99国产精品国产精品毛片| 亚洲精品视频自拍| 精品婷婷伊人一区三区三| 爽好久久久欧美精品| 精品国产欧美一区二区| 亚洲一区二区三区小说| 欧美一级理论性理论a| 亚洲福利视频一区| 91精品在线麻豆| 国产精选一区二区三区| 亚洲欧美激情插| 欧美人狂配大交3d怪物一区| 奇米888四色在线精品| 欧美高清一级片在线观看| 色偷偷88欧美精品久久久| 日韩精品国产精品| 亚洲综合成人网| 久久免费视频一区| 色综合色狠狠天天综合色| 亚洲国产va精品久久久不卡综合| av亚洲精华国产精华精| 久久国内精品视频| 成人黄色大片在线观看| 成人动漫av在线| 亚洲精品一区二区精华| 26uuu亚洲综合色| 久久久久国产成人精品亚洲午夜| 久久久精品欧美丰满| 国产精品色哟哟| 亚洲午夜精品网| 狠狠色丁香久久婷婷综合_中| 国产老妇另类xxxxx| 色诱亚洲精品久久久久久| 欧美视频在线不卡| 日韩欧美色综合网站| 久久久久久久av麻豆果冻| 国产精品毛片久久久久久| 亚洲欧美一区二区久久| 亚洲国产色一区| 韩国午夜理伦三级不卡影院| 懂色av中文一区二区三区| 欧美亚洲一区二区三区四区| 日韩欧美在线网站| 亚洲欧美日韩国产成人精品影院| 喷水一区二区三区| 色综合久久久久综合| 日韩三级电影网址| 亚洲激情在线激情| 成人av午夜电影| 精品欧美黑人一区二区三区| 一区二区三区在线观看欧美| 国产麻豆午夜三级精品| 欧美日韩国产电影| 亚洲色图视频免费播放| 国产jizzjizz一区二区| 在线播放欧美女士性生活| 亚洲码国产岛国毛片在线| 另类小说综合欧美亚洲| 91精品国产色综合久久不卡蜜臀 | 99久久婷婷国产综合精品| 精品国产精品一区二区夜夜嗨| 日精品一区二区| 精品视频1区2区| 一级精品视频在线观看宜春院 | 成人18视频在线播放|