This repository has been archived on 2024-01-04. You can view files and clone it, but cannot push or open issues or pull requests.
ncsa-mosaic/src/mo-hdf.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 */