www.gusucode.com > 一些VC++网络编程实例源代码-源码程序 > 一些VC++网络编程实例源代码-源码程序\code\第三章\MyBrowserEx\ithread.cpp

    //Download by http://www.NewXing.com
#include "stdafx.h"
#include "IThread.h"


BOOL Succeeded(HANDLE h, LPCTSTR strFunctionName) ;

CInternetThread::CInternetThread()
   : m_hPostMsgWnd(NULL), 
      m_hSession(NULL), 
      m_buffer(NULL),
      m_dwAccessType(PRE_CONFIG_INTERNET_ACCESS)
{
}

void CInternetThread::ResetSession()
{
   TRACE0("重置会话\r\n") ;
   if (m_hSession != NULL)
   {
      VERIFY(::InternetCloseHandle(m_hSession)) ;
      m_hSession = NULL ;
   }   
}

CInternetThread::~CInternetThread()
{
   if (m_buffer) delete m_buffer ;
   ResetSession(); 
}

BOOL CInternetThread::Init(HWND hPostMsgWnd)
{
   ASSERT(hPostMsgWnd) ;
   m_hPostMsgWnd = hPostMsgWnd ;

   return TRUE ;
}

int CInternetThread::GetAccessTypeIndex() 
{
   int index = 0 ;
   switch (m_dwAccessType)
   {
   case PRE_CONFIG_INTERNET_ACCESS:
      index = 0 ;
      break ;
   case CERN_PROXY_INTERNET_ACCESS:
      index = 2 ;
      break ;
   case LOCAL_INTERNET_ACCESS:
      index = 3 ;
      break ;
   default:
      ASSERT(0) ;
   }
   return index ;
}

void CInternetThread::SetAccessTypeIndex(int index) 
{
   switch(index)
   {
   case 0:
      m_dwAccessType = PRE_CONFIG_INTERNET_ACCESS ;
      break;
   case 1:
      break;
   case 2:
      m_dwAccessType = CERN_PROXY_INTERNET_ACCESS ;
      break;
   case 3:
      m_dwAccessType = LOCAL_INTERNET_ACCESS ;
      break;
   default:
      ASSERT(0) ;
   }
   ResetSession() ;
}

void CInternetThread::GetPage(CString& rAddress)
{
   ASSERT(!rAddress.IsEmpty()) ;
   CString strTemp = rAddress.Mid(7) ;
   int i = strTemp.Find("/"); 
   if (i != -1)
   {
      m_strServer = strTemp.Left(i) ;
      m_strPath = strTemp.Mid(i) ;
      TRACE("Path = [%s]", (LPCTSTR)m_strPath) ; 
  }
   else
      m_strServer = strTemp ;

   TRACE("\t Server = [%s] \r\n", (LPCTSTR)m_strServer) ;   

   ASSERT(IsBufferEmpty()) ;
   AfxBeginThread(GetWebPageWorkerThread, this) ;
}

UINT CInternetThread::GetWebPageWorkerThread(LPVOID pvThread)
{
   TRACE0("GetWebPageWorkerThread\r\n") ;

   CInternetThread* pInternetThread = (CInternetThread*) pvThread ;
   if (pInternetThread == NULL 
       || pInternetThread->m_strServer.IsEmpty()
         || pInternetThread->m_hPostMsgWnd == NULL)
   {
      TRACE0("Internet相称不合法\r\n") ;
      return THREAD_BAD ;
   }

   return pInternetThread->_GetPageWorker() ;
}

UINT CInternetThread::_GetPageWorker()
{
    UINT uiResult = THREAD_BAD;

    if (m_hSession == NULL)
   {
      TRACE("Starting Session (Access = %i) (Proxy = %s)\r\n",
            GetAccessTypeIndex(),
            (LPCTSTR)m_strProxyServer) ;
      m_hSession = ::InternetOpen("MyBorwserEx",
                                  m_dwAccessType,
                                  m_strProxyServer,
                                  INTERNET_INVALID_PORT_NUMBER,
                                  0 ) ;

      if (!Succeeded(m_hSession, "InternetOpen"))
      {
         ::PostMessage(m_hPostMsgWnd,WM_READFILECOMPLETED, NULL, (LPARAM)THREAD_BAD) ;

         return THREAD_BAD;
      }
   }

   HINTERNET hConnect = ::InternetConnect(m_hSession,
                                          m_strServer,
                                          INTERNET_INVALID_PORT_NUMBER,
                                          "",
                                          "",
                                          INTERNET_SERVICE_HTTP,
                                          0,
                                          0) ;

                                          
   if (Succeeded(hConnect, "InternetConnect"))
   {

      HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,
                                              "GET",
                                              m_strPath,
                                              HTTP_VERSION,
                                              NULL,
                                              0,
                                              INTERNET_FLAG_DONT_CACHE,
                                              0) ;

      if (Succeeded(hHttpFile, "HttpOpenRequest"))
      {
         
         BOOL bSendRequest = ::HttpSendRequest(hHttpFile, NULL, 0, 0, 0);
         
         if (Succeeded((HINTERNET)bSendRequest, "HttpSendRequest"))
         {
            char bufQuery[32] ;
            DWORD dwFileSize ;
            DWORD dwLengthBufQuery = sizeof (bufQuery);
            BOOL bQuery = ::HttpQueryInfo(hHttpFile,
                           HTTP_QUERY_CONTENT_LENGTH, 
                           bufQuery, 
                           &dwLengthBufQuery,
                           NULL) ;
            if (Succeeded((HINTERNET)bQuery, "HttpQueryInfo"))
            {
               TRACE("HttpQueryInfo文件尺寸为 %s.\r\n", bufQuery) ;
               dwFileSize = (DWORD)atol(bufQuery) ;
            }
            else
            {
               TRACE("\tQueryInfo执行失败,只得到5k.\r\n") ;
               dwFileSize = 5*1024 ;
            }

            ASSERT(m_buffer == NULL); 
            m_buffer = new char[dwFileSize+1] ;
            DWORD dwBytesRead ;
            BOOL bRead = ::InternetReadFile(hHttpFile,	
                                            m_buffer,	
                                            dwFileSize+1, 	
                                            &dwBytesRead);	
            if (Succeeded((HINTERNET)bRead, "InternetReadFile"))
            {
               TRACE("\t读入字节数为 %d\r\n", dwBytesRead) ;
               m_buffer[dwBytesRead] = 0 ;
               uiResult = THREAD_GOOD;
            } // InternetReadFile
         } // HttpSendRequest

         VERIFY(::InternetCloseHandle(hHttpFile)); 
      } // HttpOpenRequest

      VERIFY(::InternetCloseHandle(hConnect)) ;
   } // InternetConnect 

   ::PostMessage(m_hPostMsgWnd,WM_READFILECOMPLETED, NULL, (LPARAM)uiResult) ;

   return uiResult ;
}

BOOL Succeeded(HANDLE h, LPCTSTR strFunctionName)
{
   if (h == NULL)
   {
      DWORD dwError = GetLastError() ;
      TRACE("%s *** Error = %u***\r\n",strFunctionName, dwError) ;

      CString errString ;
      errString.Format("%s 返回错误 %u", strFunctionName, dwError) ;
      AfxMessageBox(errString, MB_ICONEXCLAMATION | MB_OK) ;
      return FALSE;
   }
   else
   {
      TRACE("%s\r\n", strFunctionName) ;
      return TRUE ;
   }

}