BOOL CHwSMTP::GetResponse ( LPCTSTR lpszVerifyCode, int *pnCode/*=NULL*/) { if ( !lpszVerifyCode || lstrlen(lpszVerifyCode) < 1 ) return FALSE; char szRecvBuf[1024] = {0}; int nRet = 0; char szStatusCode[4] = {0}; nRet = m_SendSock.Receive ( szRecvBuf, sizeof(szRecvBuf) ); TRACE ( _T("Received : %s\r\n"), szRecvBuf ); if ( nRet <= 0 ) { m_csLastError.Format ( _T("Receive TCP data failed") ); return FALSE; } // TRACE ( _T("收到服务器回应:%s\n"), szRecvBuf ); memcpy ( szStatusCode, szRecvBuf, 3 ); if ( pnCode ) (*pnCode) = atoi ( szStatusCode ); if ( strcmp ( szStatusCode, CMultiByteString(lpszVerifyCode).GetBuffer() ) != 0 ) { m_csLastError.Format ( _T("Received invalid response : %s"), GetCompatibleString(szRecvBuf,FALSE) ); return FALSE; } return TRUE; }
std::string LFGQueue::DumpCompatibleInfo(bool full /* = false */) const { std::ostringstream o; o << "Compatible Map size: " << CompatibleMapStore.size() << "\n"; if (full) for (LfgCompatibleContainer::const_iterator itr = CompatibleMapStore.begin(); itr != CompatibleMapStore.end(); ++itr) o << "(" << itr->first << "): " << GetCompatibleString(itr->second.compatibility) << "\n"; return o.str(); }
BOOL CHwSMTP::SendEmail() { BOOL bRet = TRUE; char szLocalHostName[64] = {0}; gethostname ( (char*)szLocalHostName, sizeof(szLocalHostName) ); // hello,握手 CString str; str.Format(_T("HELO %s\r\n"), GetCompatibleString(szLocalHostName,FALSE)); if ( !Send ( str )) { return FALSE; } if ( !GetResponse ( _T("250") ) ) { return FALSE; } // 身份验证 if ( m_bMustAuth && !auth() ) { return FALSE; } // 发送邮件头 if ( !SendHead() ) { return FALSE; } // 发送邮件主题 if ( !SendSubject() ) { return FALSE; } // 发送邮件正文 if ( !SendBody() ) { return FALSE; } // 发送附件 if ( !SendAttach() ) { return FALSE; } // 结束邮件正文 if ( !Send ( CString(_T(".\r\n") ) ) ) return FALSE; if ( !GetResponse ( _T("250") ) ) return FALSE; // 退出发送 if ( HANDLE_IS_VALID(m_SendSock.m_hSocket) ) Send ( CString(_T("QUIT\r\n")) ); m_bConnected = FALSE; return bRet; }
BOOL CHwSMTP::auth() { int nResponseCode = 0; if ( !Send ( CString(_T("auth login\r\n")) ) ) return FALSE; if ( !GetResponse ( _T("334"), &nResponseCode ) ) return FALSE; if ( nResponseCode != 334 ) // 不需要验证用户名和密码 return TRUE; CBase64 Base64Encode; CMultiByteString cbsUserName ( m_csUserName ), cbsPasswd ( m_csPasswd ); CString csBase64_UserName = GetCompatibleString ( Base64Encode.Encode ( cbsUserName.GetBuffer(), cbsUserName.GetLength() ).GetBuffer(0), FALSE ); CString csBase64_Passwd = GetCompatibleString ( Base64Encode.Encode ( cbsPasswd.GetBuffer(), cbsPasswd.GetLength() ).GetBuffer(0), FALSE ); CString str; str.Format( _T("%s\r\n"), csBase64_UserName ); if ( !Send ( str ) ) return FALSE; if ( !GetResponse ( _T("334") ) ) { m_csLastError.Format ( _T("Authentication UserName failed") ); return FALSE; } str.Format(_T("%s\r\n"), csBase64_Passwd ); if ( !Send ( str ) ) return FALSE; if ( !GetResponse ( _T("235") ) ) { m_csLastError.Format ( _T("Authentication Password failed") ); return FALSE; } return TRUE; }
/** Checks que main queue to try to form a Lfg group. Returns first match found (if any) @param[in] check List of guids trying to match with other groups @param[in] all List of all other guids in main queue to match against @return LfgCompatibility type of compatibility between groups */ LfgCompatibility LFGQueue::FindNewGroups(LfgGuidList& check, LfgGuidList& all) { std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles == LFG_COMPATIBLES_BAD_STATES && sLFGMgr->AllQueued(check)) { TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", strGuids.c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } if (compatibles != LFG_COMPATIBLES_WITH_LESS_PLAYERS) return compatibles; // Try to match with queued groups while (!all.empty()) { check.push_back(all.front()); all.pop_front(); LfgCompatibility subcompatibility = FindNewGroups(check, all); if (subcompatibility == LFG_COMPATIBLES_MATCH) return LFG_COMPATIBLES_MATCH; check.pop_back(); } return compatibles; }
/** Checks que main queue to try to form a Lfg group. Returns first match found (if any) @param[in] check List of guids trying to match with other groups @param[in] all List of all other guids in main queue to match against @return LfgCompatibility type of compatibility between groups */ LfgCompatibility LfgQueue::FindNewGroups(LfgGuidList& check, LfgGuidList& all) { std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); sLog->outDebug(LOG_FILTER_LFG, "LFGQueue::FindNewGroup: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING || compatibles == LFG_COMPATIBLES_BAD_STATES) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles != LFG_COMPATIBLES_WITH_LESS_PLAYERS) return compatibles; // Try to match with queued groups while (!all.empty()) { check.push_back(all.front()); all.pop_front(); LfgCompatibility subcompatibility = FindNewGroups(check, all); if (subcompatibility == LFG_COMPATIBLES_MATCH) return LFG_COMPATIBLES_MATCH; check.pop_back(); } return compatibles; }