⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wininetconnector.cpp

📁 Windows CE 6.0 Server 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//+----------------------------------------------------------------------------
//
//
// File:
//      WinInetConnector.cpp
//
// Contents:
//
//      CWinInetConnector class implementation
//
//-----------------------------------------------------------------------------

#include "Headers.h"
#include "strsafe.h"

#ifdef UNDER_CE
#include "WinCEUtils.h"
#endif


////////////////////////////////////////////////////////////////////////////////////////////////////
// static member initialization
////////////////////////////////////////////////////////////////////////////////////////////////////

const WCHAR CWinInetConnector::s_szSoapAction[]    = L"SOAPAction: ";
const WCHAR CWinInetConnector::s_szNewLine[]       = L"\r\n";
const WCHAR CWinInetConnector::s_Quote             = '"';

////////////////////////////////////////////////////////////////////////////////////////////////////
//  Error Map
////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef _DEBUG
#define WEE(wi, hr) { HRESULT_FROM_WIN32(wi), hr , __LINE__ },
#else
#define WEE(wi, hr) { HRESULT_FROM_WIN32(wi), hr },
#endif

static HResultMapEntry g_WinInetHResultMapEntries[] = 
{
    WEE(ERROR_INTERNET_OUT_OF_HANDLES,                    CONN_E_HTTP_OUTOFMEMORY)
    WEE(ERROR_INTERNET_TIMEOUT,                           CONN_E_HTTP_TIMEOUT)
    WEE(ERROR_INTERNET_EXTENDED_ERROR,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INTERNAL_ERROR,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INVALID_URL,                       CONN_E_HTTP_BAD_URL)
    WEE(ERROR_INTERNET_UNRECOGNIZED_SCHEME,               CONN_E_HTTP_BAD_URL)
    WEE(ERROR_INTERNET_NAME_NOT_RESOLVED,                 CONN_E_HTTP_HOST_NOT_FOUND)
    WEE(ERROR_INTERNET_PROTOCOL_NOT_FOUND,                CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INVALID_OPTION,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_BAD_OPTION_LENGTH,                 CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_OPTION_NOT_SETTABLE,               CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_SHUTDOWN,                          CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INCORRECT_USER_NAME,               CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INCORRECT_PASSWORD,                CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_LOGIN_FAILURE,                     CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INVALID_OPERATION,                 CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_OPERATION_CANCELLED,               CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INCORRECT_HANDLE_TYPE,             CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INCORRECT_HANDLE_STATE,            CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_NOT_PROXY_REQUEST,                 CONN_E_HTTP_CANNOT_USE_PROXY)
    WEE(ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND,          CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_BAD_REGISTRY_PARAMETER,            CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_NO_DIRECT_ACCESS,                  CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_NO_CONTEXT,                        CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_NO_CALLBACK,                       CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_REQUEST_PENDING,                   CONN_E_HTTP_OVERLOADED)
    WEE(ERROR_INTERNET_INCORRECT_FORMAT,                  CONN_E_HTTP_BAD_REQUEST)
    WEE(ERROR_INTERNET_ITEM_NOT_FOUND,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_CANNOT_CONNECT,                    CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_CONNECTION_ABORTED,                CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_CONNECTION_RESET,                  CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_FORCE_RETRY,                       CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INVALID_PROXY_REQUEST,             CONN_E_HTTP_BAD_REQUEST)
    WEE(ERROR_INTERNET_NEED_UI,                           CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_HANDLE_EXISTS,                     CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_SEC_CERT_DATE_INVALID,             CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_SEC_CERT_CN_INVALID,               CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR,            CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR,            CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_MIXED_SECURITY,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_CHG_POST_IS_NON_SECURE,            CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_POST_IS_NON_SECURE,                CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,           CONN_E_HTTP_CLIENT_AUTH_CERT_NEEDED)
    WEE(ERROR_INTERNET_INVALID_CA,                        CONN_E_HTTP_BAD_CERT_AUTHORITY)
    WEE(ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP,             CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_ASYNC_THREAD_FAILED,               CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_REDIRECT_SCHEME_CHANGE,            CONN_E_HTTP_UNSPECIFIED)
#ifndef UNDER_CE
    WEE(ERROR_INTERNET_DIALOG_PENDING,                    CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_RETRY_DIALOG,                      CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR,           CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_INSERT_CDROM,                      CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED,             CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_SEC_CERT_ERRORS,                   CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_SEC_CERT_NO_REV,                   CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_SEC_CERT_REV_FAILED,               CONN_E_HTTP_BAD_CERTIFICATE)
#endif 

    WEE(ERROR_HTTP_HEADER_NOT_FOUND,                      CONN_E_HTTP_HOST_NOT_FOUND)
    WEE(ERROR_HTTP_DOWNLEVEL_SERVER,                      CONN_E_HTTP_BAD_RESPONSE)
    WEE(ERROR_HTTP_INVALID_SERVER_RESPONSE,               CONN_E_HTTP_BAD_RESPONSE)
    WEE(ERROR_HTTP_INVALID_HEADER,                        CONN_E_HTTP_PARSE_RESPONSE)
    WEE(ERROR_HTTP_INVALID_QUERY_REQUEST,                 CONN_E_HTTP_BAD_REQUEST)
    WEE(ERROR_HTTP_HEADER_ALREADY_EXISTS,                 CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_HTTP_REDIRECT_FAILED,                       CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_SECURITY_CHANNEL_ERROR,            CONN_E_HTTP_SSL_ERROR)
    WEE(ERROR_INTERNET_UNABLE_TO_CACHE_FILE,              CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_TCPIP_NOT_INSTALLED,               CONN_E_HTTP_CONNECT_FAILED)

    WEE(ERROR_HTTP_NOT_REDIRECTED,                        CONN_E_HTTP_UNSPECIFIED)
#ifndef UNDER_CE
    WEE(ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION,             CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_HTTP_COOKIE_DECLINED,                       CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_DISCONNECTED,                      CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_SERVER_UNREACHABLE,                CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_PROXY_SERVER_UNREACHABLE,          CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT,             CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT,         CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION,           CONN_E_HTTP_UNSPECIFIED)
    WEE(ERROR_INTERNET_SEC_INVALID_CERT,                  CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_SEC_CERT_REVOKED,                  CONN_E_HTTP_BAD_CERTIFICATE)
    WEE(ERROR_INTERNET_FAILED_DUETOSECURITYCHECK,         CONN_E_ACCESS_DENIED)
    WEE(ERROR_INTERNET_NOT_INITIALIZED,                   CONN_E_HTTP_CONNECT_FAILED)
    WEE(ERROR_INTERNET_NEED_MSN_SSPI_PKG,                 CONN_E_HTTP_UNSPECIFIED)

    WEE(ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY, CONN_E_HTTP_UNSPECIFIED)
#else
    WEE(0,                                                S_OK)
#endif 
};

