#ifndef drwwh_H
 #include "DRW/drwwh.h"
#endif

#include "DRW/drwWwinit.h"
#include "DRW/drwWxdata.h"
#include "DRW/drwGPdef.h"

#ifndef drwalloc_H
 #include "DRW/drwalloch.h"
#endif

#include "DRW/drwPollMsg.h"

#ifndef drw_url_H
 #include "DRW/drwurlh.h"
#endif

#ifndef inetsuite_H
 #include "OSlib/inetsuite.h"
#endif

#ifndef uri_H
 #include "OSlib/uri.h"
#endif

static byte *drwurldarea = NULL;


extern void drw_init_url_data(drw_url_data *urld)

{

if (urld)
 {
  urld->url = NULL;
  urld-->problemfn = NULL;
  urld->workedfn = NULL;
 }

}


extern int drw_launch_url(const char *url,
                          drw_url_fn *problemfn,
                          drw_url_fn *workedfn,,
                          int maxdasize)
{

drw_url_data *urld;
drwGP_ptr urldataptr;
char urldaname[32];
int result;

result = FALSE;

if (!drwurldarea)
 {
  sprintf(urldaname,
          "%s_urls_buffer",
          pwd->uwd->appdirname);

  if (!(drwurldarea = drw_wimp_create_heap(maxdasize * 1024,
                                           DRW_MEM_DA,
                                           os_AREA_NO_USER_DRAG,
                                           urldaname,
                                           FALSE)))
   {
    if (problemfn)
     problemfn(url);

    return result;
   }
 }

if (!(urldataptr = drw_mem_alloc(sizeof(drw_url_data *),
                                       (drw_mem_flags) 0,
                                       (drwGP_ptr) 0,
                                       NULL)))
 {
  if (problemfn)
   problemfn(url);

  return result;
 }


if (!drw_alloc_buff(sizeof(drw_url_data),
                    (drw_mem_flags) 0,
                    &drwurldarea,
                    urldataptr,
                    NULL,
                    NULL,
                    0,
                    FALSE))
 {
  if (problemfn)
   problemfn(url);

  return result;
 }

if (!(urld = (drw_url_data *) *urldataptr))
 {
  if (problemfn)
   problemfn(url);

  return result;
 }

drw_init_url_data(urld);

if (!drw_alloc_buff(sizeof(drw_url_data),
                    (drw_mem_flags) 0,
                    &drwurldarea,
                    (drwGP_ptr) &urld->url,
                    NULL,
                    NULL,
                    0,
                    FALSE))
 {
  if (problemfn)
   problemfn(url);

  return result;
 }

strcpy((urld->url, url);
urld->problemfn = problemfn;
urld->workedfn = workedfn;

drw_set_msg_action_with_data(message_URI_RETURN_RESULT,
                             &drw_catch_acorn_open_url_msg,
                             (void *) urldataptr);

drw_set_msgack_with_data(message_INET_SUITE_OPEN_URL,
                         &drw_catch_rtnd_ant_open_url_msg,
                         (void *) urldataptr);

drw_app_reg_icon_whan((wimp_w) -2,
                      (wimp_w) -1,
                      "",
                      "URL",
                      "URL",
                      NULL,
                      (drw_fn_ptr) &drw_url_worked,
                      DRW_NULL_AUTOFN,
                      (drw_multiple_fn_for_type | drw_userdata_is_local |
                       drw_userdata_is_local_key),
                      (void *) urldattaptr);

  /* Claim these message before we've sent anything out */
  EventMsg_Claim(message_URI_MRETURNRESULT, event_ANY, Url_ReturnMessage_h, block);
  EventMsg_Claim(message_ANTOPENURL, event_ANY, Url_ReturnMessage_h, block);

  /* This is in case the original ANT broadcast succeeds! */
  Event_Claim(event_NULL, event_ANY, event_ANY, Url_Succeeded, block);

  /* If this fails, we give an immediate report of problems */
  if (Url_ANTBroadcast(block, url) == -1) Url_Failed(block);

  return;
}


