Пример #1
0
	string	KorCodeChg(const string& sSrc, ENCODING eEncode)
	{
		#ifndef HAVE_ICONV
			return sSrc;
		#endif
		
		ENCODING	tSrcEncode;
		string sChgCode = isKorCode(sSrc, &tSrcEncode);

		if ( tSrcEncode == US ) return sSrc;

		if ( eEncode == KO_EUCKR )
		{
			if (tSrcEncode == KO_UTF8 && e_nCurLang == KO_UTF8 )
			{
				return CodeConvert(sChgCode, "EUC-KR", "UTF-8");
			}
			if (tSrcEncode == KO_EUCKR) return sSrc;
			return sChgCode;
		}
		else if ( eEncode == KO_UTF8 )
		{
			if (tSrcEncode == KO_EUCKR && e_nCurLang == KO_EUCKR )
				return CodeConvert(sChgCode, "UTF-8", "EUC-KR");
			if (tSrcEncode == KO_UTF8) return sSrc;
			return sChgCode;
		}
		return sSrc;
	}
Пример #2
0
	/// @brief	영문과 한글을 자동으로 보여주기 위한 함수.
	/// @param	sEnglish	영문
	/// @param	sKorean		영문에 대응한 한글 내용
	/// @return	언어 설정에 따라 영어 아니면 한글 메시지를 반환한다.
	string ChgEngKor(const string& sEnglish, const string& sKorean)
	{
		#ifndef HAVE_ICONV
			return sEnglish;
		#endif
	
		if (e_nCurLang == KO_EUCKR)
			return CodeConvert(sKorean, "EUC-KR", "UTF-8");
		else if (e_nCurLang == KO_UTF8)
			return sKorean;
		else
			return sEnglish;
	}
