www.pudn.com > cfgcrypt.rar > cfgcrypt.cpp


#include 

#include "cfgcrypt.h"


#ifdef _WIN32
	#define snprintf _snprintf
#endif

using namespace std;

/***********************************************************************************/
string& ltrim(string& s)
{
	int (*func)(int) = isspace;

	string::iterator iter;
	iter = find_if(s.begin(), s.end(), not1(ptr_fun(func)));
	s.erase(s.begin(), iter);

	return s;
}

string& rtrim(string& s)
{
	int (*func)(int) = isspace;

	string::reverse_iterator iter;
	iter = find_if(s.rbegin(), s.rend(), not1(ptr_fun(func)));
	s.erase(iter.base(), s.end());

	return s;
}

//ɾ³ý×Ö·û´®ÓұߵĿոñ
char* rtrim(char* p)
{
	if(p==NULL)
	{
		return p;
	}

	char* q = p+strlen(p)-1;

	while(isspace(*q))
	{
		--q;
	}

	*(q+1) = '\0';

	return p;
}

//ɾ³ý×Ö·û´®×ó±ßµÄ¿Õ¸ñ
char* ltrim(char* p)
{
	if(p==NULL)
	{
		return p;
	}

	char* q = p;

	while(isspace(*q))
	{
		++q;
	}

	if(p!=q)
	{
		while(*p++ = *q++){}
	}

	return p;
}

string& trim(string& s)
{
	return rtrim(ltrim(s));
}

char* trim(char* s)
{
	return ltrim(rtrim(s));
}

/***********************************************************************************/
CCfgCrypt::CCfgCrypt()
			: m_eScanRet(E_SCAN_NO)
{
}


CCfgCrypt::~CCfgCrypt()
{

}


void CCfgCrypt::scanCfgFile()
{
	const char* pszCfgFile = getenv("PASSWORD_ETC");
	if(pszCfgFile == NULL)
	{
		m_strScanErr.assign("Env variable 'PASSWORD_ETC' missed!");
		m_eScanRet = E_SCAN_ERR;
		return;
	}

	FILE* f = fopen(pszCfgFile, "r");
	if(f == NULL)
	{
		m_strScanErr.assign("Failed to open file: ").append(pszCfgFile);
		m_eScanRet = E_SCAN_ERR;
		return;
	}

	while(!feof(f))
	{
		char szLine[128];
		fgets(szLine, sizeof(szLine), f);

		string sLine = ltrim(szLine);
		if(sLine.empty() || sLine[0]=='#')
		{
			continue;
		}

		string::size_type pos = sLine.find("=");
		if(pos==string::npos)
		{
			continue;
		}

		string strTemp = sLine.substr(0, pos);
		string s1 = trim(strTemp);
		strTemp = sLine.substr(pos+1, sLine.size()-pos-1);
		string s2 = trim(strTemp);

		map::iterator iter1 = m_CfgDict.lower_bound(s1);
		if(iter1 != m_CfgDict.end() && s1.compare(iter1->first) == 0)
		{
			m_strScanErr.assign("Duplicate item: ").append(s1);
			m_eScanRet = E_SCAN_ERR;
			fclose(f);
			return;
		}
		else
		{
			m_CfgDict.insert(iter1, make_pair(s1, s2));
		}
	}
	fclose(f);

	m_eScanRet = E_SCAN_YES;
	return;
}


bool CCfgCrypt::getValue(const char* pszItem, string& strValue)
{
	if(m_eScanRet == E_SCAN_NO)
	{
		this->scanCfgFile();
	}
	if(m_eScanRet == E_SCAN_ERR)
	{
		strValue.assign(m_strScanErr);
		return false;
	}

	map::const_iterator iter = m_CfgDict.find(pszItem);
	if(iter!=m_CfgDict.end())
	{
		char szOut[512];
		memset(szOut, 0, sizeof(szOut));
		TCrypt::Decrypt(iter->second.c_str(), szOut, sizeof(szOut));

		strValue.assign(szOut);
		return true;
	}
	else
	{
		char s[128];
		memset(s, 0, sizeof(s));
		snprintf(s, sizeof(s), "Config error!Item '%s' missed!", pszItem);
		strValue.assign(s);

		return false;
	}

	return false;
}