OSDN Git Service

Send email to multi person success and add CC and TO list
authorFrank Li <lznuaa@gmail.com>
Fri, 17 Apr 2009 14:07:58 +0000 (22:07 +0800)
committerFrank Li <lznuaa@gmail.com>
Fri, 17 Apr 2009 14:07:58 +0000 (22:07 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/Patch.cpp
src/TortoiseProc/Patch.h
src/TortoiseProc/SVNProgressDlg.cpp
src/TortoiseProc/SVNProgressDlg.h
src/TortoiseProc/resource.h
src/Utils/HwSMTP.cpp
src/Utils/HwSMTP.h
src/Utils/NetAdapterInfo.cpp [deleted file]
src/Utils/NetAdapterInfo.h [deleted file]

index 833d395..b27fb36 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index 7bebda9..f9a06f8 100644 (file)
@@ -31,46 +31,28 @@ void CPatch::ConvertToArray(CString &to,CStringArray &Array)
 \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
@@ -142,7 +124,7 @@ int CPatch::Parser(CString &pathfile)
 \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
@@ -159,7 +141,7 @@ void CPatch::GetNameAddress(CString &in, CString &name,CString &address)
        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
@@ -191,4 +173,5 @@ void CPatch::AddRecipient(CSmtp &mail, CString &tolist, bool isCC)
                                mail.AddRecipient(CUnicodeUtils::GetUTF8(one));\r
                }\r
        }\r
-}
\ No newline at end of file
+}\r
+#endif
\ No newline at end of file
index 8cc6c7a..769ff49 100644 (file)
@@ -1,6 +1,6 @@
 #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
@@ -11,7 +11,7 @@
 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
@@ -19,6 +19,7 @@ public:
        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
index 2d5a888..febe50b 100644 (file)
@@ -217,7 +217,9 @@ void CGitProgressDlg::AddItemToList()
 }\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
@@ -234,6 +236,7 @@ BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t actio
        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
@@ -268,11 +271,30 @@ BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t actio
                        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
@@ -493,7 +515,7 @@ BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t actio
                {\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
@@ -2690,9 +2712,14 @@ bool CGitProgressDlg::CmdSendMail(CString& sWindowTitle, bool& /*localoperation*
        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
index 7d7d102..898e588 100644 (file)
@@ -69,7 +69,9 @@ typedef enum
 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
@@ -198,7 +200,10 @@ private:
 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
index d474ad0..ed8db1c 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ
index c628191..ec51322 100644 (file)
@@ -7,7 +7,7 @@
 #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
@@ -29,14 +29,16 @@ public:
                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
@@ -45,15 +47,18 @@ public:
                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
@@ -65,14 +70,16 @@ public:
        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
@@ -96,6 +103,116 @@ CHwSMTP::~CHwSMTP()
 {\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
@@ -103,19 +220,21 @@ BOOL CHwSMTP::SendEmail (
                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
@@ -133,18 +252,21 @@ BOOL CHwSMTP::SendEmail (
 \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
@@ -158,12 +280,8 @@ BOOL CHwSMTP::SendEmail (
        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
@@ -347,21 +465,39 @@ BOOL CHwSMTP::auth()
 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
@@ -378,7 +514,22 @@ BOOL CHwSMTP::SendSubject()
                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
@@ -512,14 +663,13 @@ DWORD WINAPI ThreadProc_SendEmail( LPVOID lpParameter )
                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
@@ -551,14 +701,16 @@ BOOL SendEmail (
                                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
@@ -576,14 +728,16 @@ BOOL SendEmail (
                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
index a3e1ea1..87d0f23 100644 (file)
@@ -58,21 +58,37 @@ public:
                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
@@ -87,10 +103,13 @@ private:
        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
@@ -114,15 +133,19 @@ BOOL SendEmail (
                                  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
diff --git a/src/Utils/NetAdapterInfo.cpp b/src/Utils/NetAdapterInfo.cpp
deleted file mode 100644 (file)
index d993a90..0000000
+++ /dev/null
@@ -1,581 +0,0 @@
-// 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
diff --git a/src/Utils/NetAdapterInfo.h b/src/Utils/NetAdapterInfo.h
deleted file mode 100644 (file)
index 0281441..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-// 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