Пример #3
0
void CAppCtrl::AcceptReq(CBuffer& stBuff, int iLen)
{
	if(m_bExit) //停止了服務,這不處理客戶端信息
	{
		return;
	}

	//把數據解析出來
	CNetHead& stHead = *(CNetHead*)stBuff.GetUsedBuf();
	if(iLen != (int)sizeof(CNetHead) + stHead.m_iDataLength) //長度不一致
	{
		SL_WARNING("code length invalid. %d != %d + %d",iLen, sizeof(CNetHead), stHead.m_iDataLength);
		return;
	}
	
	CCodeStream s;
	CMsgHead stMsgHead;
	
	//斷線判斷
	if((stHead.m_LiveFlag && 0xFF) != 0)
	{
		SL_TRACE("user(%u) offline, liveflag = %x, handle = %d!",stHead.m_Act1, stHead.m_LiveFlag, stHead.m_Handle);
		SetOfflining(stHead);
		return;
	}

	int iRet = s.Attach(stBuff.GetUsedBuf() + sizeof(CNetHead), stHead.m_iDataLength);
	if(iRet)
	{
		SL_TRACE("Attach failed!");
		return;
	}

	s.InitConvert();
	iRet = CodeConvert(s, stMsgHead, NULL, bin_decode());
	if(iRet)
	{
		SL_TRACE("CodeConvert iRet = %d!", iRet);
		return;
	}

	//檢查消息合法性
	bool bIsAdmin = IsFromAdminPort(stHead);
	if(!bIsAdmin && IsAdminMsg(stMsgHead.m_shMsgID))
	{
		//如果是從非管理端口來的管理消息則直接忽略掉
		SL_WARNING("user (%llu) send admin msg(%u) but no admin", static_cast<sl::uid_t>(stHead.m_Act1), stMsgHead.m_shMsgID);
		return;
	}
	
	//慢處理的檢測
	SL_TRACE("get commend from user(%llu), cmd id = (%d)", stHead.m_Act1, stMsgHead.m_shMsgID);
	sl::uint iNowTime = static_cast<sl::uint>(time(0));
	if(iNowTime - stHead.m_LastTime >= 2)
	{
		m_Stat.Put(app_stat_waittimeout);
		SL_WARNING("user(%llu) cmd(%d) act(%d) waited more than 2 sec!", stHead.m_Act1, 
			stMsgHead.m_shMsgID, stMsgHead.m_llMsgAct);
	}

	//創建并執行異步命令
	CAsyncCmdInf* pstCmd = SL_CMDFACTORY->CreateCmd(stMsgHead.m_shMsgID);
	if(pstCmd == NULL)
	{
		//創建命令失敗
		SL_WARNING("create cmd(%d) fails", stMsgHead.m_shMsgID);
		return;
	}
	CCmdDoParam stPara(stHead, stMsgHead, s, bIsAdmin);
	pstCmd->Do((void*)&stPara);
}
Пример #4
0
	/// @brief	현재 사용하는 코드로 바꿔준다. US 면 utf-8로 바꾼다.
	/// @param	sSrc	문자열
	/// @param	eEncode	리턴 현재 인코드
	/// @return	 바꾼 문자열
	string	isKorCode(const string& sSrc, ENCODING* eEncode)
	{
		string	sCodeConvertStr;
		string	strData1, strData2;
		if (eEncode != NULL) *eEncode = US;
		if (sSrc == "") return "";
		bool 	bUS = true;
		
		#ifndef 	__CYGWIN_C__
		
		wstring	wstr = strtowstr(sSrc);
		if (wstr.size() != 0)
		{
			for (int n = 0; n < (int)wstr.size(); n++)
			{
				if (wstr[n] > 0x80) {
					bUS = false;
					break;
				}
			}
			if (bUS == true) {
				if (eEncode != NULL) *eEncode = US;
				return sSrc;
			}
		}
		
		#else
		
		unsigned char cData;

		if (sSrc.size() != 0)
		{
			for (int n = 0; n < (int)sSrc.size(); n++)
			{
				cData = sSrc[n];
				if (cData > 0x0080) {
					bUS = false;
					break;
				}
			}
			if (bUS == true) {
				if (eEncode != NULL) *eEncode = US;
				return sSrc;
			}
		}
		#endif

		if (e_nCurLang == KO_EUCKR)
		{
			#ifndef HAVE_ICONV
				sCodeConvertStr = sSrc;
				if (eEncode != NULL) *eEncode = KO_EUCKR;
				return sCodeConvertStr;
			#endif

			// EUCKR 로 본다.
			strData1 = CodeConvert(sSrc, "UTF-8", "EUC-KR"); 			// UTF8 로 바꿔봄.	
	
			if ( strData1 == "" )
			{
				// 현재 : UTF8
				strData1 = CodeConvert(sSrc, "EUC-KR", "UTF-8"); 		// EUCKR 로 바꿔봄.
				strData2 = CodeConvert(strData1, "UTF-8", "EUC-KR");	// UTF8 로 바꿔봄.
				
				if ( strData1 != "" && sSrc == strData2 )
				{
					if (eEncode != NULL) *eEncode = KO_UTF8;
					return strData1;
				}
			}
			else
			{
				strData2 = CodeConvert(strData1, "EUC-KR", "UTF-8"); 		// EUCKR 로 바꿔봄.	
				if ( sSrc == strData2 )
				{
					if (eEncode != NULL) *eEncode = KO_EUCKR;
					return sSrc; // UTF8
				}
			}	
		}
		else // 나머지는 utf-8로 바꿈.
		{
			#ifndef HAVE_ICONV
				sCodeConvertStr = sSrc;
				if (eEncode != NULL) *eEncode = KO_UTF8;
				return sCodeConvertStr;
			#endif
			
			// 현재 : UTF8
			strData1 = CodeConvert(sSrc, "EUC-KR", "UTF-8"); 			// EUCKR 로 바꿔봄.
			
			if ( strData1 == "" )
			{
				// EUCKR 로 본다.
				strData1 = CodeConvert(sSrc, "UTF-8", "EUC-KR"); 		// UTF8 로 바꿔봄.
				strData2 = CodeConvert(strData1, "EUC-KR", "UTF-8"); 	// EUCKR 로 바꿔봄.
				
				if ( strData1 != "" && sSrc == strData2 )
				{
					if (eEncode != NULL) *eEncode = KO_EUCKR;
					return strData1;
				}
			}
			else
			{	
				strData2 = CodeConvert(strData1, "UTF-8", "EUC-KR"); 		// UTF8 로 바꿔봄.
				
				if ( sSrc == strData2 )
				{
					if (eEncode != NULL) *eEncode = KO_UTF8;
					return sSrc; // UTF8
				}
			}	
		}
		return sSrc;
	}