\r
int CPatch::Send(CString &pathfile,CString &TO,CString &CC,bool bAttachment)\r
{\r
- CSmtp mail;\r
- \r
- if(mail.GetLastError() != CSMTP_NO_ERROR )\r
- {\r
- return -1;\r
- }\r
- \r
+ CHwSMTP mail;\r
if(this->Parser(pathfile) )\r
return -1;\r
\r
- int at=TO.Find(_T('@'));\r
- int start =0;\r
- TO = TO.Tokenize(_T(";"),start);\r
-\r
- CString server=TO.Mid(at+1);\r
-\r
- PDNS_RECORD pDnsRecord; \r
-\r
- DnsQuery(server, DNS_TYPE_MX,DNS_QUERY_BYPASS_CACHE,\r
- NULL, //Contains DNS server IP address.\r
- &pDnsRecord, //Resource record that contains the response.\r
- NULL); \r
-\r
- CString name,address;\r
- GetNameAddress(this->m_Author,name,address);\r
-\r
-\r
- CStringArray attchments,CCArray;\r
+ CStringArray attachments,CCArray;\r
if(bAttachment)\r
{\r
- attchments.Add(pathfile);\r
+ attachments.Add(pathfile);\r
}\r
\r
- ConvertToArray(CC,CCArray);\r
+ //ConvertToArray(CC,CCArray);\r
\r
- SendEmail(FALSE,pDnsRecord->Data.MX.pNameExchange,\r
- NULL,NULL,FALSE,address,TO,this->m_Author,TO,this->m_Subject,m_strBody,0,&attchments,&CCArray);\r
- \r
- DnsRecordListFree(pDnsRecord,DnsFreeRecordList);\r
+ CString sender;\r
+ sender.Format(_T("%s <%s> "),g_Git.GetUserName(),g_Git.GetUserEmail());\r
\r
+ if(mail.SendSpeedEmail(this->m_Author,TO,this->m_Subject,this->m_strBody,NULL,&attachments,CC,25,sender))\r
+ return 0;\r
+ else\r
+ {\r
+ this->m_LastError=mail.GetLastErrorText();\r
+ return -1;\r
+ }\r
#if 0\r
CRegString server(REG_SMTP_SERVER);\r
CRegDWORD port(REG_SMTP_PORT,25);\r
\r
g_Git.StringAppend(&m_strBody,&m_Body[0],CP_ACP);\r
\r
-\r
+ return 0;\r
}\r
\r
void CPatch::GetNameAddress(CString &in, CString &name,CString &address)\r
else\r
address=in;\r
}\r
-\r
+#if 0\r
void CPatch::AddRecipient(CSmtp &mail, CString &tolist, bool isCC)\r
{\r
int pos=0;\r
mail.AddRecipient(CUnicodeUtils::GetUTF8(one));\r
}\r
}\r
-}
\ No newline at end of file
+}\r
+#endif
\ No newline at end of file
#pragma once\r
\r
-#include "csmtp.h"\r
+#include "hwsmtp.h"\r
\r
#define REG_SMTP_SERVER _T("Software\\TortoiseGit\\EMAIL\\SMTPSERVER")\r
#define REG_SMTP_PORT _T("Software\\TortoiseGit\\EMAIL\\PORT")\r
class CPatch\r
{\r
protected:\r
- void AddRecipient(CSmtp &mail, CString &tolist, bool isCC= FALSE);\r
+// void AddRecipient(CSmtp &mail, CString &tolist, bool isCC= FALSE);\r
void GetNameAddress(CString &in, CString &name,CString &address);\r
public:\r
CPatch();\r
int Parser(CString &pathfile);\r
int Send(CString &pathfile,CString &To, CString &CC,bool bAttachment);\r
\r
+ CString m_LastError;\r
CString m_Author;\r
CString m_Date;\r
CString m_Subject;\r
}\r
\r
\r
-BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t action\r
+BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t action,\r
+ int status ,\r
+ CString *strErr \r
/*\r
svn_node_kind_t kind, const CString& mime_type, \r
svn_wc_notify_state_t content_state, \r
data->path = path;\r
data->action = action;\r
data->sPathColumnText=path.GetGitPathString();\r
+ data->bAuxItem = false;\r
#if 0\r
data->kind = kind;\r
data->mime_type = mime_type;\r
data->color = m_Colors.GetColor(CColors::Added);\r
// }\r
break;\r
- case git_wc_notify_sendmail:\r
- data->sActionColumnText.LoadString(IDS_SVNACTION_SENDMAIL);\r
+ case git_wc_notify_sendmail_start:\r
+ data->bAuxItem = true;\r
+ data->sActionColumnText.LoadString(IDS_SVNACTION_SENDMAIL_START);\r
data->color = m_Colors.GetColor(CColors::Modified);\r
break;\r
\r
+ case git_wc_notify_sendmail_error:\r
+ data->bAuxItem = true;\r
+ data->sActionColumnText.LoadString(IDS_SVNACTION_SENDMAIL_ERROR);\r
+ if(strErr)\r
+ data->sPathColumnText = *strErr;\r
+ else\r
+ data->sPathColumnText.Empty();\r
+ data->color = m_Colors.GetColor(CColors::Modified);\r
+ break;\r
+\r
+ case git_wc_notify_sendmail_done:\r
+ \r
+ data->sActionColumnText.LoadString(IDS_SVNACTION_SENDMAIL_DONE);\r
+ data->sPathColumnText.Empty();\r
+ data->color = m_Colors.GetColor(CColors::Modified);\r
+ break;\r
+\r
+\r
case git_wc_notify_resolved:\r
data->sActionColumnText.LoadString(IDS_SVNACTION_RESOLVE);\r
break;\r
{\r
m_arData.push_back(data);\r
AddItemToList();\r
- if (/*(!data->bAuxItem)&&*/(m_itemCount > 0))\r
+ if ((!data->bAuxItem) && (m_itemCount > 0))\r
{\r
m_itemCount--;\r
\r
for(int i=0;i<m_targetPathList.GetCount();i++)\r
{\r
CPatch patch;\r
- patch.Send((CString&)m_targetPathList[i].GetWinPathString(),this->m_SendMailTO,\r
- this->m_SendMailCC,this->m_SendMailFlags&SENDMAIL_ATTACHMENT);\r
- Notify(m_targetPathList[i],git_wc_notify_sendmail);\r
+ Notify(m_targetPathList[i],git_wc_notify_sendmail_start);\r
+ int ret=patch.Send((CString&)m_targetPathList[i].GetWinPathString(),this->m_SendMailTO,\r
+ this->m_SendMailCC,this->m_SendMailFlags&SENDMAIL_ATTACHMENT);\r
+ if(ret)\r
+ {\r
+ Notify(m_targetPathList[i],git_wc_notify_sendmail_error,ret,&patch.m_LastError);\r
+ }\r
+ Notify(m_targetPathList[i],git_wc_notify_sendmail_done,ret);\r
}\r
return true;\r
}
\ No newline at end of file
typedef enum\r
{\r
git_wc_notify_add,\r
- git_wc_notify_sendmail,\r
+ git_wc_notify_sendmail_start,\r
+ git_wc_notify_sendmail_error,\r
+ git_wc_notify_sendmail_done,\r
git_wc_notify_resolved\r
\r
}git_wc_notify_action_t;\r
protected:\r
\r
//Need update in the future implement the virtual methods from Git base class\r
- virtual BOOL Notify(const CTGitPath& path, git_wc_notify_action_t action\r
+ virtual BOOL Notify(const CTGitPath& path, \r
+ git_wc_notify_action_t action,\r
+ int status = 0,\r
+ CString *strErr =NULL\r
/*\r
git_node_kind_t kind, const CString& mime_type, \r
git_wc_notify_state_t content_state, \r
#include "HwSMTP.h"\r
#include "CBase64.h"\r
#include "SpeedPostEmail.h"\r
-\r
+#include "Windns.h"\r
#include <Afxmt.h>\r
\r
#ifdef _DEBUG\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
+ LPCTSTR lpszFromName,\r
LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet,\r
CStringArray *pStrAryAttach,\r
- CStringArray *pStrAryCC,\r
- UINT nSmtpSrvPort\r
+ LPCTSTR pStrAryCC,\r
+ UINT nSmtpSrvPort,\r
+ LPCTSTR pSender,\r
+ LPCTSTR pToList\r
)\r
{\r
m_csSmtpSrvHost = GET_SAFE_STRING(lpszSmtpSrvHost);\r
m_bMustAuth = bMustAuth;\r
m_csAddrFrom = GET_SAFE_STRING(lpszAddrFrom);\r
m_csAddrTo = GET_SAFE_STRING(lpszAddrTo);\r
- m_csSenderName = GET_SAFE_STRING(lpszSenderName);\r
+ m_csFromName = GET_SAFE_STRING(lpszFromName);\r
m_csReceiverName = GET_SAFE_STRING(lpszReceiverName);\r
m_csSubject = GET_SAFE_STRING(lpszSubject);\r
m_csBody = GET_SAFE_STRING(lpszBody);\r
m_csCharSet = GET_SAFE_STRING(lpszCharSet);\r
+ m_StrCC = GET_SAFE_STRING(pStrAryCC);\r
+ m_csSender = GET_SAFE_STRING(pSender);\r
+ m_csToList = GET_SAFE_STRING(pToList);\r
+\r
if ( pStrAryAttach )\r
m_StrAryAttach.Append ( *pStrAryAttach );\r
- if ( pStrAryCC )\r
- m_StrAryCC.Append ( *pStrAryCC );\r
+ \r
m_nSmtpSrvPort = nSmtpSrvPort;\r
m_hThread = NULL;\r
}\r
BOOL m_bMustAuth;\r
CString m_csAddrFrom;\r
CString m_csAddrTo;\r
- CString m_csSenderName;\r
+ CString m_csFromName;\r
CString m_csReceiverName;\r
CString m_csSubject;\r
CString m_csBody;\r
CString m_csCharSet;\r
CStringArray m_StrAryAttach;\r
- CStringArray m_StrAryCC;\r
+ CString m_StrCC;\r
UINT m_nSmtpSrvPort;\r
+ CString m_csSender;\r
+ CString m_csToList;\r
\r
HANDLE m_hThread;\r
};\r
{\r
}\r
\r
+void CHwSMTP::GetNameAddress(CString &in, CString &name,CString &address)\r
+{\r
+ int start,end;\r
+ start=in.Find(_T('<'));\r
+ end=in.Find(_T('>'));\r
+\r
+ if(start >=0 && end >=0)\r
+ {\r
+ name=in.Left(start);\r
+ address=in.Mid(start+1,end-start-1);\r
+ }\r
+ else\r
+ address=in;\r
+}\r
+\r
+CString CHwSMTP::GetServerAddress(CString &email)\r
+{\r
+ CString str;\r
+ int start,end;\r
+ \r
+ start = email.Find(_T("<"));\r
+ end = email.Find(_T(">"));\r
+\r
+ if(start>=0 && end >=0)\r
+ {\r
+ str=email.Mid(start+1,end-start-1);\r
+ }\r
+ else\r
+ {\r
+ str=email;\r
+ }\r
+\r
+ start = str.Find(_T('@'));\r
+ return str.Mid(start+1);\r
+\r
+}\r
+\r
+BOOL CHwSMTP::SendSpeedEmail\r
+ (\r
+ LPCTSTR lpszAddrFrom,\r
+ LPCTSTR lpszAddrTo,\r
+ LPCTSTR lpszSubject,\r
+ LPCTSTR lpszBody,\r
+ LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
+ CStringArray *pStrAryAttach,\r
+ LPCTSTR pStrAryCC,\r
+ UINT nSmtpSrvPort,\r
+ LPCTSTR pSend \r
+ )\r
+{\r
+\r
+ BOOL ret=true;\r
+ CString To;\r
+ To += GET_SAFE_STRING(lpszAddrTo);\r
+ To += _T(";");\r
+ To += GET_SAFE_STRING(pStrAryCC);\r
+\r
+ std::map<CString,std::vector<CString>> Address;\r
+\r
+ int start = 0;\r
+ while( start >= 0 )\r
+ {\r
+ CString one= To.Tokenize(_T(";"),start);\r
+ one=one.Trim();\r
+ if(one.IsEmpty())\r
+ continue;\r
+ \r
+ CString addr;\r
+ addr = GetServerAddress(one);\r
+ if(addr.IsEmpty())\r
+ continue;\r
+ \r
+ \r
+ Address[addr].push_back(one); \r
+\r
+ }\r
+\r
+ std::map<CString,std::vector<CString>>::iterator itr1 = Address.begin();\r
+ for( ; itr1 != Address.end(); ++itr1 )\r
+ {\r
+ PDNS_RECORD pDnsRecord; \r
+\r
+ DnsQuery(itr1->first ,\r
+ DNS_TYPE_MX,DNS_QUERY_BYPASS_CACHE,\r
+ NULL, //Contains DNS server IP address.\r
+ &pDnsRecord, //Resource record that contains the response.\r
+ NULL\r
+ ); \r
+ \r
+ CString to;\r
+ to.Empty();\r
+ for(int i=0;i<itr1->second.size();i++)\r
+ {\r
+ to+=itr1->second[i];\r
+ to+=_T(";");\r
+ }\r
+ if(to.IsEmpty())\r
+ continue;\r
+\r
+ if(!SendEmail(pDnsRecord->Data.MX.pNameExchange,NULL,NULL,false,\r
+ lpszAddrFrom,to,lpszSubject,lpszBody,lpszCharSet,pStrAryAttach,pStrAryCC,\r
+ 25,pSend,lpszAddrTo))\r
+ ret = false;\r
+\r
+ //SendEmail(itr1.first,NULL,NULL,false,lpszAddrFrom,,lpszFromname);\r
+ DnsRecordListFree(pDnsRecord,DnsFreeRecordList);\r
+ } \r
+\r
+ return ret;\r
+}\r
BOOL CHwSMTP::SendEmail (\r
LPCTSTR lpszSmtpSrvHost,\r
LPCTSTR lpszUserName,\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
- LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
CStringArray *pStrAryAttach/*=NULL*/,\r
- CStringArray *pStrAryCC/*=NULL*/,\r
- UINT nSmtpSrvPort/*=25*/\r
+ LPCTSTR pStrAryCC/*=NULL*/,\r
+ UINT nSmtpSrvPort,/*=25*/\r
+ LPCTSTR pSender,\r
+ LPCTSTR pToList\r
)\r
{\r
- TRACE ( _T("·¢ËÍÓʼþ£º%s, %s, %s\n"), lpszAddrTo, lpszReceiverName, lpszBody );\r
+ TRACE ( _T("·¢ËÍÓʼþ£º%s, %s\n"), lpszAddrTo, lpszBody );\r
m_StrAryAttach.RemoveAll();\r
- m_StrAryCC.RemoveAll();\r
+\r
+ m_StrCC += GET_SAFE_STRING(pStrAryCC);\r
+\r
m_csSmtpSrvHost = GET_SAFE_STRING ( lpszSmtpSrvHost );\r
if ( m_csSmtpSrvHost.GetLength() <= 0 )\r
{\r
\r
m_csAddrFrom = GET_SAFE_STRING ( lpszAddrFrom );\r
m_csAddrTo = GET_SAFE_STRING ( lpszAddrTo );\r
- m_csSenderName = GET_SAFE_STRING ( lpszSenderName );\r
- m_csReceiverName = GET_SAFE_STRING ( lpszReceiverName );\r
+// m_csFromName = GET_SAFE_STRING ( lpszFromName );\r
+// m_csReceiverName = GET_SAFE_STRING ( lpszReceiverName );\r
m_csSubject = GET_SAFE_STRING ( lpszSubject );\r
m_csBody = GET_SAFE_STRING ( lpszBody );\r
+ \r
+ this->m_csSender = GET_SAFE_STRING(pSender);\r
+ this->m_csToList = GET_SAFE_STRING(pToList);\r
+\r
m_nSmtpSrvPort = nSmtpSrvPort;\r
+\r
if ( lpszCharSet && lstrlen(lpszCharSet) > 0 )\r
m_csCharSet.Format ( _T("\r\n\tcharset=\"%s\"\r\n"), lpszCharSet );\r
\r
if (\r
- m_csAddrFrom.GetLength() <= 0 || m_csAddrTo.GetLength() <= 0 ||\r
- m_csSenderName.GetLength() <= 0 || m_csReceiverName.GetLength() <= 0 ||\r
- m_csSubject.GetLength() <= 0 || m_csBody.GetLength() <= 0\r
+ m_csAddrFrom.GetLength() <= 0 || m_csAddrTo.GetLength() <= 0 \r
)\r
{\r
m_csLastError.Format ( _T("Parameter Error!") );\r
if ( m_StrAryAttach.GetSize() < 1 )\r
m_csMIMEContentType = _T( "text/plain");\r
\r
- if ( pStrAryCC )\r
- {\r
- m_StrAryCC.Append ( *pStrAryCC );\r
- } \r
-\r
// ´´½¨Socket\r
+ m_SendSock.Close();\r
if ( !m_SendSock.Create () )\r
{\r
m_csLastError.Format ( _T("Create socket failed!") );\r
BOOL CHwSMTP::SendHead()\r
{\r
CString str;\r
- str.Format( _T("MAIL From: <%s>\r\n"), m_csAddrFrom );\r
+ CString name,addr;\r
+ GetNameAddress(m_csAddrFrom,name,addr);\r
+\r
+ str.Format( _T("MAIL From: <%s>\r\n"), addr );\r
if ( !Send ( str ) ) return FALSE;\r
\r
if ( !GetResponse ( _T("250") ) ) return FALSE;\r
\r
- str.Format(_T("RCPT TO: <%s>\r\n"), m_csAddrTo );\r
- if ( !Send ( str ) ) return FALSE;\r
- if ( !GetResponse ( _T("250") ) ) return FALSE;\r
+ int start=0;\r
+ while(start>=0)\r
+ {\r
+ CString one=m_csAddrTo.Tokenize(_T(";"),start);\r
+ one=one.Trim();\r
+ if(one.IsEmpty())\r
+ continue;\r
\r
+ \r
+ GetNameAddress(one,name,addr);\r
+ \r
+ str.Format(_T("RCPT TO: <%s>\r\n"), addr );\r
+ if ( !Send ( str ) ) return FALSE;\r
+ if ( !GetResponse ( _T("250") ) ) return FALSE;\r
+ }\r
+\r
+#if 0\r
for ( int i=0; i<m_StrAryCC.GetSize(); i++ )\r
{\r
str.Format(_T("RCPT TO: <%s>\r\n"), m_StrAryCC.GetAt(i) );\r
if ( !Send ( str ) ) return FALSE;\r
if ( !GetResponse ( _T("250") ) ) return FALSE;\r
}\r
+#endif\r
+\r
if ( !Send ( CString(_T("DATA\r\n") ) ) ) return FALSE;\r
if ( !GetResponse ( CString(_T("354") )) ) return FALSE; \r
\r
csSubject += GetCompatibleString(FormatDateTime (tNow, _T("%a, %d %b %y %H:%M:%S %Z")).GetBuffer(0),FALSE);\r
}\r
csSubject += _T("\r\n");\r
- csSubject += FormatString ( _T("From: %s\r\nTo: %s\r\n"), m_csSenderName, m_csReceiverName );\r
+ csSubject += FormatString ( _T("From: %s\r\n"), this->m_csAddrFrom);\r
+ \r
+ csSubject += FormatString ( _T("CC: %s\r\n"), this->m_StrCC);\r
+ \r
+ if(m_csSender.IsEmpty())\r
+ m_csSender = this->m_csAddrFrom;\r
+ \r
+ csSubject += FormatString ( _T("Sender: %s\r\n"), this->m_csSender);\r
+ \r
+ if(this->m_csToList.IsEmpty())\r
+ m_csToList = m_csReceiverName;\r
+ \r
+ csSubject += FormatString ( _T("To: %s\r\n"), this->m_csToList);\r
+\r
+ CString m_csToList;\r
+\r
csSubject += FormatString ( _T("Subject: %s\r\n"), m_csSubject );\r
csSubject += FormatString ( _T("X-Mailer: TortoiseGit\r\nMIME-Version: 1.0\r\nContent-Type: %s; %s boundary=%s\r\n\r\n") , \r
m_csMIMEContentType, m_csCharSet, m_csPartBoundary );\r
pEMailObject->m_bMustAuth,\r
pEMailObject->m_csAddrFrom,\r
pEMailObject->m_csAddrTo,\r
- pEMailObject->m_csSenderName,\r
- pEMailObject->m_csReceiverName,\r
pEMailObject->m_csSubject,\r
pEMailObject->m_csBody,\r
pEMailObject->m_csCharSet,\r
&pEMailObject->m_StrAryAttach,\r
- &pEMailObject->m_StrAryCC,\r
- pEMailObject->m_nSmtpSrvPort\r
+ pEMailObject->m_StrCC,\r
+ pEMailObject->m_nSmtpSrvPort,\r
+ pEMailObject->m_csSender\r
);\r
if ( !bRet)\r
{\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
+ LPCTSTR lpszFromName,\r
LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet/*=NULL*/,\r
CStringArray *pStrAryAttach/*=NULL*/,\r
- CStringArray *pStrAryCC/*=NULL*/,\r
- UINT nSmtpSrvPort/*=25*/\r
+ LPCTSTR pStrAryCC/*=NULL*/,\r
+ UINT nSmtpSrvPort/*=25*/,\r
+ LPCTSTR lpszSender,\r
+ LPCTSTR lpszToList\r
)\r
{\r
if ( !lpszSmtpSrvHost || lstrlen(lpszSmtpSrvHost) < 1 ||\r
bMustAuth,\r
lpszAddrFrom,\r
lpszAddrTo,\r
- lpszSenderName,\r
+ lpszFromName,\r
lpszReceiverName,\r
lpszSubject,\r
lpszBody,\r
lpszCharSet,\r
pStrAryAttach,\r
pStrAryCC,\r
- nSmtpSrvPort\r
+ nSmtpSrvPort,\r
+ lpszSender,\r
+ lpszToList\r
);\r
if ( !pEMailObject ) return FALSE;\r
\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
- LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
CStringArray *pStrAryAttach=NULL,\r
- CStringArray *pStrAryCC=NULL,\r
- UINT nSmtpSrvPort=25\r
+ LPCTSTR pStrAryCC=NULL,\r
+ UINT nSmtpSrvPort=25,\r
+ LPCTSTR pSend = NULL,\r
+ LPCTSTR pToList = NULL\r
+ );\r
+ BOOL SendSpeedEmail\r
+ (\r
+ LPCTSTR lpszAddrFrom,\r
+ LPCTSTR lpszAddrTo,\r
+ LPCTSTR lpszSubject,\r
+ LPCTSTR lpszBody,\r
+ LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
+ CStringArray *pStrAryAttach=NULL,\r
+ LPCTSTR pStrAryCC=NULL,\r
+ UINT nSmtpSrvPort=25,\r
+ LPCTSTR pSend = NULL\r
);\r
CHwSMTP();\r
virtual ~CHwSMTP();\r
\r
+protected:\r
+ CString GetServerAddress(CString &email);\r
+ void GetNameAddress(CString &in, CString &name,CString &address);\r
+\r
private:\r
BOOL SendSubject();\r
- CStringArray m_StrAryCC;\r
+ CString m_StrCC;\r
BOOL SendHead();\r
BOOL auth();\r
BOOL SendEmail();\r
CString m_csPasswd;\r
CString m_csAddrFrom;\r
CString m_csAddrTo;\r
- CString m_csSenderName;\r
+ CString m_csFromName;\r
CString m_csReceiverName;\r
CString m_csSubject;\r
CString m_csBody;\r
+ CString m_csSender;\r
+ CString m_csToList;\r
+\r
private:\r
BOOL m_bMustAuth;\r
UINT m_nSmtpSrvPort;\r
BOOL bMustAuth, // SMTP ·þÎñÆ÷ÐèÒªÉí·ÝÑéÖ¤\r
LPCTSTR lpszAddrFrom, // ·¢ËÍÕß E-Mail µØÖ·\r
LPCTSTR lpszAddrTo, // ½ÓÊÕÕßµÄ E-Mail µØÖ·\r
- LPCTSTR lpszSenderName, // ·¢ËÍÕßµÄÃû×Ö£¬ÀýÈ磺лºìΰ\r
+ LPCTSTR lpszFromName, // ·¢ËÍÕßµÄÃû×Ö£¬ÀýÈ磺лºìΰ\r
LPCTSTR lpszReceiverName, // ½ÓÊÕÕßµÄÃû×Ö£¬ÀýÈ磺ÕÅ·É\r
LPCTSTR lpszSubject, // ÓʼþÖ÷Ìâ\r
LPCTSTR lpszBody, // ÓʼþÄÚÈÝ\r
LPCTSTR lpszCharSet=NULL, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
CStringArray *pStrAryAttach=NULL, // ¸½¼þÎļþ·¾¶£¬¿ÉÒÔ¶à¸ö\r
- CStringArray *pStrAryCC=NULL, // ³ËÍ E-Mail µØÖ·£¬¿ÉÒÔ¶à¸ö\r
- UINT nSmtpSrvPort=25 // SMTP ·þÎñÆ÷µÄ TCP ¶Ë¿ÚºÅ\r
+ LPCTSTR pStrAryCC=NULL, // ³ËÍ E-Mail µØÖ·£¬¿ÉÒÔ¶à¸ö\r
+ UINT nSmtpSrvPort=25, // SMTP ·þÎñÆ÷µÄ TCP ¶Ë¿ÚºÅ\r
+ LPCTSTR pSend = NULL,\r
+ LPCTSTR ToList = NULL\r
);\r
+\r
+\r
void EndOfSMTP ();\r
\r
#endif // !defined(AFX_HwSMTP_H__633A52B7_1CBE_41D7_BDA3_188D98D692AF__INCLUDED_)\r
+++ /dev/null
-// OneNetAdapterInfo.cpp: implementation of the COneNetAdapterInfo class.\r
-//\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-#include "stdafx.h"\r
-#include "SpeedPostEmail.h"\r
-#include "NetAdapterInfo.h"\r
-#include "Iphlpapi.h"\r
-#include "IpTypes.h"\r
-\r
-#ifdef _DEBUG\r
-#undef THIS_FILE\r
-static char THIS_FILE[]=__FILE__;\r
-#define new DEBUG_NEW\r
-#endif\r
-\r
-#define MALLOC( bytes ) ::HeapAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, (bytes) )\r
-#define FREE( ptr ) if( ptr ) ::HeapFree( ::GetProcessHeap(), 0, ptr )\r
-#define REMALLOC( ptr, bytes ) ::HeapReAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, bytes )\r
-\r
-#pragma comment ( lib, "iphlpapi.lib" )\r
-\r
-//////////////////////////////////////////////////////////////////////\r
-// Construction/Destruction\r
-//////////////////////////////////////////////////////////////////////\r
-COneNetAdapterInfo::COneNetAdapterInfo ( IP_ADAPTER_INFO *pAdptInfo )\r
-{\r
- m_bInitOk = FALSE;\r
- memset ( &m_PhysicalAddress, 0, sizeof(m_PhysicalAddress) );\r
- m_nPhysicalAddressLength = 0;\r
- ASSERT ( pAdptInfo );\r
- memcpy ( &m_AdptInfo, pAdptInfo, sizeof(IP_ADAPTER_INFO) );\r
- if ( !Init() )\r
- {\r
- TRACE ( _T("[%s - %s] initialize failed."), Get_Name(), Get_Desc() );\r
- }\r
-}\r
-\r
-COneNetAdapterInfo::~COneNetAdapterInfo()\r
-{\r
- \r
-}\r
-\r
-//\r
-// ¸ù¾Ý´«ÈëµÄ pAdptInfo ÐÅÏ¢À´»ñÈ¡Ö¸¶¨Íø¿¨µÄ»ù±¾ÐÅÏ¢\r
-//\r
-BOOL COneNetAdapterInfo::Init ()\r
-{\r
- IP_ADDR_STRING* pNext = NULL;\r
- IP_PER_ADAPTER_INFO* pPerAdapt = NULL;\r
- ULONG ulLen = 0;\r
- DWORD dwErr = ERROR_SUCCESS;\r
- ASSERT ( m_AdptInfo.AddressLength > 0 );\r
- t_IPINFO iphold;\r
-\r
- // ½«±äÁ¿Çå¿Õ\r
- m_bInitOk = FALSE;\r
- m_csName.Empty ();\r
- m_csDesc.Empty ();\r
- m_CurIPInfo.csIP.Empty ();\r
- m_CurIPInfo.csSubnet.Empty ();\r
- m_Ary_IP.RemoveAll ();\r
- m_Ary_DNS.RemoveAll ();\r
- m_Ary_Gateway.RemoveAll ();\r
- \r
-#ifndef _UNICODE\r
- m_csName = m_AdptInfo.AdapterName;\r
- m_csDesc = m_AdptInfo.Description;\r
-#else\r
- USES_CONVERSION;\r
- m_csName = A2W ( m_AdptInfo.AdapterName );\r
- m_csDesc = A2W ( m_AdptInfo.Description );\r
-#endif\r
- \r
- // »ñÈ¡µ±Ç°ÕýÔÚʹÓõÄIPµØÖ·\r
- if ( m_AdptInfo.CurrentIpAddress )\r
- {\r
- m_CurIPInfo.csIP = m_AdptInfo.CurrentIpAddress->IpAddress.String;\r
- m_CurIPInfo.csSubnet = m_AdptInfo.CurrentIpAddress->IpMask.String;\r
- }\r
- else\r
- {\r
- m_CurIPInfo.csIP = _T("0.0.0.0");\r
- m_CurIPInfo.csSubnet = _T("0.0.0.0");\r
- }\r
- \r
- // »ñÈ¡±¾Íø¿¨ÖÐËùÓеÄIPµØÖ·\r
- pNext = &( m_AdptInfo.IpAddressList );\r
- while ( pNext )\r
- {\r
- iphold.csIP = pNext->IpAddress.String;\r
- iphold.csSubnet = pNext->IpMask.String;\r
- m_Ary_IP.Add ( iphold );\r
- pNext = pNext->Next;\r
- }\r
- \r
- // »ñÈ¡±¾Íø¿¨ÖÐËùÓеÄÍø¹ØÐÅÏ¢\r
- pNext = &( m_AdptInfo.GatewayList );\r
- while ( pNext )\r
- {\r
- m_Ary_Gateway.Add ( A2W( pNext->IpAddress.String ));\r
- pNext = pNext->Next;\r
- }\r
- \r
- // »ñÈ¡±¾Íø¿¨ÖÐËùÓÐµÄ DNS\r
- dwErr = ::GetPerAdapterInfo ( m_AdptInfo.Index, pPerAdapt, &ulLen );\r
- if( dwErr == ERROR_BUFFER_OVERFLOW )\r
- {\r
- pPerAdapt = ( IP_PER_ADAPTER_INFO* ) MALLOC( ulLen );\r
- dwErr = ::GetPerAdapterInfo( m_AdptInfo.Index, pPerAdapt, &ulLen );\r
- \r
- // if we succeed than we need to drop into our loop\r
- // and fill the dns array will all available IP\r
- // addresses.\r
- if( dwErr == ERROR_SUCCESS )\r
- {\r
- pNext = &( pPerAdapt->DnsServerList );\r
- while( pNext )\r
- {\r
- m_Ary_DNS.Add( A2W( pNext->IpAddress.String ) );\r
- pNext = pNext->Next;\r
- } \r
- m_bInitOk = TRUE;\r
- }\r
-\r
- // this is done outside the dwErr == ERROR_SUCCES just in case. the macro\r
- // uses NULL pointer checking so it is ok if pPerAdapt was never allocated.\r
- FREE( pPerAdapt );\r
- }\r
-\r
- return m_bInitOk;\r
-}\r
-\r
-//\r
-// ÊÍ·Å»òˢб¾Íø¿¨µÄIPµØÖ·\r
-//\r
-BOOL COneNetAdapterInfo::RenewReleaseIP( Func_OperateIP func )\r
-{ \r
- IP_INTERFACE_INFO* pInfo = NULL;\r
- BOOL bDidIt = FALSE;\r
- ULONG ulLen = 0;\r
- int nNumInterfaces = 0;\r
- int nCnt = 0;\r
- DWORD dwErr = ERROR_SUCCESS;\r
-\r
- dwErr = ::GetInterfaceInfo ( pInfo, &ulLen );\r
- if( dwErr == ERROR_INSUFFICIENT_BUFFER )\r
- {\r
- pInfo = ( IP_INTERFACE_INFO* ) MALLOC( ulLen );\r
- dwErr = ::GetInterfaceInfo ( pInfo, &ulLen );\r
- \r
- if( dwErr != ERROR_SUCCESS )\r
- {\r
- return FALSE; \r
- }\r
- }\r
- \r
- // we can assume from here out that we have a valid array\r
- // of IP_INTERFACE_INFO structures due to the error \r
- // checking one above.\r
- nNumInterfaces = ulLen / sizeof( IP_INTERFACE_INFO );\r
- for( nCnt = 0; nCnt < nNumInterfaces; nCnt++ )\r
- {\r
- if( pInfo[ nCnt ].Adapter[ 0 ].Index == m_AdptInfo.Index )\r
- {\r
- dwErr = func( &pInfo[ nCnt ].Adapter[ 0 ] );\r
- \r
- // free all used memory since we don't need it any more.\r
- FREE( pInfo ); \r
- \r
- bDidIt = ( dwErr == NO_ERROR ); \r
- if( ! bDidIt ) { \r
- return FALSE;\r
- }\r
- \r
- break;\r
- }\r
- } \r
- \r
- return bDidIt;\r
-}\r
-\r
-////////////////////////////////////////////////////////////\r
-// Desc:\r
-// Releases the addresses held by this adapter.\r
-////////////////////////////////////////////////////////////\r
-BOOL COneNetAdapterInfo::ReleaseIP()\r
-{ \r
- return RenewReleaseIP ( ::IpReleaseAddress );\r
-}\r
-\r
-////////////////////////////////////////////////////////////\r
-// Desc:\r
-// Renews the address being held by this adapter.\r
-////////////////////////////////////////////////////////////\r
-BOOL COneNetAdapterInfo::RenewIP()\r
-{\r
- return RenewReleaseIP ( ::IpRenewAddress );\r
-}\r
-\r
-CString COneNetAdapterInfo::GetAdapterTypeString ()\r
-{\r
- UINT nType = m_AdptInfo.Type;\r
- CString csType = _T("");\r
- switch( nType )\r
- {\r
- case MIB_IF_TYPE_OTHER: csType = _T("Other"); break;\r
- case MIB_IF_TYPE_ETHERNET: csType = _T("Ethernet"); break; \r
- case MIB_IF_TYPE_TOKENRING: csType = _T("Token Ring"); break; \r
- case MIB_IF_TYPE_FDDI: csType = _T("FDDI"); break; \r
- case MIB_IF_TYPE_PPP: csType = _T("PPP"); break; \r
- case MIB_IF_TYPE_LOOPBACK: csType = _T("Loopback"); break; \r
- case MIB_IF_TYPE_SLIP: csType = _T("SLIP"); break; \r
- default: csType = _T("Invalid Adapter Type"); break;\r
- };\r
- \r
- return csType;\r
-}\r
-\r
-time_t COneNetAdapterInfo::Get_LeaseObtained() const { return m_AdptInfo.LeaseObtained; }\r
-time_t COneNetAdapterInfo::Get_LeaseExpired() const { return m_AdptInfo.LeaseExpires; }\r
-int COneNetAdapterInfo::Get_IPCount() const { return (int)m_Ary_IP.GetSize(); }\r
-int COneNetAdapterInfo::Get_DNSCount() const { return (int)m_Ary_DNS.GetSize(); }\r
-CString COneNetAdapterInfo::Get_CurrentIP() const { return m_CurIPInfo.csIP; }\r
-BOOL COneNetAdapterInfo::Is_DHCP_Used() const { return m_AdptInfo.DhcpEnabled; }\r
-CString COneNetAdapterInfo::Get_DHCPAddr() const { return m_AdptInfo.DhcpServer.IpAddress.String; }\r
-BOOL COneNetAdapterInfo::Is_Wins_Used() const { return m_AdptInfo.HaveWins; }\r
-CString COneNetAdapterInfo::Get_PrimaryWinsServer() const { return m_AdptInfo.PrimaryWinsServer.IpAddress.String; }\r
-CString COneNetAdapterInfo::Get_SecondaryWinsServer() const { return m_AdptInfo.SecondaryWinsServer.IpAddress.String; }\r
-int COneNetAdapterInfo::Get_GatewayCount() const { return m_Ary_Gateway.GetSize(); }\r
-DWORD COneNetAdapterInfo::Get_AdapterIndex() const { return m_AdptInfo.Index; }\r
-UINT COneNetAdapterInfo::Get_AdapterType() const { return m_AdptInfo.Type; }\r
-\r
-CString COneNetAdapterInfo::Get_IPAddr ( int nIndex ) const\r
-{ \r
- CString csAddr = _T("");\r
- if ( nIndex >= 0 && nIndex < m_Ary_IP.GetSize() )\r
- {\r
- csAddr = m_Ary_IP.GetAt(nIndex).csIP;\r
- }\r
- \r
- return csAddr;\r
-}\r
-\r
-CString COneNetAdapterInfo::Get_Subnet ( int nIndex ) const\r
-{ \r
- CString csAddr = _T("");\r
- if ( nIndex >= 0 && nIndex < m_Ary_IP.GetSize() )\r
- {\r
- csAddr = m_Ary_IP.GetAt(nIndex).csSubnet;\r
- }\r
- \r
- return csAddr;\r
-}\r
-\r
-CString COneNetAdapterInfo::Get_DNSAddr ( int nIndex ) const\r
-{ \r
- CString csAddr = _T("");\r
- if ( nIndex >= 0 && nIndex < m_Ary_DNS.GetSize() )\r
- {\r
- csAddr = m_Ary_DNS.GetAt(nIndex);\r
- }\r
- \r
- return csAddr;\r
-}\r
-\r
-CString COneNetAdapterInfo::Get_GatewayAddr ( int nIndex ) const\r
-{ \r
- CString csAddr = _T("");\r
- if ( nIndex >= 0 && nIndex < m_Ary_Gateway.GetSize() )\r
- {\r
- csAddr = m_Ary_Gateway.GetAt(nIndex);\r
- }\r
- \r
- return csAddr;\r
-}\r
-\r
-void COneNetAdapterInfo::Set_PhysicalAddress ( int nPhysicalAddressLength, BYTE *pPhysicalAddress )\r
-{\r
- if ( !pPhysicalAddress ) return;\r
- m_nPhysicalAddressLength = __min(nPhysicalAddressLength,sizeof(m_PhysicalAddress));\r
- memcpy ( m_PhysicalAddress, pPhysicalAddress, m_nPhysicalAddressLength );\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////\r
-// Construction/Destruction\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-CNetAdapterInfo::CNetAdapterInfo ()\r
-{\r
-}\r
-\r
-CNetAdapterInfo::~CNetAdapterInfo()\r
-{\r
- DeleteAllNetAdapterInfo ();\r
-}\r
-\r
-void CNetAdapterInfo::DeleteAllNetAdapterInfo()\r
-{\r
- for ( int i=0; i<m_Ary_NetAdapterInfo.GetSize(); i++ )\r
- {\r
- COneNetAdapterInfo *pOneNetAdapterInfo = (COneNetAdapterInfo*)m_Ary_NetAdapterInfo.GetAt(i);\r
- if ( pOneNetAdapterInfo ) delete pOneNetAdapterInfo;\r
- }\r
- m_Ary_NetAdapterInfo.RemoveAll ();\r
-}\r
-\r
-//\r
-// ö¾ÙÍøÂçÊÊÅäÆ÷\r
-// return : ------------------------------------------------------------\r
-// -1 - ʧ°Ü\r
-// >=0 - ÍøÂçÊÊÅäÆ÷ÊýÁ¿\r
-//\r
-int CNetAdapterInfo::EnumNetworkAdapters ()\r
-{\r
- DeleteAllNetAdapterInfo ();\r
-\r
- IP_ADAPTER_INFO* pAdptInfo = NULL;\r
- IP_ADAPTER_INFO* pNextAd = NULL;\r
- ULONG ulLen = 0;\r
- int nCnt = 0;\r
- \r
- DWORD dwError = ::GetAdaptersInfo ( pAdptInfo, &ulLen );\r
- if( dwError != ERROR_BUFFER_OVERFLOW ) return -1;\r
- pAdptInfo = ( IP_ADAPTER_INFO* )MALLOC ( ulLen );\r
- dwError = ::GetAdaptersInfo( pAdptInfo, &ulLen );\r
- if ( dwError != ERROR_SUCCESS ) return -1;\r
- \r
- pNextAd = pAdptInfo;\r
- while( pNextAd )\r
- {\r
- COneNetAdapterInfo *pOneNetAdapterInfo = new COneNetAdapterInfo ( pNextAd );\r
- if ( pOneNetAdapterInfo )\r
- {\r
- m_Ary_NetAdapterInfo.Add ( pOneNetAdapterInfo );\r
- }\r
- nCnt ++;\r
- pNextAd = pNextAd->Next;\r
- }\r
- \r
- // free any memory we allocated from the heap before\r
- // exit. we wouldn't wanna leave memory leaks now would we? ;p\r
- FREE( pAdptInfo ); \r
- \r
- return nCnt;\r
-}\r
-\r
-COneNetAdapterInfo* CNetAdapterInfo::Get_OneNetAdapterInfo ( int nIndex )\r
-{\r
- if ( nIndex < 0 || nIndex >= m_Ary_NetAdapterInfo.GetSize() )\r
- {\r
- ASSERT ( FALSE );\r
- return NULL;\r
- }\r
-\r
- return (COneNetAdapterInfo*)m_Ary_NetAdapterInfo.GetAt(nIndex);\r
-}\r
-\r
-COneNetAdapterInfo* CNetAdapterInfo::Get_OneNetAdapterInfo ( DWORD dwIndex )\r
-{\r
- for ( int i=0; i<m_Ary_NetAdapterInfo.GetSize(); i++ )\r
- {\r
- COneNetAdapterInfo *pOneNetAdapterInfo = (COneNetAdapterInfo*)m_Ary_NetAdapterInfo.GetAt(i);\r
- if ( pOneNetAdapterInfo && pOneNetAdapterInfo->Get_AdapterIndex() == dwIndex )\r
- return pOneNetAdapterInfo;\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-void CNetAdapterInfo::Refresh ()\r
-{\r
- DeleteAllNetAdapterInfo ();\r
- EnumNetworkAdapters ();\r
- GetAdapterAddress ();\r
-}\r
-\r
-//\r
-// »ñÈ¡Íø¿¨µÄµØÖ·ÐÅÏ¢£¬Ö÷ÒªÊÇMACµØÖ·\r
-//\r
-BOOL CNetAdapterInfo::GetAdapterAddress ()\r
-{\r
- DWORD dwSize = 0;\r
- DWORD dwRetVal = 0;\r
- BOOL bRet = FALSE;\r
-\r
- int i = 0;\r
-\r
- // Set the flags to pass to GetAdaptersAddresses\r
- ULONG flags = GAA_FLAG_INCLUDE_PREFIX;\r
-\r
- // default to unspecified address family (both)\r
- // AF_INET for IPv4, AF_INET6 for IPv6\r
- ULONG family = AF_UNSPEC;\r
-\r
- LPVOID lpMsgBuf = NULL;\r
-\r
- PIP_ADAPTER_ADDRESSES pAddresses = NULL;\r
- ULONG outBufLen = 0;\r
-\r
- PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;\r
- PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;\r
- PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;\r
- PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;\r
- IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;\r
- IP_ADAPTER_PREFIX *pPrefix = NULL;\r
-\r
- outBufLen = sizeof (IP_ADAPTER_ADDRESSES);\r
- pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);\r
- if (pAddresses == NULL) return FALSE;\r
-\r
- // Make an initial call to GetAdaptersAddresses to get the \r
- // size needed into the outBufLen variable\r
- if ( ::GetAdaptersAddresses ( family, flags, NULL, pAddresses, &outBufLen ) == ERROR_BUFFER_OVERFLOW )\r
- {\r
- FREE(pAddresses);\r
- pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);\r
- }\r
- if (pAddresses == NULL) return FALSE;\r
-\r
- // Make a second call to GetAdapters Addresses to get the\r
- // actual data we want\r
-#ifdef _DEBUG\r
- TRACE ( _T("Memory allocated for GetAdapterAddresses = %d bytes\n"), outBufLen);\r
- TRACE ( _T("Calling GetAdaptersAddresses function with family = " ) );\r
- if (family == AF_INET)\r
- TRACE(_T("AF_INET\n"));\r
- if (family == AF_INET6)\r
- TRACE(_T("AF_INET6\n"));\r
- if (family == AF_UNSPEC)\r
- TRACE(_T("AF_UNSPEC\n\n"));\r
-#endif\r
- dwRetVal = GetAdaptersAddresses ( family, flags, NULL, pAddresses, &outBufLen );\r
-\r
- if ( dwRetVal == NO_ERROR )\r
- {\r
- // If successful, output some information from the data we received\r
- pCurrAddresses = pAddresses;\r
- while (pCurrAddresses)\r
- {\r
- TRACE(_T("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n"),\r
- pCurrAddresses->Length);\r
- TRACE(_T("\tIfIndex (IPv4 interface): %u\n"), pCurrAddresses->IfIndex);\r
- TRACE(_T("\tAdapter name: %s\n"), pCurrAddresses->AdapterName);\r
-\r
- pUnicast = pCurrAddresses->FirstUnicastAddress;\r
- if (pUnicast != NULL)\r
- {\r
- for (i = 0; pUnicast != NULL; i++)\r
- pUnicast = pUnicast->Next;\r
- TRACE(_T("\tNumber of Unicast Addresses: %d\n"), i);\r
- }\r
- else\r
- {\r
- TRACE(_T("\tNo Unicast Addresses\n"));\r
- }\r
-\r
- pAnycast = pCurrAddresses->FirstAnycastAddress;\r
- if (pAnycast)\r
- {\r
- for (i = 0; pAnycast != NULL; i++)\r
- pAnycast = pAnycast->Next;\r
- TRACE(_T("\tNumber of Anycast Addresses: %d\n"), i);\r
- }\r
- else\r
- {\r
- TRACE(_T("\tNo Anycast Addresses\n"));\r
- }\r
-\r
- pMulticast = pCurrAddresses->FirstMulticastAddress;\r
- if (pMulticast)\r
- {\r
- for (i = 0; pMulticast != NULL; i++)\r
- pMulticast = pMulticast->Next;\r
- TRACE(_T("\tNumber of Multicast Addresses: %d\n"), i);\r
- }\r
- else\r
- {\r
- TRACE(_T("\tNo Multicast Addresses\n"));\r
- }\r
-\r
- pDnServer = pCurrAddresses->FirstDnsServerAddress;\r
- if (pDnServer)\r
- {\r
- for (i = 0; pDnServer != NULL; i++)\r
- pDnServer = pDnServer->Next;\r
- TRACE(_T("\tNumber of DNS Server Addresses: %d\n"), i);\r
- }\r
- else\r
- {\r
- TRACE(_T("\tNo DNS Server Addresses\n"));\r
- }\r
-\r
- TRACE(_T("\tDNS Suffix: %wS\n"), pCurrAddresses->DnsSuffix);\r
- TRACE(_T("\tDescription: %wS\n"), pCurrAddresses->Description);\r
- TRACE(_T("\tFriendly name: %wS\n"), pCurrAddresses->FriendlyName);\r
-\r
- if (pCurrAddresses->PhysicalAddressLength != 0)\r
- {\r
- TRACE(_T("\tPhysical address: "));\r
- for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength; i++)\r
- {\r
- if ( i == (int)(pCurrAddresses->PhysicalAddressLength - 1))\r
- TRACE(_T("%.2X\n"), (int) pCurrAddresses->PhysicalAddress[i]);\r
- else\r
- TRACE(_T("%.2X-"), (int) pCurrAddresses->PhysicalAddress[i]);\r
- }\r
-\r
- COneNetAdapterInfo* pNetAdapterInfo = Get_OneNetAdapterInfo ( pCurrAddresses->IfIndex );\r
- if ( pNetAdapterInfo )\r
- {\r
- pNetAdapterInfo->Set_PhysicalAddress ( pCurrAddresses->PhysicalAddressLength, pCurrAddresses->PhysicalAddress );\r
- }\r
- }\r
- TRACE(_T("\tFlags: %ld\n"), pCurrAddresses->Flags);\r
- TRACE(_T("\tMtu: %lu\n"), pCurrAddresses->Mtu);\r
- TRACE(_T("\tIfType: %ld\n"), pCurrAddresses->IfType);\r
- TRACE(_T("\tOperStatus: %ld\n"), pCurrAddresses->OperStatus);\r
- TRACE(_T("\tIpv6IfIndex (IPv6 interface): %u\n"),\r
- pCurrAddresses->Ipv6IfIndex);\r
- TRACE(_T("\tZoneIndices (hex): "));\r
- for (i = 0; i < 16; i++)\r
- TRACE(_T("%lx "), pCurrAddresses->ZoneIndices[i]);\r
- TRACE(_T("\n"));\r
-\r
- pPrefix = pCurrAddresses->FirstPrefix;\r
- if (pPrefix)\r
- {\r
- for (i = 0; pPrefix != NULL; i++)\r
- pPrefix = pPrefix->Next;\r
- TRACE(_T("\tNumber of IP Adapter Prefix entries: %d\n"), i);\r
- }\r
- else\r
- {\r
- TRACE(_T("\tNumber of IP Adapter Prefix entries: 0\n"));\r
- }\r
-\r
- TRACE(_T("\n"));\r
-\r
- pCurrAddresses = pCurrAddresses->Next;\r
- bRet = TRUE;\r
- }\r
- }\r
- else\r
- {\r
- TRACE(_T("Call to GetAdaptersAddresses failed with error: %d\n"), dwRetVal );\r
- if (dwRetVal == ERROR_NO_DATA)\r
- {\r
- TRACE(_T("\tNo addresses were found for the requested parameters\n"));\r
- }\r
- else\r
- {\r
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
- (LPTSTR) & lpMsgBuf, 0, NULL))\r
- {\r
- TRACE(_T("\tError: %s"), lpMsgBuf);\r
- LocalFree(lpMsgBuf);\r
- FREE(pAddresses);\r
- }\r
- }\r
- bRet = FALSE;\r
- }\r
- FREE(pAddresses);\r
-\r
- return bRet;\r
-}\r
-\r
-CString MacAddress2String ( int nPhysicalAddressLength, BYTE *pPhysicalAddress )\r
-{\r
- ASSERT ( nPhysicalAddressLength >= 6 );\r
- AfxIsValidAddress(pPhysicalAddress,nPhysicalAddressLength,TRUE);\r
- CString csMacAddress, csOneCell;\r
- for ( int i=0; i<nPhysicalAddressLength; i++ )\r
- {\r
- csOneCell.Format ( _T("%.2X"), (int)pPhysicalAddress[i] );\r
- if ( !csMacAddress.IsEmpty() ) csMacAddress += _T("-");\r
- csMacAddress += csOneCell;\r
- }\r
-\r
- return csMacAddress;\r
-}
\ No newline at end of file
+++ /dev/null
-// OneNetAdapterInfo.h: interface for the COneNetAdapterInfo class.\r
-//\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-#if !defined(AFX_OneNetAdapterInfo_H__A899410F_5CFF_4958_80C4_D1AC693F62E3__INCLUDED_)\r
-#define AFX_OneNetAdapterInfo_H__A899410F_5CFF_4958_80C4_D1AC693F62E3__INCLUDED_\r
-\r
-#if _MSC_VER > 1000\r
-#pragma once\r
-#endif // _MSC_VER > 1000\r
-\r
-/*\r
- ˵Ã÷\r
- »ñÈ¡Íø¿¨ÐÅÏ¢£¬°üÀ¨IPµØÖ·¡¢DNS¡¢Íø¹Ø¡¢ÊÇ·ñΪ¶¯Ì¬IP¡¢DHCPµÈ£¬¸ÃÀ಻ÓöÁȡע²á±í¼´¿É»ñÈ¡×îеÄÍø¿¨ÐÅÏ¢\r
-ÁíÍ⻹¿ÉÒÔÊÍ·ÅÍø¿¨µØÖ·²¢ÖØÐÂˢеØÖ·\r
-*/\r
-\r
-#include <winsock2.h>\r
-#include <iphlpapi.h>\r
-#include <Afxtempl.h>\r
-\r
-typedef struct _IPINFO\r
-{\r
- CString csIP;\r
- CString csSubnet;\r
-} t_IPINFO;\r
-typedef CArray<t_IPINFO,t_IPINFO&> t_Ary_IPINFO;\r
-\r
-typedef DWORD ( __stdcall *Func_OperateIP)( PIP_ADAPTER_INDEX_MAP AdapterInfo );\r
-CString MacAddress2String ( int nPhysicalAddressLength, BYTE *pPhysicalAddress );\r
-\r
-class COneNetAdapterInfo\r
-{\r
-public:\r
- COneNetAdapterInfo ( IP_ADAPTER_INFO *pAdptInfo );\r
- virtual ~COneNetAdapterInfo();\r
- CString Get_Name() { return m_csName; }\r
- CString Get_Desc() { return m_csDesc; }\r
- BOOL ReleaseIP();\r
- BOOL RenewIP();\r
- CString GetAdapterTypeString ();\r
-\r
- time_t Get_LeaseObtained() const;\r
- time_t Get_LeaseExpired() const;\r
- int Get_IPCount() const;\r
- int Get_DNSCount() const;\r
- CString Get_CurrentIP() const;\r
- BOOL Is_DHCP_Used() const;\r
- CString Get_DHCPAddr() const;\r
- BOOL Is_Wins_Used() const;\r
- CString Get_PrimaryWinsServer() const;\r
- CString Get_SecondaryWinsServer() const;\r
- int Get_GatewayCount() const;\r
- DWORD Get_AdapterIndex() const;\r
- UINT Get_AdapterType() const;\r
- CString Get_IPAddr ( int nIndex ) const;\r
- CString Get_Subnet ( int nIndex ) const;\r
- CString Get_DNSAddr ( int nIndex ) const;\r
- CString Get_GatewayAddr ( int nIndex ) const;\r
- void Set_PhysicalAddress ( int nPhysicalAddressLength, BYTE *pPhysicalAddress );\r
- CString Get_PhysicalAddressStr () { return MacAddress2String ( m_nPhysicalAddressLength, m_PhysicalAddress ); }\r
-\r
-private:\r
- BOOL Init ();\r
- BOOL RenewReleaseIP( Func_OperateIP func );\r
-\r
-public:\r
- BOOL m_bInitOk;\r
-private:\r
- IP_ADAPTER_INFO m_AdptInfo;\r
- CString m_csName;\r
- CString m_csDesc;\r
- t_IPINFO m_CurIPInfo; // this is also in the ip address list but this is the address currently active. \r
- t_Ary_IPINFO m_Ary_IP;\r
- CStringArray m_Ary_DNS;\r
- CStringArray m_Ary_Gateway;\r
- BYTE m_PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];\r
- int m_nPhysicalAddressLength;\r
-};\r
-\r
-class CNetAdapterInfo\r
-{\r
-public:\r
- CNetAdapterInfo ();\r
- ~CNetAdapterInfo();\r
- int GetNetCardCount () { return m_Ary_NetAdapterInfo.GetSize(); }\r
- COneNetAdapterInfo* Get_OneNetAdapterInfo ( int nIndex );\r
- COneNetAdapterInfo* CNetAdapterInfo::Get_OneNetAdapterInfo ( DWORD dwIndex );\r
- void Refresh ();\r
-\r
-private:\r
- int EnumNetworkAdapters ();\r
- void DeleteAllNetAdapterInfo();\r
- BOOL GetAdapterAddress ();\r
-\r
-private:\r
- CPtrArray m_Ary_NetAdapterInfo;\r
-};\r
-\r
-#endif // !defined(AFX_OneNetAdapterInfo_H__A899410F_5CFF_4958_80C4_D1AC693F62E3__INCLUDED_)\r