#ifndef _WEBJIT_H_ #define _WEBJIT_H_ #include #define WM_DOWNLOAD_DONE WM_USER + 11 #define WM_SETUP_ERROR WM_USER + 12 #define WM_DOWNLOAD_ERROR WM_USER + 13 #define WM_PROCESS_ERROR WM_USER + 14 #define WM_INTERNAL_ERROR WM_USER + 15 #define WM_START_TIMER WM_USER + 16 #define WM_DONT_WAIT WM_USER + 17 #define WM_DATA_AVAILABLE WM_USER + 18 #define SUCCESS 0 // Component successfully downloaded and installed #define CANCELLED 2 // User canceled dialog #define NEVERASK 3 // User requested never to be asked to d/l this component again #define NO_MIME_MATCH 11 #define NO_EXT_MATCH 12 #define EXEC_ERROR 13 #define TIMER_EXEC_POLL 1 #define TIMER_EXEC_POLL_INTERVAL 1000 #define TIMER_DOWNLOAD 2 #define TIMER_DOWNLOAD_INTERVAL 10 typedef enum { WJSTATE_INIT, // obj constructed WJSTATE_BINDING, // download in progress WJSTATE_DOWNLOADED, // OnStopBinding called WJSTATE_FINISHED_READ, // all data read WJSTATE_VERIFYING, // into VerifyTrust call WJSTATE_READY_TO_EXEC, // read to shell exec. WJSTATE_WAITING_PROCESS, // Start DoSetup WJSTATE_DONE, // all done, ready to free obj } WJSTATE; class CWebJit; typedef struct _WebJitParam { LPCSTR lpszResource; DWORD dwFlags; LPCWSTR pwszComponentId; CWebJit* pWebJit; HWND hWndParent; QUERYCONTEXT *pQueryInstalled; } WEBJIT_PARAM; extern IInternetSecurityManager* g_pSecurityManager; class CWebJit : public IBindStatusCallback , public IAuthenticate , public IInternetHostSecurityManager { private: // data members BOOL m_fInited; HMODULE m_hWintrustMod; BOOL m_fInitedCC; HMODULE m_hComCtlMod; DWORD m_dwFlags; LPCWSTR m_pwszComponentId; HWND m_hWndParent; QUERYCONTEXT* m_pQueryInstalled; DWORD m_cRef; DWORD m_dwTotal; DWORD m_dwCurrent; LPCSTR m_szResource; //don't own: don't free. LPWSTR m_pwszUrl; DWORD m_dwDownloadSpeed; IBindCtx* m_pbc; IMoniker* m_pMk; IStream* m_pStm; IBinding* m_pBinding; HWND m_hDialog; HANDLE m_hProcess; HANDLE m_hCacheFile; DWORD m_dwRetVal; HRESULT m_hDownloadResult; BOOL m_fResultIn; WJSTATE m_State; BOOL m_fAborted; BOOL m_fCalledAbort; HRESULT m_hrInternal; LPWSTR m_pwszMimeType; LPWSTR m_pwszRedirectUrl; LPWSTR m_pwszCacheFile; BOOL m_fHtml; BOOL m_fDownloadInited; #define TEMPREADBUFFERSIZE 8192 CHAR* m_pTempBuffer; BOOL m_bReading; BOOL m_bStartedReadTimer; public: // constructors/destructors CWebJit(WEBJIT_PARAM* pWebJitParam); ~CWebJit(); VOID ReleaseAll(); // IUnknown methods STDMETHODIMP QueryInterface(REFIID riid, void ** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IBindStatusCallback methods STDMETHODIMP OnStartBinding(DWORD dwReserved, IBinding* pbinding); STDMETHODIMP GetPriority(LONG* pnPriority) { return S_OK; } STDMETHODIMP OnLowResource(DWORD dwReserved) { return S_OK; } STDMETHODIMP OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR pwzStatusText); STDMETHODIMP OnStopBinding(HRESULT hrResult, LPCWSTR szError); STDMETHODIMP GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo); STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, STGMEDIUM* pstgmed); STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown* punk); // IAuthenticate methods STDMETHODIMP Authenticate(HWND* phwnd, LPWSTR *pszUsername,LPWSTR *pszPassword); // IInternetHostSecurityManager STDMETHODIMP GetSecurityId( BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) { DEBUG_ENTER((DBG_DOWNLOAD, Hresult, "CWebJit::GetSecurityId", "this=%#x", this )); HRESULT hr = E_FAIL; IInternetSecurityManager *pSecMgr = g_pSecurityManager; if (pSecMgr) { hr = pSecMgr->GetSecurityId(m_pwszUrl, pbSecurityId, pcbSecurityId, dwReserved); } DEBUG_LEAVE(hr); return hr; } STDMETHODIMP ProcessUrlAction( DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved) { DEBUG_ENTER((DBG_DOWNLOAD, Hresult, "CWebJit::ProcessUrlAction", "this=%#x, %d(%#x)", this, dwAction, dwAction )); HRESULT hr = E_FAIL; IInternetSecurityManager *pSecMgr = g_pSecurityManager; if (pSecMgr) { hr = pSecMgr->ProcessUrlAction(m_pwszUrl, dwAction, pPolicy, cbPolicy, pContext, cbContext, dwFlags, dwReserved); } DEBUG_LEAVE(hr); return hr; } STDMETHODIMP QueryCustomPolicy( REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved) { DEBUG_ENTER((DBG_DOWNLOAD, Hresult, "CWebJit::ProcessUrlAction", "this=%#x", this )); HRESULT hr = E_FAIL; IInternetSecurityManager *pSecMgr = g_pSecurityManager; if (pSecMgr) { hr = pSecMgr->QueryCustomPolicy(m_pwszUrl, guidKey, ppPolicy, pcbPolicy, pContext, cbContext, dwReserved); } DEBUG_LEAVE(hr); return hr; } VOID UpdateDownloadResult(HRESULT hr, BOOL fFromOnStopBinding); VOID ProcessFile(); HRESULT SetupDownload(); HRESULT StartDownload(); HRESULT ExecFile(); HRESULT DisplayError(HRESULT hr, UINT nMsgError); HRESULT VerifyMimeAndExtension(); BOOL NeedHostSecMgr(); HRESULT VerifyTrust(BOOL fUseHostSecMgr); BOOL IsConnected(BOOL* pfIsOffline); VOID ProcessAbort(); VOID Terminate(DWORD iRetVal); HRESULT CanWebJit(); BOOL SetupWindow(); DWORD GetDownloadSpeed(); BOOL UpdateProgressUI(); VOID UpdateStatusString(); VOID ReadData(); BOOL IsReadTimerStarted() { return m_bStartedReadTimer; } VOID SetReadTimerStarted() { m_bStartedReadTimer = TRUE; } VOID SetState(WJSTATE state) { m_State = state; } WJSTATE GetState() { return m_State; } HANDLE GetProcessHandle() { return m_hProcess; } VOID SetWindowHandle(HWND hDlg) { m_hDialog = hDlg; } DWORD GetResult() { return m_dwRetVal; } LPCWSTR GetComponentIdName() { return m_pwszComponentId; } BOOL IsDownloadInited() { return m_fDownloadInited; } VOID SetDownloadInited() { m_fDownloadInited = TRUE; } BOOL IsAborted() { return m_fAborted; } // to delayload InitCommonControlsEx HRESULT InitCC(void); #define DELAYCCAPI(_fn, _args, _nargs, ret) \ ret _fn _args \ { \ HRESULT hres; \ ret retval = 0; \ hres = InitCC(); \ if (SUCCEEDED(hres) && (_pfn##_fn)) \ { \ retval = _pfn##_fn _nargs; \ } \ return retval; \ } \ ret (STDAPICALLTYPE* _pfn##_fn) _args; DELAYCCAPI(InitCommonControlsEx, (LPINITCOMMONCONTROLSEX lpInitCtrls), (lpInitCtrls), BOOL); BOOL CWebJit::InitCommonControlsForWebJit(); // to delayload WinVerifyTrust HRESULT Init(void); #define DELAYWVTAPI(_fn, _args, _nargs) \ HRESULT _fn _args { \ HRESULT hres = Init(); \ if (SUCCEEDED(hres)) { \ hres = _pfn##_fn _nargs; \ } \ return hres; } \ HRESULT (STDAPICALLTYPE* _pfn##_fn) _args; DELAYWVTAPI(WinVerifyTrust, (HWND hwnd, GUID * ActionID, LPVOID ActionData), (hwnd, ActionID, ActionData)); }; INT_PTR CALLBACK WebJitProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); #endif _WEBJIT_H_