#include "webgate.h" #include "msobcomm.h" #include "commerr.h" extern CObCommunicationManager* gpCommMgr; HRESULT hrCallbackSet; ///////////////////////////////////////////////////////////////////////////// // CWebGate CWebGate::CWebGate() { m_pmk = NULL; m_pstm = NULL; m_pbc = NULL; m_cRef = 0; m_bstrCacheFileName = NULL; m_hEventComplete = NULL; m_hEventError = NULL; m_bstrPath = NULL; AddRef(); } CWebGate::~CWebGate() { if(m_pbc) { m_pbc->Release(); m_pbc = NULL; } FlushCache(); } // --------------------------------------------------------------------------- // CWebGate::QueryInterface // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::QueryInterface(REFIID riid, void** ppv) { HRESULT hr = E_NOINTERFACE; *ppv = NULL; if (riid == IID_IUnknown) { AddRef(); *ppv = this; hr = S_OK; } else if (riid == IID_IBindStatusCallback) { AddRef(); *ppv = (IBindStatusCallback*)this; hr = S_OK; } else if (riid == IID_IHttpNegotiate) { AddRef(); *ppv = (IHttpNegotiate*)this; hr = S_OK; } return hr; } // --------------------------------------------------------------------------- // CWebGate::AddRef // --------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CWebGate::AddRef() { return m_cRef++; } // --------------------------------------------------------------------------- // CWebGate::Release // --------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CWebGate::Release() { --m_cRef; if(m_cRef == 0) { delete this; return 0; } return m_cRef; } // --------------------------------------------------------------------------- // CWebGate::put_Path // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::put_Path(BSTR newVal) { BSTR bstrTemp = SysAllocString(newVal); if (NULL == bstrTemp) { return E_OUTOFMEMORY; } if (NULL != m_bstrPath) { SysFreeString(m_bstrPath); } m_bstrPath = bstrTemp; bstrTemp = NULL; return S_OK; } void CWebGate::FlushCache() { if(m_bstrCacheFileName) { DeleteFile(m_bstrCacheFileName); SysFreeString(m_bstrCacheFileName); m_bstrCacheFileName = NULL; } } // --------------------------------------------------------------------------- // CWebGate::FetchPage // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::FetchPage(DWORD dwDoWait, BOOL* pbRetVal) { HRESULT hr = E_FAIL; IStream* pstm = NULL; FlushCache(); if(SUCCEEDED(CreateBindCtx(0, &m_pbc)) && m_pbc) { RegisterBindStatusCallback(m_pbc, this, 0, 0L); } if(SUCCEEDED(CreateURLMoniker(NULL, m_bstrPath, &m_pmk)) && m_pmk && m_pbc) { hr = m_pmk->BindToStorage(m_pbc, 0, IID_IStream, (void**)&pstm); m_pmk->Release(); m_pmk = NULL; } if (dwDoWait) { MSG msg; DWORD dwRetCode; HANDLE hEventList[2]; m_hEventComplete = CreateEvent(NULL, TRUE, FALSE, NULL); m_hEventError = CreateEvent(NULL, TRUE, FALSE, NULL); hEventList[0] = m_hEventComplete; hEventList[1] = m_hEventError; while(TRUE) { // We will wait on window messages and also the named event. dwRetCode = MsgWaitForMultipleObjects(2, &hEventList[0], FALSE, 300000, // 5 minutes QS_ALLINPUT); if(dwRetCode == WAIT_TIMEOUT) { *pbRetVal = FALSE; break; } else if(dwRetCode == WAIT_OBJECT_0) { *pbRetVal = TRUE; break; } else if(dwRetCode == WAIT_OBJECT_0 + 1) { *pbRetVal = FALSE; break; } else { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (WM_QUIT == msg.message) { *pbRetVal = FALSE; break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } } CloseHandle(m_hEventComplete); CloseHandle(m_hEventError); m_hEventComplete = NULL; m_hEventError = NULL; } else *pbRetVal = TRUE; if(m_pbc) { m_pbc->Release(); m_pbc = NULL; } return hr; } // --------------------------------------------------------------------------- // CWebGate::get_DownloadFname // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::get_DownloadFname(BSTR *pVal) { if (pVal == NULL) return(E_POINTER); *pVal = SysAllocString(m_bstrCacheFileName); return(S_OK); } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ////// IBindStatusCallback ////// ////// ////// // --------------------------------------------------------------------------- // CWebGate::GetBindInfo // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo) { *pgrfBINDF = BINDF_PULLDATA | BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_GETNEWESTVERSION | BINDF_SILENTOPERATION | BINDF_NOWRITECACHE; pbindInfo->cbSize = sizeof(BINDINFO); pbindInfo->szExtraInfo = NULL; pbindInfo->grfBindInfoF = 0; pbindInfo->dwBindVerb = BINDVERB_GET; pbindInfo->szCustomVerb = NULL; memset(&pbindInfo->stgmedData, 0, sizeof(STGMEDIUM)); return S_OK; } HANDLE g_hFile = NULL; int g_nOBEFileCount = 0; #define HTML_TAG_BASE_REF L"" // --------------------------------------------------------------------------- // CWebGate::OnStartBinding // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnStartBinding(DWORD dwReserved, IBinding* pbinding) { WCHAR szTempFileFullName[MAX_PATH]; WCHAR szTempFileName[MAX_PATH]; if(g_hFile) CloseHandle(g_hFile); GetTempPath(MAX_PATH, szTempFileFullName); wsprintf( szTempFileName, L"OOBE%x.htm", g_nOBEFileCount++); lstrcat(szTempFileFullName, szTempFileName); if((g_hFile = CreateFile(szTempFileFullName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { return E_FAIL; } m_bstrCacheFileName = SysAllocString(szTempFileFullName); return S_OK; } // --------------------------------------------------------------------------- // CWebGate::OnStopBinding // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnStopBinding(HRESULT hrStatus, LPCWSTR pszError) { if(g_hFile) { CloseHandle(g_hFile); g_hFile = NULL; } if(S_OK == hrStatus) { if(m_hEventError) SetEvent(m_hEventComplete); else gpCommMgr->Fire_DownloadComplete(m_bstrCacheFileName); } else { if(m_hEventError) SetEvent(m_hEventError); //else // PostMessage(gpCommMgr->m_hwndCallBack, WM_OBCOMM_ONSERVERERROR, (WPARAM)0, (LPARAM)ERR_COMM_SERVER_BINDFAILED); } return S_OK; } // --------------------------------------------------------------------------- // CWebGate::OnDataAvailable // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnDataAvailable ( DWORD grfBSCF, DWORD dwSize, FORMATETC* pfmtetc, STGMEDIUM* pstgmed ) { HRESULT hr; DWORD dwActuallyRead = 0; DWORD dwWritten = 0; // Get the Stream passed if (BSCF_FIRSTDATANOTIFICATION & grfBSCF) { if (!m_pstm && pstgmed->tymed == TYMED_ISTREAM) { m_pstm = pstgmed->pstm; if (m_pstm) m_pstm->AddRef(); } } if (m_pstm && dwSize) { BYTE* pszBuff = (BYTE*)malloc(dwSize); do { dwActuallyRead = 0; // Read what we can hr = m_pstm->Read(pszBuff, dwSize, &dwActuallyRead); if (g_hFile) { WriteFile(g_hFile, pszBuff, dwActuallyRead, &dwWritten, NULL); } } while (hr == E_PENDING || hr != S_FALSE); free(pszBuff); } if (BSCF_LASTDATANOTIFICATION & grfBSCF) { if (m_pstm) { m_pstm->Release(); m_pstm = NULL; } } return S_OK; } // --------------------------------------------------------------------------- // CWebGate::OnProgress // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) { return S_OK; } // --------------------------------------------------------------------------- // CWebGate::OnObjectAvailable // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnObjectAvailable(REFIID riid, IUnknown* punk) { return E_NOTIMPL; } // --------------------------------------------------------------------------- // CWebGate::GetPriority // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::GetPriority(LONG* pnPriority) { return E_NOTIMPL; } // --------------------------------------------------------------------------- // CWebGate::OnLowResource // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnLowResource(DWORD dwReserved) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ////// IHttpNegotiate ////// ////// ////// // --------------------------------------------------------------------------- // CWebGate::BeginningTransaction // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::BeginningTransaction ( LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR* pszAdditionalHeaders ) { // Here's our opportunity to add headers if (!pszAdditionalHeaders) { return E_POINTER; } *pszAdditionalHeaders = NULL; return NOERROR; } // --------------------------------------------------------------------------- // CWebGate::BeginningTransaction // --------------------------------------------------------------------------- STDMETHODIMP CWebGate::OnResponse ( DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR* pszAdditionalRequestHeaders) { if (!pszAdditionalRequestHeaders) { return E_POINTER; } *pszAdditionalRequestHeaders = NULL; return NOERROR; }