/*
** -- Copyright (c) 1996-1997 Inria/CNRS All rights reserved. --
*/
#include "amaya.h"
#include "dialog.h"
#include "content.h"
#include "view.h"
#include "interface.h"
#include "message.h"
#include "conststr.h"
#include "AHTMemConv.h"
#include "init.h"
#include "AHTURLTools.h" /** defined here **/
/*+--------------------------------------------------------------------+ */
/*| IsHTMLName | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsHTMLName (char *path)
#else /* __STDC__ */
boolean IsHTMLName (path)
char *path;
#endif /* __STDC__ */
{
char temppath[MAX_LENGTH];
char suffix[MAX_LENGTH];
char nsuffix[MAX_LENGTH];
int i;
if (!path)
return FALSE;
strcpy (temppath, path);
ExtractSuffix (temppath, suffix);
/* Normalize the suffix */
i = 0;
while (suffix[i] != EOS)
nsuffix[i] = TOLOWER (suffix[i++]);
nsuffix[i] = EOS;
if ((strcmp (nsuffix, "html")) &&
(strcmp (nsuffix, "htm")) &&
(strcmp (nsuffix, "shtml")))
return FALSE;
return TRUE;
}
/*+--------------------------------------------------------------------+ */
/*| IsImageName | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsImageName (char *path)
#else /* __STDC__ */
boolean IsImageName (path)
char *path;
#endif /* __STDC__ */
{
char temppath[MAX_LENGTH];
char suffix[MAX_LENGTH];
char nsuffix[MAX_LENGTH];
int i;
if (!path)
return FALSE;
strcpy (temppath, path);
ExtractSuffix (temppath, suffix);
/* Normalize the suffix */
i = 0;
while (suffix[i] != EOS)
nsuffix[i] = TOLOWER (suffix[i++]);
nsuffix[i] = EOS;
if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
(strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
(strcmp (nsuffix, "png")) && (strcmp (nsuffix, "au")))
return FALSE;
return TRUE;
}
/*+--------------------------------------------------------------------+ */
/*| IsTextName | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsTextName (char *path)
#else /* __STDC__ */
boolean IsTextName (path)
char *path;
#endif /* __STDC__ */
{
char temppath[MAX_LENGTH];
char suffix[MAX_LENGTH];
char nsuffix[MAX_LENGTH];
int i;
if (!path)
return FALSE;
strcpy (temppath, path);
ExtractSuffix (temppath, suffix);
/* Normalize the suffix */
i = 0;
while (suffix[i] != EOS)
{
nsuffix[i] = TOLOWER (suffix[i]);
i++;
}
nsuffix[i] = EOS;
if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
(strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
(strcmp (nsuffix, "pdf")) && (strcmp (nsuffix, "png")) &&
(strcmp (nsuffix, "Z")) && (strcmp (nsuffix, "gz")) &&
(strcmp (nsuffix, "tgz")) && (strcmp (nsuffix, "xpg")) &&
(strcmp (nsuffix, "xpd")) && (strcmp (nsuffix, "ps")) &&
(strcmp (nsuffix, "au")))
return TRUE;
return FALSE;
}
/*+--------------------------------------------------------------------+ */
/*| IsHTTPPath | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsHTTPPath (char *path)
#else /* __STDC__ */
boolean IsHTTPPath (path)
char *path;
#endif /* __STDC__ */
{
if (!path)
return FALSE;
if (strncmp (path, "http:", 5) != 0)
return FALSE;
return TRUE;
}
/*+--------------------------------------------------------------------+ */
/*| IsWithParameters | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsWithParameters (char *path)
#else /* __STDC__ */
boolean IsWithParameters (path)
char *path;
#endif /* __STDC__ */
{
int i;
if ((!path) || (path[0] == EOS))
return FALSE;
i = strlen (path) - 1;
while (i > 0 && path[i--] != '?')
if (i < 0)
return FALSE;
/* There is a parameter */
return TRUE;
}
/*+--------------------------------------------------------------------+ */
/*| IsW3Path | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsW3Path (char *path)
#else /* __STDC__ */
boolean IsW3Path (path)
char *path;
#endif /* __STDC__ */
{
if ((strncmp (path, "http:", 5)) && (strncmp (path, "ftp:", 4)) &&
(strncmp (path, "telnet:", 7)) && (strncmp (path, "wais:", 5)) &&
(strncmp (path, "news:", 5)) && (strncmp (path, "gopher:", 7)) &&
(strncmp (path, "mailto:", 7)) && (strncmp (path, "archie:", 7)))
return FALSE;
return TRUE;
}
/*+--------------------------------------------------------------------+ */
/*| IsValidProtocol | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsValidProtocol (char *path)
#else /* __STDC__ */
boolean IsValidProtocol (path)
char *path;
#endif /* __STDC__ */
{
if (!strncmp (path, "http:", 5)
/***|| !strncmp (path, "ftp:", 4)
|| !strncmp (path, "news:", 5)***/)
return (YES);
else
return (NO);
}
/*+--------------------------------------------------------------------+ */
/*| IsValidNormalizeURL says which URL's may be normalized | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsValidNormalizeURL (char *path)
#else /* __STDC__ */
boolean IsValidNormalizeURL (path)
char *path;
#endif /* __STDC__ */
{
if (strchr(path,':') && !strncmp (path, "http:", 5))
return (YES);
else
return (NO);
}
/*+--------------------------------------------------------------------+ */
/*| NormalizeURL provides the new complete and normalized URL or file | */
/*| name path and the name of the document. | */
/*| orgName is the original requested name. | */
/*| doc identifies the document which provides the original | */
/*| name. | */
/*| newName is the resulting URL of file name. | */
/*| docName is the resulting document name. | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
void NormalizeURL (char *orgName, Document doc, char *newName, char *docName)
#else /* __STDC__ */
void NormalizeURL (orgName, doc, newName, docName)
char *orgName;
Document doc;
char *newName;
char *docName;
#endif /* __STDC__ */
{
char basename[MAX_LENGTH];
char tempname[MAX_LENGTH];
int i;
char *ptr;
char *basename_ptr;
int basename_flag;
Element el;
ElementType elType;
AttributeType attrType;
Attribute attrHREF;
int length;
/* Fix up orgName, by erasing leading and trailing white space */
if (!newName || !docName)
return;
ptr = orgName;
while (*ptr == ' ' && *ptr++ != EOS) ;
strcpy (tempname, ptr);
ptr = strchr (tempname, ' ');
if (ptr)
*ptr = EOS;
/*
** the following block to take into account the BASE element.
** This is not very optimized, as this procedure is repeated for
** each element which is retrieved. A better way would be to
** move this higher up in the function call hierarchy.
*/
if (IsValidNormalizeURL (tempname) && doc)
{
length = MAX_LENGTH;
/* get the root element */
el = TtaGetMainRoot (doc);
/* search the BASE element */
elType.ElSSchema = TtaGetDocumentSSchema (doc);
elType.ElTypeNum = HTML_EL_BASE;
el = TtaSearchTypedElement (elType, SearchInTree, el);
if (el)
{
/*
** The document has a BASE element
** Get the HREF attribute of the BASE Element
*/
attrType.AttrSSchema = elType.ElSSchema;
attrType.AttrTypeNum = HTML_ATTR_HREF_;
attrHREF = TtaGetAttribute (el, attrType);
if (attrHREF)
{
/*
** Use the base path of the document
** To do: verify length of the buffer
** length > TtaGetTextAttributeLength (attrHREF) + strlen (orgName)
*/
TtaGiveTextAttributeValue (attrHREF, basename, &length);
/*
** base and orgName have to be separated by a DIR_SEP
*/
if (basename[strlen (basename) - 1] != DIR_SEP && tempname[0] != DIR_SEP)
strcat (basename, DIR_STR);
}
}
else
basename[0] = EOS;
}
else
basename[0] = EOS;
if (basename[0] == EOS)
{
/*
** There is no BASE element in that document.
** A temporary fix as TtaExtractName does not tolerate a name
** ending in /. Here, we reinsert the slash, in order to
** parse the name in the following two lines. A bit
** redundant and has to be reviewed.
*/
if (DocumentURLs[(int) doc])
{
basename_ptr = HTParse (DocumentURLs[(int) doc], "", PARSE_ALL);
basename_flag = TRUE;
}
else
{
basename_ptr = "";
basename_flag = FALSE;
}
}
else
{
basename_ptr = HTParse (basename, "", PARSE_ALL);
basename_flag = TRUE;
} /* if-else tempname */
ptr = HTParse (tempname, basename_ptr, PARSE_ALL);
if (basename_flag)
HT_FREE (basename_ptr);
if (ptr)
{
ptr = HTSimplify (&ptr);
strcpy (newName, ptr);
HT_FREE (ptr);
}
else
newName[0] = EOS;
i = strlen (newName) - 1;
if (i > 0)
{
/*
** A temporary fix for an interfacing problem:
** TtaExtractName does not tolerate url's finished on DIR_SEP
*/
ptr = strrchr (newName, DIR_SEP);
if (ptr)
ptr++;
if (ptr && *ptr != EOS)
strcpy (docName, ptr);
else
/*
** The docname was not comprised inside the URL, so let's
** assign a "noname.html" name :)
*/
strcpy (docName, "noname.html");
/*
** A temporary fix for an interfacing problem:
** TtaExtractName does not tolerate url's finished on DIR_SEP
*/
if (newName[i] == DIR_SEP)
newName[i] = EOS;
}
}
/*+--------------------------------------------------------------------+ */
/*| IsSameHost | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
boolean IsSameHost (char *url1, char *url2)
#else /* __STDC__ */
boolean IsSameHost (url1, url2)
char *path;
#endif /* __STDC__ */
{
char *basename_ptr1, *basename_ptr2;
boolean result;
basename_ptr1 = HTParse(url1, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
basename_ptr2 = HTParse(url2, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
if (strcmp (basename_ptr1, basename_ptr2))
result = NO;
else
result = YES;
HT_FREE(basename_ptr1);
HT_FREE(basename_ptr2);
return(result);
}
/*+--------------------------------------------------------------------+ */
/*| AHTMakeRelativeURL | */
/*+--------------------------------------------------------------------+ */
#ifdef __STDC__
char *AHTMakeRelativeName(char *url, char *base_url)
#else /* __STDC__ */
char *AHTMakeRelativeName(url, base_url)
char url;
char base_url;
#endif /* __STDC__ */
{
char *base_ptr, *url_ptr;
char *result;
/* verify if we are in the same host */
base_ptr = HTParse(base_url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
url_ptr = HTParse(url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
if (!strcmp (base_ptr, url_ptr)) {
HT_FREE(base_ptr);
HT_FREE(url_ptr);
/* Normalize the URLs */
base_ptr = HTParse(base_url, "", PARSE_ALL);
url_ptr = HTParse(url, "", PARSE_ALL);
/* Use libwww to make relative name */
result = HTRelative(url_ptr, base_ptr);
HT_FREE(base_ptr);
HT_FREE(url_ptr);
}
else
result = (char *) NULL;
return(result);
}
Webmaster