#include "stdafx.h"
#include <string>
#include "DES_MODULE.h"

using namespace std;

map<string, string> CodeMap;
map<string, string> CodeMapReverse;
map<string, short> keystone; // size 200 for now // 20180404
HINSTANCE hMod = NULL;
bool loaded = false;


bool ignore_keystone = false;



CDES_MODULE::CDES_MODULE()
{
}

CDES_MODULE::~CDES_MODULE()
{
}

CString CDES_MODULE::_enc(const std::string& plain, const std::string& key)
{
#ifdef CODEC_FREE
	return plain.c_str();
#endif
	// check keystone
	CHECK_KEYSTONE();
	if (!ignore_keystone)
		if (keystone.find(plain) != keystone.end())
			return plain.c_str();
	// check codemap
	if (CodeMap.find(plain) != CodeMap.end())
		return CodeMap[plain].c_str();
	string output;

	//typedef std::string(*FEnc)(const std::string&, const std::string&);
	typedef char*(*FEnc)(char*, char*);

	CString moduleName;
	moduleName = L"RailStationCodec.dll";

	//HINSTANCE hMod = LoadLibrary(moduleName);
	if (!loaded)
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
	if (hMod)
	{
		loaded = true;
		FEnc FEncrypt = (FEnc)GetProcAddress(hMod, "Encrypt");
		output = (string)FEncrypt(S2C(plain), S2C(key));
		//FreeLibrary(hMod);
	}
	else
	{
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
		DWORD n_error = GetLastError();
		if (hMod)
		{
			loaded = true;
			FEnc FEncrypt = (FEnc)GetProcAddress(hMod, "Encrypt");
			output = (string)FEncrypt(S2C(plain), S2C(key));
			//FreeLibrary(hMod);
		}
		else
		{
			output = "系统文件损坏！请联系开发人员！";
			CString hint(L"");
			hint.Format(_T("系统文件损坏！请联系开发人员！\r\n[加密过程]\r\n错误代码：%d"), n_error);
			AfxMessageBox(hint);
			throw output;
		}
	}
	// 将新的明文和密文配对加入映射
	CodeMap.insert(make_pair(plain, output));
	CodeMapReverse.insert(make_pair(output, plain));

	return output.c_str();
}

CString CDES_MODULE::_dec(const std::string& cipher, const std::string& key)
{
#ifdef CODEC_FREE
	return cipher.c_str();
#endif
	// check keystone
	CHECK_KEYSTONE();
	if (!ignore_keystone)
		if (keystone.find(cipher) != keystone.end())
			return cipher.c_str();
	// check codemap
	if (CodeMapReverse.find(cipher) != CodeMapReverse.end())
		return CodeMapReverse[cipher].c_str();
	string output;

	//typedef std::string(*FDec)(const std::string&, const std::string&);
	typedef char*(*FDec)(char*, char*);

	CString moduleName;
	moduleName = L"RailStationCodec.dll";

	if (!loaded)
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
	if (hMod)
	{
		loaded = true;
		FDec FDecrypt = (FDec)GetProcAddress(hMod, "Decrypt");
		output = (string)FDecrypt(S2C(cipher), S2C(key));
		//FreeLibrary(hMod);
	}
	else
	{
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
		DWORD n_error = GetLastError();
		if (hMod)
		{
			loaded = true;
			FDec FDecrypt = (FDec)GetProcAddress(hMod, "Decrypt");
			output = (string)FDecrypt(S2C(cipher), S2C(key));
			//FreeLibrary(hMod);
		}
		else
		{
			output = "系统文件损坏！请联系开发人员！";
			CString hint(L"");
			hint.Format(_T("系统文件损坏！请联系开发人员！\r\n[解密过程]\r\n错误代码：%d"), n_error);
			AfxMessageBox(hint);
			throw output;
		}
	}
	// 将新的明文和密文配对加入映射
	CodeMap.insert(make_pair(output, cipher));
	CodeMapReverse.insert(make_pair(cipher, output));

	return output.c_str();
}

string CDES_MODULE::CStringTostring(const CString& cstr)
{
	CStringA stra((TCHAR*)(LPCTSTR)(cstr));
	string str((char*)(LPCSTR)(stra));
	return  str;
}

