00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsShellBrowsersEvents.h"
00009
00010 #ifdef _DEBUG
00011 #define new DEBUG_NEW
00012 #undef THIS_FILE
00013 static char THIS_FILE[] = __FILE__;
00014 #endif
00015
00016 IMPLEMENT_DYNCREATE(fsShellBrowsersEvents, CCmdTarget)
00017
00018 fsShellBrowsersEvents::fsShellBrowsersEvents()
00019 {
00020 m_pfnEvents = NULL;
00021 EnableAutomation ();
00022 m_pWBRoot = NULL;
00023 m_bDetaching = false;
00024 }
00025
00026 fsShellBrowsersEvents::~fsShellBrowsersEvents()
00027 {
00028 Detach ();
00029 }
00030
00031 BEGIN_MESSAGE_MAP(fsShellBrowsersEvents, CCmdTarget)
00032
00033
00034
00035 END_MESSAGE_MAP()
00036
00037 BEGIN_DISPATCH_MAP(fsShellBrowsersEvents, CCmdTarget)
00038 DISP_FUNCTION_ID(fsShellBrowsersEvents, "BeforeNavigate2",DISPID_BEFORENAVIGATE2,OnBeforeNavigate, VT_EMPTY, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
00039 DISP_FUNCTION_ID(fsShellBrowsersEvents, "DownloadBegin",DISPID_DOWNLOADBEGIN,OnDownloadBegin, VT_EMPTY, VTS_NONE)
00040 DISP_FUNCTION_ID(fsShellBrowsersEvents, "DownloadComplete",DISPID_DOWNLOADCOMPLETE,OnDownloadComplete, VT_EMPTY, VTS_NONE)
00041 DISP_FUNCTION_ID(fsShellBrowsersEvents, "DocumentComplete", DISPID_DOCUMENTCOMPLETE, OnDocumentComplete, VT_EMPTY, VTS_DISPATCH VTS_PVARIANT)
00042 DISP_FUNCTION_ID(fsShellBrowsersEvents, "NavigateComplete2", DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2, VT_EMPTY, VTS_DISPATCH VTS_PVARIANT)
00043 END_DISPATCH_MAP()
00044
00045 HRESULT fsShellBrowsersEvents::Attach(SHDocVw::IShellWindowsPtr& spSHWnds)
00046 {
00047 if (m_bDetaching)
00048 return S_FALSE;
00049
00050 if (is_Attached ())
00051 Detach ();
00052
00053 LONG cItems = spSHWnds->GetCount ();
00054 HRESULT hr;
00055
00056 for (LONG i = 0; i < cItems; i++)
00057 {
00058 try {
00059 IDispatchPtr spDisp;
00060 _variant_t va (i, VT_I4);
00061
00062 spDisp = spSHWnds->Item (va);
00063
00064 SHDocVw::IWebBrowser2Ptr spBrowser (spDisp);
00065
00066 if (spBrowser == NULL)
00067 continue;
00068
00069 fsShellBrowsersEvents* pBrowser = new fsShellBrowsersEvents;
00070
00071 hr = pBrowser->Attach (spBrowser);
00072
00073 if (FAILED (hr))
00074 {
00075 delete pBrowser;
00076 return hr;
00077 }
00078
00079 pBrowser->SetEventFunc (m_pfnEvents, m_lpEventsParam);
00080
00081 m_vBrowsers.add (pBrowser);
00082 }
00083 catch (...) {}
00084 }
00085
00086 return S_OK;
00087 }
00088
00089 HRESULT fsShellBrowsersEvents::Attach(SHDocVw::IWebBrowser2Ptr& spBrowser)
00090 {
00091 if (m_bDetaching)
00092 return S_FALSE;
00093
00094 IConnectionPointContainerPtr spConnPtContr;
00095 HRESULT hr;
00096
00097 hr = spBrowser->QueryInterface (IID_IConnectionPointContainer, (LPVOID*) &spConnPtContr);
00098 if (FAILED (hr))
00099 return hr;
00100
00101 hr = spConnPtContr->FindConnectionPoint (__uuidof (SHDocVw::DWebBrowserEvents2), &m_spConnPt);
00102 if (FAILED (hr))
00103 return hr;
00104
00105 hr = m_spConnPt->Advise (GetIDispatch (FALSE), &m_dwCookie);
00106
00107 if (SUCCEEDED (hr))
00108 m_spWB = spBrowser;
00109
00110 return hr;
00111 }
00112
00113 void fsShellBrowsersEvents::Detach()
00114 {
00115 m_bDetaching = true;
00116
00117 try {
00118
00119 if (m_vBrowsers.size () != 0)
00120 {
00121 for (int i = 0; i < m_vBrowsers.size (); i++)
00122 m_vBrowsers [i]->SetEventFunc (NULL, 0);
00123
00124 for (i = 0; i < m_vBrowsers.size (); i++)
00125 {
00126 m_vBrowsers [i]->Detach ();
00127 delete m_vBrowsers [i];
00128 }
00129
00130 m_vBrowsers.clear ();
00131 }
00132 else
00133 {
00134 if (m_spConnPt != NULL)
00135 {
00136 m_spConnPt->Unadvise (m_dwCookie);
00137 m_spConnPt = NULL;
00138 }
00139 }
00140
00141 }catch (...) {}
00142
00143 m_bDetaching = false;
00144 }
00145
00146 void fsShellBrowsersEvents::OnBeforeNavigate(LPDISPATCH, VARIANT *vtUrl, VARIANT *, VARIANT *, VARIANT *, VARIANT *, BOOL* pbCancel)
00147 {
00148 _bstr_t bstrUrl = vtUrl->bstrVal;
00149 *pbCancel = Event (SBE_BEFORENAVIGATE, (DWORD)(LPCSTR) bstrUrl) == FALSE;
00150 }
00151
00152 void fsShellBrowsersEvents::OnDownloadBegin()
00153 {
00154 Event (SBE_DLBEGIN);
00155 }
00156
00157 void fsShellBrowsersEvents::OnDownloadComplete()
00158 {
00159 Event (SBE_DLCOMPLETE);
00160 }
00161
00162 void fsShellBrowsersEvents::SetEventFunc(fntSHBrowserEvent pfn, LPVOID lpParam)
00163 {
00164 m_pfnEvents = pfn;
00165 m_lpEventsParam = lpParam;
00166
00167 for (int i = 0; i < m_vBrowsers.size (); i++)
00168 m_vBrowsers [i]->SetEventFunc (pfn, lpParam);
00169 }
00170
00171 BOOL fsShellBrowsersEvents::Event(fsSHBrowserEvent ev, DWORD dwInfo)
00172 {
00173 if (m_bDetaching || is_Attached () == FALSE)
00174 return FALSE;
00175
00176 if (m_pfnEvents)
00177 return m_pfnEvents (this, ev, dwInfo, m_lpEventsParam);
00178
00179 return TRUE;
00180 }
00181
00182 BOOL fsShellBrowsersEvents::is_Attached()
00183 {
00184 return m_spConnPt != NULL || m_vBrowsers.size () != 0;
00185 }
00186
00187 IWebBrowser2* fsShellBrowsersEvents::get_WB()
00188 {
00189 return m_spWB;
00190 }
00191
00192 void fsShellBrowsersEvents::OnDocumentComplete(LPDISPATCH pDisp, VARIANT *URL)
00193 {
00194 if (m_pWBRoot == pDisp)
00195 {
00196 Event (SBE_DOCUMENTCOMPLETE);
00197 m_pWBRoot = NULL;
00198 }
00199 }
00200
00201 void fsShellBrowsersEvents::OnNavigateComplete2(LPDISPATCH pDisp, VARIANT *URL)
00202 {
00203 if (m_pWBRoot == NULL)
00204 m_pWBRoot = pDisp;
00205 }