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

📄 myienshandle.cpp

📁 1.MyIE开源工程协议 MyIE开源工程遵循GNU通用公共许可证GPL(GNU General Public License)开发,任何人都可以永久免费安装使用,在你下载和使用MyIE源代码前,请
💻 CPP
字号:
// MyIENSHandle.cpp : Implementation of CMyIEApp and DLL registration.

#include "stdafx.h"
#include "MyIE.h"
#include "MyIENSHandle.h"
#include "afxmt.h"
#include "MainFrm.h"

/////////////////////////////////////////////////////////////////////////////
//
BYTE bytePlaceHold[] = {0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00,
						0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
						0xFF, 0xFF, 0xFF, 0x21, 0xF9, 0x04, 0x01, 0x00,
						0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00,
						0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x01, 0x44,
						0x00, 0x3B
};

CMyIENSHandle::CMyIENSHandle()
{
}

STDMETHODIMP CMyIENSHandle::Start(
        LPCWSTR szUrl,
        IInternetProtocolSink *pIProtSink,
        IInternetBindInfo *pIBindInfo,
        DWORD grfSTI,
        DWORD dwReserved)
{
	// Should we do the following or always fail? How can we continue if parsing failed?
	try{

	//dialog filter
	if (pmf->m_bUseDialogFilter && !PRESS_CTRL)
	{
		HRESULT hr;
		DWORD m_bindf;
		BINDINFO m_bindinfo;
		m_bindinfo.cbSize = sizeof(BINDINFO);
		hr = pIBindInfo->GetBindInfo(&m_bindf, &m_bindinfo);
		if (m_bindf == 0x100083)
		{
			CString strUrl(szUrl);
			//m_strLastNavUrl = view-source:http://127.0.0.1/forum/includes/default_javascript.js
			if (pmf->m_strLastNavUrl.Find(strUrl)==-1)
			{
				BOOL bFilter = TRUE;
				//must use pop list, for that ConfirmPopupFilter may add to pop list
				if (!pmf->NeedUnPopFilter(strUrl))
					bFilter = FALSE;
				//some special url
				else if (strUrl.Right(4)==".xsl" || strUrl.Right(4)==".htc")
					bFilter = FALSE;
				if (pmf->m_bNotFilterClickDialog)
				{
					//now MDIGetActive may not current child frame
					int nCurSel = pmf->m_wndTab.GetCurSel();
					if (nCurSel>=0)
					{
						TCITEM TabCtrlItem;
						TabCtrlItem.mask = TCIF_PARAM;
						pmf->m_wndTab.GetItem(nCurSel, &TabCtrlItem);
						if(TabCtrlItem.lParam)
						{
							CChildFrame* tcf = (CChildFrame*)TabCtrlItem.lParam;
							if (tcf && tcf->m_pView)
							{
								LARGE_INTEGER liFinish;
								LARGE_INTEGER liFreq;
								QueryPerformanceCounter(&liFinish);
								QueryPerformanceFrequency(&liFreq);
								double secs = (double)(liFinish.LowPart - tcf->m_pView->m_tLastClick.LowPart)/(double)liFreq.LowPart;
								if (secs < pmf->m_nPopDelay)
									bFilter = FALSE;
							}
						}
					}
				}
				//confirm
				if (bFilter)
				{
					if (pmf->ConfirmPopupFilter(strUrl, TRUE))
					{
						pmf->AddToPopList(strUrl, 3);
						pmf->m_nDialogFilterCount++;
						//must only do this, do more will have quit problem
						if (pIProtSink)
							pIProtSink->ReportResult(S_OK, 0, 0);
						return S_OK;
					}
				}
			}
		}
	}
	//better place after dialog filter
	//if some dialog url filter by this, will pop a blank window
	if(pmf->m_bUseUrlFilter && !pmf->m_bUrlFilterDirty)
	{
		BOOL bFilter = FALSE;
		CString strUrl(szUrl);
		strUrl.MakeLower();

		bFilter = pmf->NeedUrlFilter(strUrl);
		if(bFilter)
		{
			if (pmf->m_bOutputSaveUrlFilter)
			{
				CString strMsg;
				LOADSTR(strMsg ,IDS_URL_FILTER);
				strMsg += strUrl;
				pmf->AddToCollector(strMsg,15);
			}
			if(pIProtSink!=NULL)
			{
				m_pProtSink = pIProtSink;
				m_pProtSink->AddRef();
				m_pProtSink->ReportData(BSCF_FIRSTDATANOTIFICATION || BSCF_LASTDATANOTIFICATION || BSCF_DATAFULLYAVAILABLE, 42, 42);
				m_pProtSink->ReportResult(S_OK, 0, 0);
				m_pProtSink->Release();
				m_pProtSink = NULL;
			}
			return S_OK;
		}
	}

	}catch(...){}

	return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
}