CString CDES_MODULE::_wenc(const CString& plain, const std::string& key)
{
	string _plain;
	USES_CONVERSION;
	//char* s_char = W2A(plain);
	//_plain = s_char;
	_plain = CStringTostring(plain);
#ifdef CODEC_FREE
	return plain;
#endif
	// check keystone
	CHECK_KEYSTONE();
	if (!ignore_keystone)
		if (keystone.find(_plain) != keystone.end())
			return plain;
	// check codemap
	if (CodeMap.find(_plain) != CodeMap.end())
		return CodeMap[_plain].c_str();
	string output;

	//typedef std::string(*FEnc)(const std::string&, const std::string&);
	typedef char*(*FEnc)(char*, char*);

	CString moduleName;
	moduleName = L"RailStationCodec.dll";

	if (!loaded)
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
	if (hMod)
	{
		loaded = true;
		FEnc FEncrypt = (FEnc)GetProcAddress(hMod, "Encrypt");
		output = (string)FEncrypt(S2C(_plain), S2C(key));
		//FreeLibrary(hMod);
	}
	else
	{
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
		DWORD n_error = GetLastError();
		if (hMod)
		{
			loaded = true;
			FEnc FEncrypt = (FEnc)GetProcAddress(hMod, "Encrypt");
			output = (string)FEncrypt(S2C(_plain), S2C(key));
			//FreeLibrary(hMod);
		}
		else
		{
			output = "系统文件损坏！请联系开发人员！";
			CString hint(L"");
			hint.Format(_T("系统文件损坏！请联系开发人员！\r\n[W加密过程]\r\n错误代码：%d"), n_error);
			AfxMessageBox(hint);
			throw output;
		}
	}
	// 将新的明文和密文配对加入映射
	CodeMap.insert(make_pair(_plain, output));
	CodeMapReverse.insert(make_pair(output, _plain));

	return output.c_str();
}



