home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ool.zip / OOL / source / xwebview.cpp < prev    next >
C/C++ Source or Header  |  1997-04-08  |  14KB  |  506 lines

  1. #include "XControl.h"
  2. #include "XWebView.h"
  3. #include "xmsgbox.h"
  4. #include "webexwin.h"
  5. #include "xstring.h"
  6. #include "XDefHdl.h"
  7.  
  8. /*@ 
  9. @class XWebView
  10. @type overview
  11. @symbol _
  12. @remarks XWebView is a high-level control which gives you the functionality of a web-browser.
  13. It uses the the WebExplorer-display capabilitys so you can use the EMail and News services
  14. too.<P>
  15. To use the control in your application:
  16. <OL>
  17. <LI>derive a class from XWebView
  18. <LI>override the functions you need (eg. HandleError())
  19. <LI>call Load() with the needed URL
  20. <LI>done
  21. </OL>
  22. */
  23.  
  24. class webDefHandler:public XDefaultHandler
  25. {
  26.         XWebView *web;
  27.     public:
  28.         webDefHandler(const XWindow * w, const XWebView * v):XDefaultHandler(w)
  29.                 { web = (XWebView *) v; }
  30.         BOOL HandleEvent(ULONG, void *, void *);
  31. };
  32.  
  33.  
  34. /*@ XWebView :: XWebView(const XWindow * owner, const XRect * rec, const USHORT id)
  35. @remarks Constructs a web-control
  36. @parameters <t '°' c=2>
  37.                 °XWindow * owner  °the owner window
  38.            °XRect * rect     °rectangle
  39.            °USHORT id        °the window-ID
  40.                 </t>
  41. */
  42. XWebView :: XWebView(const XWindow * owner, const XRect * rec, const USHORT id):XControl(rec, WS_VISIBLE, owner, "", WC_WXVIEW, id)
  43. {
  44.     WXDISPLAYOPTS opts;
  45.  
  46.     WXViewQueryDisplayOpts(winhandle, &opts, sizeof(opts));
  47.     WXViewSetDisplayOpts(winhandle, &opts, sizeof(opts));
  48.     webDefHandler *d = new webDefHandler(owner, this);
  49. }
  50.  
  51.  
  52. /*@ XWebView::SetOptions(const char *emailAddress, const char *newsServer)
  53. @group misc
  54. @remarks Setup options for EMail and News services.
  55. @parameters  char * emailAddress  your email address<BR>
  56.             char * newsServer    the news-server to use
  57. */
  58. void XWebView::SetOptions(const char *emailAddress, const char *newsServer)
  59. {
  60.     WXNETWORKOPTS opts;
  61.  
  62.     WXViewQueryNetworkOpts(winhandle, &opts, sizeof(opts));
  63.  
  64.     if (emailAddress)
  65.         strcpy(opts.szEmailAddress, emailAddress);
  66.     if (newsServer)
  67.         strcpy(opts.szNewsServer, newsServer);
  68.     WXViewSetNetworkOpts(winhandle, &opts, sizeof(opts));
  69. }
  70.  
  71.  
  72. /*@ XWebView::Load(const char *url, const BOOL reload)
  73. @group load data
  74. @remarks Load data from the internet/intranet
  75. @parameters char * url   full qualified URL<BR>
  76.            BOOL reload   TRUE=do not use cached data, FALSE=use cache
  77. @returns     LONG result
  78. */
  79. LONG XWebView::Load(const char *url, const BOOL reload)
  80. {
  81.     return WXViewLoad(winhandle, (PCSZ) url, (reload ? WXLOAD_ANCHOR | WXLOAD_FORCERELOAD : WXLOAD_ANCHOR), NULL);
  82. }
  83.  
  84.  
  85.  
  86. /*@ XWebView::GetDocTitle(XString * buffer)
  87. @group misc
  88. @remarks Get the title of the document.
  89. @parameters XString * buffer   buffer to hold data.
  90. @returns     BOOL result
  91. */
  92. BOOL XWebView::GetDocTitle(XString * buffer)
  93. {
  94.     SHORT len = WXViewQueryDocTitleLen(winhandle);
  95.  
  96.     if (len <= 0)
  97.         return FALSE;
  98.     LONG res = (LONG) WXViewQueryDocTitle(winhandle, (PSZ) buffer->GetBuffer(len + 1), len);
  99.  
  100.     buffer->ReleaseBuffer(len);
  101.     return (res ? FALSE : TRUE);
  102. }
  103.  
  104.  
  105. /*@ XWebView::GetDocAnchor(XString * buffer)
  106. @group anchor
  107. @remarks Get the anchor of the document.
  108. @parameters XString * buffer   buffer to hold data.
  109. @returns     BOOL result
  110. */
  111. BOOL XWebView::GetDocAnchor(XString * buffer)
  112. {
  113.     SHORT len = WXViewQueryDocAnchorLen(winhandle);
  114.     LONG res = (LONG) WXViewQueryDocAnchor(winhandle, (PSZ) buffer->GetBuffer(len + 1), len);
  115.  
  116.     buffer->ReleaseBuffer(len);
  117.     return (res ? FALSE : TRUE);
  118. }
  119.  
  120.  
  121. /*@ XWebView::Search(const char *searchString, const XPoint * start, XPoint * resBuffer, const BOOL forward)
  122. @group misc
  123. @remarks Search a string in the document.
  124. @parameters <t '°' c=2>
  125.                 °char* string       °string to find.
  126.            °XPoint * start     °point in document-coordinates to start
  127.            °XPoint * buffer    °buffer which will hold coordinates of the result
  128.            °BOOL forward       °TRUE=search forward, FALSE=backward
  129.                 </t>
  130. @returns     BOOL result
  131. */
  132. BOOL XWebView::Search(const char *searchString, const XPoint * start, XPoint * resBuffer, const BOOL forward)
  133. {
  134.     WXPOS s, e;
  135.  
  136.     s.x = start->GetX();
  137.     s.y = start->GetY();
  138.     LONG opts = (forward ? WXSEARCH_FORWARD : WXSEARCH_BACKWARD);
  139.  
  140.     if (WXViewSearch(winhandle, opts, &s, &e, (PSZ) searchString) != 0)
  141.         return FALSE;
  142.     else
  143.         resBuffer->Set(e.x, e.y);
  144.     return TRUE;
  145. }
  146.  
  147.  
  148. /*@ XWebView::GetPos(const XPoint * mouse, XPoint * view)
  149. @group misc
  150. @remarks Calculate document-coordinates from window-coordinates (e.g. mouse-position).
  151. @parameters XPoint * in        window-cordinates<BR>
  152.            XPoint * buffer    bufer wich will hold the document-coordinates
  153. @returns     LONG result
  154. */
  155. BOOL XWebView::GetPos(const XPoint * mouse, XPoint * view)
  156. {
  157.     WXPOS pos;
  158.  
  159.     if (WXViewQueryPos(winhandle, mouse->GetX(), mouse->GetY(), &pos) != 0)
  160.         return FALSE;
  161.     else
  162.         view->Set(pos.x, pos.y);
  163.     return TRUE;
  164. }
  165.  
  166.  
  167. /*@ XWebView::SetAnchorState(const char *anchor, const LONG state)
  168. @group anchor
  169. @remarks Set the state of an anchor.
  170. @parameters  <t '°' c=2>
  171.                 °char * anchor     °name of the anchor
  172.             °LONG state        °state to set:
  173.                                         <t '°' c=1>
  174.                                  °WEB_ANCHOR_DEFAULT
  175.                                  °WEB_ANCHOR_VISITED
  176.                                         </t>
  177.                 </t>
  178. @returns     BOOL result
  179. */
  180. BOOL XWebView::SetAnchorState(const char *anchor, const LONG state)
  181. {
  182.     if (WXViewSetAnchorState(winhandle, anchor, state) == 0)
  183.         return TRUE;
  184.     else
  185.         return FALSE;
  186. }
  187.  
  188.  
  189. /*@ XWebView::GetAnchorState(const char *anchor, LONG & state)
  190. @group anchor
  191. @remarks Get the state of an anchor.
  192. @parameters  <t '°' c=2>
  193.                 °char * anchor     °name of the anchor
  194.             °LONG& state       °buffer for the state to the anchor, you may receive:
  195.                                         <t '°' c=1>
  196.                                  °WEB_ANCHOR_DEFAULT
  197.                                  °WEB_ANCHOR_VISITED
  198.                                         </t>
  199.                 </t>
  200. @returns     BOOL result
  201. */
  202. BOOL XWebView::GetAnchorState(const char *anchor, LONG & state)
  203. {
  204.     WXFLAGS flags;
  205.  
  206.     if (WXViewQueryAnchorState(winhandle, anchor, &flags) == 0)
  207.     {
  208.         state = flags;
  209.         return TRUE;
  210.     }
  211.     else
  212.         return FALSE;
  213. }
  214.  
  215.  
  216. /*@ XWebView::SetViewer(const char *MIMEType, const char *program)
  217. @group MIME
  218. @remarks Register a viewer for a specific MIME-type
  219. @parameters char * MIME     type of MIME<BR>
  220.            char * program  program to register.
  221. @returns     BOOL result
  222. */
  223. BOOL XWebView::SetViewer(const char *MIMEType, const char *program)
  224. {
  225.     WXVIEWER view;
  226.  
  227.     strcpy(view.szMIMEType, MIMEType);
  228.     strcpy(view.szProgram, program);
  229.     if (WXViewSetViewer(winhandle, &view, sizeof(view)) == 0)
  230.         return TRUE;
  231.     else
  232.         return FALSE;
  233. }
  234.  
  235.  
  236. /*@ XWebView::GetViewer(const char *MIMEType, XString * program)
  237. @group MIME
  238. @remarks Get a viewer for a specific MIME-type
  239. @parameters char * MIME          type of MIME<BR>
  240.            XString * program    buffer which will hold the registered program.
  241. @returns     BOOL result
  242. */
  243. BOOL XWebView::GetViewer(const char *MIMEType, XString * program)
  244. {
  245.     WXVIEWER view;
  246.  
  247.     if (WXViewQueryViewer(winhandle, (PSZ) MIMEType, &view, sizeof(view)) == 0)
  248.     {
  249.         *program = view.szProgram;
  250.         return TRUE;
  251.     }
  252.     else
  253.         return FALSE;
  254. }
  255.  
  256.  
  257. /*@ XWebView::GetPointer(const LONG pointerType)
  258. @group Pointer
  259. @remarks Get a pointer.
  260. @parameters <t '°' c=2>
  261.                 °LONG pointerType   °the pointer to request:
  262.                                         <t '°' c=1>
  263.                                  °WEB_POINTER_NORMAL
  264.                                  °WEB_POINTER_WAIT
  265.                                  °WEB_POINTER_ANCHOR
  266.                                  °WEB_POINTER_UNKNOWN
  267.                                         </t>
  268.                 </t>
  269. @returns     OOL_POINTERHNDLE   handle of the pointer.
  270. */
  271. OOL_POINTERHANDLE XWebView::GetPointer(const LONG pointerType)
  272. {
  273.     return WXViewQueryPointer(winhandle, pointerType);
  274. }
  275.  
  276.  
  277. /*@ XWebView::SetPointer(const OOL_POINTERHANDLE pointer, const LONG pointerType)
  278. @group Pointer
  279. @remarks Get a pointer.
  280. @parameters <t '°' c=2>
  281.                 °OOL_POINTERHANDLE   °handle of the pointer to set
  282.            °LONG pointerType   °the pointer to set:
  283.                                         <t '°' c=1>
  284.                                  °WEB_POINTER_NORMAL
  285.                                  °WEB_POINTER_WAIT
  286.                                  °WEB_POINTER_ANCHOR
  287.                                  °WEB_POINTER_UNKNOWN
  288.                                         </t>
  289.                 </t>
  290. @returns BOOL success
  291. */
  292. BOOL XWebView::SetPointer(const OOL_POINTERHANDLE pointer, const LONG pointerType)
  293. {
  294.     if (WXViewSetPointer(winhandle, pointerType, pointer) == 0)
  295.         return TRUE;
  296.     else
  297.         return FALSE;
  298. }
  299.  
  300.  
  301. /*@ XWebView::SetExtMap(const char *extension, const char *MIMEType, const SHORT format)
  302. @group MIME
  303. @remarks Associate a file-extension with a MIME-type
  304. @parameters  <t '°' c=2>
  305.                 °char * extension     °file-extension
  306.             °char * MIME          °type of MIME
  307.             °SHORT format         °format:
  308.                                             <t '°' c=1>
  309.                                     °WEB_FORMAT_BINARY
  310.                                     °WEB_FORMAT_7BIT
  311.                                     °WEB_FORMAT_8BIT
  312.                                             </t>
  313.                 </t>
  314. @returns     BOOL result
  315. */
  316. BOOL XWebView::SetExtMap(const char *extension, const char *MIMEType, const SHORT format)
  317. {
  318.     WXEXTMAP map;
  319.  
  320.     map.wxFormat = format;
  321.     strcpy(map.szExtension, extension);
  322.     strcpy(map.szMIMEType, MIMEType);
  323.     if (WXViewSetExtMap(winhandle, &map, sizeof(map)) == 0)
  324.         return TRUE;
  325.     else
  326.         return FALSE;
  327. }
  328.  
  329.  
  330. /*@ XWebView::GetExtMap(const char *extension, XString * MIMEType, SHORT & format)
  331. @group MIME
  332. @remarks Get an association of a file-extension with a MIME-type
  333. @parameters  <t '°' c=2>
  334.                 °char * extension     °file-extension
  335.             °XString * MIME       °buffer for the type of MIME
  336.             °SHORT& format        °buffer for format, on result you may receive:
  337.                                             <t '°' c=1>
  338.                                     °WEB_FORMAT_BINARY
  339.                                     °WEB_FORMAT_7BIT
  340.                                     °WEB_FORMAT_8BIT
  341.                                             </t>
  342.                 </t>
  343. @returns     BOOL result
  344. */
  345. BOOL XWebView::GetExtMap(const char *extension, XString * MIMEType, SHORT & format)
  346. {
  347.     WXEXTMAP map;
  348.  
  349.     if (WXViewQueryExtMap(winhandle, (PSZ) extension, &map, sizeof(map)) == 0)
  350.     {
  351.         format = map.wxFormat;
  352.         *MIMEType = map.szMIMEType;
  353.         return TRUE;
  354.     }
  355.     else
  356.         return FALSE;
  357. }
  358.  
  359.  
  360. /*@ XWebView::StopLoading(void)
  361. @group load data
  362. @remarks Stops loading data.
  363. */
  364. void XWebView::StopLoading(void) const
  365. {
  366.     WXViewCancelLoad(winhandle);
  367. }
  368.  
  369.  
  370. /*@ XWebView::IsLoading(void)
  371. @group load data
  372. @remarks Get if the control is loading data.
  373. @returns     BOOL result
  374. */
  375. BOOL XWebView::IsLoading(void) const
  376. {
  377.     return WXViewIsLoading(winhandle);
  378. }
  379.  
  380.  
  381. /*@ XWebView::GetLastLoadError(void)
  382. @group error handling
  383. @remarks Get for the lasterror which occures when data was loaded.
  384. @returns     LONG result
  385. */
  386. LONG XWebView::GetLastLoadError(void) const
  387. {
  388.     return WXViewQueryLastLoadError(winhandle);
  389. }
  390.  
  391.  
  392. /*@ XWebView::GetLastError(void)
  393. @group error handling
  394. @remarks Get the last error-code.
  395. @returns     LONG result
  396. */
  397. LONG XWebView::GetLastError(void) const
  398. {
  399.     return WXViewQueryLastError(winhandle);
  400. }
  401.  
  402.  
  403. /*@ XWebView::SaveToFile(const char *url, const char *filePath, const BOOL reload)
  404. @group load data
  405. @remarks Load data and save it to a file
  406. @parameters  <t '°' c=2>
  407.                 °char * url     °full qualified URL
  408.             °char * file    °full qualified path + filename
  409.             °BOOL reload   °TRUE=do not use cached data<BR> FALSE=use cache
  410.                 </t>
  411. @returns     LONG result
  412. */
  413. LONG XWebView::SaveToFile(const char *url, const char *filePath, const BOOL reload)
  414. {
  415.     return WXViewLoadToFile(winhandle, (PCSZ) url, (PCSZ) filePath, (reload ? WXLOAD_ANCHOR | WXLOAD_FORCERELOAD : WXLOAD_ANCHOR), NULL);
  416. }
  417.  
  418.  
  419. BOOL webDefHandler::HandleEvent(ULONG msg, void *mp1, void *mp2)
  420. {
  421.     switch (msg)
  422.     {
  423.         case WX_MSGERROR:
  424.         {
  425.             PWXMSGDATA data = (PWXMSGDATA) mp2;
  426.  
  427.             web->HandleError(data->ulMsgID, (char *) data->pwxMsgData);
  428.         }
  429.         break;
  430.     case WX_LOADSTATUS:
  431.         {
  432.             PWXTHREADDATA data = (PWXTHREADDATA) mp2;
  433.  
  434.             if (data[0].wxflState > 0)
  435.                 web->LoadProgress(data[0].wxflState);
  436.             else
  437.                 web->LoadProgress(data[1].wxflState);
  438.         }
  439.         return TRUE;
  440.     case WX_LOADRESULT:
  441.         web->LoadResult((LONG) SHORT1FROMMP(mp2));
  442.         return TRUE;
  443.     case WX_BUTTONCLICK:
  444.         {
  445.             PWXBUTTONDATA data = (PWXBUTTONDATA) mp2;
  446.             WXPOS pos;
  447.  
  448.             web->ButtonPressed(data->usButtonNum, data->x, data->y);
  449.             if (WXViewQueryPos(web->GetHandle(), data->x, data->y, &pos) != 0)
  450.                 return FALSE;
  451.             if (WXViewQueryAnchorLen(web->GetHandle(), &pos) == 0)
  452.                 return TRUE;
  453.             char anchor[1024];
  454.  
  455.             if (WXViewQueryAnchor(web->GetHandle(), &pos, (PSZ) anchor, 1024) != 0)
  456.                 return TRUE;
  457.             web->Load(anchor);
  458.             return TRUE;
  459.         }
  460.         break;
  461.     }
  462.     return FALSE;
  463. }
  464.  
  465.  
  466. /*docs only*/
  467.  
  468. /*@ XWebView::ButtonPressed()
  469. @group misc
  470. @remarks Override this function to get information when a mouse-button was pressed.
  471. @parameters  <t '°' c=2>
  472.                 °SHORT    °buttonNumber
  473.             °SHORT    °xPosition in window-coordinates
  474.             °SHORT    °yPosition in window-coordinates
  475.                 </t>
  476. */
  477.  
  478.  
  479. /*@ XWebView::HandleError()
  480. @group error handling
  481. @remarks Override this function to get information on runtime-errors
  482. @parameters  ULONG    errorCode
  483.             char *   errorMessage
  484. */
  485.  
  486.  
  487. /*@ XWebView::LoadResult()
  488. @group error handling
  489. @remarks Override this function to get information of the success of loading data.
  490. @parameters  ULONG    result, possible values are:
  491.                         WEB_SUCCESS
  492.                         WEB_ERROR
  493.                         WEB_CANCELLED
  494. */
  495.  
  496.  
  497. /*@ XWebView::LoadProgress()
  498. @group error handling
  499. @remarks Override this function to get information of progress of loading data
  500. @parameters  ULONG    state, possible values are:
  501.                         WEB_CONNECT
  502.                         WEB_WAIT
  503.                         WEB_LOADDATA
  504.                         WEB_RENDER
  505. */
  506.