mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
417 lines
7.4 KiB
417 lines
7.4 KiB
|
|
#ifdef OLD_HOTLIST
|
|
|
|
far struct hash_table gHotList;
|
|
|
|
/* HTML Object
|
|
** -----------
|
|
*/
|
|
|
|
#define TITLE_LEN 512
|
|
|
|
struct _HTStructured
|
|
{
|
|
CONST HTStructuredClass *isa;
|
|
CONST SGML_dtd *dtd;
|
|
|
|
BOOL bInAnchor;
|
|
char href[MAX_URL_STRING + 1];
|
|
char title[TITLE_LEN + 1]; /* TODO check this for overflow */
|
|
int lenTitle;
|
|
char base_url[MAX_URL_STRING + 1];
|
|
};
|
|
|
|
/* Flush Buffer
|
|
** ------------
|
|
*/
|
|
PRIVATE void HTHotList_flush(HTStructured * me)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/* Character handling
|
|
** ------------------
|
|
**
|
|
*/
|
|
PRIVATE void HTHotList_put_character(HTStructured * me, char c)
|
|
{
|
|
switch (c)
|
|
{
|
|
case '\n':
|
|
case '\t':
|
|
case '\r':
|
|
c = ' ';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (me->bInAnchor)
|
|
{
|
|
if (!(c == ' ' && me->lenTitle == 0))
|
|
{
|
|
me->title[me->lenTitle++] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* String handling
|
|
** ---------------
|
|
*/
|
|
PRIVATE void HTHotList_put_string(HTStructured * me, CONST char *s)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
PRIVATE void HTHotList_write(HTStructured * me, CONST char *s, int l)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/* Start Element
|
|
** -------------
|
|
**
|
|
*/
|
|
PRIVATE void HTHotList_start_element(HTStructured * me, int element_number, CONST BOOL * present, CONST char **value)
|
|
{
|
|
switch (element_number)
|
|
{
|
|
case HTML_A:
|
|
{
|
|
if (present[HTML_A_HREF])
|
|
{
|
|
GTR_strncpy(me->href, value[HTML_A_HREF], MAX_URL_STRING);
|
|
HTSimplify(me->href);
|
|
}
|
|
|
|
memset(me->title, 0, TITLE_LEN + 1);
|
|
me->lenTitle = 0;
|
|
me->bInAnchor = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* End Element
|
|
** -----------
|
|
**
|
|
*/
|
|
PRIVATE void HTHotList_end_element(HTStructured * me, int element_number)
|
|
{
|
|
char *full_address;
|
|
char mycopy[MAX_URL_STRING + 1];
|
|
char *stripped;
|
|
|
|
switch (element_number)
|
|
{
|
|
case HTML_A:
|
|
/*
|
|
First get the full URL
|
|
*/
|
|
if (me->href)
|
|
{
|
|
GTR_strncpy(mycopy, me->href, MAX_URL_STRING);
|
|
|
|
stripped = HTStrip(mycopy);
|
|
if (stripped)
|
|
{
|
|
full_address = HTParse(stripped,
|
|
me->base_url,
|
|
PARSE_ACCESS | PARSE_HOST | PARSE_PATH | PARSE_PUNCTUATION | PARSE_ANCHOR);
|
|
if (full_address)
|
|
{
|
|
me->bInAnchor = FALSE;
|
|
if (me->title[0])
|
|
{
|
|
Hash_Add(&gHotList, full_address, me->title, NULL);
|
|
}
|
|
|
|
GTR_FREE(full_address);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/* Expanding entities
|
|
** ------------------
|
|
**
|
|
*/
|
|
PRIVATE void HTHotList_put_entity(HTStructured * me, int entity_number)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free an HTML object
|
|
** -------------------
|
|
**
|
|
*/
|
|
PRIVATE void HTHotList_free(HTStructured * me)
|
|
{
|
|
|
|
GTR_FREE(me);
|
|
}
|
|
|
|
|
|
PRIVATE void HTHotList_abort(HTStructured * me, HTError e)
|
|
{
|
|
HTHotList_free(me);
|
|
}
|
|
|
|
|
|
/* Structured Object Class
|
|
** -----------------------
|
|
*/
|
|
PRIVATE CONST HTStructuredClass HTHotList = /* As opposed to print etc */
|
|
{
|
|
"HTMLToHotList",
|
|
HTHotList_free,
|
|
HTHotList_abort,
|
|
HTHotList_put_character, HTHotList_put_string, HTHotList_write,
|
|
HTHotList_start_element, HTHotList_end_element,
|
|
HTHotList_put_entity, NULL, NULL, NULL
|
|
};
|
|
|
|
|
|
/* HTConverter from HTML to TeX Stream
|
|
** ------------------------------------------
|
|
**
|
|
*/
|
|
PUBLIC HTStream *HTMLToHotList(struct Mwin *tw, HTRequest * request, void *param, HTFormat input_format, HTFormat output_format, HTStream * output_stream)
|
|
{
|
|
HTStructured *me = (HTStructured *) GTR_CALLOC(1, sizeof(*me));
|
|
if (me)
|
|
{
|
|
GTR_strncpy(me->base_url, request->destination->szActualURL, MAX_URL_STRING);
|
|
me->bInAnchor = FALSE;
|
|
me->isa = (HTStructuredClass *) & HTHotList;
|
|
me->dtd = &HTMLP_dtd;
|
|
return SGML_new(tw, &HTMLP_dtd, me, request);
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
struct Params_HotList_Load {
|
|
HTRequest *request;
|
|
|
|
/* Used internally */
|
|
int status;
|
|
};
|
|
|
|
static int HotList_Load_Async(struct Mwin *tw, int nState, void **ppInfo)
|
|
{
|
|
struct Params_HotList_Load *pParams;
|
|
struct Params_LoadAsync *p2;
|
|
|
|
pParams = *ppInfo;
|
|
|
|
switch (nState)
|
|
{
|
|
case STATE_INIT:
|
|
pParams->request = HTRequest_validate(pParams->request);
|
|
if (pParams->request == NULL) return STATE_DONE;
|
|
|
|
p2 = GTR_MALLOC(sizeof(*p2));
|
|
p2->request = pParams->request;
|
|
p2->pStatus = &pParams->status;
|
|
Async_DoCall(HTLoadDocument_Async, p2);
|
|
return STATE_OTHER;
|
|
case STATE_OTHER:
|
|
case STATE_ABORT:
|
|
pParams->request = HTRequest_validate(pParams->request);
|
|
if (pParams->request)
|
|
{
|
|
Dest_DestroyDest(pParams->request->destination);
|
|
HTRequest_delete(pParams->request);
|
|
}
|
|
return STATE_DONE;
|
|
}
|
|
XX_Assert((0), ("Function called with illegal state: %d", nState));
|
|
return STATE_DONE;
|
|
}
|
|
|
|
void HotList_Init(void)
|
|
{
|
|
HTRequest *request;
|
|
char url[MAX_URL_STRING + 1];
|
|
struct Params_HotList_Load *phll;
|
|
struct DestInfo *pDest;
|
|
|
|
#ifdef WIN32
|
|
char path[_MAX_PATH];
|
|
|
|
PREF_GetPrefsDirectory(path);
|
|
FixPathName(path);
|
|
|
|
strcpy(url, "file:///");
|
|
strcat(url, path);
|
|
strcat(url, gPrefs.szHotListFile);
|
|
#endif
|
|
|
|
#ifdef MAC
|
|
long dirid;
|
|
|
|
SetVol(NULL, sysVRN);
|
|
getwddirid(sysVRN, &dirid);
|
|
strcpy(url, "file:///");
|
|
strcat(url, vv_Application);
|
|
strcat(url, " Hotlist.html");
|
|
|
|
PathNameFromDirID(dirid, sysVRN, url + 8);
|
|
FixPathName(url + 8);
|
|
#endif
|
|
|
|
#ifdef UNIX
|
|
char path[_MAX_PATH];
|
|
|
|
strcpy(url, "file://");
|
|
strcat(url, gPrefs.szHotListFile);
|
|
#endif
|
|
|
|
Hash_Init(&gHotList);
|
|
|
|
pDest = Dest_CreateDest(url);
|
|
if (pDest)
|
|
{
|
|
request = HTRequest_new();
|
|
HTFormatInit(request->conversions);
|
|
request->output_format = HTAtom_for("www/hotlist");
|
|
request->destination = pDest;
|
|
|
|
phll = GTR_MALLOC(sizeof(*phll));
|
|
phll->request = request;
|
|
Async_StartThread(HotList_Load_Async, phll, NULL);
|
|
}
|
|
}
|
|
|
|
BOOL HotList_Add(char *title, char *url)
|
|
{
|
|
char *pTitle, bPrintable;
|
|
int i = 1;
|
|
|
|
if ( title && *title )
|
|
{
|
|
/* Insure there are printable characters in the <TITLE> field */
|
|
/* If none, put URL into hotlist instead of <TITLE> */
|
|
bPrintable = FALSE;
|
|
while ( title[i] && !bPrintable )
|
|
{
|
|
bPrintable = ((title[0] != ' ') &&
|
|
(title[0] != '\n') &&
|
|
(title[0] != '\t') &&
|
|
(title[0] != '\r'));
|
|
i++;
|
|
}
|
|
if (bPrintable)
|
|
{
|
|
pTitle = title;
|
|
}
|
|
else
|
|
{
|
|
pTitle = url;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pTitle = url;
|
|
}
|
|
|
|
return (SUCCEEDED(CreateURLShortcut(url, title, /*fHotList=*/TRUE)));
|
|
|
|
#ifdef OLD_HOTLIST
|
|
if (Hash_Add(&gHotList, url, pTitle, NULL) != -1)
|
|
{
|
|
HotList_SaveToDisk();
|
|
|
|
#ifdef WIN32
|
|
if (DlgHOT_IsHotlistRunning())
|
|
DlgHOT_RefreshHotlist();
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
#endif /* OLD_HOTLIST */
|
|
}
|
|
|
|
int HotList_Export(char *file)
|
|
{
|
|
int count;
|
|
char *s1;
|
|
char *s2;
|
|
FILE *fp;
|
|
int i;
|
|
|
|
fp = fopen(file, "w");
|
|
if (!fp)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
fprintf(fp, "<title>Hotlist</title>\n");
|
|
fprintf(fp, "\n<h1>Hotlist Page</h1>\n");
|
|
count = Hash_Count(&gHotList);
|
|
for (i = 0; i < count; i++)
|
|
{
|
|
Hash_GetIndexedEntry(&gHotList, i, &s2, &s1, NULL);
|
|
fprintf(fp, "<a href=\"%s\">%s</a><p>\n", s2, s1);
|
|
}
|
|
fclose(fp);
|
|
return 0;
|
|
}
|
|
|
|
int HotList_SaveToDisk(void)
|
|
{
|
|
char path[_MAX_PATH];
|
|
int status;
|
|
#ifdef MAC
|
|
long dirid;
|
|
|
|
SetVol(NULL, MacGlobals.sysVRN);
|
|
getwddirid(MacGlobals.sysVRN, &dirid);
|
|
strcpy(path, vv_Application);
|
|
strcat(path, " Hotlist.html");
|
|
PathNameFromDirID(dirid, sysVRN, path);
|
|
#endif
|
|
#ifdef WIN32
|
|
PREF_GetPrefsDirectory(path);
|
|
strcat(path, "\\");
|
|
strcat(path, gPrefs.szHotListFile);
|
|
#endif
|
|
#ifdef UNIX
|
|
strcpy(path, gPrefs.szHotListFile);
|
|
#endif
|
|
|
|
status = HotList_Export(path);
|
|
#ifdef MAC
|
|
if (!status)
|
|
MakeGuitarFile(MacGlobals.sysVRN, path);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
void HotList_Destroy(void)
|
|
{
|
|
Hash_FreeContents(&gHotList);
|
|
}
|
|
|
|
void HotList_DeleteIndexedItem(int ndx)
|
|
{
|
|
Hash_DeleteIndexedEntry(&gHotList, ndx);
|
|
HotList_SaveToDisk();
|
|
}
|
|
|
|
#endif /* OLD_HOTLIST */
|