static HResultMap g_WinInetHResultMap =
{
    countof(g_WinInetHResultMapEntries),
    g_WinInetHResultMapEntries,
    CONN_E_HTTP_UNSPECIFIED
#ifdef _DEBUG
    , __FILE__
#endif
};


////////////////////////////////////////////////////////////////////////////////////////////////////
//  Interface Map
////////////////////////////////////////////////////////////////////////////////////////////////////

TYPEINFOIDSFORCLASS(CHttpConnBase, ISoapConnector, MSSOAPLib)

BEGIN_INTERFACE_MAP(CWinInetConnector)
    ADD_IUNKNOWN(CWinInetConnector, ISoapConnector)
    ADD_INTERFACE(CWinInetConnector, ISoapConnector)
    ADD_INTERFACE(CWinInetConnector, IDispatch)
END_INTERFACE_MAP(CWinInetConnector)

////////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CWinInetConnector::CWinInetConnector
//
//  parameters:
//
//  description:
//
//  returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
CWinInetConnector::CWinInetConnector()
: m_hInternet(0),
#ifndef UNDER_CE
  m_hConnect(0),
  m_hRequest(0),
#endif 
  m_pRequest(0),
  m_pResponse(0)
{
#ifdef UNDER_CE
    m_hConnect = 0;
    m_hRequest = 0;
#endif /* UNDER_CE */


#ifdef _DEBUG
    m_dwTimeout = 0x1FFFFFFF;       // is int, not DWORD in WinInet
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CWinInetConnector::~CWinInetConnector
//
//  parameters:
//
//  description:
//
//  returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
CWinInetConnector::~CWinInetConnector()
{
    ::ReleaseInterface((const CWinInetRequestStream*&)m_pRequest);
    ::ReleaseInterface((const CWinInetResponseStream*&)m_pResponse);

    CWinInetConnector::ShutdownConnection();
}
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
//  function: STDMETHODIMP CWinInetConnector::get_InputStream(IStream **pVal)
//
//  parameters:
//
//  description:
//
//  returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::get_InputStream(IStream **pVal)
{
    if (! pVal)
        return E_INVALIDARG;

    HRESULT hr = S_OK;

    *pVal = 0;

    if (! m_pRequest)
    {
        m_pRequest = new CSoapOwnedObject<CWinInetRequestStream>(INITIAL_REFERENCE);

        if (! m_pRequest)
        {
            hr = E_OUTOFMEMORY;
            goto Cleanup;
        }

        hr = m_pRequest->set_Owner(this);
    }

    m_pRequest->AddRef();
    *pVal = m_pRequest;

Cleanup:
    return hr;
}
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
//  function: STDMETHODIMP CWinInetConnector::get_OutputStream(IStream **pVal)
//
//  parameters:
//
//  description:
//
//  returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::get_OutputStream(IStream **pVal)
{
    if (! pVal)
        return E_INVALIDARG;

    HRESULT hr = S_OK;

    *pVal = 0;

    if (! m_pResponse)
    {
        m_pResponse = new CSoapOwnedObject<CWinInetResponseStream>(INITIAL_REFERENCE);

        if (! m_pResponse)
        {
            hr = E_OUTOFMEMORY;
            goto Cleanup;
        }

        hr = m_pResponse->set_Owner(this);
    }

    m_pResponse->AddRef();
    *pVal = m_pResponse;

Cleanup:
    return hr;
}
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
//  function: STDMETHODIMP CWinInetConnector::EstablishConnection()
//
//  parameters:
//
//  description:
//
//  returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::EstablishConnection()
{
    HINTERNET           hInternet   = 0;
#ifndef UNDER_CE
    HINTERNET           hConnect    = 0;
#endif 
    HRESULT             hr          = S_OK;
    HINTERNET           hTemp = NULL;

    BSTR                pProxyUrl   = 0;
#ifndef UNDER_CE    
    INTERNET_PROXY_INFO proxy;
#endif 

#ifdef DEBUG
    DWORD dbg_dwError;
    WCHAR dbg_pszError[1000];
    DWORD dbg_bufLen = 1000;
#endif
    
    if (!m_Url.HostName())
    {
        hr = E_INVALIDARG;
        goto Cleanup;
    }

    CHK(GetProxyURL(&pProxyUrl));

    if (m_bUseProxy)
    {
#ifndef UNDER_CE
        if (pProxyUrl)
            hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_PROXY, pProxyUrl, 0, 0);
        else
            hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
#else
        if (pProxyUrl)
            hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_PROXY, pProxyUrl, 0, INTERNET_FLAG_ASYNC);
        else
            hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC);
