mshtmlview.cpp 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  1. #include <w32api.h>
  2. #include <windows.h>
  3. #include <mshtml.h>
  4. #include <exdisp.h>
  5. #include <mshtmhst.h>
  6. #include "mshtmlview.h"
  7. // fix emit!!!
  8. // blitzmax / mingw compilations stuff...
  9. #include <brl.mod/blitz.mod/blitz.h>
  10. #include <maxgui.mod/maxgui.mod/maxgui.h>
  11. #define NOCONTEXTMENU 1
  12. #define NONAVIGATE 2
  13. BBString *bbStringFromVariant2(VARIANT *v){
  14. unsigned short *w;
  15. int n;
  16. if (v->vt!=VT_BSTR) return 0;
  17. w=(unsigned short*)v->bstrVal;
  18. n=0;
  19. while (w[n++]) {}
  20. return bbStringFromShorts(w,n-1);
  21. }
  22. #define OLERENDER_DRAW 1
  23. #define TODO {printf("htmlview TODO error line:%d\n",__LINE__);fflush(stdout);brl_blitz_NullObjectError();return 0;}
  24. typedef IDispatch * DWebBrowserEventsPtr;
  25. const IID IID_IDocHostUIHandler2={0xbd3f23c0,0xd43e,0x11cf,{0x89,0x3b,0x00,0xaa,0x00,0xbd,0xce,0x1a}};
  26. const IID IID_DWebBrowserEvents2={0x34A715A0,0x6587,0x11D0,{0x92,0x4A,0x00,0x20,0xAF,0xC7,0xAC,0x4D}};
  27. //const IID IID_IHTMLDocument={0x626FC520,0xA41E,0x11cf,{0xA7,0x31,0x00,0xa0,0xc9,0x08,0x26,0x37}};
  28. #define DISPID_BEFORENAVIGATE2 250 // hyperlink clicked on
  29. #define DISPID_NEWWINDOW2 251
  30. #define DISPID_NAVIGATECOMPLETE2 252 // UIActivate new document
  31. #define DISPID_DOCUMENTCOMPLETE 259
  32. //#ifdef MINGW322
  33. typedef interface IHTMLFiltersCollection *LPHTMLFILTERSCOLLECTION;
  34. typedef interface IHTMLLinkElement *LPHTMLLINKELEMENT;
  35. typedef interface IHTMLImgElement *LPHTMLIMGELEMENT;
  36. typedef interface IHTMLImageElementFactory *LPHTMLIMAGEELEMENTFACTORY;
  37. typedef interface IHTMLEventObj *LPHTMLEVENTOBJ;
  38. typedef interface IHTMLScreen *LPHTMLSCREEN;
  39. typedef interface IHTMLOptionElementFactory *LPHTMLOPTIONELEMENTFACTORY;
  40. typedef interface IOmHistory *LPOMHISTORY;
  41. typedef interface IOmNavigator *LPOMNAVIGATOR;
  42. #if __W32API_MAJOR_VERSION<3
  43. EXTERN_C const IID IID_IHTMLFramesCollection2;
  44. EXTERN_C const IID IID_IHTMLWindow2;
  45. #undef INTERFACE
  46. #define INTERFACE IHTMLFramesCollection2
  47. DECLARE_INTERFACE_(IHTMLFramesCollection2,IDispatch)
  48. {
  49. STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
  50. STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  51. STDMETHOD_(ULONG,Release)(THIS) PURE;
  52. STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE;
  53. STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE;
  54. STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE;
  55. STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
  56. STDMETHOD(item)(THIS_ VARIANT*,VARIANT*) PURE;
  57. STDMETHOD(get_length)(THIS_ long*) PURE;
  58. };
  59. #undef INTERFACE
  60. #define INTERFACE IHTMLWindow2
  61. DECLARE_INTERFACE_(IHTMLWindow2,IHTMLFramesCollection2)
  62. {
  63. STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
  64. STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  65. STDMETHOD_(ULONG,Release)(THIS) PURE;
  66. STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE;
  67. STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE;
  68. STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE;
  69. STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
  70. STDMETHOD(item)(THIS_ VARIANT*,VARIANT*) PURE;
  71. STDMETHOD(get_length)(THIS_ long*) PURE;
  72. STDMETHOD(get_frames)(THIS_ IHTMLFramesCollection2**) PURE;
  73. STDMETHOD(put_defaultStatus)(THIS_ BSTR) PURE;
  74. STDMETHOD(get_defaultStatus)(THIS_ BSTR*) PURE;
  75. STDMETHOD(put_status)(THIS_ BSTR) PURE;
  76. STDMETHOD(get_status)(THIS_ BSTR*) PURE;
  77. STDMETHOD(setTimeout)(THIS_ BSTR,long,VARIANT*,long*) PURE;
  78. STDMETHOD(clearTimeout)(THIS_ long) PURE;
  79. STDMETHOD(alert)(THIS_ BSTR) PURE;
  80. STDMETHOD(confirm)(THIS_ BSTR,VARIANT_BOOL*) PURE;
  81. STDMETHOD(prompt)(THIS_ BSTR,BSTR,VARIANT*) PURE;
  82. STDMETHOD(get_Image)(THIS_ LPHTMLIMAGEELEMENTFACTORY*) PURE;
  83. STDMETHOD(get_location)(THIS_ LPHTMLLOCATION*) PURE;
  84. STDMETHOD(get_history)(THIS_ LPOMHISTORY*) PURE;
  85. STDMETHOD(close)(THIS) PURE;
  86. STDMETHOD(put_opener)(THIS_ VARIANT) PURE;
  87. STDMETHOD(get_opener)(THIS_ VARIANT*) PURE;
  88. STDMETHOD(get_navigator)(THIS_ LPOMNAVIGATOR*) PURE;
  89. STDMETHOD(put_name)(THIS_ BSTR) PURE;
  90. STDMETHOD(get_name)(THIS_ BSTR*) PURE;
  91. STDMETHOD(get_parent)(THIS_ LPHTMLWINDOW2*) PURE;
  92. STDMETHOD(open)(THIS_ BSTR,BSTR,BSTR,VARIANT_BOOL,LPHTMLWINDOW2*) PURE;
  93. STDMETHOD(get_self)(THIS_ LPHTMLWINDOW2*) PURE;
  94. STDMETHOD(get_top)(THIS_ LPHTMLWINDOW2*) PURE;
  95. STDMETHOD(get_window)(THIS_ LPHTMLWINDOW2*) PURE;
  96. STDMETHOD(navigate)(THIS_ BSTR) PURE;
  97. STDMETHOD(put_onfocus)(THIS_ VARIANT) PURE;
  98. STDMETHOD(get_onfocus)(THIS_ VARIANT*) PURE;
  99. STDMETHOD(put_onblur)(THIS_ VARIANT) PURE;
  100. STDMETHOD(get_onblur)(THIS_ VARIANT*) PURE;
  101. STDMETHOD(put_onload)(THIS_ VARIANT) PURE;
  102. STDMETHOD(get_onload)(THIS_ VARIANT*) PURE;
  103. STDMETHOD(put_onbeforeunload)(THIS_ VARIANT) PURE;
  104. STDMETHOD(get_onbeforeunload)(THIS_ VARIANT*) PURE;
  105. STDMETHOD(put_onunload)(THIS_ VARIANT) PURE;
  106. STDMETHOD(get_onunload)(THIS_ VARIANT*) PURE;
  107. STDMETHOD(put_onhelp)(THIS_ VARIANT) PURE;
  108. STDMETHOD(get_onhelp)(THIS_ VARIANT*) PURE;
  109. STDMETHOD(put_onerror)(THIS_ VARIANT) PURE;
  110. STDMETHOD(get_onerror)(THIS_ VARIANT*) PURE;
  111. STDMETHOD(put_onresize)(THIS_ VARIANT) PURE;
  112. STDMETHOD(get_onresize)(THIS_ VARIANT*) PURE;
  113. STDMETHOD(put_onscroll)(THIS_ VARIANT) PURE;
  114. STDMETHOD(get_onscroll)(THIS_ VARIANT*) PURE;
  115. STDMETHOD(get_document)(THIS_ IHTMLDocument2**) PURE;
  116. STDMETHOD(get_event)(THIS_ LPHTMLEVENTOBJ*) PURE;
  117. STDMETHOD(get__newEnum)(THIS_ IUnknown**) PURE;
  118. STDMETHOD(showModalDialog)(THIS_ BSTR,VARIANT*,VARIANT*,VARIANT*) PURE;
  119. STDMETHOD(showHelp)(THIS_ BSTR,VARIANT,BSTR) PURE;
  120. STDMETHOD(get_screen)(THIS_ LPHTMLSCREEN*) PURE;
  121. STDMETHOD(get_Option)(THIS_ LPHTMLOPTIONELEMENTFACTORY*) PURE;
  122. STDMETHOD(focus)(THIS) PURE;
  123. STDMETHOD(get_closed)(THIS_ VARIANT_BOOL*) PURE;
  124. STDMETHOD(blur)(THIS) PURE;
  125. STDMETHOD(scroll)(THIS_ long,long) PURE;
  126. STDMETHOD(get_clientInformation)(THIS_ LPOMNAVIGATOR*) PURE;
  127. STDMETHOD(setInterval)(THIS_ BSTR,long,VARIANT*,long*) PURE;
  128. STDMETHOD(clearInterval)(THIS_ long) PURE;
  129. STDMETHOD(put_offscreenBuffering)(THIS_ VARIANT) PURE;
  130. STDMETHOD(get_offscreenBuffering)(THIS_ VARIANT*) PURE;
  131. STDMETHOD(execScript)(THIS_ BSTR,BSTR,VARIANT*) PURE;
  132. STDMETHOD(toString)(THIS_ BSTR*) PURE;
  133. STDMETHOD(scrollBy)(THIS_ long,long) PURE;
  134. STDMETHOD(scrollTo)(THIS_ long,long) PURE;
  135. STDMETHOD(moveTo)(THIS_ long,long) PURE;
  136. STDMETHOD(moveBy)(THIS_ long,long) PURE;
  137. STDMETHOD(resizeTo)(THIS_ long,long) PURE;
  138. STDMETHOD(resizeBy)(THIS_ long,long) PURE;
  139. STDMETHOD(get_external)(THIS_ IDispatch**) PURE;
  140. };
  141. #endif
  142. //#endif //additional mingw 3.2 includes
  143. struct CNullStorage2 : public IStorage{
  144. // IUnknown
  145. STDMETHODIMP QueryInterface(REFIID riid,void ** ppvObject);
  146. STDMETHODIMP_(ULONG) AddRef(void);
  147. STDMETHODIMP_(ULONG) Release(void);
  148. // IStorage
  149. STDMETHODIMP CreateStream(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStream ** ppstm);
  150. STDMETHODIMP OpenStream(const WCHAR * pwcsName,void * reserved1,DWORD grfMode,DWORD reserved2,IStream ** ppstm);
  151. STDMETHODIMP CreateStorage(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStorage ** ppstg);
  152. STDMETHODIMP OpenStorage(const WCHAR * pwcsName,IStorage * pstgPriority,DWORD grfMode,SNB snbExclude,DWORD reserved,IStorage ** ppstg);
  153. STDMETHODIMP CopyTo(DWORD ciidExclude,IID const * rgiidExclude,SNB snbExclude,IStorage * pstgDest);
  154. STDMETHODIMP MoveElementTo(const OLECHAR * pwcsName,IStorage * pstgDest,const OLECHAR* pwcsNewName,DWORD grfFlags);
  155. STDMETHODIMP Commit(DWORD grfCommitFlags);
  156. STDMETHODIMP Revert(void);
  157. STDMETHODIMP EnumElements(DWORD reserved1,void * reserved2,DWORD reserved3,IEnumSTATSTG ** ppenum);
  158. STDMETHODIMP DestroyElement(const OLECHAR * pwcsName);
  159. STDMETHODIMP RenameElement(const WCHAR * pwcsOldName,const WCHAR * pwcsNewName);
  160. STDMETHODIMP SetElementTimes(const WCHAR * pwcsName,FILETIME const * pctime,FILETIME const * patime,FILETIME const * pmtime);
  161. STDMETHODIMP SetClass(REFCLSID clsid);
  162. STDMETHODIMP SetStateBits(DWORD grfStateBits,DWORD grfMask);
  163. STDMETHODIMP Stat(STATSTG * pstatstg,DWORD grfStatFlag);
  164. };
  165. struct CMyFrame2 : public IOleInPlaceFrame{
  166. // IUnknown
  167. STDMETHODIMP QueryInterface(REFIID riid,void ** ppvObject);
  168. STDMETHODIMP_(ULONG) AddRef(void);
  169. STDMETHODIMP_(ULONG) Release(void);
  170. // IOleWindow
  171. STDMETHODIMP GetWindow(HWND FAR* lphwnd);
  172. STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
  173. // IOleInPlaceUIWindow
  174. STDMETHODIMP GetBorder(LPRECT lprectBorder);
  175. STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pborderwidths);
  176. STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pborderwidths);
  177. STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName);
  178. // IOleInPlaceFrame
  179. STDMETHODIMP InsertMenus(HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths);
  180. STDMETHODIMP SetMenu(HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject);
  181. STDMETHODIMP RemoveMenus(HMENU hmenuShared);
  182. STDMETHODIMP SetStatusText(LPCOLESTR pszStatusText);
  183. STDMETHODIMP EnableModeless(BOOL fEnable);
  184. STDMETHODIMP TranslateAccelerator( LPMSG lpmsg,WORD wID);
  185. struct HTMLView *rep;
  186. };
  187. struct CMySite2 : public IOleClientSite,public IOleInPlaceSite,public IDocHostUIHandler
  188. {
  189. // IUnknown
  190. STDMETHODIMP QueryInterface(REFIID riid,void ** ppvObject);
  191. STDMETHODIMP_(ULONG) AddRef(void);
  192. STDMETHODIMP_(ULONG) Release(void);
  193. // IOleClientSite
  194. STDMETHODIMP SaveObject();
  195. STDMETHODIMP GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker ** ppmk);
  196. STDMETHODIMP GetContainer(LPOLECONTAINER FAR* ppContainer);
  197. STDMETHODIMP ShowObject();
  198. STDMETHODIMP OnShowWindow(BOOL fShow);
  199. STDMETHODIMP RequestNewObjectLayout();
  200. // IOleWindow
  201. STDMETHODIMP GetWindow(HWND FAR* lphwnd);
  202. STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
  203. // IOleInPlaceSite methods
  204. STDMETHODIMP CanInPlaceActivate();
  205. STDMETHODIMP OnInPlaceActivate();
  206. STDMETHODIMP OnUIActivate();
  207. STDMETHODIMP GetWindowContext(LPOLEINPLACEFRAME FAR* lplpFrame,LPOLEINPLACEUIWINDOW FAR* lplpDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo);
  208. STDMETHODIMP Scroll(SIZE scrollExtent);
  209. STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
  210. STDMETHODIMP OnInPlaceDeactivate();
  211. STDMETHODIMP DiscardUndoState();
  212. STDMETHODIMP DeactivateAndUndo();
  213. STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
  214. // idochost methods
  215. STDMETHODIMP ShowContextMenu( DWORD dwID,POINT __RPC_FAR *ppt,IUnknown __RPC_FAR *pcmdtReserved,IDispatch __RPC_FAR *pdispReserved) ;
  216. STDMETHODIMP GetHostInfo( DOCHOSTUIINFO __RPC_FAR *pInfo);
  217. STDMETHODIMP ShowUI( DWORD dwID,IOleInPlaceActiveObject __RPC_FAR *pActiveObject,IOleCommandTarget __RPC_FAR *pCommandTarget,IOleInPlaceFrame __RPC_FAR *pFrame,IOleInPlaceUIWindow __RPC_FAR *pDoc);
  218. STDMETHODIMP HideUI( void);
  219. STDMETHODIMP UpdateUI( void);
  220. STDMETHODIMP OnDocWindowActivate( BOOL fActivate);
  221. STDMETHODIMP OnFrameWindowActivate( BOOL fActivate);
  222. STDMETHODIMP ResizeBorder( LPCRECT prcBorder,IOleInPlaceUIWindow __RPC_FAR *pUIWindow,BOOL fRameWindow);
  223. STDMETHODIMP TranslateAccelerator( LPMSG lpMsg,const GUID __RPC_FAR *pguidCmdGroup,DWORD nCmdID);
  224. STDMETHODIMP GetOptionKeyPath( LPOLESTR __RPC_FAR *pchKey,DWORD dw);
  225. STDMETHODIMP GetDropTarget( IDropTarget __RPC_FAR *pDropTarget,IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);
  226. STDMETHODIMP GetExternal( IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);
  227. STDMETHODIMP TranslateUrl(DWORD dwTranslate,OLECHAR __RPC_FAR *pchURLIn,OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);
  228. STDMETHODIMP EnableModeless( BOOL fEnable);
  229. STDMETHODIMP FilterDataObject( IDataObject __RPC_FAR *pDO,IDataObject __RPC_FAR *__RPC_FAR *ppDORet);
  230. struct HTMLView *rep;
  231. };
  232. struct CMyContainer : public IOleContainer{
  233. // IUnknown
  234. STDMETHODIMP QueryInterface(REFIID riid,void ** ppvObject);
  235. STDMETHODIMP_(ULONG) AddRef(void);
  236. STDMETHODIMP_(ULONG) Release(void);
  237. // IParseDisplayName
  238. STDMETHODIMP ParseDisplayName(IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut);
  239. // IOleContainer
  240. STDMETHODIMP EnumObjects(DWORD grfFlags,IEnumUnknown **ppenum);
  241. STDMETHODIMP LockContainer(BOOL fLock);
  242. };
  243. struct _bstr_t
  244. {
  245. struct Data_t
  246. {
  247. wchar_t* m_wstr;
  248. mutable char* m_str;
  249. unsigned long m_RefCount;
  250. Data_t(BSTR bstr, bool fCopy) : m_str(NULL), m_RefCount(1) //throw(_com_error)
  251. {
  252. if (fCopy && bstr != NULL)
  253. {
  254. m_wstr = ::SysAllocStringByteLen(reinterpret_cast<char*>(bstr),::SysStringByteLen(bstr));
  255. // if (m_wstr == NULL) {_com_issue_error(E_OUTOFMEMORY);}
  256. }
  257. else
  258. {
  259. m_wstr = bstr;
  260. }
  261. }
  262. Data_t(const wchar_t* s):m_str(NULL), m_RefCount(1)
  263. {
  264. m_wstr = ::SysAllocString(s);
  265. // if (m_wstr == NULL && s != NULL) {_com_issue_error(E_OUTOFMEMORY);}
  266. }
  267. unsigned long AddRef() throw()
  268. {
  269. InterlockedIncrement(reinterpret_cast<long*>(&m_RefCount));
  270. return m_RefCount;
  271. }
  272. unsigned long Release() throw()
  273. {
  274. if (!InterlockedDecrement(reinterpret_cast<long*>(&m_RefCount))) {delete this;return 0;}
  275. return m_RefCount;
  276. }
  277. unsigned long RefCount() const throw()
  278. {
  279. return m_RefCount;
  280. }
  281. wchar_t* GetWString()
  282. {
  283. return m_wstr;
  284. }
  285. };
  286. Data_t* m_Data;
  287. _bstr_t(BSTR bstr, bool fCopy):m_Data(new Data_t(bstr, fCopy))
  288. {
  289. // if (m_Data == NULL) {_com_issue_error(E_OUTOFMEMORY);}
  290. }
  291. _bstr_t(const wchar_t* s):m_Data(new Data_t(s))
  292. {
  293. // if (m_Data == NULL) {_com_issue_error(E_OUTOFMEMORY);}
  294. }
  295. BBString *bbString()
  296. {
  297. unsigned short *w;
  298. int n;
  299. w=(unsigned short*)m_Data->m_wstr;n=0;while (w[n++]) {}
  300. return bbStringFromShorts(w,n-1);
  301. }
  302. };
  303. struct DWebBrowserEventsImpl2 : public DWebBrowserEvents2 //DWebBrowserEvents
  304. {
  305. // IUnknown methods
  306. STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
  307. STDMETHOD_(ULONG, AddRef)();
  308. STDMETHOD_(ULONG, Release)();
  309. // IDispatch methods
  310. STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
  311. STDMETHOD(GetTypeInfo)(UINT iTInfo,LCID lcid,ITypeInfo** ppTInfo);
  312. STDMETHOD(GetIDsOfNames)(REFIID riid,LPOLESTR* rgszNames,UINT cNames,LCID lcid,DISPID* rgDispId);
  313. STDMETHOD(Invoke)(DISPID dispIdMember,
  314. REFIID riid,
  315. LCID lcid,
  316. WORD wFlags,
  317. DISPPARAMS __RPC_FAR *pDispParams,
  318. VARIANT __RPC_FAR *pVarResult,
  319. EXCEPINFO __RPC_FAR *pExcepInfo,
  320. UINT __RPC_FAR *puArgErr);
  321. // events
  322. HRESULT BeforeNavigate (
  323. _bstr_t URL,
  324. long Flags,
  325. _bstr_t TargetFrameName,
  326. VARIANT * PostData,
  327. _bstr_t Headers,
  328. VARIANT_BOOL * Cancel );
  329. HRESULT NavigateComplete ( _bstr_t URL ) {return S_OK;}
  330. HRESULT StatusTextChange ( _bstr_t Text );
  331. void ProgressChange (
  332. long Progress,
  333. long ProgressMax );
  334. void DownloadComplete();
  335. void CommandStateChange (
  336. long Command,
  337. VARIANT_BOOL Enable );
  338. void DownloadBegin ();
  339. HRESULT NewWindow (
  340. _bstr_t URL,
  341. long Flags,
  342. _bstr_t TargetFrameName,
  343. VARIANT * PostData,
  344. _bstr_t Headers,
  345. VARIANT_BOOL * Processed );
  346. HRESULT TitleChange ( _bstr_t Text );
  347. HRESULT FrameBeforeNavigate (
  348. _bstr_t URL,
  349. long Flags,
  350. _bstr_t TargetFrameName,
  351. VARIANT * PostData,
  352. _bstr_t Headers,
  353. VARIANT_BOOL * Cancel );
  354. HRESULT FrameNavigateComplete (
  355. _bstr_t URL );
  356. HRESULT FrameNewWindow (
  357. _bstr_t URL,
  358. long Flags,
  359. _bstr_t TargetFrameName,
  360. VARIANT * PostData,
  361. _bstr_t Headers,
  362. VARIANT_BOOL * Processed );
  363. HRESULT Quit (
  364. VARIANT_BOOL * Cancel );
  365. HRESULT WindowMove ( );
  366. HRESULT WindowResize ( );
  367. HRESULT WindowActivate ( );
  368. HRESULT PropertyChange (
  369. _bstr_t Property );
  370. void StatusTextChange(OLECHAR*) {}
  371. void TitleChange(OLECHAR*) {}
  372. void PropertyChange(OLECHAR*) {}
  373. void BeforeNavigate2(IDispatch*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL*);
  374. void NewWindow2(IDispatch**, VARIANT_BOOL*); // {}
  375. void NavigateComplete(IDispatch*, VARIANT*) ;
  376. void DocumentComplete(IDispatch*, VARIANT*) ;//{}
  377. void OnQuit() {}
  378. void OnVisible(short int) {}
  379. void OnToolBar(short int) {}
  380. void OnMenuBar(short int) {}
  381. void OnStatusBar(short int) {}
  382. void OnFullScreen(short int) {}
  383. void OnTheaterMode(short int) {}
  384. void WindowSetResizable(short int) {}
  385. void WindowSetLeft(long int) {}
  386. void WindowSetTop(long int) {}
  387. void WindowSetWidth(long int) {}
  388. void WindowSetHeight(long int) {}
  389. void WindowClosing(short int, VARIANT_BOOL*) {}
  390. void ClientToHostWindow(long int*, long int*) {}
  391. void SetSecureLockIcon(long int) {}
  392. void FileDownload(VARIANT_BOOL*) {}
  393. HTMLView *rep;
  394. };
  395. struct HTMLView{
  396. HWND hwnd;
  397. BBObject *owner;
  398. CMySite2 site;
  399. CMyFrame2 frame;
  400. CNullStorage2 storage;
  401. DWebBrowserEventsImpl2 eventsink;
  402. IOleObject *oleObject;
  403. IWebBrowser2* iBrowser;
  404. IOleInPlaceObject *inPlaceObject;
  405. IConnectionPointContainer *iConnection;
  406. IConnectionPoint *iConnectionPoint;
  407. IOleCommandTarget *iTarget;
  408. BSTR current;
  409. DWORD dwCookie;
  410. int viewstyle;
  411. int navcount; //used with style&NOUSERNAV to route user navigation to event queue
  412. int loading; //state returned by getstatus()
  413. HTMLView( BBObject *gadget, wchar_t *wndclass,HWND parent,int style ){
  414. owner=gadget;
  415. current=0;
  416. viewstyle=style;
  417. navcount=0;
  418. loading=0;
  419. int xstyle=WS_EX_CONTROLPARENT;
  420. int wstyle=WS_CHILD|WS_TABSTOP|WS_CLIPSIBLINGS|WS_VISIBLE;
  421. hwnd=CreateWindowExW( xstyle,wndclass,0,wstyle,0,0,200,200,parent,0,GetModuleHandle(0),0 );
  422. site.rep=this;
  423. eventsink.rep=this;
  424. frame.rep=this;
  425. int res=OleCreate( CLSID_WebBrowser,IID_IOleObject,OLERENDER_DRAW,0,&site,&storage,(void**)&oleObject );
  426. OleSetContainedObject( oleObject,TRUE);
  427. oleObject->SetHostNames(L"Web Host",L"Web View");
  428. oleObject->QueryInterface(IID_IWebBrowser2,(void**)&iBrowser);
  429. oleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&inPlaceObject );
  430. oleObject->QueryInterface(IID_IConnectionPointContainer,(void**)&iConnection);
  431. oleObject->QueryInterface(IID_IOleCommandTarget,(void**)&iTarget );
  432. iConnection->FindConnectionPoint(DIID_DWebBrowserEvents2, &iConnectionPoint);
  433. iConnectionPoint->Advise((LPUNKNOWN)&eventsink, &dwCookie);
  434. RECT rect;
  435. ::GetClientRect( hwnd,&rect );
  436. oleObject->DoVerb(OLEIVERB_SHOW,NULL,&site,-1,hwnd,&rect);
  437. oleObject->DoVerb(OLEIVERB_UIACTIVATE,NULL,&site,0,hwnd,&rect); //INPLACE
  438. go( L"about:blank" );
  439. }
  440. ~HTMLView(){
  441. if (current) SysFreeString(current);
  442. inPlaceObject->Release();
  443. iBrowser->Release();
  444. oleObject->Close(OLECLOSE_NOSAVE);
  445. oleObject->Release();
  446. }
  447. void setcurrenturl(VARIANT *url)
  448. {
  449. if (current) SysFreeString(current);
  450. current=0;
  451. if (url->vt==VT_BSTR){
  452. current=SysAllocString(url->bstrVal);
  453. }
  454. }
  455. void setshape(int x,int y,int w,int h){
  456. RECT rect;
  457. rect.left=0;rect.right=w;rect.top=0;rect.bottom=h;
  458. MoveWindow(hwnd,x,y,w,h,TRUE);
  459. inPlaceObject->SetObjectRects( &rect,&rect );
  460. }
  461. void go( const wchar_t *url ){
  462. BSTR bstr=SysAllocString(url);
  463. VARIANT flags={VT_INT};
  464. navcount=1;
  465. loading=1;
  466. iBrowser->Navigate( bstr,&flags,0,0,0 );
  467. SysFreeString(bstr);
  468. }
  469. #define IDM_COPY 15
  470. #define IDM_CUT 16
  471. #define IDM_PASTE 26
  472. int activate(int cmd){
  473. OLECMDF tmpOutput;
  474. switch (cmd)
  475. {
  476. case ACTIVATE_CUT:
  477. iBrowser->QueryStatusWB(OLECMDID_CUT,&tmpOutput);
  478. if(tmpOutput&OLECMDF_ENABLED) return iBrowser->ExecWB(OLECMDID_CUT,OLECMDEXECOPT_DONTPROMPTUSER,0,0);
  479. break;
  480. case ACTIVATE_COPY:
  481. iBrowser->QueryStatusWB(OLECMDID_COPY,&tmpOutput);
  482. if(tmpOutput&OLECMDF_ENABLED) return iBrowser->ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER,0,0);
  483. break;
  484. case ACTIVATE_PASTE:
  485. iBrowser->QueryStatusWB(OLECMDID_PASTE,&tmpOutput);
  486. if(tmpOutput&OLECMDF_ENABLED) return iBrowser->ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DONTPROMPTUSER,0,0);
  487. break;
  488. case ACTIVATE_PRINT:
  489. return iBrowser->ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER,0,0);
  490. case ACTIVATE_BACK:
  491. navcount=1;
  492. iBrowser->GoBack();
  493. return 0;
  494. case ACTIVATE_FORWARD:
  495. navcount=1;
  496. iBrowser->GoForward();
  497. return 0;
  498. }
  499. return 0;
  500. }
  501. void run( const wchar_t *script )
  502. {
  503. IDispatch *disp;
  504. BSTR bstr;
  505. IHTMLDocument2 *doc;
  506. IHTMLWindow2 *win;
  507. HRESULT res;
  508. VARIANT result;
  509. // bstr=SysAllocStringLen((OLECHAR*)script->buf,scripturl->length);
  510. bstr=SysAllocString(script);//(OLECHAR*)script->buf,scripturl->length);
  511. res=iBrowser->get_Document(&disp);
  512. if (res==S_OK)
  513. {
  514. res=disp->QueryInterface(IID_IHTMLDocument2,(void**)&doc);
  515. res=doc->get_parentWindow(&win);
  516. result.vt=VT_EMPTY;
  517. res=win->execScript(bstr,0,&result);
  518. }
  519. SysFreeString(bstr);
  520. }
  521. int status(){
  522. READYSTATE state;
  523. iBrowser->get_ReadyState(&state);
  524. return (state!=READYSTATE_COMPLETE);
  525. }
  526. };
  527. STDMETHODIMP CNullStorage2::QueryInterface(REFIID riid,void ** ppvObject){
  528. TODO
  529. }
  530. STDMETHODIMP_(ULONG) CNullStorage2::AddRef(void){
  531. return 1;
  532. }
  533. STDMETHODIMP_(ULONG) CNullStorage2::Release(void){
  534. return 1;
  535. }
  536. STDMETHODIMP CNullStorage2::CreateStream(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStream ** ppstm){
  537. TODO
  538. }
  539. STDMETHODIMP CNullStorage2::OpenStream(const WCHAR * pwcsName,void * reserved1,DWORD grfMode,DWORD reserved2,IStream ** ppstm){
  540. TODO
  541. }
  542. STDMETHODIMP CNullStorage2::CreateStorage(const WCHAR * pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2,IStorage ** ppstg){
  543. TODO
  544. }
  545. STDMETHODIMP CNullStorage2::OpenStorage(const WCHAR * pwcsName,IStorage * pstgPriority,DWORD grfMode,SNB snbExclude,DWORD reserved,IStorage ** ppstg){
  546. TODO
  547. }
  548. STDMETHODIMP CNullStorage2::CopyTo(DWORD ciidExclude,IID const * rgiidExclude,SNB snbExclude,IStorage * pstgDest){
  549. TODO
  550. }
  551. STDMETHODIMP CNullStorage2::MoveElementTo(const OLECHAR * pwcsName,IStorage * pstgDest,const OLECHAR* pwcsNewName,DWORD grfFlags){
  552. TODO
  553. }
  554. STDMETHODIMP CNullStorage2::Commit(DWORD grfCommitFlags){
  555. TODO
  556. }
  557. STDMETHODIMP CNullStorage2::Revert(void){
  558. TODO
  559. }
  560. STDMETHODIMP CNullStorage2::EnumElements(DWORD reserved1,void * reserved2,DWORD reserved3,IEnumSTATSTG ** ppenum){
  561. TODO
  562. }
  563. STDMETHODIMP CNullStorage2::DestroyElement(const OLECHAR * pwcsName){
  564. TODO
  565. }
  566. STDMETHODIMP CNullStorage2::RenameElement(const WCHAR * pwcsOldName,const WCHAR * pwcsNewName){
  567. TODO
  568. }
  569. STDMETHODIMP CNullStorage2::SetElementTimes(const WCHAR * pwcsName,FILETIME const * pctime,FILETIME const * patime,FILETIME const * pmtime){
  570. TODO
  571. }
  572. STDMETHODIMP CNullStorage2::SetClass(REFCLSID clsid){
  573. return S_OK;
  574. }
  575. STDMETHODIMP CNullStorage2::SetStateBits(DWORD grfStateBits,DWORD grfMask){
  576. TODO
  577. }
  578. STDMETHODIMP CNullStorage2::Stat(STATSTG * pstatstg,DWORD grfStatFlag){
  579. TODO
  580. }
  581. STDMETHODIMP CMySite2::QueryInterface(REFIID riid,void ** ppvObject){
  582. if( riid == IID_IUnknown || riid == IID_IOleClientSite ){
  583. *ppvObject = (IOleClientSite*)this;
  584. }else if(riid == IID_IOleInPlaceSite){
  585. *ppvObject = (IOleInPlaceSite*)this;
  586. }else if(riid == IID_IDocHostUIHandler2){
  587. *ppvObject = (IDocHostUIHandler*)this;
  588. }else{
  589. *ppvObject = NULL;
  590. return E_NOINTERFACE;
  591. }
  592. return S_OK;
  593. }
  594. STDMETHODIMP_(ULONG) CMySite2::AddRef(void){
  595. return 1;
  596. }
  597. STDMETHODIMP_(ULONG) CMySite2::Release(void){
  598. return 1;
  599. }
  600. STDMETHODIMP CMySite2::SaveObject(){
  601. TODO
  602. }
  603. STDMETHODIMP CMySite2::GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker ** ppmk){
  604. TODO
  605. }
  606. STDMETHODIMP CMySite2::GetContainer(LPOLECONTAINER FAR* ppContainer){
  607. *ppContainer = NULL;
  608. return E_NOINTERFACE;
  609. }
  610. STDMETHODIMP CMySite2::ShowObject(){
  611. return NOERROR;
  612. }
  613. STDMETHODIMP CMySite2::OnShowWindow(BOOL fShow){
  614. TODO
  615. }
  616. STDMETHODIMP CMySite2::RequestNewObjectLayout(){
  617. TODO
  618. }
  619. STDMETHODIMP CMySite2::GetWindow(HWND FAR* lphwnd){
  620. *lphwnd=rep->hwnd;
  621. return S_OK;
  622. }
  623. STDMETHODIMP CMySite2::ContextSensitiveHelp(BOOL fEnterMode){
  624. TODO
  625. }
  626. STDMETHODIMP CMySite2::CanInPlaceActivate(){
  627. return S_OK;
  628. }
  629. STDMETHODIMP CMySite2::OnInPlaceActivate(){
  630. return S_OK;
  631. }
  632. STDMETHODIMP CMySite2::OnUIActivate(){
  633. return S_OK;
  634. }
  635. STDMETHODIMP CMySite2::GetWindowContext(
  636. LPOLEINPLACEFRAME FAR* ppFrame,
  637. LPOLEINPLACEUIWINDOW FAR* ppDoc,
  638. LPRECT prcPosRect,
  639. LPRECT prcClipRect,
  640. LPOLEINPLACEFRAMEINFO lpFrameInfo){
  641. *ppFrame=&rep->frame;
  642. *ppDoc = NULL;
  643. GetClientRect(rep->hwnd,prcPosRect);
  644. GetClientRect(rep->hwnd,prcClipRect);
  645. lpFrameInfo->cb=sizeof(OLEINPLACEFRAMEINFO);
  646. lpFrameInfo->fMDIApp=FALSE;
  647. lpFrameInfo->hwndFrame=rep->hwnd;
  648. lpFrameInfo->haccel=NULL;
  649. lpFrameInfo->cAccelEntries=0;
  650. return S_OK;
  651. }
  652. STDMETHODIMP CMySite2::Scroll(SIZE scrollExtent){
  653. TODO
  654. }
  655. STDMETHODIMP CMySite2::OnUIDeactivate(BOOL fUndoable){
  656. return S_OK;
  657. }
  658. STDMETHODIMP CMySite2::OnInPlaceDeactivate(){
  659. return S_OK;
  660. }
  661. STDMETHODIMP CMySite2::DiscardUndoState(){
  662. TODO
  663. }
  664. STDMETHODIMP CMySite2::DeactivateAndUndo(){
  665. TODO
  666. }
  667. STDMETHODIMP CMySite2::OnPosRectChange( const RECT *rect ){
  668. TODO
  669. }
  670. STDMETHODIMP CMySite2::EnableModeless( BOOL fEnable) {return S_OK;} //[in]
  671. STDMETHODIMP CMySite2::ShowContextMenu(
  672. /* [in] */ DWORD dwID,
  673. /* [in] */ POINT __RPC_FAR *ppt,
  674. /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
  675. /* [in] */ IDispatch __RPC_FAR *pdispReserved)
  676. {
  677. if (rep->viewstyle&NOCONTEXTMENU) return S_OK;
  678. return S_FALSE;
  679. }
  680. STDMETHODIMP CMySite2::ShowUI(
  681. /* [in] */ DWORD dwID,
  682. /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
  683. /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
  684. /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
  685. /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc)
  686. {
  687. // pCommandTarget->Exec(0,IDM_DISABLEMODELESS,OLECMDEXECOPT_DODEFAULT,0,0);
  688. // if (rep->style&SHOWUI) return S_FALSE;
  689. return S_OK;
  690. }
  691. STDMETHODIMP CMySite2::HideUI( void)
  692. {
  693. return S_OK;
  694. }
  695. STDMETHODIMP CMySite2::UpdateUI( void)
  696. {
  697. return S_OK;
  698. }
  699. STDMETHODIMP CMySite2::OnDocWindowActivate( /* [in] */ BOOL fActivate) {return S_OK;}
  700. STDMETHODIMP CMySite2::OnFrameWindowActivate( /* [in] */ BOOL fActivate){return S_OK;}
  701. STDMETHODIMP CMySite2::ResizeBorder(
  702. /* [in] */ LPCRECT prcBorder,
  703. /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
  704. /* [in] */ BOOL fRameWindow) {return S_OK;}
  705. STDMETHODIMP CMySite2::TranslateAccelerator( //simon was here
  706. /* [in] */ LPMSG lpMsg,
  707. /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
  708. /* [in] */ DWORD nCmdID)
  709. {
  710. // printf("CMySite2::TranslateAccelerator\n");fflush(stdout);
  711. if (lpMsg && lpMsg->message == WM_KEYDOWN){// && pMsg->wParam == VK_TAB) {
  712. return S_FALSE;
  713. } return E_NOTIMPL;
  714. }
  715. STDMETHODIMP CMySite2::GetOptionKeyPath(
  716. /* [out] */ LPOLESTR __RPC_FAR *pchKey,
  717. /* [in] */ DWORD dw) {return E_NOTIMPL;}
  718. STDMETHODIMP CMySite2::GetDropTarget(
  719. /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
  720. /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget) {return E_NOTIMPL;}
  721. STDMETHODIMP CMySite2::GetExternal( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) {return -1;}
  722. STDMETHODIMP CMySite2::TranslateUrl(
  723. /* [in] */ DWORD dwTranslate,
  724. /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
  725. /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
  726. {
  727. return S_FALSE;
  728. // ppchURLOut=0;
  729. // return S_OK;
  730. }
  731. STDMETHODIMP CMySite2::GetHostInfo(
  732. /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo)
  733. {
  734. // static DOCHOSTUIINFO pi;
  735. // pi.cbSize=sizeof(pi);
  736. // pi.dwFlags|=DOCHOSTUIFLAG_SCROLL_NO;
  737. // pi.dwDoubleClick=0;
  738. // pInfo=&pi;
  739. // pinfo.dwFlags|=DOCHOSTUIFLAG_SCROLL_NO;
  740. // return S_OK;
  741. return E_NOTIMPL;
  742. }
  743. STDMETHODIMP CMySite2::FilterDataObject(
  744. /* [in] */ IDataObject __RPC_FAR *pDO,
  745. /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet) {return S_FALSE;}
  746. STDMETHODIMP CMyFrame2::QueryInterface(REFIID riid,void ** ppvObject){
  747. TODO
  748. }
  749. STDMETHODIMP_(ULONG) CMyFrame2::AddRef(void){
  750. return 1;
  751. }
  752. STDMETHODIMP_(ULONG) CMyFrame2::Release(void){
  753. return 1;
  754. }
  755. STDMETHODIMP CMyFrame2::GetWindow(HWND FAR* lphwnd){
  756. *lphwnd=rep->hwnd;
  757. return S_OK;
  758. }
  759. STDMETHODIMP CMyFrame2::ContextSensitiveHelp(BOOL fEnterMode){
  760. TODO
  761. }
  762. STDMETHODIMP CMyFrame2::GetBorder(LPRECT lprectBorder){
  763. TODO
  764. }
  765. STDMETHODIMP CMyFrame2::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths){
  766. TODO
  767. }
  768. STDMETHODIMP CMyFrame2::SetBorderSpace(LPCBORDERWIDTHS pborderwidths){
  769. TODO
  770. }
  771. STDMETHODIMP CMyFrame2::SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName){
  772. return S_OK;
  773. }
  774. STDMETHODIMP CMyFrame2::InsertMenus(HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths){
  775. TODO
  776. }
  777. STDMETHODIMP CMyFrame2::SetMenu(HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject){
  778. return S_OK;
  779. }
  780. STDMETHODIMP CMyFrame2::RemoveMenus(HMENU hmenuShared){
  781. TODO
  782. }
  783. STDMETHODIMP CMyFrame2::SetStatusText(LPCOLESTR pszStatusText){
  784. return S_OK;
  785. }
  786. STDMETHODIMP CMyFrame2::EnableModeless(BOOL fEnable){
  787. return S_OK;
  788. }
  789. STDMETHODIMP CMyFrame2::TranslateAccelerator(LPMSG lpmsg,WORD wID){
  790. TODO
  791. }
  792. ULONG __stdcall DWebBrowserEventsImpl2::AddRef() { return 1;}
  793. ULONG __stdcall DWebBrowserEventsImpl2::Release() { return 0;}
  794. HRESULT __stdcall DWebBrowserEventsImpl2::QueryInterface(REFIID riid, LPVOID* ppv)
  795. {
  796. *ppv = NULL;
  797. if (IID_IUnknown == riid || IID_DWebBrowserEvents2 == riid) //__uuidof(DWebBrowserEventsPtr) == riid) //was PTR
  798. {
  799. *ppv = (LPUNKNOWN)(DWebBrowserEventsPtr*)this;
  800. AddRef();
  801. return NOERROR;
  802. }
  803. else if (IID_IOleClientSite == riid)
  804. {
  805. *ppv = (IOleClientSite*)this;
  806. AddRef();
  807. return NOERROR;
  808. }
  809. else if (IID_IDispatch == riid)
  810. {
  811. *ppv = (IDispatch*)this;
  812. AddRef();
  813. return NOERROR;
  814. }
  815. else
  816. {
  817. return E_NOTIMPL;
  818. }
  819. }
  820. // void BeforeNavigate2(IDispatch*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL*);
  821. HRESULT __stdcall DWebBrowserEventsImpl2::Invoke(DISPID dispIdMember,
  822. REFIID riid,
  823. LCID lcid,
  824. WORD wFlags,
  825. DISPPARAMS __RPC_FAR *pDispParams,
  826. VARIANT __RPC_FAR *pVarResult,
  827. EXCEPINFO __RPC_FAR *pExcepInfo,
  828. UINT __RPC_FAR *puArgErr)
  829. {
  830. switch (dispIdMember)
  831. {
  832. case DISPID_BEFORENAVIGATE2:
  833. BeforeNavigate2(
  834. pDispParams->rgvarg[6].pdispVal,
  835. pDispParams->rgvarg[5].pvarVal,
  836. pDispParams->rgvarg[4].pvarVal,
  837. pDispParams->rgvarg[3].pvarVal,
  838. pDispParams->rgvarg[2].pvarVal,
  839. pDispParams->rgvarg[1].pvarVal,
  840. pDispParams->rgvarg[0].pboolVal);
  841. break;
  842. case DISPID_NEWWINDOW2:
  843. NewWindow2(
  844. pDispParams->rgvarg[1].ppdispVal,
  845. pDispParams->rgvarg[0].pboolVal); //IDispatch**, VARIANT_BOOL*
  846. break;
  847. case DISPID_NAVIGATECOMPLETE2:
  848. NavigateComplete(pDispParams->rgvarg[1].pdispVal,pDispParams->rgvarg[0].pvarVal);
  849. break;
  850. case DISPID_DOCUMENTCOMPLETE:
  851. DocumentComplete(pDispParams->rgvarg[1].pdispVal,pDispParams->rgvarg[0].pvarVal);
  852. break;
  853. }
  854. return NOERROR;
  855. }
  856. // IDispatch methods
  857. HRESULT __stdcall DWebBrowserEventsImpl2::GetTypeInfoCount(UINT* pctinfo)
  858. {
  859. return E_NOTIMPL;
  860. }
  861. HRESULT __stdcall DWebBrowserEventsImpl2::GetTypeInfo(UINT iTInfo,
  862. LCID lcid,
  863. ITypeInfo** ppTInfo)
  864. {
  865. return E_NOTIMPL;
  866. }
  867. HRESULT __stdcall DWebBrowserEventsImpl2::GetIDsOfNames(REFIID riid,
  868. LPOLESTR* rgszNames,
  869. UINT cNames,
  870. LCID lcid,
  871. DISPID* rgDispId)
  872. {
  873. return E_NOTIMPL;
  874. }
  875. // Methods:
  876. void DWebBrowserEventsImpl2::NewWindow2(IDispatch**pdisp, VARIANT_BOOL*Cancel)
  877. {
  878. // *pdisp=rep->iBrowser;
  879. *Cancel=VARIANT_TRUE;// was FALSE;
  880. }
  881. void DWebBrowserEventsImpl2::BeforeNavigate2(IDispatch*, VARIANT*URL, VARIANT*, VARIANT*TARGET, VARIANT*, VARIANT*, VARIANT_BOOL*Cancel)
  882. {
  883. BBString *url;
  884. *Cancel=VARIANT_FALSE;
  885. if (TARGET->bstrVal) {
  886. return;
  887. }
  888. if ((rep->viewstyle&NONAVIGATE) && (rep->navcount==0)){
  889. *Cancel=VARIANT_TRUE;
  890. url=bbStringFromVariant2(URL);
  891. bbSystemEmitEvent( BBEVENT_GADGETACTION,rep->owner,0,0,0,0,(BBObject*)url );
  892. }else{
  893. rep->navcount=0;
  894. }
  895. }
  896. void DWebBrowserEventsImpl2::NavigateComplete ( IDispatch* pDisp,VARIANT*URL )
  897. {
  898. // printf("Navigate Complete!\n");fflush(stdout);
  899. // rep->setcurrenturl(URL);
  900. // rep->loading=0;
  901. // rep->owner->emit( BBEVENT_GADGETDONE );
  902. // bbSystemEmitEvent( BBEVENT_GADGETDONE,rep->owner,0,0,0,0,BBNULL );
  903. }
  904. void DWebBrowserEventsImpl2::DocumentComplete ( IDispatch* pDisp,VARIANT*URL )
  905. {
  906. // printf("Document Complete!\n");fflush(stdout);
  907. rep->setcurrenturl(URL);
  908. rep->loading=0;
  909. // rep->owner->emit( BBEVENT_GADGETDONE );
  910. bbSystemEmitEvent( BBEVENT_GADGETDONE,rep->owner,0,0,0,0,BBNULL );
  911. }
  912. HRESULT DWebBrowserEventsImpl2::StatusTextChange ( _bstr_t Text ) { return S_OK; }
  913. void DWebBrowserEventsImpl2::ProgressChange (long Progress,long ProgressMax ) {}
  914. void DWebBrowserEventsImpl2::DownloadComplete() {}
  915. void DWebBrowserEventsImpl2::CommandStateChange (long Command,VARIANT_BOOL Enable ) {}
  916. void DWebBrowserEventsImpl2::DownloadBegin () {}
  917. HRESULT DWebBrowserEventsImpl2::NewWindow (
  918. _bstr_t URL,
  919. long Flags,
  920. _bstr_t TargetFrameName,
  921. VARIANT * PostData,
  922. _bstr_t Headers,
  923. VARIANT_BOOL * Processed ) { return S_OK; }
  924. HRESULT DWebBrowserEventsImpl2::TitleChange ( _bstr_t Text ) { return S_OK; }
  925. HRESULT DWebBrowserEventsImpl2::FrameBeforeNavigate (
  926. _bstr_t URL,
  927. long Flags,
  928. _bstr_t TargetFrameName,
  929. VARIANT * PostData,
  930. _bstr_t Headers,
  931. VARIANT_BOOL * Cancel ) { return S_OK; }
  932. HRESULT DWebBrowserEventsImpl2::FrameNavigateComplete (
  933. _bstr_t URL ) { return S_OK; }
  934. HRESULT DWebBrowserEventsImpl2::FrameNewWindow (
  935. _bstr_t URL,
  936. long Flags,
  937. _bstr_t TargetFrameName,
  938. VARIANT * PostData,
  939. _bstr_t Headers,
  940. VARIANT_BOOL * Processed ) { return S_OK; }
  941. HRESULT DWebBrowserEventsImpl2::Quit (
  942. VARIANT_BOOL * Cancel ) { return S_OK; }
  943. HRESULT DWebBrowserEventsImpl2::WindowMove ( ) { return S_OK; }
  944. HRESULT DWebBrowserEventsImpl2::WindowResize ( ) { return S_OK; }
  945. HRESULT DWebBrowserEventsImpl2::WindowActivate ( ) { return S_OK; }
  946. HRESULT DWebBrowserEventsImpl2::PropertyChange (
  947. _bstr_t Property ) { return S_OK; }
  948. // C style public interface
  949. HTMLView * msHtmlCreate( BBObject *gadget,wchar_t *wndclass,HWND hwnd,int flags ){
  950. HTMLView *view;
  951. view=new HTMLView(gadget,wndclass, hwnd,flags);
  952. return view;
  953. }
  954. void msHtmlGo( HTMLView * view,wchar_t *url ){
  955. view->go(url);
  956. }
  957. void msHtmlRun( HTMLView * view,wchar_t *script ){
  958. view->run(script);
  959. }
  960. void msHtmlSetShape( HTMLView * view,int x,int y,int w,int h ){
  961. view->setshape(x,y,w,h);
  962. }
  963. void msHtmlSetVisible( HTMLView * view,int visible ){
  964. }
  965. void msHtmlSetEnabled( HTMLView * view,int enabled ){
  966. }
  967. int msHtmlActivate(HTMLView * view,int cmd){
  968. return view->activate(cmd);
  969. }
  970. int msHtmlStatus(HTMLView * view){
  971. return view->status();
  972. }
  973. HWND msHtmlHwnd( HTMLView * view){
  974. return view->hwnd;
  975. }
  976. void msHtmlBrowser( HTMLView * view, IWebBrowser2 ** browser){
  977. *browser = view->iBrowser;
  978. //return view->iBrowser;
  979. }