262 lines
9.8 KiB
C
262 lines
9.8 KiB
C
![]() |
/****************************************************************************
|
||
|
* NCSA Mosaic for the X Window System *
|
||
|
* Software Development Group *
|
||
|
* National Center for Supercomputing Applications *
|
||
|
* University of Illinois at Urbana-Champaign *
|
||
|
* 605 E. Springfield, Champaign IL 61820 *
|
||
|
* mosaic@ncsa.uiuc.edu *
|
||
|
* *
|
||
|
* Copyright (C) 1993, Board of Trustees of the University of Illinois *
|
||
|
* *
|
||
|
* NCSA Mosaic software, both binary and source (hereafter, Software) is *
|
||
|
* copyrighted by The Board of Trustees of the University of Illinois *
|
||
|
* (UI), and ownership remains with the UI. *
|
||
|
* *
|
||
|
* The UI grants you (hereafter, Licensee) a license to use the Software *
|
||
|
* for academic, research and internal business purposes only, without a *
|
||
|
* fee. Licensee may distribute the binary and source code (if released) *
|
||
|
* to third parties provided that the copyright notice and this statement *
|
||
|
* appears on all copies and that no charge is associated with such *
|
||
|
* copies. *
|
||
|
* *
|
||
|
* Licensee may make derivative works. However, if Licensee distributes *
|
||
|
* any derivative work based on or derived from the Software, then *
|
||
|
* Licensee will (1) notify NCSA regarding its distribution of the *
|
||
|
* derivative work, and (2) clearly notify users that such derivative *
|
||
|
* work is a modified version and not the original NCSA Mosaic *
|
||
|
* distributed by the UI. *
|
||
|
* *
|
||
|
* Any Licensee wishing to make commercial use of the Software should *
|
||
|
* contact the UI, c/o NCSA, to negotiate an appropriate license for such *
|
||
|
* commercial use. Commercial use includes (1) integration of all or *
|
||
|
* part of the source code into a product for sale or license by or on *
|
||
|
* behalf of Licensee to third parties, or (2) distribution of the binary *
|
||
|
* code or source code to third parties that need it to utilize a *
|
||
|
* commercial product sold or licensed by or on behalf of Licensee. *
|
||
|
* *
|
||
|
* UI MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR *
|
||
|
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED *
|
||
|
* WARRANTY. THE UI SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY THE *
|
||
|
* USERS OF THIS SOFTWARE. *
|
||
|
* *
|
||
|
* By using or copying this Software, Licensee agrees to abide by the *
|
||
|
* copyright law and all other applicable laws of the U.S. including, but *
|
||
|
* not limited to, export control laws, and the terms of this license. *
|
||
|
* UI shall have the right to terminate this license immediately by *
|
||
|
* written notice upon Licensee's breach of, or non-compliance with, any *
|
||
|
* of its terms. Licensee may be held legally responsible for any *
|
||
|
* copyright infringement that is caused or encouraged by Licensee's *
|
||
|
* failure to abide by the terms of this license. *
|
||
|
* *
|
||
|
* Comments and questions are welcome and can be sent to *
|
||
|
* mosaic-x@ncsa.uiuc.edu. *
|
||
|
****************************************************************************/
|
||
|
#include "../config.h"
|
||
|
#include "mosaic.h"
|
||
|
#include "mo-hdf.h"
|
||
|
#include "mo-dtm.h"
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
|
||
|
#ifdef HAVE_HDF
|
||
|
|
||
|
static char *pull_guts_from_hdfref (char *target)
|
||
|
{
|
||
|
if (target)
|
||
|
{
|
||
|
/* If the first seven characters don't match "hdfref;", then we know
|
||
|
it's not a target. */
|
||
|
if (strncmp (target, "hdfref;", 7))
|
||
|
{
|
||
|
/* It's not an hdfref; we don't know what the hell it is. */
|
||
|
target = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* OK, it's an hdfref. Or, more to the point, &(target[7]) is. */
|
||
|
target = &(target[7]);
|
||
|
}
|
||
|
return target;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
* name: mo_hdf_fetch_local_filename
|
||
|
* purpose: Given an HDF URL (we will canonicalize it), return the
|
||
|
* filename of the local cached copy of the file.
|
||
|
* inputs:
|
||
|
* - char *url: The URL to use.
|
||
|
* returns:
|
||
|
* The local filename (char *).
|
||
|
* remarks:
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
char *mo_hdf_fetch_local_filename (char *url)
|
||
|
{
|
||
|
char *cache_url = mo_url_canonicalize (url, "");
|
||
|
char *rv = (char *)mo_fetch_cached_local_name (cache_url);
|
||
|
free (cache_url);
|
||
|
return rv;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
* name: mo_decode_internal_reference
|
||
|
* purpose: Given a URL, a block of HTML that came out of libwww
|
||
|
* (assumed to be in this format:
|
||
|
* <mosaic-internal-reference "filename">\n
|
||
|
* ), and a target anchor (can be NULL), pull the filename out
|
||
|
* of the internal HTML reference and do the right thing
|
||
|
* with the resulting HDF file.
|
||
|
* inputs:
|
||
|
* - char *url: The URL we're visiting.
|
||
|
* - char *newtext: The block of HTML containing the internal
|
||
|
* HTML reference.
|
||
|
* - char *target: The target anchor in the URL, or NULL.
|
||
|
* returns:
|
||
|
* HTML (char *)
|
||
|
* remarks:
|
||
|
* When we're called, we've already pulled over something from the net.
|
||
|
* So no matter what, nuke any existing file and cache the current
|
||
|
* file.
|
||
|
****************************************************************************/
|
||
|
char *mo_decode_internal_reference (char *url, char *newtext, char *target)
|
||
|
{
|
||
|
char *text, *fname;
|
||
|
int i;
|
||
|
|
||
|
/* We always reload here, since we already sucked it over the network.
|
||
|
However, we want to clean up after ourselves if this is in fact a reload,
|
||
|
i.e., another local copy of this URL already exists. */
|
||
|
fname = mo_hdf_fetch_local_filename (url);
|
||
|
if (fname)
|
||
|
{
|
||
|
/* Nuke an existing file, since we just got a new one. */
|
||
|
/*
|
||
|
char *cmd = (char *)malloc ((strlen (fname) + 32) * sizeof (char));
|
||
|
sprintf (cmd, "/bin/rm -f %s &", fname);
|
||
|
system (cmd);
|
||
|
free (cmd);
|
||
|
*/
|
||
|
unlink(fname);
|
||
|
}
|
||
|
|
||
|
/* Now go get the new filename. */
|
||
|
fname = (char *)malloc (sizeof (char) * (strlen (newtext) - 20));
|
||
|
sscanf (newtext, "<mosaic-internal-reference \"%s", fname);
|
||
|
|
||
|
/* We certainly don't need newtext anymore. */
|
||
|
free (newtext);
|
||
|
|
||
|
for (i = 0; i < strlen (fname); i++)
|
||
|
if (fname[i] == '\"')
|
||
|
fname[i] = '\0';
|
||
|
{
|
||
|
char *cache_url = mo_url_canonicalize (url, "");
|
||
|
mo_cache_data (cache_url, fname, 1);
|
||
|
free (cache_url);
|
||
|
}
|
||
|
|
||
|
target = pull_guts_from_hdfref (target);
|
||
|
|
||
|
if (!target)
|
||
|
{
|
||
|
text = (char *)hdfGrokFile (fname, url);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
text = (char *)hdfGrokReference (fname, target, url);
|
||
|
}
|
||
|
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
* name: mo_decode_hdfref
|
||
|
* purpose: Given a URL (canonicalized with or without target still
|
||
|
* attached) and a target anchor which is an hdfref,
|
||
|
* look up the cached local file and decode the href.
|
||
|
* inputs:
|
||
|
* - char *url: URL for the data file on the net.
|
||
|
* - char *target: Target anchor (hdfref).
|
||
|
* returns:
|
||
|
* HTML for the hdfref.
|
||
|
* remarks:
|
||
|
* The URL is canonicalized (target anchor stripped out) for the call
|
||
|
* to mo_fetch_cached_data(), so it can return the appropriate local
|
||
|
* filename for all internal references.
|
||
|
* --> We assume the file is already stored locally. ???
|
||
|
****************************************************************************/
|
||
|
char *mo_decode_hdfref (char *url, char *target)
|
||
|
{
|
||
|
char *text, *fname;
|
||
|
struct stat buf;
|
||
|
int i;
|
||
|
|
||
|
fname = mo_hdf_fetch_local_filename (url);
|
||
|
if (!fname || stat (fname, &buf))
|
||
|
{
|
||
|
/* Go fetch the file anew. */
|
||
|
fname = mo_tmpnam (url);
|
||
|
if (mo_pull_er_over_virgin (url, fname) == mo_fail)
|
||
|
{
|
||
|
return strdup ("Whoops, something went wrong -- back up and try again.");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char *cache_url = mo_url_canonicalize (url, "");
|
||
|
mo_cache_data (cache_url, fname, 1);
|
||
|
free (cache_url);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
target = pull_guts_from_hdfref (target);
|
||
|
|
||
|
if (!target)
|
||
|
{
|
||
|
return strdup ("Whoops, something went wrong -- badly wrong.");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
text = (char *)hdfGrokReference (fname, target, url);
|
||
|
}
|
||
|
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef HAVE_DTM
|
||
|
mo_status mo_do_hdf_dtm_thang (char *url, char *hdfdtmref)
|
||
|
{
|
||
|
char *fname = mo_hdf_fetch_local_filename (url);
|
||
|
struct stat buf;
|
||
|
|
||
|
if (!fname || stat (fname, &buf))
|
||
|
{
|
||
|
/* Go fetch the file anew. */
|
||
|
fname = mo_tmpnam (url);
|
||
|
if (mo_pull_er_over_virgin (url, fname) == mo_fail)
|
||
|
{
|
||
|
return mo_fail;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char *cache_url = mo_url_canonicalize (url, "");
|
||
|
mo_cache_data (cache_url, fname, 1);
|
||
|
free (cache_url);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hdfDtmThang (fname, hdfdtmref);
|
||
|
|
||
|
return mo_succeed;
|
||
|
}
|
||
|
#endif /* HAVE_DTM */
|
||
|
|
||
|
#endif /* HAVE_HDF */
|