BOOL CFifa2AutoLauncher::Run() { StartLauncherWindow(); if (NULL == m_hMainWindow) { return FALSE; } if (DISCONNECT == m_state) { ClickButton(m_hMainWindow, m_iFailedOkButtonID); return FALSE; } if (FALSE == CheckButton(m_iAcceptCheckboxID)) { return FALSE; } if (FALSE == CheckButton(m_iZone1RadioButtonID)) { return FALSE; } HWND hStartButton = ::GetDlgItem(m_hMainWindow, m_iStartButtonID); if (NULL == hStartButton) { return FALSE; } HANDLE hThread = ::CreateThread(NULL, 0, MonitorThreadFunction, this, 0, NULL); if (NULL == hThread) { return FALSE; } while (hStartButton != NULL) { if (FALSE == ClickButton(m_iStartButtonID)) { return FALSE; } hStartButton = ::GetDlgItem(m_hMainWindow, m_iStartButtonID); } if (FALSE == WaitForComplete()) { return FALSE; } ::WaitForSingleObject(hThread, INFINITE); ::CloseHandle(hThread); if (TRUE == m_bIsFailed) { return FALSE; } return TRUE; }
DWORD CHttpDownloader::GetHttpStatus() { LPVOID lpOutBuffer = new char[4]; DWORD dwSize = 4; DWORD Status = 0; DWORD err = 0; BOOL bResult; ret: m_context.op = HTTP_DOWNLOADER_OP_GET_STATUS; bResult = HttpQueryInfo(m_hRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)lpOutBuffer, &dwSize, NULL); if(!bResult&&997 == GetLastError()) WaitForComplete(m_dwTimeout); if(!bResult) { err = GetLastError(); if(err == ERROR_HTTP_HEADER_NOT_FOUND) { return false; //throw(); } else { if (err == ERROR_INSUFFICIENT_BUFFER) { if(lpOutBuffer!=NULL) delete[] lpOutBuffer; lpOutBuffer = new char[dwSize]; goto ret; } else { return Status; //throw(); } } } else { // ATLTRACE("HTTP STATUS - %s \r\n", lpOutBuffer); Status = atol((char*)lpOutBuffer); delete[] lpOutBuffer; lpOutBuffer = NULL; return Status; } }
HRESULT CHttpDownloader::ConnectToServer(_bstr_t &strBuffer) { BOOL bResult; DWORD dwStatus; DWORD nTimeoutCounter; _bstr_t strMethod; _bstr_t strUrl = m_request.url; LPCTSTR szProxyName = NULL; if(m_ProxyType == INTERNET_OPEN_TYPE_PROXY) szProxyName = m_ProxyName; //// InternetOpen \\\\ if(!m_hInternet) m_hInternet = InternetOpen(_T("McHttpDownloader"), m_ProxyType, szProxyName, NULL, INTERNET_FLAG_ASYNC); if(!m_hInternet) { strBuffer = _T("InternetOpen failed"); return E_FAIL; } InternetSetStatusCallback(m_hInternet, (INTERNET_STATUS_CALLBACK)CallbackFunc); //// InternetOpen //// if(m_longAbort > 0) return E_ABORT; //// InternetConnect \\\\ if(!m_hConnect) { m_hConnect = InternetConnect(m_hInternet, m_request.server, (short)m_request.port, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, (DWORD)&m_context); } if(m_hConnect == NULL) { strBuffer = _T("InternetConnect failed"); return INET_E_CANNOT_CONNECT; } //// InternetConnect //// nTimeoutCounter = 0; NewConnect: strMethod = _T("GET"); strBuffer = _T(""); //// OpenRequest \\\\ if(m_hRequest) { ::InternetCloseHandle(m_hRequest); m_hRequest = NULL; } if(m_longAbort > 0) return E_ABORT; DWORD dwFlags = INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_UI | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_HYPERLINK | (m_request.bUseSSL ? (INTERNET_FLAG_SECURE/*| INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS| INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP*/) : 0); m_context.op = HTTP_DOWNLOADER_OP_OPEN_REQUEST; m_hRequest = HttpOpenRequest(m_hConnect, strMethod, strUrl, _T("HTTP/1.1"), NULL, NULL, dwFlags, (DWORD)&m_context); if(m_hRequest == NULL) { strBuffer = _T("HttpOpenRequest failed"); return E_FAIL; } if(m_ProxyType == INTERNET_OPEN_TYPE_PROXY) { if(GetOptionInt(IDS_NETOPTIONS,IDS_USEFIREWALL,0)) { CString fireWallUser = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T("")); CString fireWallPass = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T("")); ////////////////////////////////////////////////////////////////////////// int HeaderLen = ATL::ProxyAuthorizationStringGetRequiredLength(fireWallUser, fireWallPass); LPTSTR strHeader = new TCHAR[HeaderLen+1]; ZeroMemory(strHeader,HeaderLen+1); HRESULT hr = ATL::ProxyAuthorizationString(fireWallUser, fireWallPass, strHeader, &HeaderLen); ASSERT(hr==S_OK); HttpAddRequestHeaders(m_hRequest, strHeader, HeaderLen, HTTP_ADDREQ_FLAG_ADD ); delete []strHeader; ////////////////////////////////////////////////////////////////////////// } } //// OpenRequest //// NewRequest: if(m_longAbort > 0) return E_ABORT; m_context.op = HTTP_DOWNLOADER_OP_SEND_REQUEST; bResult = HttpSendRequest(m_hRequest, NULL , 0, (LPVOID)(BYTE*)(LPCTSTR)strBuffer, lstrlen(strBuffer)); if(!bResult && 997 == GetLastError()) // Overlapped I/O operation is in progress. bResult = WaitForComplete(m_dwTimeout); // Resolve host name, connect, send request, receive response. if(!bResult) { DWORD dwErrCode = GetLastError(); // ATLTRACE("Send Request error = %d \r\n",dwErrCode); if(dwErrCode == 6) // The handle is invalid. goto NewConnect; if(dwErrCode == ERROR_INTERNET_TIMEOUT) // timeout { if(++nTimeoutCounter < m_dwConnectRetryCount) goto NewConnect; else { strBuffer = _T("Timeout"); return E_FAIL;//INET_E_CONNECTION_TIMEOUT; } } strBuffer = _T("SendRequest failed"); return E_FAIL; } dwStatus = GetHttpStatus(); if(dwStatus == 401 || dwStatus == 407) // Denied or Proxy asks password { if(ERROR_INTERNET_FORCE_RETRY == InternetErrorDlg(GetDesktopWindow(), m_hRequest, ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, NULL)) { goto NewRequest; } } if(dwStatus != 200) // Not OK { strBuffer = _T("SendRequest returned with error"); return INET_E_CANNOT_CONNECT; } return S_OK; }
HRESULT CHttpDownloader::ReadData(_bstr_t &strBuffer) { HRESULT hr = E_FAIL; IStream *pStream = NULL; INTERNET_BUFFERS ib ={0}; ULONG ulWritten; BOOL bResult; DWORD dwErr; TCHAR buf[32]; DWORD dwBufferLength; TCHAR *szNULL = _T("\x0"); // Get file size dwBufferLength = 32*sizeof(TCHAR); if(::HttpQueryInfo(m_hRequest, HTTP_QUERY_CONTENT_LENGTH, buf, &dwBufferLength, NULL)) { m_dwTotalSize = _tcstoul(buf, &szNULL, 10); if(m_hWnd != NULL && m_nMessage != 0) ::PostMessage(m_hWnd, m_nMessage, m_dwDownloaded, m_dwTotalSize); } //Check MD5 hash if(m_request.md5 != NULL && _tcslen(m_request.md5) >= 22) { dwBufferLength = 32*sizeof(TCHAR); if(::HttpQueryInfo(m_hRequest, HTTP_QUERY_CONTENT_MD5, buf, &dwBufferLength, NULL)) { if(0 == _tcsnicmp(m_request.md5, buf, 22)) { if(m_hWnd != NULL && m_nMessage != 0) ::PostMessage(m_hWnd, m_nMessage, m_dwTotalSize, m_dwTotalSize); } return S_OK; } } hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream); if(FAILED(hr)) { return hr; } ib.lpcszHeader = NULL; ib.dwHeadersLength = NULL; ib.lpvBuffer = new TCHAR[COMMAND_BUFF_SIZE_PART]; ib.dwBufferLength = COMMAND_BUFF_SIZE_PART; ib.dwStructSize = sizeof(ib); do { ib.dwBufferLength = COMMAND_BUFF_SIZE_PART; if(m_longAbort > 0) { hr = E_ABORT; break; } m_context.op = HTTP_DOWNLOADER_OP_READ_DATA; bResult = InternetReadFileEx(m_hRequest, &ib, IRF_ASYNC | IRF_USE_CONTEXT, (DWORD)&m_context); dwErr = GetLastError(); if(!bResult && dwErr == 997) // Overlapped I/O operation is in progress. { bResult = WaitForComplete(m_dwTimeout); if(bResult) continue; } if(bResult) { if(ib.dwBufferLength) { hr = pStream->Write(ib.lpvBuffer, ib.dwBufferLength, &ulWritten); if(FAILED(hr)) { strBuffer = _T("Cannot write to stream"); break; } m_dwDownloaded += ib.dwBufferLength; if(m_hWnd != NULL && m_nMessage != 0) ::PostMessage(m_hWnd, m_nMessage, m_dwDownloaded, m_dwTotalSize); } } else { hr = E_FAIL; break; } // Sleep(1); } while(ib.dwBufferLength); if(ib.lpvBuffer) { delete[] ib.lpvBuffer; ib.lpvBuffer = NULL; } if(SUCCEEDED(hr) && pStream) { m_pStream = pStream; return hr; } else { if(pStream) pStream->Release(); pStream = NULL; } return hr; }