CString CDES_MODULE::_wdec(const CString& cipher, const std::string& key)
{
	string _cipher;
	USES_CONVERSION;
	_cipher = CStringTostring(cipher);
	//_cipher = s_char;
#ifdef CODEC_FREE
	return cipher;
#endif
	// check keystone
	CHECK_KEYSTONE();
	if (!ignore_keystone)
		if (keystone.find(_cipher) != keystone.end())
			return cipher;
	// check codemap
	if (CodeMapReverse.find(_cipher) != CodeMapReverse.end())
		return CodeMapReverse[_cipher].c_str();
	string output;

	//typedef std::string(*FDec)(const std::string&, const std::string&);
	typedef char*(*FDec)(char*, char*);

	CString moduleName;
	moduleName = L"RailStationCodec.dll";

	if (!loaded)
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
	if (hMod)
	{
		loaded = true;
		FDec FDecrypt = (FDec)GetProcAddress(hMod, "Decrypt");
		output = (string)FDecrypt(S2C(_cipher), S2C(key));
		//FreeLibrary(hMod);
	}
	else
	{
		hMod = LoadLibraryEx(moduleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
		DWORD n_error = GetLastError();
		if (hMod)
		{
			loaded = true;
			FDec FDecrypt = (FDec)GetProcAddress(hMod, "Decrypt");
			output = (string)FDecrypt(S2C(_cipher), S2C(key));
			//FreeLibrary(hMod);
		}
		else
		{
			output = "系统文件损坏！请联系开发人员！";
			CString hint(L"");
			hint.Format(_T("系统文件损坏！请联系开发人员！\r\n[W解密过程]\r\n错误代码：%d"), n_error);
			AfxMessageBox(hint);
			throw output;
		}
	}
	// 将新的明文和密文配对加入映射
	CodeMap.insert(make_pair(output, _cipher));
	CodeMapReverse.insert(make_pair(_cipher, output));

	return output.c_str();
}

char* CDES_MODULE::S2C(const std::string& input)
{
	char* output = new char[input.length()+1];
	strcpy(output, input.c_str());
	return output;
}

void CDES_MODULE::CHECK_KEYSTONE()
{
	if (keystone.find("车站表道岔表") != keystone.end())
		return;
	// enable keystone
	// batch one
	keystone.insert(make_pair("车站表道岔表", 0));
	keystone.insert(make_pair("道岔表", 1));
	keystone.insert(make_pair("既有曲线拨量计算结果表", 2));
	keystone.insert(make_pair("既有曲线测量原始资料表", 3));
	keystone.insert(make_pair("道路横断面参数", 4));
	keystone.insert(make_pair("横断面土石方数量精度", 5));
	keystone.insert(make_pair("清表土厚度", 6));
	keystone.insert(make_pair("既有站股道帮宽", 7));
	keystone.insert(make_pair("地层线数据", 8));
	keystone.insert(make_pair("其他地质数据表", 9));
	// batch two
	keystone.insert(make_pair("其他地质文字表", 10));
	keystone.insert(make_pair("横断面地面线表", 11));
	keystone.insert(make_pair("增补横断面地面线表", 12));
	keystone.insert(make_pair("道路横断面地面线表", 13));
	keystone.insert(make_pair("左地面线内插宽", 14));
	keystone.insert(make_pair("右地面线内插宽", 15));
	keystone.insert(make_pair("横断面桩号序列", 16));
	keystone.insert(make_pair("增补横断面桩号序列", 17));
	keystone.insert(make_pair("道床边坡数据", 18));
	keystone.insert(make_pair("道砟数量统计表", 19));
	// batch three
	keystone.insert(make_pair("土方数量统计表", 20));
	keystone.insert(make_pair("道床顶宽数据", 21));
	keystone.insert(make_pair("底砟顶宽数据", 22));
	keystone.insert(make_pair("电化里程分段数据", 23));
	keystone.insert(make_pair("道砟里程分段数据", 24));
	keystone.insert(make_pair("轨枕类型数据", 25));
	keystone.insert(make_pair("护轮轨类型数据", 26));
	keystone.insert(make_pair("股道利用段数据", 27));
	keystone.insert(make_pair("股道拆除段数据", 28));
	keystone.insert(make_pair("围墙拆除段数据", 29));
	// batch four
	keystone.insert(make_pair("排水沟拆除段数据", 30));
	keystone.insert(make_pair("站台拆除段数据", 31));
	keystone.insert(make_pair("左侧股间砟数据", 32));
	keystone.insert(make_pair("右侧股间砟数据", 33));
	keystone.insert(make_pair("左侧加宽数据", 34));
	keystone.insert(make_pair("右侧加宽数据", 35));
	keystone.insert(make_pair("面砟厚度数据", 36));
	keystone.insert(make_pair("底砟边坡数据", 37));
	keystone.insert(make_pair("钢轨类型数据", 38));
	keystone.insert(make_pair("中部掏空数据", 39));
	// batch five
	keystone.insert(make_pair("难行线坡度表", 40));
	keystone.insert(make_pair("难行线关键点", 41));
	keystone.insert(make_pair("难行线相邻线关键点", 42));
	keystone.insert(make_pair("调车线股道编号", 43));
	keystone.insert(make_pair("峰顶平台", 44));
	keystone.insert(make_pair("减速器", 45));
	keystone.insert(make_pair("小桥涵框架涵", 46));
	keystone.insert(make_pair("车站表道岔数量统计表", 47));
	keystone.insert(make_pair("车站表配轨表", 48));
	keystone.insert(make_pair("车站表桥遂", 49));
	// batch six
	keystone.insert(make_pair("车站表桥隧边界点", 50));
	keystone.insert(make_pair("大中桥", 51));
	keystone.insert(make_pair("大中桥边界点", 52));
	keystone.insert(make_pair("隧道", 53));
	keystone.insert(make_pair("房屋表", 54));
	keystone.insert(make_pair("车站表股道汇总表", 55));
	keystone.insert(make_pair("股道汇总表", 56));
	keystone.insert(make_pair("外移桩导线点表", 57));
	keystone.insert(make_pair("车站表股道曲线表", 58));
	keystone.insert(make_pair("股道曲线表", 59));
	// batch seven
	keystone.insert(make_pair("股道配轨表", 60));
	keystone.insert(make_pair("股道标注表", 61));
	keystone.insert(make_pair("方案描述表", 62));
	keystone.insert(make_pair("车站表基本信息表", 63));
	keystone.insert(make_pair("基本信息表", 64));
	keystone.insert(make_pair("股道有效长表", 65));
	keystone.insert(make_pair("轨道结构高", 66));
	keystone.insert(make_pair("既有轨面线表", 67));
	keystone.insert(make_pair("既有地面线表", 68)); // obsolete
	keystone.insert(make_pair("既有道床线表", 69)); // obsolete
											  // batch eight
	keystone.insert(make_pair("股道地面线表", 70));
	keystone.insert(make_pair("基线汇总表", 71));
	keystone.insert(make_pair("渡线汇总表", 72));
	keystone.insert(make_pair("车站表渡线汇总表", 73));
	keystone.insert(make_pair("站台表", 74));
	keystone.insert(make_pair("站台边界点表", 75));
	keystone.insert(make_pair("车站", 76));
	keystone.insert(make_pair("基线控制点范围表", 77));
	keystone.insert(make_pair("基线曲线表", 78));
	keystone.insert(make_pair("左线曲线表", 79)); // obsolete
											 // batch nine
	keystone.insert(make_pair("右线曲线表", 80)); // obsolete
	keystone.insert(make_pair("股道断链表", 81));
	keystone.insert(make_pair("基线断链表", 82));
	keystone.insert(make_pair("车站表股道断链表", 83));
	keystone.insert(make_pair("电缆井数量表", 84));
	keystone.insert(make_pair("综合管线数量表", 85));
	keystone.insert(make_pair("坡度表", 86));
	keystone.insert(make_pair("联络线坡度表", 87));
	keystone.insert(make_pair("车站表坡度表", 88));
	keystone.insert(make_pair("三维股道坡度表", 89));
	// batch ten
	keystone.insert(make_pair("车站信息表", 90));
	keystone.insert(make_pair("检查坑汇总表", 91));
	keystone.insert(make_pair("轨道衡汇总表", 92));
	keystone.insert(make_pair("超偏载仪汇总表", 93));
	keystone.insert(make_pair("警冲标汇总表", 94));
	keystone.insert(make_pair("信号机汇总表", 95));
	keystone.insert(make_pair("电缆井表", 96));
	keystone.insert(make_pair("线路信息表", 97));
	keystone.insert(make_pair("综合管线表", 98));
	keystone.insert(make_pair("综合管线桩表", 99));
	// batch eleven
	keystone.insert(make_pair("车站表车挡汇总表", 100));
	keystone.insert(make_pair("车挡汇总表", 101));
	keystone.insert(make_pair("车站表天桥地道表", 102));
	keystone.insert(make_pair("天桥地道表", 103));
	keystone.insert(make_pair("平过道表", 104));
	keystone.insert(make_pair("货物雨棚及仓库表", 105));
	keystone.insert(make_pair("旅客雨棚表", 106));
	keystone.insert(make_pair("道路横断面桩号序列", 107));
	keystone.insert(make_pair("地块面积统计表", 108));
	keystone.insert(make_pair("拆迁表", 109));
	// batch twelve
	keystone.insert(make_pair("路网半径表", 110));
	keystone.insert(make_pair("道路汇总表", 111));
	keystone.insert(make_pair("道路纵坡表", 112));
	keystone.insert(make_pair("道路平面坐标表", 113));
	keystone.insert(make_pair("车站表站台汇总表", 114));
	keystone.insert(make_pair("车站表围墙汇总表", 115));
	keystone.insert(make_pair("围墙汇总表", 116));
	keystone.insert(make_pair("场坪桩表", 117));
	keystone.insert(make_pair("场坪汇总表", 118));
	keystone.insert(make_pair("龙门吊汇总表", 119));
	// batch thirteen
	keystone.insert(make_pair("车站表围墙门表", 120));
	keystone.insert(make_pair("围墙门表", 121));
	keystone.insert(make_pair("栅栏门表", 122));
	keystone.insert(make_pair("栅栏汇总表", 123));
	keystone.insert(make_pair("里程设置地块汇总表", 124));
	keystone.insert(make_pair("里程设置行政区汇总表", 125));
	keystone.insert(make_pair("地块汇总表", 126));
	keystone.insert(make_pair("行政区汇总表", 127));
	keystone.insert(make_pair("地块桩表", 128));
	keystone.insert(make_pair("行政区桩表", 129));
	// batch fourteen
	keystone.insert(make_pair("用地界汇总表", 130));
	keystone.insert(make_pair("用地界桩表", 131));
	keystone.insert(make_pair("排水沟表", 132));
	//keystone.insert(make_pair("横断面水沟表", 133));
	keystone.insert(make_pair("围墙栅栏桩表", 134));
	keystone.insert(make_pair("房屋桩表", 135));
	keystone.insert(make_pair("排水沟桩表", 136));
	//keystone.insert(make_pair("横断面水沟桩表", 137));
	keystone.insert(make_pair("池表", 138));
	keystone.insert(make_pair("检查井表", 139));
	// batch fifteen
	keystone.insert(make_pair("横坡标注表", 140));
	keystone.insert(make_pair("既有横坡参考线", 141));
	keystone.insert(make_pair("路面横坡形式表", 142));
	keystone.insert(make_pair("转换参数表", 143));
	keystone.insert(make_pair("分界点里程表", 144));
	keystone.insert(make_pair("在建设备处理方式", 145));
	keystone.insert(make_pair("三维设备高程表", 146));
	keystone.insert(make_pair("线间距里程表", 147));
	//// Main Table Ended
	keystone.insert(make_pair("横断面方案汇总表", 148));
	keystone.insert(make_pair("横断面占地宽汇总表", 149));
	// batch sixteen
	keystone.insert(make_pair("横断面总面积表", 150));
	keystone.insert(make_pair("分场填挖标准表", 151));
	keystone.insert(make_pair("断面挖洞点位表", 152));
	keystone.insert(make_pair("断面标注信息表", 153));
	keystone.insert(make_pair("断面挖台阶参数表", 154));
	keystone.insert(make_pair("断面顺接坡段表", 155));
	keystone.insert(make_pair("断面面积汇总表", 156));
	keystone.insert(make_pair("断面地面线表", 157));
	keystone.insert(make_pair("相交股道信息汇总表", 158));
	keystone.insert(make_pair("相交排水信息表", 159));
	// batch seventeen
	keystone.insert(make_pair("相交围墙表", 160));
	keystone.insert(make_pair("相交道路表", 161));
	keystone.insert(make_pair("相交站台表", 162));
	keystone.insert(make_pair("相交场坪表", 163));
	keystone.insert(make_pair("相交房屋表", 164));
	keystone.insert(make_pair("相交龙门吊表", 165));
	keystone.insert(make_pair("分体设计点表", 166));
	keystone.insert(make_pair("分体水沟表", 167));
	keystone.insert(make_pair("分体路面高程点标注表", 168));
	keystone.insert(make_pair("分体台阶线表", 169));
	// batch eighteen
	keystone.insert(make_pair("分体线分段表", 170));
	keystone.insert(make_pair("分体边坡设计参数表", 171));
	keystone.insert(make_pair("分体面积汇总表", 172));
	keystone.insert(make_pair("填挖方填料标准表", 173));
	keystone.insert(make_pair("分区股道详细信息表", 174));
	keystone.insert(make_pair("填料面积汇总表", 175));
	keystone.insert(make_pair("左右边界线表", 176));
	keystone.insert(make_pair("分区台阶线表", 177));
	keystone.insert(make_pair("站台外轮廓线表", 178));
	keystone.insert(make_pair("清表相关填挖分段表", 179));
	// batch nineteen
	keystone.insert(make_pair("填料分层线点位表", 180));
	keystone.insert(make_pair("分区标注点位表", 181));
	keystone.insert(make_pair("填料分层过程数据基本信息汇总表", 182));
	keystone.insert(make_pair("填料分层结果数据基本信息汇总表", 183));
	keystone.insert(make_pair("虚拟分区基本信息汇总表", 184));
	keystone.insert(make_pair("分体基本信息汇总表", 185));
	keystone.insert(make_pair("断面基本信息汇总表", 186));
	keystone.insert(make_pair("虚拟分区左右边界线表", 187));
	keystone.insert(make_pair("横断面路面横坡形式表", 188));
	//// Cross Section Ended
	keystone.insert(make_pair("道路横断面汇总表", 189));
	// batch twenty
	keystone.insert(make_pair("道路横断面设计成果汇总表", 190));
	keystone.insert(make_pair("道路横断面面积统计表", 191));
	keystone.insert(make_pair("道路横断面占地宽表", 192));
	keystone.insert(make_pair("道路横断面挖洞点位表", 193));
	//// Road Cross Section Ended
	keystone.insert(make_pair("分体标注调整汇总表", 194));
	keystone.insert(make_pair("横断面方案地面线表", 195));
	keystone.insert(make_pair("横断面三点归一类型分段", 196));
	keystone.insert(make_pair("NOT_DEFINED_4", 197));
	keystone.insert(make_pair("NOT_DEFINED_5", 198));
	keystone.insert(make_pair("NOT_DEFINED_6", 199));

	keystone.insert(make_pair("车站表站台边界点表", 200));
	keystone.insert(make_pair("风玫瑰数据", 201));
	keystone.insert(make_pair("驼峰基本参数", 202));
	keystone.insert(make_pair("驼峰线束", 203));

	keystone.insert(make_pair("地质文字表", 204));
	keystone.insert(make_pair("地质填图数据表", 205));
	keystone.insert(make_pair("既有预留标注设定", 206));
	keystone.insert(make_pair("引线标注表", 207));

	keystone.insert(make_pair("特殊断面方案汇总表", 208));
	keystone.insert(make_pair("特殊断面基本信息汇总表", 209));
	keystone.insert(make_pair("特殊断面挖除线表", 210));
	keystone.insert(make_pair("特殊断面设备信息表", 211));
	keystone.insert(make_pair("特殊断面面积统计表", 212));
	
	keystone.insert(make_pair("驼峰车辆类型", 213));
	keystone.insert(make_pair("转标注线数据表", 214));
	keystone.insert(make_pair("转标注圆数据表", 215));
	keystone.insert(make_pair("转标注文本数据表", 216));
	keystone.insert(make_pair("横断面排水结构宽度表", 217));
	keystone.insert(make_pair("股道左右路基半宽表", 218));

	keystone.insert(make_pair("路基图形数字化数据表", 219));
	keystone.insert(make_pair("路基图形填充数据表", 220));
	keystone.insert(make_pair("路基图形文字表", 221)); 
	keystone.insert(make_pair("平面标注信息表", 222));
	keystone.insert(make_pair("路基图形图层信息表", 223));
	keystone.insert(make_pair("股道特征桩信息表", 224));
    keystone.insert(make_pair("横断面下标注标高绘制设置", 225));

	keystone.insert(make_pair("脱鞋器汇总表", 226));
	keystone.insert(make_pair("脱轨器汇总表", 227));
	keystone.insert(make_pair("停车器汇总表", 228));
	keystone.insert(make_pair("限界检查器汇总表", 229));
	keystone.insert(make_pair("装载限界架汇总表", 230));
	
	keystone.insert(make_pair("驼峰气温表", 231));
	keystone.insert(make_pair("驼峰风速表", 232));
	keystone.insert(make_pair("驼峰峰高计算基本信息表", 233));
	keystone.insert(make_pair("易行线关键点", 234));
	keystone.insert(make_pair("难行线相邻线坡度表", 235));
	keystone.insert(make_pair("易行线坡度表", 236));
	keystone.insert(make_pair("驼峰其他股道坡度表", 237));
	keystone.insert(make_pair("跨座式道岔汇总表", 238));   // hsx 202006
	keystone.insert(make_pair("土工格栅参数设置表", 239));
	keystone.insert(make_pair("分体土工格栅线表", 240));
	keystone.insert(make_pair("断面开挖线表", 241));//20200709 
	keystone.insert(make_pair("驼峰改建调车场", 242));

}