Milán Major

netscape-revival

1 branch
Code

cmd/xfe/convert.c

/* -*- Mode:C; tab-width: 8 -*-
   convert.c --- Converting documents in various contorted ways.
   Copyright © 1995 Netscape Communications Corporation, all rights reserved.
   Created: Jamie Zawinski <jwz@netscape.com>, 30-Jan-95.
 */

#include "mozilla.h"
#include "xlate.h"
#include "xfe.h"

struct output_to_string_data
{
  Boolean done;
  char *data;
  int data_size;
  int data_fp;
};


static void
fe_get_url_as_something_done (FILE *file, char *filename,
			      struct output_to_string_data *data)
			      
{
  struct stat st;
  int nread = 0;

  /* Close hateful temporary output file */
  fclose (file);

  /* Open hateful temporary file as input  */
  file = XP_FileOpen (filename, xpTemporary, XP_FILE_READ);
  if (! file)
    goto ABORT;
  fstat (fileno (file), &st);
  if (st.st_size + 1 > data->data_size)
    {
      data->data_size = st.st_size + 1;
      data->data = (char *) realloc (data->data, data->data_size);
      if (! data->data)
	goto ABORT;
    }

  while ((nread = fread (data->data + data->data_fp, 1,
			 data->data_size - data->data_fp,
			 file))
	 > 0)
    {
      data->data_fp += nread;
    }
  data->data [data->data_fp] = 0;

 ABORT:

  /* Close and delete hateful temporary input file */
  if (file)
    {
      fclose (file);
      XP_FileRemove (filename, xpTemporary);
    }

  /* Tell the wait loop to exit. */
  data->done = True;
}


static void
fe_get_url_as_text_done (PrintSetup *p)
{
  struct output_to_string_data *data =
    (struct output_to_string_data *) p->carg;
  fe_get_url_as_something_done (p->out, p->filename, data);
}

#if 0
static void
fe_get_url_as_source_done (struct save_as_data *sad)
{
  struct output_to_string_data *data =
    (struct output_to_string_data *) sad->data;
  fe_get_url_as_something_done (sad->file, sad->name, data);
}
#endif

#if 0
static void
fe_get_url_as_source_exit (URL_Struct *url, int status, MWContext *context)
{
  if (status < 0 && url->error_msg)
    FE_Alert (context, url->error_msg);
  /* Don't free the URL */
}
#endif

char *
fe_GetURLAsText (MWContext *context, URL_Struct *url, const char *prefix,
		 unsigned long *data_size)
{
  char *result;
  PrintSetup p;
  struct output_to_string_data data;

  if (! prefix) prefix = "";

  /* remove an position information from the url
   */
  XP_STRTOK(url->address, "#");
  url->position_tag = 0;

  data.done = False;
  data.data_fp = 0;
  data.data_size = 1024;
  data.data = (char *) malloc (data.data_size);

  XL_InitializeTextSetup (&p);
  p.prefix = (char *) prefix;
  p.carg = &data;
  p.url = url;
  p.completion = fe_get_url_as_text_done;
  p.filename = WH_TempName (xpTemporary, "ns");
  if (!p.filename) return NULL;
  p.out = XP_FileOpen (p.filename, xpTemporary, XP_FILE_WRITE);
  if (p.out)
    {
      XL_TranslateText (context, p.url, &p);
      while (!data.done)
	fe_EventLoop ();
    }
  result = (char *) realloc (data.data, data.data_fp + 1); /* shrink it */
  free (p.filename);
  if (data_size) *data_size = data.data_fp;
  return result;
}

#if 0
char *
fe_GetURLAsPostscript (MWContext *context, URL_Struct *url,
		       unsigned long *data_size)
{
  char *result;
  PrintSetup p;
  struct output_to_string_data data;

  data.done = False;
  data.data_fp = 0;
  data.data_size = 1024;
  data.data = (char *) malloc (data.data_size);

  XFE_InitializePrintSetup (&p);
  p.carg = &data;
  p.url = url;
  p.completion = fe_get_url_as_text_done;
  p.filename = WH_TempName (xpTemporary, "ns");
  if (!p.filename) return NULL;
  p.out = XP_FileOpen (p.filename, xpTemporary, XP_FILE_WRITE);
  if (p.out)
    {
      XL_TranslatePostscript(context, p.url, &p);
      while (!data.done)
	fe_EventLoop ();
    }
  result = (char *) realloc (data.data, data.data_fp + 1); /* shrink it */
  free (p.filename);
  if (data_size) *data_size = data.data_fp;
  return result;
}
#endif


#if 0
char *
fe_GetURLAsSource (MWContext *context, URL_Struct *url,
		   unsigned long *data_size)
{
  char *result;
  struct save_as_data *sad =
    (struct save_as_data *) calloc (sizeof (struct save_as_data), 1);
  struct output_to_string_data data;

  data.done = False;
  data.data_fp = 0;
  data.data_size = 1024;
  data.data = (char *) malloc (data.data_size);

  sad->context = context;
  sad->name = WH_TempName (xpTemporary, "ns");
  if (!p.filename) return NULL;
  sad->file = XP_FileOpen (sad->name, xpTemporary, XP_FILE_WRITE);
  sad->type = fe_FILE_TYPE_HTML;
  sad->insert_base_tag = TRUE;
  sad->done = fe_get_url_as_source_done;
  sad->data = &data;

  if (sad->file)
    {
      url->fe_data = sad;
      NET_GetURL (url, FO_CACHE_AND_SAVE_AS, sad->context,
		  fe_get_url_as_source_exit);
      while (!data.done)
	fe_EventLoop ();
      /* sad and sad->file are freed by fe_save_as_stream_complete_method() */
    }
  result = (char *) realloc (data.data, data.data_fp + 1); /* shrink it */
  if (data_size) *data_size = data.data_fp;
  return result;
}
#endif