#endif 
    }
    else
    {
#ifndef UNDER_CE
        hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
#else
        hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_ASYNC);
#endif 
    }
    CHK_BOOL(hInternet != 0, MAP_WININET_ERROR());
    TRACE(("InternetOpen ==> hInternet == (0x%08X)\n", hInternet));

#ifndef UNDER_CE
    hConnect = ::InternetConnectW(hInternet, m_Url.HostName(), m_Url.Port(), 0, 0, INTERNET_SERVICE_HTTP, 0, 0);
    CHK_BOOL(hConnect, MAP_WININET_ERROR());
    TRACE(("InternetConnect ==> hConnect == (0x%08X)\n", hConnect));
#else
    hTemp = ::InternetConnectW(hInternet, m_Url.HostName(), m_Url.Port(), 0, 0, INTERNET_SERVICE_HTTP, 0, reinterpret_cast<DWORD>(&m_hConnect)); 
#if DEBUG

    if(NULL == hTemp && InternetGetLastResponseInfo(&dbg_dwError, dbg_pszError, &dbg_bufLen))
    {
        OutputDebugString(L"ERROR!! -- InternetConnectW FAILED!");
        OutputDebugString(dbg_pszError);
    }
#endif
    CHK_BOOL(hTemp, MAP_WININET_ERROR());
    m_hConnect = hTemp;
    TRACE(("InternetConnect ==> hConnect == (0x%08X)\n", m_hConnect));
#endif 

    m_hInternet = hInternet; hInternet = 0;
#ifndef UNDER_CE
    m_hConnect  = hConnect;  hConnect  = 0;
#endif 

    ASSERT(m_hRequest == 0);
    m_hRequest  = 0;

Cleanup:
    if (hInternet)
    {
        ::InternetCloseHandle(hInternet);
    }
#ifndef UNDER_CE
    if (hConnect)
    {
        ::InternetCloseHandle(hInternet);
    }
    ::SysFreeString(pProxyUrl);
#endif 
    return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -