- From: Michael Qiu <michael@atlas-china.com>
- Date: Mon, 17 Feb 2003 14:19:44 +0800
- To: <www-lib@w3.org>
- Message-ID: <000501c2d64c$91b1c380$1c01a8c0@michaelchina>
Hello everyone,
I am newbie of libwww. My task is to develop a module for my application which can get data from web server(I put the data into HTML&XML page). So I should parse HTML&XML page. I have seen the ready to go example for libwww. And I found showtags.c which fit my request well. But I want to use it as a module of my project. It should fetch multiple request. Such like:
initwww()
fetch()
fetch()
.......
fetch()
closewww()
Here is my module. It works in most time. But as the time goes by, It will caught a SIGSEGV signal. Seems like I have make some mistake in memory. Can anybody help me?
#include <stdlib.h>
#include "WWWLib.h"
#include "WWWInit.h"
#include "WWWHTML.h"
#include "WWWXML.h"
#include "http.h"
PRIVATE void beginElement (HText * text,
int element_number,
const BOOL * present,
const char ** value)
{
SGML_dtd * dtd = HTML_dtd();
HTTag * tag = SGML_findTag(dtd, element_number);
if (tag)
{
char * tagname = HTTag_name(tag);
if (!strcmp(tagname, "A"))
{
int maxcnt = HTTag_attributes(tag);
int cnt;
for (cnt=0; cnt<maxcnt; cnt++)
{
if (present[cnt])
{
char * attrname = HTTag_attributeName(tag, cnt);
if (!strcmp(attrname, "HREF"))
{
if (!strncmp(value[cnt], "RoomId", 6) && (strlen(value[cnt]) > 7))
{
strncpy(g_strID, value[cnt]+7, 9);
g_strID[9] = '\0';
}
if (!strncmp(value[cnt], "RoomName", 6) && (strlen(value[cnt]) > 9))
{
strncpy(g_strName, value[cnt]+9, 9);
g_strName[9] = '\0';
}
}
}
}
}
HT_FREE(tagname);
}
HT_FREE(tag);
HT_FREE(dtd);
}
PRIVATE void XML_startElement (void * userData,
const XML_Char * name, const XML_Char ** atts)
{
if (!strcmp(name, "row"))
{
int i = 0;
songdata *tmp = NULL;
tmp = (songdata *)g_malloc(sizeof(songdata));
while(atts[i])
{
if (!strcmp(atts[i], "soundid")||!strcmp(atts[i], "songid")
||!strcmp(atts[i], "SongID")||!strcmp(atts[i], "SoundID"))
{
strcpy(tmp->songid, atts[i+1]);
}
if (!strcmp(atts[i], "title")||!strcmp(atts[i], "Title"))
{
strcpy(tmp->songtitle, atts[i+1]);
}
if (!strcmp(atts[i], "artistname")||!strcmp(atts[i], "ArtistName"))
{
strcpy(tmp->singername, atts[i+1]);
}
if (!strcmp(atts[i], "artistid"))
{
strcpy(tmp->singerid, atts[i+1]);
}
if (!strcmp(atts[i], "played")||!strcmp(atts[i], "Played"))
{
tmp->state = atoi(atts[i+1]);
}
i++;
}
tmp->selected = 0;
head = g_list_append (head, tmp);
}
}
PRIVATE void XML_endElement (void * userData,
const XML_Char * name)
{
//HTPrint("End......... %s\n", name ? name : "<null>");
}
PRIVATE int printer (const char * fmt, va_list pArgs)
{
return (vfprintf(stdout, fmt, pArgs));
}
PRIVATE int tracer (const char * fmt, va_list pArgs)
{
return (vfprintf(stderr, fmt, pArgs));
}
PRIVATE int terminate_handler (HTRequest * request, HTResponse * response,
void * param, int status)
{
HTEventList_stopLoop ();
HTRequest_delete(request);
return 0;
}
PRIVATE void HTXML_setHandlers (XML_Parser me)
{
XML_SetElementHandler(me, XML_startElement, XML_endElement);
}
PRIVATE void HTXML_newInstance (HTStream * me,
HTRequest * request,
HTFormat target_format,
HTStream * target_stream,
XML_Parser xmlparser,
void * context)
{
if (me && xmlparser) HTXML_setHandlers(xmlparser);
}
void
initwww()
{
HTProfile_newHTMLNoCacheClient ("BZKTV-LIBWWW", "1.0");
HTPrint_setCallback(printer);
HTTrace_setCallback(tracer);
HTNet_addAfter(terminate_handler, NULL, NULL, HT_ALL, HT_FILTER_LAST);
HTXMLCallback_registerNew (HTXML_newInstance, NULL);
HText_registerElementCallback(beginElement, NULL);
// HTHost_setEventTimeout(5000);
}
void
closewww()
{
HTProfile_delete();
exit(0);
}
void
fetch (const char * url)
{
char * uri = NULL;
uri = HTParse(url, NULL, PARSE_ALL);
if (uri) {
HTRequest * request = NULL;
HTAnchor * anchor = NULL;
BOOL status = NO;
request = HTRequest_new();
// HTRequest_setPreemptive(request, YES);
anchor = HTAnchor_findAddress(uri);
status = HTLoadAnchor(anchor, request);
if (status == YES) HTEventList_loop(request);
}
HT_FREE(uri);
return;
}
Received on Monday, 17 February 2003 01:22:37 UTC