Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1812 lines
47 KiB

  1. /******************************************************************************
  2. Copyright (c) 1999 Microsoft Corporation
  3. Module Name:
  4. HelpCenterExternal.cpp
  5. Abstract:
  6. This file contains the implementation of the class exposed as the "pchealth" object.
  7. Revision History:
  8. Ghim-Sim Chua (gschua) 07/23/99
  9. created
  10. Davide Massarenti (dmassare) 07/25/99
  11. modified
  12. Kalyani Narlanka (KalyaniN) 03/15/01
  13. Moved Incident and Encryption Objects from HelpService to HelpCtr to improve Perf.
  14. ******************************************************************************/
  15. #include "stdafx.h"
  16. #include "rdshost_i.c"
  17. #include "safrdm_i.c"
  18. #include "rassistance.h"
  19. #include "rassistance_i.c"
  20. #include <mshtmcid.h>
  21. #include <userenv.h>
  22. /////////////////////////////////////////////////////////////////////////////
  23. static const MPC::StringToBitField s_arrMessageBoxMap[] =
  24. {
  25. { L"OK" , MB_TYPEMASK, MB_OK , -1 },
  26. { L"OKCANCEL" , MB_TYPEMASK, MB_OKCANCEL , -1 },
  27. { L"ABORTRETRYIGNORE" , MB_TYPEMASK, MB_ABORTRETRYIGNORE , -1 },
  28. { L"YESNOCANCEL" , MB_TYPEMASK, MB_YESNOCANCEL , -1 },
  29. { L"YESNO" , MB_TYPEMASK, MB_YESNO , -1 },
  30. { L"RETRYCANCEL" , MB_TYPEMASK, MB_RETRYCANCEL , -1 },
  31. { L"CANCELTRYCONTINUE", MB_TYPEMASK, MB_CANCELTRYCONTINUE, -1 },
  32. { L"ICONHAND" , MB_ICONMASK, MB_ICONHAND , -1 },
  33. { L"ICONQUESTION" , MB_ICONMASK, MB_ICONQUESTION , -1 },
  34. { L"ICONEXCLAMATION" , MB_ICONMASK, MB_ICONEXCLAMATION , -1 },
  35. { L"ICONASTERISK" , MB_ICONMASK, MB_ICONASTERISK , -1 },
  36. { L"USERICON" , MB_ICONMASK, MB_USERICON , -1 },
  37. { L"ICONWARNING" , MB_ICONMASK, MB_ICONWARNING , -1 },
  38. { L"ICONERROR" , MB_ICONMASK, MB_ICONERROR , -1 },
  39. { L"ICONINFORMATION" , MB_ICONMASK, MB_ICONINFORMATION , -1 },
  40. { L"ICONSTOP" , MB_ICONMASK, MB_ICONSTOP , -1 },
  41. { L"DEFBUTTON1" , MB_MODEMASK, MB_DEFBUTTON1 , -1 },
  42. { L"DEFBUTTON2" , MB_MODEMASK, MB_DEFBUTTON2 , -1 },
  43. { L"DEFBUTTON3" , MB_MODEMASK, MB_DEFBUTTON3 , -1 },
  44. { L"DEFBUTTON4" , MB_MODEMASK, MB_DEFBUTTON4 , -1 },
  45. { L"APPLMODAL" , MB_MODEMASK, MB_APPLMODAL , -1 },
  46. { L"SYSTEMMODAL" , MB_MODEMASK, MB_SYSTEMMODAL , -1 },
  47. { L"TASKMODAL" , MB_MODEMASK, MB_TASKMODAL , -1 },
  48. { L"HELP" , MB_MODEMASK, MB_HELP , -1 },
  49. { NULL }
  50. };
  51. static const CComBSTR s_bstrFunc_GlobalContextMenu( L"GlobalContextMenu" );
  52. static const CComBSTR s_bstrFunc_BuildTree ( L"debug_BuildTree" );
  53. /////////////////////////////////////////////////////////////////////////////
  54. CPCHSecurityHandle::CPCHSecurityHandle()
  55. {
  56. m_ext = NULL; // CPCHHelpCenterExternal* m_ext;
  57. m_object = NULL; // IDispatch* m_object;
  58. }
  59. void CPCHSecurityHandle::Initialize( /*[in]*/ CPCHHelpCenterExternal* ext, /*[in] */ IDispatch* object )
  60. {
  61. m_ext = ext;
  62. m_object = object;
  63. }
  64. void CPCHSecurityHandle::Passivate()
  65. {
  66. m_ext = NULL;
  67. m_object = NULL;
  68. }
  69. HRESULT CPCHSecurityHandle::ForwardInvokeEx( /*[in] */ DISPID id ,
  70. /*[in] */ LCID lcid ,
  71. /*[in] */ WORD wFlags ,
  72. /*[in] */ DISPPARAMS* pdp ,
  73. /*[out]*/ VARIANT* pvarRes ,
  74. /*[out]*/ EXCEPINFO* pei ,
  75. /*[in] */ IServiceProvider* pspCaller )
  76. {
  77. return m_ext ? m_ext->SetTLSAndInvoke( m_object, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller ) : E_ACCESSDENIED;
  78. }
  79. HRESULT CPCHSecurityHandle::IsTrusted()
  80. {
  81. return m_ext ? m_ext->IsTrusted() : E_ACCESSDENIED;
  82. }
  83. HRESULT CPCHSecurityHandle::IsSystem()
  84. {
  85. return m_ext ? m_ext->IsSystem() : E_ACCESSDENIED;
  86. }
  87. /////////////////////////////////////////////////////////////////////////////
  88. STDMETHODIMP CPCHHelpCenterExternal::get_HelpSession( /*[out, retval]*/ IPCHHelpSession* *pVal )
  89. {
  90. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_HelpSession",hr,pVal);
  91. INTERNETSECURITY__CHECK_TRUST();
  92. if(HelpSession())
  93. {
  94. __MPC_EXIT_IF_METHOD_FAILS(hr, HelpSession()->QueryInterface( IID_IPCHHelpSession, (void**)pVal ));
  95. }
  96. __HCP_END_PROPERTY(hr);
  97. }
  98. STDMETHODIMP CPCHHelpCenterExternal::get_Channels( /*[out, retval]*/ ISAFReg* *pVal )
  99. {
  100. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_Channels",hr,pVal);
  101. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  102. INTERNETSECURITY__CHECK_TRUST();
  103. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->get_Channels( pVal ));
  104. __HCP_END_PROPERTY(hr);
  105. }
  106. STDMETHODIMP CPCHHelpCenterExternal::get_UserSettings( /*[out, retval]*/ IPCHUserSettings2* *pVal )
  107. {
  108. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_UserSettings",hr,pVal);
  109. if(!m_UserSettings) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  110. //
  111. // We don't check trust at this stage, it's the object's responsibility to protect each one of its methods.
  112. // This is because "pchealth.UserSettings" exposes read-only properties that could be accessed from untrusted pages.
  113. //
  114. __MPC_EXIT_IF_METHOD_FAILS(hr, m_UserSettings->QueryInterface( IID_IPCHUserSettings2, (void**)pVal ));
  115. __HCP_END_PROPERTY(hr);
  116. }
  117. STDMETHODIMP CPCHHelpCenterExternal::get_Security( /*[out, retval]*/ IPCHSecurity* *pVal )
  118. {
  119. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_Security",hr,pVal);
  120. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  121. INTERNETSECURITY__CHECK_TRUST();
  122. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->get_Security( pVal ));
  123. __HCP_END_PROPERTY(hr);
  124. }
  125. STDMETHODIMP CPCHHelpCenterExternal::get_Connectivity( /*[out, retval]*/ IPCHConnectivity* *pVal )
  126. {
  127. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_Connectivity",hr,pVal);
  128. CComPtr<CPCHConnectivity> pC;
  129. INTERNETSECURITY__CHECK_TRUST();
  130. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pC ));
  131. __MPC_EXIT_IF_METHOD_FAILS(hr, pC->ConnectToParent( this ));
  132. __MPC_EXIT_IF_METHOD_FAILS(hr, pC.QueryInterface( pVal ));
  133. __HCP_END_PROPERTY(hr);
  134. }
  135. STDMETHODIMP CPCHHelpCenterExternal::get_Database( /*[out, retval]*/ IPCHTaxonomyDatabase* *pVal )
  136. {
  137. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_Database",hr,pVal);
  138. INTERNETSECURITY__CHECK_TRUST();
  139. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  140. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->get_Database( pVal ));
  141. __HCP_END_PROPERTY(hr);
  142. }
  143. STDMETHODIMP CPCHHelpCenterExternal::get_TextHelpers( /*[out, retval]*/ IPCHTextHelpers* *pVal )
  144. {
  145. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_TextHelpers",hr,pVal);
  146. if(!m_TextHelpers)
  147. {
  148. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_TextHelpers ));
  149. }
  150. __MPC_EXIT_IF_METHOD_FAILS(hr, m_TextHelpers.QueryInterface( pVal ));
  151. __HCP_END_PROPERTY(hr);
  152. }
  153. /////////////////////////////////////////////////////////////////////////////
  154. HRESULT CPCHHelpCenterExternal::get_UI_Panel( /*[out, retval]*/ IUnknown* *pVal, /*[in]*/ HscPanel id )
  155. {
  156. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_UI_Panel",hr,pVal);
  157. INTERNETSECURITY__CHECK_SYSTEM();
  158. __MPC_EXIT_IF_METHOD_FAILS(hr, GetPanel( id, (IMarsPanel**)pVal, true ));
  159. __HCP_END_PROPERTY(hr);
  160. }
  161. HRESULT CPCHHelpCenterExternal::get_WEB_Panel( /*[out, retval]*/ IUnknown* *pVal, /*[in]*/ HscPanel id )
  162. {
  163. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_WEB_Panel",hr,pVal);
  164. CComPtr<IMarsPanel> panel;
  165. CComPtr<IWebBrowser2> wb;
  166. INTERNETSECURITY__CHECK_SYSTEM();
  167. __MPC_EXIT_IF_METHOD_FAILS(hr, GetPanel( id, &panel, true ));
  168. switch(id)
  169. {
  170. case HSCPANEL_CONTEXT : wb = m_panel_CONTEXT_WebBrowser ; break;
  171. case HSCPANEL_CONTENTS: wb = m_panel_CONTENTS_WebBrowser; break;
  172. case HSCPANEL_HHWINDOW: wb = m_panel_HHWINDOW_WebBrowser; break;
  173. }
  174. *pVal = wb.Detach();
  175. __HCP_END_PROPERTY(hr);
  176. }
  177. STDMETHODIMP CPCHHelpCenterExternal::get_UI_NavBar ( /*[out, retval]*/ IUnknown* *pVal ) { return get_UI_Panel( pVal, HSCPANEL_NAVBAR ); }
  178. STDMETHODIMP CPCHHelpCenterExternal::get_UI_MiniNavBar( /*[out, retval]*/ IUnknown* *pVal ) { return get_UI_Panel( pVal, HSCPANEL_MININAVBAR ); }
  179. STDMETHODIMP CPCHHelpCenterExternal::get_UI_Context ( /*[out, retval]*/ IUnknown* *pVal ) { return get_UI_Panel( pVal, HSCPANEL_CONTEXT ); }
  180. STDMETHODIMP CPCHHelpCenterExternal::get_UI_Contents ( /*[out, retval]*/ IUnknown* *pVal ) { return get_UI_Panel( pVal, HSCPANEL_CONTENTS ); }
  181. STDMETHODIMP CPCHHelpCenterExternal::get_UI_HHWindow ( /*[out, retval]*/ IUnknown* *pVal ) { return get_UI_Panel( pVal, HSCPANEL_HHWINDOW ); }
  182. STDMETHODIMP CPCHHelpCenterExternal::get_WEB_Context ( /*[out, retval]*/ IUnknown* *pVal ) { return get_WEB_Panel( pVal, HSCPANEL_CONTEXT ); }
  183. STDMETHODIMP CPCHHelpCenterExternal::get_WEB_Contents( /*[out, retval]*/ IUnknown* *pVal ) { return get_WEB_Panel( pVal, HSCPANEL_CONTENTS ); }
  184. STDMETHODIMP CPCHHelpCenterExternal::get_WEB_HHWindow( /*[out, retval]*/ IUnknown* *pVal ) { return get_WEB_Panel( pVal, HSCPANEL_HHWINDOW ); }
  185. STDMETHODIMP CPCHHelpCenterExternal::get_ExtraArgument( /*[out, retval]*/ BSTR *pVal )
  186. {
  187. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_ExtraArgument",hr,pVal);
  188. INTERNETSECURITY__CHECK_TRUST();
  189. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_bstrExtraArgument, pVal ));
  190. __HCP_END_PROPERTY(hr);
  191. }
  192. STDMETHODIMP CPCHHelpCenterExternal::get_HelpViewer( /*[out, retval]*/ IUnknown* *pVal )
  193. {
  194. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::get_HelpViewer",hr,pVal);
  195. INTERNETSECURITY__CHECK_TRUST();
  196. MPC::CopyTo( (IPCHHelpViewerWrapper*)m_panel_HHWINDOW_Wrapper, pVal );
  197. __HCP_END_PROPERTY(hr);
  198. }
  199. STDMETHODIMP CPCHHelpCenterExternal::RegisterEvents( /*[in]*/ BSTR id ,
  200. /*[in]*/ long pri ,
  201. /*[in]*/ IDispatch* function ,
  202. /*[out,retval]*/ long *cookie )
  203. {
  204. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RegisterEvents" );
  205. HRESULT hr;
  206. __MPC_PARAMCHECK_BEGIN(hr)
  207. __MPC_PARAMCHECK_STRING_NOT_EMPTY(id);
  208. __MPC_PARAMCHECK_POINTER_AND_SET(cookie,0);
  209. __MPC_PARAMCHECK_END();
  210. INTERNETSECURITY__CHECK_TRUST();
  211. hr = m_Events.RegisterEvents( id, pri, function, cookie );
  212. __HCP_FUNC_CLEANUP;
  213. __HCP_FUNC_EXIT(hr);
  214. }
  215. STDMETHODIMP CPCHHelpCenterExternal::UnregisterEvents( /*[in]*/ long cookie )
  216. {
  217. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::UnregisterEvents" );
  218. HRESULT hr;
  219. INTERNETSECURITY__CHECK_TRUST();
  220. hr = m_Events.UnregisterEvents( cookie );
  221. __HCP_FUNC_CLEANUP;
  222. __HCP_FUNC_EXIT(hr);
  223. }
  224. /////////////////////////////////////////////////////////////////////////////
  225. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_SearchEngineMgr( /*[out, retval]*/ IPCHSEManager* *ppSE )
  226. {
  227. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_SearchEngineMgr",hr,ppSE);
  228. INTERNETSECURITY__CHECK_TRUST();
  229. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  230. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_SearchEngineMgr( ppSE ));
  231. __HCP_END_PROPERTY(hr);
  232. }
  233. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_DataCollection( /*[out, retval]*/ ISAFDataCollection* *ppDC )
  234. {
  235. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_DataCollection",hr,ppDC);
  236. INTERNETSECURITY__CHECK_TRUST();
  237. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  238. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_DataCollection( ppDC ));
  239. __HCP_END_PROPERTY(hr);
  240. }
  241. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_Cabinet( /*[out , retval]*/ ISAFCabinet* *ppCB )
  242. {
  243. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_Cabinet",hr,ppCB);
  244. INTERNETSECURITY__CHECK_TRUST();
  245. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  246. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_Cabinet( ppCB ));
  247. __HCP_END_PROPERTY(hr);
  248. }
  249. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_Encryption( /*[out, retval]*/ ISAFEncrypt* *ppEn )
  250. {
  251. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_Encryption",hr,ppEn);
  252. bool fTemporaryProfile = false;
  253. DWORD dwProfileFlags;
  254. INTERNETSECURITY__CHECK_TRUST();
  255. if(::GetProfileType( &dwProfileFlags ))
  256. {
  257. if(( dwProfileFlags & PT_MANDATORY ) ||
  258. ((dwProfileFlags & PT_TEMPORARY) && !(dwProfileFlags & PT_ROAMING)) )
  259. {
  260. fTemporaryProfile = true;
  261. }
  262. }
  263. if(fTemporaryProfile)
  264. {
  265. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  266. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_Encryption( ppEn ));
  267. }
  268. else
  269. {
  270. CComPtr<CSAFEncrypt> pEn;
  271. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pEn ));
  272. __MPC_EXIT_IF_METHOD_FAILS(hr, pEn.QueryInterface( ppEn ));
  273. }
  274. __HCP_END_PROPERTY(hr);
  275. }
  276. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_Channel( /*[in] */ BSTR bstrVendorID ,
  277. /*[in] */ BSTR bstrProductID ,
  278. /*[out, retval]*/ ISAFChannel* *ppCh )
  279. {
  280. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_Channel",hr,ppCh);
  281. INTERNETSECURITY__CHECK_TRUST();
  282. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  283. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_Channel( bstrVendorID, bstrProductID, ppCh ));
  284. __HCP_END_PROPERTY(hr);
  285. }
  286. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_Incident( /*[out, retval]*/ ISAFIncident* *ppIn )
  287. {
  288. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_Incident",hr,ppIn);
  289. CComPtr<CSAFIncident> pIn;
  290. INTERNETSECURITY__CHECK_TRUST();
  291. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pIn ));
  292. __MPC_EXIT_IF_METHOD_FAILS(hr, pIn.QueryInterface( ppIn ));
  293. __HCP_END_PROPERTY(hr);
  294. }
  295. ////////////////////////////////////////////////////////////////////////////////
  296. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_RemoteDesktopSession(
  297. /*[in]*/ long lTimeout ,
  298. /*[in]*/ BSTR bstrConnectionParms ,
  299. /*[in]*/ BSTR bstrUserHelpBlob ,
  300. /*[out, retval]*/ ISAFRemoteDesktopSession* *ppRCS )
  301. {
  302. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_RemoteDesktopSession",hr,ppRCS);
  303. REMOTE_DESKTOP_SHARING_CLASS sharingClass = VIEWDESKTOP_PERMISSION_NOT_REQUIRE;
  304. INTERNETSECURITY__CHECK_TRUST();
  305. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  306. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_RemoteDesktopSession( sharingClass, lTimeout, bstrConnectionParms, bstrUserHelpBlob, ppRCS ));
  307. __HCP_END_PROPERTY(hr);
  308. }
  309. STDMETHODIMP CPCHHelpCenterExternal::ConnectToExpert( /* [in] */ BSTR bstrExpertConnectParm,
  310. /* [in] */ LONG lTimeout,
  311. /* [retval][out] */ LONG *lSafErrorCode)
  312. {
  313. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::ConnectToExpert",hr,lSafErrorCode);
  314. INTERNETSECURITY__CHECK_TRUST();
  315. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  316. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->ConnectToExpert( bstrExpertConnectParm, lTimeout, lSafErrorCode));
  317. __HCP_END_PROPERTY(hr);
  318. }
  319. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_RemoteDesktopManager( /*[out, retval]*/ ISAFRemoteDesktopManager* *ppRDM )
  320. {
  321. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_RemoteDesktopManager",hr,ppRDM);
  322. CComPtr<ISAFRemoteDesktopManager> pSAFRDManager;
  323. INTERNETSECURITY__CHECK_TRUST();
  324. // Instantiate ISAFRemoteDesktopManager.
  325. __MPC_EXIT_IF_METHOD_FAILS(hr, pSAFRDManager.CoCreateInstance( CLSID_SAFRemoteDesktopManager, NULL, CLSCTX_INPROC_SERVER ));
  326. *ppRDM = pSAFRDManager.Detach();
  327. __HCP_END_PROPERTY(hr);
  328. }
  329. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_RemoteDesktopConnection( /*[out, retval]*/ ISAFRemoteDesktopConnection* *ppRDC )
  330. {
  331. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_RemoteDesktopConnection",hr,ppRDC);
  332. INTERNETSECURITY__CHECK_TRUST();
  333. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  334. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->CreateObject_RemoteDesktopConnection( ppRDC ));
  335. __HCP_END_PROPERTY(hr);
  336. }
  337. ////////////////////////////////////////////////////////////////////////////////
  338. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_ContextMenu( /*[out, retval]*/ IPCHContextMenu* *ppCM )
  339. {
  340. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_ContextMenu",hr,ppCM);
  341. CComPtr<CPCHContextMenu> pObj;
  342. INTERNETSECURITY__CHECK_TRUST();
  343. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj )); pObj->Initialize( this );
  344. __MPC_EXIT_IF_METHOD_FAILS(hr, pObj.QueryInterface( ppCM ));
  345. __HCP_END_PROPERTY(hr);
  346. }
  347. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_PrintEngine( /*[out, retval]*/ IPCHPrintEngine* *ppPE )
  348. {
  349. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_PrintEngine",hr,ppPE);
  350. CComPtr<CPCHPrintEngine> pObj;
  351. INTERNETSECURITY__CHECK_TRUST();
  352. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj ));
  353. __MPC_EXIT_IF_METHOD_FAILS(hr, pObj.QueryInterface( ppPE ));
  354. __HCP_END_PROPERTY(hr);
  355. }
  356. ////////////////////////////////////////////////////////////////////////////////
  357. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_IntercomClient( /* [out, retval] */ ISAFIntercomClient* *ppI )
  358. {
  359. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_IntercomClient",hr,ppI);
  360. CComPtr<CSAFIntercomClient> pObj;
  361. INTERNETSECURITY__CHECK_TRUST();
  362. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj ));
  363. __MPC_EXIT_IF_METHOD_FAILS(hr, pObj.QueryInterface( ppI ));
  364. __HCP_END_PROPERTY(hr);
  365. }
  366. STDMETHODIMP CPCHHelpCenterExternal::CreateObject_IntercomServer( /* [out, retval] */ ISAFIntercomServer* *ppI )
  367. {
  368. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::CreateObject_IntercomServer",hr,ppI);
  369. CComPtr<CSAFIntercomServer> pObj;
  370. INTERNETSECURITY__CHECK_TRUST();
  371. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj ));
  372. __MPC_EXIT_IF_METHOD_FAILS(hr, pObj.QueryInterface( ppI ));
  373. __HCP_END_PROPERTY(hr);
  374. }
  375. /////////////////////////////////////////////////////////////////////////////
  376. STDMETHODIMP CPCHHelpCenterExternal::OpenFileAsStream( /*[in]*/ BSTR bstrFilename ,
  377. /*[out, retval]*/ IUnknown* *stream )
  378. {
  379. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::OpenFileAsStream" );
  380. HRESULT hr;
  381. CComPtr<CPCHScriptableStream> fsStream;
  382. __MPC_PARAMCHECK_BEGIN(hr)
  383. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFilename);
  384. __MPC_PARAMCHECK_POINTER_AND_SET(stream,NULL);
  385. __MPC_PARAMCHECK_END();
  386. INTERNETSECURITY__CHECK_TRUST();
  387. //
  388. // Create a stream for a file.
  389. //
  390. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &fsStream ));
  391. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStream->InitForRead( bstrFilename ));
  392. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStream.QueryInterface( stream ));
  393. hr = S_OK;
  394. __HCP_FUNC_CLEANUP;
  395. __HCP_FUNC_EXIT(hr);
  396. }
  397. STDMETHODIMP CPCHHelpCenterExternal::CreateFileAsStream( /*[in]*/ BSTR bstrFilename ,
  398. /*[out, retval]*/ IUnknown* *stream )
  399. {
  400. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::OpenFileAsStream" );
  401. HRESULT hr;
  402. CComPtr<CPCHScriptableStream> fsStream;
  403. __MPC_PARAMCHECK_BEGIN(hr)
  404. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFilename);
  405. __MPC_PARAMCHECK_POINTER_AND_SET(stream,NULL);
  406. __MPC_PARAMCHECK_END();
  407. INTERNETSECURITY__CHECK_TRUST();
  408. //
  409. // Create a stream for a file.
  410. //
  411. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &fsStream ));
  412. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStream->InitForWrite( bstrFilename ));
  413. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStream.QueryInterface( stream ));
  414. hr = S_OK;
  415. __HCP_FUNC_CLEANUP;
  416. __HCP_FUNC_EXIT(hr);
  417. }
  418. STDMETHODIMP CPCHHelpCenterExternal::CopyStreamToFile( /*[in]*/ BSTR bstrFilename ,
  419. /*[in]*/ IUnknown* stream )
  420. {
  421. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::CopyStreamToFile" );
  422. HRESULT hr;
  423. CComPtr<MPC::FileStream> fsStreamDst;
  424. CComPtr<IStream> fsStreamSrc;
  425. LARGE_INTEGER li;
  426. __MPC_PARAMCHECK_BEGIN(hr)
  427. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFilename);
  428. __MPC_PARAMCHECK_NOTNULL(stream);
  429. __MPC_PARAMCHECK_END();
  430. //
  431. // Create a stream for a file.
  432. //
  433. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &fsStreamDst ));
  434. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStreamDst->InitForWrite( bstrFilename ));
  435. //
  436. // Copy the source stream to the file.
  437. //
  438. li.LowPart = 0;
  439. li.HighPart = 0;
  440. __MPC_EXIT_IF_METHOD_FAILS(hr, stream->QueryInterface ( IID_IStream, (void**)&fsStreamSrc ));
  441. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStreamSrc->Seek ( li, STREAM_SEEK_SET, NULL )); // Rewind the stream.
  442. __MPC_EXIT_IF_METHOD_FAILS(hr, fsStreamDst->TransferData( fsStreamSrc, fsStreamDst ));
  443. hr = S_OK;
  444. __HCP_FUNC_CLEANUP;
  445. __HCP_FUNC_EXIT(hr);
  446. }
  447. /////////////////////////////////////////////////////////////////////////////
  448. STDMETHODIMP CPCHHelpCenterExternal::NetworkAlive( /*[out, retval]*/ VARIANT_BOOL *pVal )
  449. {
  450. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::NetworkAlive" );
  451. HRESULT hr;
  452. CComPtr<IPCHConnectivity> pchc;
  453. INTERNETSECURITY__CHECK_TRUST();
  454. __MPC_EXIT_IF_METHOD_FAILS(hr, get_Connectivity( &pchc ));
  455. __MPC_EXIT_IF_METHOD_FAILS(hr, pchc->NetworkAlive( pVal ));
  456. hr = S_OK;
  457. __HCP_FUNC_CLEANUP;
  458. __HCP_FUNC_EXIT(hr);
  459. }
  460. STDMETHODIMP CPCHHelpCenterExternal::DestinationReachable( /*[in] */ BSTR bstrURL ,
  461. /*[out, retval]*/ VARIANT_BOOL *pVal )
  462. {
  463. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::DestinationReachable" );
  464. HRESULT hr;
  465. CComPtr<IPCHConnectivity> pchc;
  466. INTERNETSECURITY__CHECK_TRUST();
  467. __MPC_EXIT_IF_METHOD_FAILS(hr, get_Connectivity( &pchc ));
  468. __MPC_EXIT_IF_METHOD_FAILS(hr, pchc->DestinationReachable( bstrURL, pVal ));
  469. hr = S_OK;
  470. __HCP_FUNC_CLEANUP;
  471. __HCP_FUNC_EXIT(hr);
  472. }
  473. ////////////////////////////////////////////////////////////////////////////////
  474. STDMETHODIMP CPCHHelpCenterExternal::FormatError( /*[in ]*/ VARIANT vError ,
  475. /*[out, retval]*/ BSTR *pVal )
  476. {
  477. __HCP_BEGIN_PROPERTY_GET("CPCHHelpCenterExternal::FormatError",hr,pVal);
  478. INTERNETSECURITY__CHECK_TRUST();
  479. if(!m_Utility) __MPC_SET_ERROR_AND_EXIT(hr, E_ACCESSDENIED);
  480. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->FormatError( vError, pVal ));
  481. __HCP_END_PROPERTY(hr);
  482. }
  483. HRESULT CPCHHelpCenterExternal::RegInit( /*[in]*/ BSTR bstrKey ,
  484. /*[in]*/ bool fRead ,
  485. /*[out]*/ MPC::RegKey& rk ,
  486. /*[out]*/ MPC::wstring& strValue )
  487. {
  488. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RegInit" );
  489. HRESULT hr;
  490. HKEY hKeyRoot = HKEY_LOCAL_MACHINE;
  491. MPC::wstring strKey;
  492. LPCWSTR szPtr;
  493. LPCWSTR szPtr2;
  494. __MPC_PARAMCHECK_BEGIN(hr)
  495. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrKey);
  496. __MPC_PARAMCHECK_END();
  497. INTERNETSECURITY__CHECK_TRUST();
  498. szPtr = bstrKey;
  499. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::RegKey::ParsePath( szPtr, hKeyRoot, szPtr ));
  500. szPtr2 = wcsrchr( szPtr, '\\' );
  501. if(szPtr2)
  502. {
  503. strKey.assign( szPtr, szPtr2 - szPtr );
  504. strValue = &szPtr2[1];
  505. }
  506. else
  507. {
  508. strKey = szPtr;
  509. }
  510. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.SetRoot( hKeyRoot, fRead ? KEY_READ : KEY_ALL_ACCESS ));
  511. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.Attach ( strKey.c_str() ));
  512. hr = S_OK;
  513. __HCP_FUNC_CLEANUP;
  514. __HCP_FUNC_EXIT(hr);
  515. }
  516. STDMETHODIMP CPCHHelpCenterExternal::RegRead( /*[in]*/ BSTR bstrKey, /*[out, retval]*/ VARIANT *pVal )
  517. {
  518. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RegRead" );
  519. HRESULT hr;
  520. MPC::RegKey rk;
  521. MPC::wstring strValue;
  522. bool fFound;
  523. __MPC_PARAMCHECK_BEGIN(hr)
  524. __MPC_PARAMCHECK_NOTNULL(pVal);
  525. __MPC_PARAMCHECK_END();
  526. __MPC_EXIT_IF_METHOD_FAILS(hr, RegInit( bstrKey, /*fRead*/true, rk, strValue ));
  527. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.get_Value( *pVal, fFound, strValue.size() ? strValue.c_str() : NULL ));
  528. hr = S_OK;
  529. __HCP_FUNC_CLEANUP;
  530. __HCP_FUNC_EXIT(hr);
  531. }
  532. STDMETHODIMP CPCHHelpCenterExternal::RegWrite( /*[in]*/ BSTR bstrKey, /*[in]*/ VARIANT newVal, /*[in,optional]*/ VARIANT vKind )
  533. {
  534. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RegWrite" );
  535. HRESULT hr;
  536. MPC::RegKey rk;
  537. MPC::wstring strValue;
  538. CComVariant v( newVal );
  539. bool fExpand = false;
  540. __MPC_EXIT_IF_METHOD_FAILS(hr, RegInit( bstrKey, /*fRead*/false, rk, strValue ));
  541. if(vKind.vt == VT_BSTR && STRINGISPRESENT(vKind.bstrVal))
  542. {
  543. if(!_wcsicmp( vKind.bstrVal, L"REG_DWORD" ))
  544. {
  545. __MPC_EXIT_IF_METHOD_FAILS(hr, v.ChangeType( VT_I4 ));
  546. }
  547. if(!_wcsicmp( vKind.bstrVal, L"REG_SZ" ))
  548. {
  549. __MPC_EXIT_IF_METHOD_FAILS(hr, v.ChangeType( VT_BSTR ));
  550. }
  551. if(!_wcsicmp( vKind.bstrVal, L"REG_EXPAND_SZ" ))
  552. {
  553. fExpand = true;
  554. __MPC_EXIT_IF_METHOD_FAILS(hr, v.ChangeType( VT_BSTR ));
  555. }
  556. if(!_wcsicmp( vKind.bstrVal, L"REG_MULTI_SZ" ))
  557. {
  558. fExpand = true;
  559. __MPC_EXIT_IF_METHOD_FAILS(hr, v.ChangeType( VT_ARRAY | VT_BSTR ));
  560. }
  561. }
  562. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.Create ( ));
  563. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.put_Value( newVal, strValue.size() ? strValue.c_str() : NULL, fExpand ));
  564. hr = S_OK;
  565. __HCP_FUNC_CLEANUP;
  566. __HCP_FUNC_EXIT(hr);
  567. }
  568. STDMETHODIMP CPCHHelpCenterExternal::RegDelete( /*[in]*/ BSTR bstrKey )
  569. {
  570. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RegDelete" );
  571. HRESULT hr;
  572. MPC::RegKey rk;
  573. MPC::wstring strValue;
  574. __MPC_EXIT_IF_METHOD_FAILS(hr, RegInit( bstrKey, /*fRead*/false, rk, strValue ));
  575. if(strValue.size())
  576. {
  577. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.del_Value( strValue.c_str() ));
  578. }
  579. else
  580. {
  581. __MPC_EXIT_IF_METHOD_FAILS(hr, rk.Delete( /*fDeep*/false ));
  582. }
  583. hr = S_OK;
  584. __HCP_FUNC_CLEANUP;
  585. __HCP_FUNC_EXIT(hr);
  586. }
  587. ////////////////////////////////////////////////////////////////////////////////
  588. STDMETHODIMP CPCHHelpCenterExternal::Close()
  589. {
  590. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::Close" );
  591. HRESULT hr;
  592. HWND hwnd;
  593. INTERNETSECURITY__CHECK_TRUST();
  594. //
  595. // In case we are called really early, give the application some time to initialize properly.
  596. //
  597. MPC::SleepWithMessagePump( 100 );
  598. if((hwnd = Window()) != NULL)
  599. {
  600. ::PostMessage( hwnd, WM_CLOSE, 0, 0 );
  601. }
  602. hr = S_OK;
  603. __HCP_FUNC_CLEANUP;
  604. __HCP_FUNC_EXIT(hr);
  605. }
  606. STDMETHODIMP CPCHHelpCenterExternal::RefreshUI()
  607. {
  608. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::RefreshUI" );
  609. MSG msg;
  610. //
  611. // There is one or more window message available. Dispatch them
  612. //
  613. while(::PeekMessage( &msg, NULL, NULL, NULL, PM_REMOVE ))
  614. {
  615. ::TranslateMessage( &msg );
  616. ::DispatchMessage ( &msg );
  617. }
  618. __HCP_FUNC_EXIT(S_OK);
  619. }
  620. ////////////////////////////////////////////////////////////////////////////////
  621. STDMETHODIMP CPCHHelpCenterExternal::Print( /*[in]*/ VARIANT window, /*[in]*/ VARIANT_BOOL fEvent, /*[out, retval]*/ VARIANT_BOOL *pVal )
  622. {
  623. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::Print" );
  624. HRESULT hr;
  625. VARIANT_BOOL Cancel;
  626. if(m_fHidden)
  627. {
  628. __MPC_EXIT_IF_METHOD_FAILS(hr, E_ACCESSDENIED);
  629. }
  630. if(fEvent == VARIANT_TRUE)
  631. {
  632. if(SUCCEEDED(m_Events.FireEvent_Print( &Cancel )))
  633. {
  634. if(Cancel == VARIANT_TRUE)
  635. {
  636. __MPC_FUNC_LEAVE;
  637. }
  638. }
  639. }
  640. {
  641. CComQIPtr<IWebBrowser2> wb2;
  642. if(window.vt == VT_DISPATCH)
  643. {
  644. wb2 = window.pdispVal;
  645. }
  646. else
  647. {
  648. wb2.Attach( IsHHWindowVisible() ? HHWindow() : Contents() );
  649. }
  650. if(wb2)
  651. {
  652. (void)wb2->ExecWB( OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, NULL, NULL );
  653. }
  654. }
  655. hr = S_OK;
  656. __HCP_FUNC_CLEANUP;
  657. __HCP_FUNC_EXIT(hr);
  658. }
  659. ////////////////////////////////////////////////////////////////////////////////
  660. static HRESULT local_HighlighDocument( /*[in]*/ IHTMLDocument2* doc ,
  661. /*[in]*/ MPC::WStringList& lst )
  662. {
  663. __HCP_FUNC_ENTRY( "local_HighlighDocument" );
  664. HRESULT hr;
  665. CComPtr<IHTMLElement> elem;
  666. __MPC_EXIT_IF_METHOD_FAILS(hr, doc->get_body( &elem ));
  667. if(elem)
  668. {
  669. CComPtr<IHTMLBodyElement> bodyElement;
  670. CComBSTR bstrCmd ( L"BackColor" );
  671. CComBSTR bstrCmd2 ( L"ForeColor" );
  672. CComVariant vBackColor( (long)::GetSysColor( COLOR_HIGHLIGHT ) );
  673. CComVariant vForeColor( (long)::GetSysColor( COLOR_HIGHLIGHTTEXT ) );
  674. DWORD dwTimeout;
  675. MPC::WStringIterConst it;
  676. __MPC_EXIT_IF_METHOD_FAILS(hr, elem.QueryInterface( &bodyElement ));
  677. dwTimeout = ::GetTickCount() + 6000;
  678. for(it = lst.begin(); it != lst.end(); it++)
  679. {
  680. CComBSTR bstrSearchTerm( it->c_str() );
  681. CComPtr<IHTMLTxtRange> range;
  682. VARIANT_BOOL vbRet;
  683. __MPC_EXIT_IF_METHOD_FAILS(hr, bodyElement->createTextRange( &range ));
  684. while(1)
  685. {
  686. if(FAILED(range->findText( bstrSearchTerm, 1000000, 2, &vbRet )) || vbRet != VARIANT_TRUE) break;
  687. if(FAILED(range->execCommand( bstrCmd2, VARIANT_FALSE, vForeColor, &vbRet )) || vbRet != VARIANT_TRUE) break;
  688. if(FAILED(range->execCommand( bstrCmd , VARIANT_FALSE, vBackColor, &vbRet )) || vbRet != VARIANT_TRUE) break;
  689. if(::GetTickCount() > dwTimeout) break;
  690. if(FAILED(range->collapse( VARIANT_FALSE ))) break;
  691. }
  692. if(::GetTickCount() > dwTimeout) break;
  693. }
  694. }
  695. hr = S_OK;
  696. __HCP_FUNC_CLEANUP;
  697. __HCP_FUNC_EXIT(hr);
  698. }
  699. STDMETHODIMP CPCHHelpCenterExternal::HighlightWords( /*[in]*/ VARIANT window, /*[in]*/ VARIANT words )
  700. {
  701. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::HighlightWords" );
  702. HRESULT hr;
  703. CComPtr<IHTMLDocument2> doc;
  704. if(window.vt == VT_DISPATCH)
  705. {
  706. if(FAILED(MPC::HTML::IDispatch_To_IHTMLDocument2( doc, window.pdispVal )))
  707. {
  708. doc.Release();
  709. }
  710. }
  711. if(!doc)
  712. {
  713. //
  714. // If the caller didn't specify a window, we'll get the currently displayed window.
  715. //
  716. CComPtr<IWebBrowser2> wb2; wb2.Attach( IsHHWindowVisible() ? HHWindow() : Contents() );
  717. if(wb2)
  718. {
  719. CComPtr<IDispatch> docDisp;
  720. __MPC_EXIT_IF_METHOD_FAILS(hr, wb2->get_Document( &docDisp ));
  721. if(docDisp)
  722. {
  723. __MPC_EXIT_IF_METHOD_FAILS(hr, docDisp.QueryInterface( &doc ));
  724. }
  725. }
  726. }
  727. if(doc)
  728. {
  729. MPC::WStringList lst;
  730. CComPtr<IHTMLFramesCollection2> frames;
  731. if(words.vt == (VT_ARRAY | VT_BSTR ) ||
  732. words.vt == (VT_ARRAY | VT_VARIANT) )
  733. {
  734. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertSafeArrayToList( words, lst ));
  735. }
  736. else if(words.vt == VT_BSTR)
  737. {
  738. lst.push_back( SAFEWSTR( words.bstrVal ) );
  739. }
  740. (void)local_HighlighDocument( doc, lst );
  741. __MPC_EXIT_IF_METHOD_FAILS(hr, doc->get_frames( &frames ));
  742. if(frames)
  743. {
  744. long len;
  745. __MPC_EXIT_IF_METHOD_FAILS(hr, frames->get_length( &len ));
  746. for(int i=0; i<len; i++)
  747. {
  748. CComVariant vIndex = i;
  749. CComVariant vValue;
  750. __MPC_EXIT_IF_METHOD_FAILS(hr, frames->item( &vIndex, &vValue ));
  751. if(vValue.vt == VT_DISPATCH)
  752. {
  753. CComQIPtr<IHTMLWindow2> fb = vValue.pdispVal;
  754. if(fb)
  755. {
  756. CComPtr<IHTMLDocument2> docSub;
  757. __MPC_EXIT_IF_METHOD_FAILS(hr, fb->get_document( &docSub ));
  758. if(docSub)
  759. {
  760. (void)local_HighlighDocument( docSub, lst );
  761. }
  762. }
  763. }
  764. }
  765. }
  766. }
  767. hr = S_OK;
  768. __HCP_FUNC_CLEANUP;
  769. __HCP_FUNC_EXIT(hr);
  770. }
  771. ////////////////////////////////////////////////////////////////////////////////
  772. STDMETHODIMP CPCHHelpCenterExternal::MessageBox( /*[in]*/ BSTR bstrText, /*[in]*/ BSTR bstrKind, /*[out, retval]*/ BSTR *pVal )
  773. {
  774. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::MessageBox" );
  775. HRESULT hr;
  776. MPC::wstring szTitle; MPC::LocalizeString( IDS_MAINWND_TITLE, szTitle );
  777. DWORD dwType = 0;
  778. LPCWSTR szRes;
  779. __MPC_PARAMCHECK_BEGIN(hr)
  780. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  781. __MPC_PARAMCHECK_END();
  782. if(m_fHidden)
  783. {
  784. __MPC_EXIT_IF_METHOD_FAILS(hr, E_ACCESSDENIED);
  785. }
  786. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertStringToBitField( bstrKind, dwType, s_arrMessageBoxMap ));
  787. if(dwType == 0) dwType = MB_OK;
  788. switch( ::MessageBoxW( m_hwnd, SAFEBSTR( bstrText ), szTitle.c_str(), dwType ) )
  789. {
  790. case IDABORT : szRes = L"ABORT" ; break;
  791. case IDCANCEL : szRes = L"CANCEL" ; break;
  792. case IDCONTINUE: szRes = L"CONTINUE"; break;
  793. case IDIGNORE : szRes = L"IGNORE" ; break;
  794. case IDNO : szRes = L"NO" ; break;
  795. case IDOK : szRes = L"OK" ; break;
  796. case IDRETRY : szRes = L"RETRY" ; break;
  797. case IDTRYAGAIN: szRes = L"TRYAGAIN"; break;
  798. case IDYES : szRes = L"YES" ; break;
  799. default : szRes = L"" ; break;
  800. }
  801. hr = MPC::GetBSTR( szRes, pVal );
  802. __HCP_FUNC_CLEANUP;
  803. __HCP_FUNC_EXIT(hr);
  804. }
  805. ////////////////////////////////////////
  806. struct SelectFolder_Data
  807. {
  808. BSTR bstrDefault;
  809. BSTR bstrPrefix;
  810. BSTR bstrSuffix;
  811. };
  812. static int CALLBACK SelectFolder_Callback( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
  813. {
  814. SelectFolder_Data* ptr = (SelectFolder_Data*)lpData;
  815. switch(uMsg)
  816. {
  817. case BFFM_INITIALIZED:
  818. if(ptr->bstrDefault)
  819. {
  820. ::SendMessageW( hwnd, BFFM_SETSELECTIONW, TRUE, (LPARAM)ptr->bstrDefault );
  821. }
  822. break;
  823. case BFFM_SELCHANGED:
  824. {
  825. BOOL fEnabled = TRUE;
  826. if(ptr->bstrPrefix)
  827. {
  828. }
  829. ::SendMessageW( hwnd, BFFM_ENABLEOK, 0, fEnabled );
  830. }
  831. break;
  832. }
  833. return 0;
  834. }
  835. STDMETHODIMP CPCHHelpCenterExternal::SelectFolder( /*[in]*/ BSTR bstrTitle, /*[in]*/ BSTR bstrDefault, /*[out, retval]*/ BSTR *pVal )
  836. {
  837. __HCP_FUNC_ENTRY( "CPCHHelpCenterExternal::SelectFolder" );
  838. HRESULT hr;
  839. LPITEMIDLIST pidl = NULL;
  840. CComPtr<IMalloc> malloc;
  841. SelectFolder_Data data;
  842. BROWSEINFOW bi;
  843. __MPC_PARAMCHECK_BEGIN(hr)
  844. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  845. __MPC_PARAMCHECK_END();
  846. INTERNETSECURITY__CHECK_TRUST();
  847. __MPC_EXIT_IF_METHOD_FAILS(hr, ::SHGetMalloc( &malloc ));
  848. ::ZeroMemory( &bi, sizeof( bi ) );
  849. bi.hwndOwner = m_hwnd;
  850. bi.lpszTitle = bstrTitle;
  851. bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI | BIF_STATUSTEXT | BIF_VALIDATE;
  852. bi.lpfn = SelectFolder_Callback;
  853. bi.lParam = (LPARAM)&data;
  854. data.bstrDefault = bstrDefault;
  855. data.bstrPrefix = NULL;
  856. data.bstrSuffix = NULL;
  857. pidl = ::SHBrowseForFolderW( &bi );
  858. if(pidl)
  859. {
  860. WCHAR rgPath[MAX_PATH];
  861. if(::SHGetPathFromIDListW( pidl, rgPath ))
  862. {
  863. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( rgPath, pVal ));
  864. }
  865. }
  866. hr = S_OK;
  867. __HCP_FUNC_CLEANUP;
  868. if(malloc && pidl) malloc->Free( pidl );
  869. __HCP_FUNC_EXIT(hr);
  870. }
  871. ////////////////////////////////////////////////////////////////////////////////
  872. CPCHHelper_IDocHostUIHandler::CPCHHelper_IDocHostUIHandler()
  873. {
  874. m_parent = NULL; CPCHHelpCenterExternal* m_parent;
  875. }
  876. void CPCHHelper_IDocHostUIHandler::Initialize( /*[in]*/ CPCHHelpCenterExternal* parent )
  877. {
  878. m_parent = parent;
  879. }
  880. STDMETHODIMP CPCHHelper_IDocHostUIHandler::QueryService( REFGUID guidService, REFIID riid, void **ppv )
  881. {
  882. HRESULT hr = E_NOINTERFACE;
  883. if(InlineIsEqualGUID( riid, IID_IDocHostUIHandler ))
  884. {
  885. hr = QueryInterface( riid, ppv );
  886. }
  887. return hr;
  888. }
  889. STDMETHODIMP CPCHHelper_IDocHostUIHandler::ShowContextMenu( DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch* pDispatchObjectHit )
  890. {
  891. if(g_Debug_CONTEXTMENU)
  892. {
  893. if(::GetKeyState( VK_CONTROL ) & 0x8000) return E_NOTIMPL;
  894. }
  895. if(g_Debug_BUILDTREE)
  896. {
  897. if(::GetKeyState( VK_MENU ) & 0x8000)
  898. {
  899. CComVariant vArg( pDispatchObjectHit );
  900. (void)m_parent->CallFunctionOnPanel( HSCPANEL_NAVBAR, NULL, s_bstrFunc_BuildTree, &vArg, 1 );
  901. }
  902. }
  903. //
  904. // Last chance for the scripts to say something...
  905. //
  906. {
  907. CComVariant vArgs[4];
  908. CComVariant vRes;
  909. DWORD dwCmd = -1;
  910. vArgs[3] = (long)dwID;
  911. vArgs[2] = pDispatchObjectHit;
  912. vArgs[1] = (long)pptPosition->x;
  913. vArgs[0] = (long)pptPosition->y;
  914. (void)m_parent->CallFunctionOnPanel( HSCPANEL_NAVBAR, NULL, s_bstrFunc_GlobalContextMenu, vArgs, ARRAYSIZE(vArgs), &vRes );
  915. if(vRes.vt == VT_BSTR && vRes.bstrVal)
  916. {
  917. if(!_wcsicmp( vRes.bstrVal, L"DELEGATE" )) return E_NOTIMPL;
  918. if(!_wcsicmp( vRes.bstrVal, L"SELECTALL" )) dwCmd = OLECMDID_SELECTALL;
  919. if(!_wcsicmp( vRes.bstrVal, L"REFRESH" )) dwCmd = OLECMDID_REFRESH;
  920. if(!_wcsicmp( vRes.bstrVal, L"PROPERTIES" )) dwCmd = OLECMDID_PROPERTIES;
  921. }
  922. if(dwCmd != -1)
  923. {
  924. CComVariant vaIn;
  925. CComVariant vaOut;
  926. switch(dwCmd)
  927. {
  928. case OLECMDID_PROPERTIES: // Trident folks say the In value must be set to the mouse pos
  929. vaIn = MAKELONG(pptPosition->x,pptPosition->y);
  930. break;
  931. }
  932. ((IOleCommandTarget*)pCommandTarget)->Exec( NULL, dwCmd, OLECMDEXECOPT_DODEFAULT, &vaIn, &vaOut );
  933. }
  934. }
  935. return S_OK;
  936. }
  937. STDMETHODIMP CPCHHelper_IDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO* pInfo)
  938. {
  939. pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER |
  940. DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE |
  941. DOCHOSTUIFLAG_THEME;
  942. pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
  943. return S_OK;
  944. }
  945. STDMETHODIMP CPCHHelper_IDocHostUIHandler::ShowUI(DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow* pDoc)
  946. {
  947. return E_NOTIMPL;
  948. }
  949. STDMETHODIMP CPCHHelper_IDocHostUIHandler::HideUI()
  950. {
  951. return E_NOTIMPL;
  952. }
  953. STDMETHODIMP CPCHHelper_IDocHostUIHandler::UpdateUI()
  954. {
  955. return E_NOTIMPL;
  956. }
  957. STDMETHODIMP CPCHHelper_IDocHostUIHandler::EnableModeless(BOOL fEnable)
  958. {
  959. return E_NOTIMPL;
  960. }
  961. STDMETHODIMP CPCHHelper_IDocHostUIHandler::OnDocWindowActivate(BOOL fActivate)
  962. {
  963. return E_NOTIMPL;
  964. }
  965. STDMETHODIMP CPCHHelper_IDocHostUIHandler::OnFrameWindowActivate(BOOL fActivate)
  966. {
  967. return E_NOTIMPL;
  968. }
  969. STDMETHODIMP CPCHHelper_IDocHostUIHandler::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow* pUIWindow, BOOL fFrameWindow)
  970. {
  971. return E_NOTIMPL;
  972. }
  973. STDMETHODIMP CPCHHelper_IDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID)
  974. {
  975. bool fCancel = false;
  976. bool fBack = false;
  977. bool fForward = false;
  978. bool fPossibleBack = false;
  979. switch(nCmdID)
  980. {
  981. // case IDM_CONTEXTMENU:
  982. case IDM_GOBACKWARD :
  983. fCancel = true;
  984. fBack = true;
  985. break;
  986. case IDM_GOFORWARD:
  987. fCancel = true;
  988. fForward = true;
  989. break;
  990. }
  991. if(lpMsg->message == WM_KEYDOWN ||
  992. lpMsg->message == WM_KEYUP )
  993. {
  994. switch(lpMsg->wParam)
  995. {
  996. case 'N': // CTRL-N (new window) disabled.
  997. if(::GetKeyState( VK_CONTROL ) & 0x8000)
  998. {
  999. if (!( HIWORD(lpMsg->lParam) & KF_ALTDOWN )) // ALT not pressed
  1000. {
  1001. fCancel = true;
  1002. }
  1003. }
  1004. break;
  1005. case VK_F5: // We want to disable F5 as a refresh tool.
  1006. fCancel = true;
  1007. break;
  1008. case VK_BACK: // Enable "backspace" directly.
  1009. fPossibleBack = true;
  1010. break;
  1011. }
  1012. }
  1013. if(lpMsg->message == WM_SYSKEYDOWN)
  1014. {
  1015. switch(lpMsg->wParam)
  1016. {
  1017. case VK_LEFT:
  1018. fCancel = true;
  1019. fBack = true;
  1020. break;
  1021. case VK_RIGHT:
  1022. fCancel = true;
  1023. fForward = true;
  1024. break;
  1025. }
  1026. }
  1027. ////////////////////
  1028. if(fPossibleBack || fBack || fForward)
  1029. {
  1030. if(m_parent)
  1031. {
  1032. CPCHHelpSession* hs = m_parent->HelpSession();
  1033. if(hs)
  1034. {
  1035. if(fPossibleBack)
  1036. {
  1037. hs->PossibleBack();
  1038. }
  1039. if(fBack)
  1040. {
  1041. if(hs->IsTravelling() == false) (void)hs->Back( 1 );
  1042. }
  1043. if(fForward)
  1044. {
  1045. if(hs->IsTravelling() == false) (void)hs->Forward( 1 );
  1046. }
  1047. }
  1048. }
  1049. }
  1050. if(fCancel == false)
  1051. {
  1052. fCancel = SUCCEEDED(m_parent->ProcessMessage( lpMsg ));
  1053. }
  1054. return fCancel ? S_OK : E_NOTIMPL;
  1055. }
  1056. STDMETHODIMP CPCHHelper_IDocHostUIHandler::GetOptionKeyPath(BSTR* pbstrKey, DWORD dwReserved)
  1057. {
  1058. if(pbstrKey)
  1059. {
  1060. static const WCHAR c_options[] = HC_REGISTRY_HELPCTR_IE;
  1061. BSTR szBuf = (BSTR)::CoTaskMemAlloc( sizeof(c_options) );
  1062. if(szBuf)
  1063. {
  1064. wcscpy( *pbstrKey = szBuf, c_options );
  1065. }
  1066. }
  1067. return S_OK;
  1068. }
  1069. STDMETHODIMP CPCHHelper_IDocHostUIHandler::GetDropTarget(IDropTarget* pDropTarget, IDropTarget** ppDropTarget)
  1070. {
  1071. return E_NOTIMPL;
  1072. }
  1073. STDMETHODIMP CPCHHelper_IDocHostUIHandler::GetExternal(IDispatch** ppDispatch)
  1074. {
  1075. return E_NOTIMPL;
  1076. }
  1077. STDMETHODIMP CPCHHelper_IDocHostUIHandler::TranslateUrl(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut)
  1078. {
  1079. return E_NOTIMPL;
  1080. }
  1081. STDMETHODIMP CPCHHelper_IDocHostUIHandler::FilterDataObject(IDataObject* pDO, IDataObject** ppDORet)
  1082. {
  1083. return E_NOTIMPL;
  1084. }
  1085. ////////////////////////////////////////////////////////////////////////////////
  1086. ////////////////////////////////////////////////////////////////////////////////
  1087. ////////////////////////////////////////////////////////////////////////////////
  1088. CPCHContextMenu::CPCHContextMenu()
  1089. {
  1090. m_parent = NULL; // CPCHHelpCenterExternal* m_parent;
  1091. // List m_lstItems;
  1092. m_iLastItem = 1; // int m_iLastItem;
  1093. }
  1094. CPCHContextMenu::~CPCHContextMenu()
  1095. {
  1096. }
  1097. void CPCHContextMenu::Initialize( /*[in]*/ CPCHHelpCenterExternal* parent )
  1098. {
  1099. m_parent = parent;
  1100. }
  1101. ////////////////////////////////////////////////////////////////////////////////
  1102. STDMETHODIMP CPCHContextMenu::AddItem( /*[in]*/ BSTR bstrText ,
  1103. /*[in]*/ BSTR bstrID ,
  1104. /*[in, optional]*/ VARIANT vFlags )
  1105. {
  1106. __HCP_FUNC_ENTRY( "CPCHContextMenu::AddItem" );
  1107. HRESULT hr;
  1108. __MPC_PARAMCHECK_BEGIN(hr)
  1109. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrText);
  1110. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrID);
  1111. __MPC_PARAMCHECK_END();
  1112. {
  1113. const UINT sAllowedFlags = MF_GRAYED |
  1114. MF_CHECKED;
  1115. Entry& ent = *(m_lstItems.insert( m_lstItems.end() ));
  1116. ent.bstrText = bstrText;
  1117. ent.bstrID = bstrID;
  1118. ent.iID = m_iLastItem++;
  1119. ent.uFlags = (vFlags.vt == VT_I4 ? vFlags.lVal : 0) & sAllowedFlags;
  1120. }
  1121. hr = S_OK;
  1122. __HCP_FUNC_CLEANUP;
  1123. __HCP_FUNC_EXIT(hr);
  1124. }
  1125. STDMETHODIMP CPCHContextMenu::AddSeparator()
  1126. {
  1127. __HCP_FUNC_ENTRY( "CPCHContextMenu::AddSeparator" );
  1128. HRESULT hr;
  1129. {
  1130. Entry& ent = *(m_lstItems.insert( m_lstItems.end() ));
  1131. ent.iID = -1;
  1132. }
  1133. hr = S_OK;
  1134. __HCP_FUNC_EXIT(hr);
  1135. }
  1136. STDMETHODIMP CPCHContextMenu::Display( /*[out,retval]*/ BSTR *pVal )
  1137. {
  1138. __HCP_FUNC_ENTRY( "CPCHContextMenu::Display" );
  1139. HRESULT hr;
  1140. HMENU hMenu = NULL;
  1141. Iter it;
  1142. int iSelected;
  1143. POINT pt;
  1144. __MPC_PARAMCHECK_BEGIN(hr)
  1145. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  1146. __MPC_PARAMCHECK_END();
  1147. __MPC_EXIT_IF_CALL_RETURNS_NULL(hr, (hMenu = ::CreatePopupMenu()));
  1148. //
  1149. // Populate menu.
  1150. //
  1151. for(it = m_lstItems.begin(); it != m_lstItems.end(); it++)
  1152. {
  1153. Entry& ent = *it;
  1154. if(ent.iID < 0)
  1155. {
  1156. __MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::AppendMenuW( hMenu, MF_SEPARATOR, 0, 0 ));
  1157. }
  1158. else
  1159. {
  1160. __MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::AppendMenuW( hMenu, MF_STRING | ent.uFlags, ent.iID, ent.bstrText ));
  1161. }
  1162. }
  1163. ::GetCursorPos( &pt );
  1164. //
  1165. // Find the active panel and its active element. If the cursor is inside its bounding rectangle, display the CM under the cursor.
  1166. // Otherwise display the CM at the upper-left corner of the element.
  1167. //
  1168. {
  1169. IMarsWindowOM* shell = m_parent->Shell();
  1170. CComPtr<IMarsPanelCollection> coll;
  1171. if(shell && SUCCEEDED(shell->get_panels( &coll )) && coll)
  1172. {
  1173. CComPtr<IMarsPanel> panel;
  1174. if(SUCCEEDED(coll->get_activePanel( &panel )) && panel)
  1175. {
  1176. CComPtr<IDispatch> disp;
  1177. if(panel == m_parent->Panel( HSCPANEL_HHWINDOW ))
  1178. {
  1179. CComPtr<IWebBrowser2> wb2; wb2.Attach( m_parent->HHWindow() );
  1180. disp = wb2;
  1181. }
  1182. else
  1183. {
  1184. (void)panel->get_content( &disp );
  1185. }
  1186. if(disp)
  1187. {
  1188. CComQIPtr<IWebBrowser2> wb2 = disp;
  1189. CComQIPtr<IHTMLDocument2> doc2;
  1190. if(wb2)
  1191. {
  1192. disp.Release();
  1193. wb2->get_Document( &disp );
  1194. }
  1195. doc2 = disp;
  1196. //
  1197. // Look for the inner-most active element.
  1198. //
  1199. {
  1200. CComPtr<IHTMLElement> elem;
  1201. while(doc2 && SUCCEEDED(doc2->get_activeElement( &elem )) && elem)
  1202. {
  1203. //
  1204. // This could be a frame.
  1205. //
  1206. CComPtr<IHTMLFrameBase2> frame;
  1207. if(SUCCEEDED(elem.QueryInterface( &frame )))
  1208. {
  1209. CComPtr<IHTMLWindow2> winsub;
  1210. if(SUCCEEDED(frame->get_contentWindow( &winsub )) && winsub)
  1211. {
  1212. doc2.Release();
  1213. elem.Release();
  1214. (void)winsub->get_document( &doc2 );
  1215. continue;
  1216. }
  1217. }
  1218. break;
  1219. }
  1220. {
  1221. CComQIPtr<IServiceProvider> sp = elem;
  1222. if(sp)
  1223. {
  1224. CComPtr<IAccessible> acc;
  1225. if(SUCCEEDED(sp->QueryService( IID_IAccessible, IID_IAccessible, (void**)&acc )))
  1226. {
  1227. long xLeft;
  1228. long yTop;
  1229. long cxWidth;
  1230. long cyHeight;
  1231. VARIANT v;
  1232. v.vt = VT_I4;
  1233. v.lVal = CHILDID_SELF;
  1234. if(SUCCEEDED(acc->accLocation( &xLeft, &yTop, &cxWidth, &cyHeight, v )))
  1235. {
  1236. if(pt.x < xLeft || pt.x > xLeft + cxWidth ||
  1237. pt.y < yTop || pt.y > yTop + cyHeight )
  1238. {
  1239. DWORD dwDefaultLayout;
  1240. if(::GetProcessDefaultLayout( &dwDefaultLayout ) && (dwDefaultLayout & LAYOUT_RTL))
  1241. {
  1242. pt.x = xLeft + cxWidth;
  1243. pt.y = yTop;
  1244. }
  1245. else
  1246. {
  1247. pt.x = xLeft;
  1248. pt.y = yTop;
  1249. }
  1250. }
  1251. }
  1252. }
  1253. }
  1254. }
  1255. }
  1256. }
  1257. }
  1258. }
  1259. }
  1260. iSelected = ::TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, pt.x, pt.y, 0, m_parent->Window(), NULL );
  1261. if(iSelected != 0)
  1262. {
  1263. for(it = m_lstItems.begin(); it != m_lstItems.end(); it++)
  1264. {
  1265. Entry& ent = *it;
  1266. if(ent.iID == iSelected)
  1267. {
  1268. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( ent.bstrID, pVal ));
  1269. }
  1270. }
  1271. }
  1272. hr = S_OK;
  1273. __HCP_FUNC_CLEANUP;
  1274. if(hMenu) ::DestroyMenu( hMenu );
  1275. __HCP_FUNC_EXIT(hr);
  1276. }