STDMETHODIMP CMyIENSHandle::Continue(PROTOCOLDATA *pStateInfo)
{
	return S_OK;
}

STDMETHODIMP CMyIENSHandle::Abort(HRESULT hrReason,DWORD dwOptions)
{
	return E_NOTIMPL;
}

STDMETHODIMP CMyIENSHandle::Terminate(DWORD dwOptions)
{
	return  S_OK;
}

STDMETHODIMP CMyIENSHandle::Suspend()
{
ATLTRACENOTIMPL("Suspend\n");

	return E_NOTIMPL;
}

STDMETHODIMP CMyIENSHandle::Resume()
{
ATLTRACENOTIMPL("Resume\n");
	
	return E_NOTIMPL;
}

// IInternetProtocol::Read
// -----------------------

// This is how URLMON asks us for data. As we report data on the protocol sink,
// URLMON will periodically ask us for data via this method.

// How URLMON asks for data will not always correlate directly to what data is
// reported.

// Do not expect to see 1 and only 1 Read method for each time data is reported
// to the protocol sink (give URLMON what it asks for if you can.)

// Expect that extra read calls may come in after all the data in the buffer has
// been read (continue to return S_FALSE.)

// The amount requested may sometimes be much more than what was reported. URLMON
// typically looks for data in 4k buffers, but do not depend on this.

STDMETHODIMP CMyIENSHandle::Read(void *pv, ULONG cb, ULONG *pcbRead)
{
	try{

	if(cb>=42 && pv!=NULL)
	{
		memcpy(pv, bytePlaceHold, 42);
		*pcbRead =	42;
	}
	else
		*pcbRead = 0;

	}catch(...){}

	return S_FALSE;
}

STDMETHODIMP CMyIENSHandle::Seek(
        LARGE_INTEGER dlibMove,
        DWORD dwOrigin,
        ULARGE_INTEGER *plibNewPosition)
{
ATLTRACENOTIMPL("Seek\n");
	
	return E_NOTIMPL;
}

STDMETHODIMP CMyIENSHandle::LockRequest(DWORD dwOptions)
{
ATLTRACE(_T("LockRequest\n"));


	return S_OK;
}

STDMETHODIMP CMyIENSHandle::UnlockRequest()
{
ATLTRACE(_T("UnlockRequest\n"));

	return S_OK;
}


STDMETHODIMP CMyIENSHandle::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags,
	LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
{
ATLTRACE(_T("CombineURL\n"));

	return INET_E_DEFAULT_ACTION;
}

STDMETHODIMP CMyIENSHandle::CompareUrl(LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
{
ATLTRACE(_T("CompareUrl\n"));

	// Ignoring dwCompareFlags
	if (0 == wcscmp(pwzUrl1, pwzUrl2))
		return S_OK;
	else
		return S_FALSE;
}

// IInternetProtocolInfo::ParseUrl
// -------------------------------
//
// Unlike the other methods of IIPI, ParseUrl is worthy of note:
//
// 1. ParseUrl is used in many HTML-based security checks. If you seem to be having a security
//    problem with your own protocol, it is probably due to your ParseUrl implementation.
//
// 2. ParseUrl is called many many times, even when the protocol is not doing a bind. Be aware
//    that this is used as a "general utility" function by IE for parsing and checking on URLs.
//    For example, mousing over a hyperlink to a X-DB2XML URL will cause MSHTML to call
//    CoInternetParseUrl 2 or more times. Every call will cocreate a new instance of this protocol
//    handler object, call IIPI::ParseUrl, and destroy the protocol handler instance.

// Our protocol handler "cheats". We pretend that the URL we were passed as the UDL file path is
// actually our URL. This allows us to easily map ourselves to the HTTP(S) protocol so that HTML
// pages served by HTTP(S) don't continually run into security problems with our protocol. Normally
// it is Against The Rules for web pages to access data across domains or between different protocols.

STDMETHODIMP CMyIENSHandle::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags,
	LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
{
ATLTRACE(_T("ParseUrl\n"));

//	HRESULT hr = CoInternetParseUrl(m_url, ParseAction, dwParseFlags, pwzResult, dwUrlLen, pcchResult, dwReserved);

	return INET_E_DEFAULT_ACTION;
}

// TODO: Implement queryinfo against xml result set... not UDL file
STDMETHODIMP CMyIENSHandle::QueryInfo( LPCWSTR pwzUrl, QUERYOPTION QueryOption, DWORD dwQueryFlags,
	LPVOID pBuffer, DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved)
{
ATLTRACE(_T("QueryInfo\n"));

	return INET_E_DEFAULT_ACTION;
}

⌨️ 快捷键说明

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