Last month, I volunteered to add support for the bibp: scheme (bibliographic protocol) to lynx. Bibliographic protocol is currently described by the internet draft: http://www.ietf.org/internet-drafts/draft-cameron-tatu-bibp-02.txt We have implemented bibp support as described by the enclosed patch file for 2.8.4dev.16. Patch files for 2.8.4dev.14 and 2.8.3 are available from http://www.usin.org/software/clients/ . There are some rudimentary demos/tests available at http://usin.org/ . I had delayed sending the patch to lynx-dev, hoping to have more interesting server side demos (and final publication of the bibp document as an RFC). But with the pace of activities on the list, I thought I'd better get this in. Please let me know what to do from here. Robert D. Cameron, Professor School of Computing Science Simon Fraser University Burnaby, B.C. V5A 1S6 --------------------------------------------------------------------------- diff -ur lynx2-8-4r16/LYMessages_en.h lynx2-8-4r16.bibp/LYMessages_en.h --- lynx2-8-4r16/LYMessages_en.h Thu Sep 21 19:21:59 2000 +++ lynx2-8-4r16.bibp/LYMessages_en.h Tue Jan 2 06:06:44 2001 @@ -355,6 +355,7 @@ #define POPUP_FAILED gettext("Unable to create popup window!") #define GOTO_DISALLOWED gettext("Goto a random URL is disallowed!") #define GOTO_NON_HTTP_DISALLOWED gettext("Goto a non-http URL is disallowed!") +#define GOTO_BIBP_DISALLOWED gettext("You are not allowed to goto \"bibp:\" URLs") #define GOTO_CSO_DISALLOWED gettext("You are not allowed to goto \"cso:\" URLs") #define GOTO_FILE_DISALLOWED gettext("You are not allowed to goto \"file:\" URLs") #define GOTO_FINGER_DISALLOWED gettext("You are not allowed to goto \"finger:\" URLs") diff -ur lynx2-8-4r16/WWW/Library/Implementation/HTAnchor.c lynx2-8-4r16.bibp/WWW/Library/Implementation/HTAnchor.c --- lynx2-8-4r16/WWW/Library/Implementation/HTAnchor.c Wed Oct 25 09:35:28 2000 +++ lynx2-8-4r16.bibp/WWW/Library/Implementation/HTAnchor.c Tue Jan 2 06:06:44 +2001 @@ -83,6 +83,7 @@ newAnchor->FileCache = NULL; /* Path to a disk-cached copy. - FM */ newAnchor->SugFname = NULL; /* Suggested filename. - FM */ newAnchor->RevTitle = NULL; /* TITLE for a LINK with REV. - FM */ + newAnchor->citehost = NULL; /* LINK REL=citehost - RDC */ newAnchor->cache_control = NULL; /* Cache-Control. - FM */ newAnchor->no_cache = FALSE; /* no-cache? - FM */ newAnchor->content_type = NULL; /* Content-Type. - FM */ @@ -743,6 +744,7 @@ FREE(me->bookmark); FREE(me->owner); FREE(me->RevTitle); + FREE(me->citehost); #ifdef SOURCE_CACHE HTAnchor_clearSourceCache(me); #endif @@ -1048,6 +1050,23 @@ me->RevTitle[i] = ' '; } } + } +} + +/* Citehost for bibp links from LINKs with REL="citehost". - RDC +*/ +PUBLIC CONST char * HTAnchor_citehost ARGS1( + HTParentAnchor *, me) +{ + return( me ? me->citehost : NULL); +} + +PUBLIC void HTAnchor_setCitehost ARGS2( + HTParentAnchor *, me, + CONST char *, citehost) +{ + if (me) { + StrAllocCopy(me->citehost, citehost); } } diff -ur lynx2-8-4r16/WWW/Library/Implementation/HTAnchor.h lynx2-8-4r16.bibp/WWW/Library/Implementation/HTAnchor.h --- lynx2-8-4r16/WWW/Library/Implementation/HTAnchor.h Wed Dec 15 03:03:18 1999 +++ lynx2-8-4r16.bibp/WWW/Library/Implementation/HTAnchor.h Tue Jan 2 06:06:44 +2001 @@ -67,6 +67,7 @@ char * title; /* Title of document */ char * owner; /* Owner of document */ char * RevTitle; /* TITLE in REV="made" or REV="owner" LINK */ + char * citehost; /* Citehost from REL="citehost" LINK */ #ifdef USE_HASH char * style; #endif @@ -294,6 +295,15 @@ extern void HTAnchor_setRevTitle PARAMS(( HTParentAnchor * me, CONST char * title)); + +/* Citehost for bibp links from LINKs with REL="citehost". - RDC +*/ +extern CONST char * HTAnchor_citehost PARAMS(( + HTParentAnchor * me)); + +extern void HTAnchor_setCitehost PARAMS(( + HTParentAnchor * me, + CONST char * citehost)); /* Suggested filename handling. - FM ** (will be loaded if we had a Content-Disposition diff -ur lynx2-8-4r16/lynx.cfg lynx2-8-4r16.bibp/lynx.cfg --- lynx2-8-4r16/lynx.cfg Wed Oct 25 09:35:28 2000 +++ lynx2-8-4r16.bibp/lynx.cfg Tue Jan 2 06:06:44 2001 @@ -1102,6 +1102,19 @@ # #LYNX_SIG_FILE:.lynxsig +.h1 Bibliographic Protocol (bibp scheme) + +.h2 BIBP_GLOBAL_SERVER +# BIBP_GLOBAL_SERVER is the default global server for bibp: links, used +# when a local bibhost or document-specified citehost is unavailable. +# Set in userdefs.h and can be changed here. +#BIBP_GLOBAL_SERVER:http://usin.org/ + +.h2 BIBP_BIBHOST +# BIBP_BIBHOST is the URL at which local bibp service may be found, if +# it exists. Defaults to http://bibhost/ for protocol conformance, but +# may be overridden here or via --bibhost parameter. +#BIBP_BIBHOST:http://bibhost/ .h1 Interaction # These settings control interaction of the user with lynx. diff -ur lynx2-8-4r16/lynx_help/lynx_url_support.html lynx2-8-4r16.bibp/lynx_help/lynx_url_support.html --- lynx2-8-4r16/lynx_help/lynx_url_support.html Thu Apr 13 19:39:31 2000 +++ lynx2-8-4r16.bibp/lynx_help/lynx_url_support.html Tue Jan 2 06:06:44 2001 @@ -18,6 +18,7 @@ <a href="#mailto">mailto</a> <em>|</em> <a href="#finger">finger</a> <em>|</em> <a href="#cso">cso</a> <em>|</em> +<a href="#bibp">bibp</a> <em>|</em> <a href="#exec">lynxexec, lynxprog</a> <em>|</em> <a href="#cgi">lynxcgi</a><em>|</em> <a href="#internal">internal</a><em>]</em> @@ -537,6 +538,15 @@ (searches) which appear to be a URL with a supported scheme will be converted into a link for accessing that URL. <HR> + +<H2><a name="bibp">The <em>bibp</em> URL:</a></H2> + +<p>Lynx provides built-in support for bibliographic protocol (BibP). +BibP links are links to published works such as books or journal articles, +without a predefined server. BibP links are intended for resolution +by a local bibhost server (http://bibhost/) if it exists. Otherwise, +resolution is performed by a document-specified server or a known global +server. <H2><a name="exec">The <em>lynxexec</em> and <em>lynxprog</em> URLs:</a></H2> Only in lynx2-8-4r16/po: es.po Only in lynx2-8-4r16/po: it.po Only in lynx2-8-4r16/po: ko.po Only in lynx2-8-4r16/po: no.po Only in lynx2-8-4r16/po: pl.po Only in lynx2-8-4r16/po: pt.po diff -ur lynx2-8-4r16/src/HTML.c lynx2-8-4r16.bibp/src/HTML.c --- lynx2-8-4r16/src/HTML.c Thu Dec 21 18:44:11 2000 +++ lynx2-8-4r16.bibp/src/HTML.c Tue Jan 2 06:06:44 2001 @@ -1556,6 +1556,13 @@ StrAllocCopy(temp, "RelTitle: "); StrAllocCat(temp, value[HTML_LINK_REL]); } + } else + if (!strcasecomp(value[HTML_LINK_REL], "citehost")) { + /* Citehost determination for bibp links. - RDC */ + HTAnchor_setCitehost(me->node_anchor, href); + CTRACE((tfp, "HTML: citehost '%s' found\n", href)); + FREE(href); + break; } else { CTRACE((tfp, "HTML: LINK with REL=\"%s\" ignored.\n", value[HTML_LINK_REL])); diff -ur lynx2-8-4r16/src/LYGetFile.c lynx2-8-4r16.bibp/src/LYGetFile.c --- lynx2-8-4r16/src/LYGetFile.c Wed Oct 25 09:35:28 2000 +++ lynx2-8-4r16.bibp/src/LYGetFile.c Tue Jan 2 06:06:44 2001 @@ -758,6 +758,27 @@ #ifdef DIRED_SUPPORT lynx_edit_mode = FALSE; #endif /* DIRED_SUPPORT */ + if (url_type == BIBP_URL_TYPE) { + char *bibpTmp=NULL; + if (!BibP_bibhost_checked) LYCheckBibHost(); + if (BibP_bibhost_available) { + StrAllocCopy(bibpTmp, BibP_bibhost); + } else if (HTMainAnchor && HTAnchor_citehost(HTMainAnchor)) { + StrAllocCopy(bibpTmp, HTAnchor_citehost(HTMainAnchor)); + } else { + StrAllocCopy(bibpTmp, BibP_globalserver); + } + if (HTMainAnchor && HTAnchor_citehost(HTMainAnchor)) { + StrAllocCat(bibpTmp, "bibp1.0/resolve?citehost="); + StrAllocCat(bibpTmp, HTAnchor_citehost(HTMainAnchor)); + StrAllocCat(bibpTmp, "&usin="); + } + else StrAllocCat(bibpTmp, "bibp1.0/resolve?usin="); + StrAllocCat(bibpTmp, doc->address+5); /* USIN after bibp: */ + StrAllocCopy(doc->address, bibpTmp); + WWWDoc.address = doc->address; + FREE(bibpTmp); + } if (url_type == FILE_URL_TYPE) { /* @@ -865,6 +886,8 @@ url_type == FILE_URL_TYPE) || (no_goto_lynxcgi && url_type == LYNXCGI_URL_TYPE) || + (no_goto_bibp && + url_type == BIBP_URL_TYPE) || (no_goto_cso && url_type == CSO_URL_TYPE) || (no_goto_finger && diff -ur lynx2-8-4r16/src/LYGlobalDefs.h lynx2-8-4r16.bibp/src/LYGlobalDefs.h --- lynx2-8-4r16/src/LYGlobalDefs.h Wed Oct 25 09:35:28 2000 +++ lynx2-8-4r16.bibp/src/LYGlobalDefs.h Tue Jan 2 06:06:44 2001 @@ -242,6 +242,7 @@ extern BOOLEAN no_goto_lynxexec; extern BOOLEAN no_goto_lynxprog; extern BOOLEAN no_goto_mailto; +extern BOOLEAN no_goto_bibp; extern BOOLEAN no_goto_news; extern BOOLEAN no_goto_nntp; extern BOOLEAN no_goto_rlogin; @@ -364,6 +365,10 @@ extern BOOLEAN LYMBMAdvanced; /* MBM statusline for ADVANCED? */ extern int LYStatusLine; /* Line for statusline() or -1 */ extern BOOLEAN LYCollapseBRs; /* Collapse serial BRs? */ +extern char *BibP_globalserver; /* global server for bibp: links */ +extern char *BibP_bibhost; /* local server for bibp: links */ +extern BOOLEAN BibP_bibhost_checked; /* bibhost has been checked */ +extern BOOLEAN BibP_bibhost_available; /* bibhost is responding */ extern BOOLEAN LYSetCookies; /* Process Set-Cookie headers? */ extern BOOLEAN LYAcceptAllCookies; /* accept ALL cookies? */ extern char *LYCookieAcceptDomains; /* domains to accept all cookies */ diff -ur lynx2-8-4r16/src/LYMain.c lynx2-8-4r16.bibp/src/LYMain.c --- lynx2-8-4r16/src/LYMain.c Mon Jan 1 17:39:50 2001 +++ lynx2-8-4r16.bibp/src/LYMain.c Tue Jan 2 06:06:44 2001 @@ -248,6 +248,7 @@ PUBLIC BOOLEAN no_goto_lynxexec = FALSE; PUBLIC BOOLEAN no_goto_lynxprog = FALSE; PUBLIC BOOLEAN no_goto_mailto = FALSE; +PUBLIC BOOLEAN no_goto_bibp = FALSE; #ifndef DISABLE_NEWS PUBLIC BOOLEAN no_goto_news = FALSE; PUBLIC BOOLEAN no_goto_nntp = FALSE; @@ -411,6 +412,10 @@ PUBLIC BOOLEAN LYMBMAdvanced = TRUE; PUBLIC int LYStatusLine = -1; /* Line for statusline() if > -1 */ PUBLIC BOOLEAN LYCollapseBRs = COLLAPSE_BR_TAGS; /* Collapse serial BRs? */ +PUBLIC char *BibP_globalserver = NULL; /* global server for bibp: links */ +PUBLIC char *BibP_bibhost = NULL; /* local server for bibp: links */ +PUBLIC BOOLEAN BibP_bibhost_checked = FALSE; /* until LYCheckBibHost */ +PUBLIC BOOLEAN BibP_bibhost_available = FALSE; /* until check succeeds */ PUBLIC BOOLEAN LYSetCookies = SET_COOKIES; /* Process Set-Cookie headers? */ PUBLIC BOOLEAN LYAcceptAllCookies = ACCEPT_ALL_COOKIES; /* take all cookies? */ PUBLIC char *LYCookieAcceptDomains = NULL; /* domains to accept all cookies */ @@ -624,6 +629,8 @@ FREE(LynxSigFile); FREE(system_mail); FREE(system_mail_flags); + FREE(BibP_bibhost); + FREE(BibP_globalserver); #ifdef EXP_PERSISTENT_COOKIES FREE(LYCookieFile); FREE(LYCookieSaveFile); @@ -1145,7 +1152,8 @@ StrAllocCopy(URLDomainPrefixes, URL_DOMAIN_PREFIXES); StrAllocCopy(URLDomainSuffixes, URL_DOMAIN_SUFFIXES); StrAllocCopy(XLoadImageCommand, XLOADIMAGE_COMMAND); - + StrAllocCopy(BibP_globalserver, BIBP_GLOBAL_SERVER); + StrAllocCopy(BibP_bibhost, "http://bibhost/"); /* protocol specified. */ /* * Disable news posting if the compilation-based * LYNewsPosting value is FALSE. This may be changed @@ -3061,6 +3069,10 @@ PARSE_FUN( "base", 4|FUNCTION_ARG, base_fun, "prepend a request URL comment and BASE tag to text/html\noutputs for -source dumps" + ), + PARSE_STR( + "bibhost", 4|NEED_LYSTRING_ARG, &BibP_bibhost, + "=URL\nlocal bibp server (default http://bibhost/)" ), #ifdef USE_SLANG PARSE_FUN( Only in lynx2-8-4r16.bibp/src: LYMain.c~ diff -ur lynx2-8-4r16/src/LYMainLoop.c lynx2-8-4r16.bibp/src/LYMainLoop.c --- lynx2-8-4r16/src/LYMainLoop.c Thu Dec 21 18:44:11 2000 +++ lynx2-8-4r16.bibp/src/LYMainLoop.c Tue Jan 2 06:06:44 2001 @@ -560,6 +560,10 @@ !strncmp(user_input_buffer, "mailto:", 7)) { HTUserMsg(GOTO_MAILTO_DISALLOWED); + } else if (no_goto_bibp && + !strncmp(user_input_buffer, "bibp:", 5)) { + HTUserMsg(GOTO_BIBP_DISALLOWED); + #ifndef DISABLE_NEWS } else if (no_goto_news && !strncmp(user_input_buffer, "news:", 5)) { diff -ur lynx2-8-4r16/src/LYReadCFG.c lynx2-8-4r16.bibp/src/LYReadCFG.c --- lynx2-8-4r16/src/LYReadCFG.c Thu Dec 21 18:44:11 2000 +++ lynx2-8-4r16.bibp/src/LYReadCFG.c Tue Jan 2 06:06:44 2001 @@ -1404,6 +1404,8 @@ #ifdef DIRED_SUPPORT PARSE_ENV("auto_uncache_dirlists", CONF_INT, &LYAutoUncacheDirLists), #endif + PARSE_STR("bibp_bibhost", CONF_STR, &BibP_bibhost), + PARSE_STR("bibp_globalserver", CONF_STR, &BibP_globalserver), PARSE_SET("block_multi_bookmarks", CONF_BOOL, &LYMBMBlocked), PARSE_SET("bold_h1", CONF_BOOL, &bold_H1), PARSE_SET("bold_headers", CONF_BOOL, &bold_headers), Only in lynx2-8-4r16.bibp/src: LYReadCFG.c~ diff -ur lynx2-8-4r16/src/LYUtils.c lynx2-8-4r16.bibp/src/LYUtils.c --- lynx2-8-4r16/src/LYUtils.c Thu Dec 21 18:44:11 2000 +++ lynx2-8-4r16.bibp/src/LYUtils.c Tue Jan 2 06:06:44 2001 @@ -2858,6 +2858,9 @@ } else if (compare_type(cp, "mailto:", 7)) { return(MAILTO_URL_TYPE); + } else if (compare_type(cp, "bibp:", 5)) { + return(BIBP_URL_TYPE); + } else if (compare_type(cp, "file:", 5)) { if (LYisLocalFile(cp)) { return(FILE_URL_TYPE); @@ -4198,6 +4201,7 @@ no_inside_rlogin = !(CAN_ANONYMOUS_INSIDE_DOMAIN_RLOGIN); no_outside_rlogin = !(CAN_ANONYMOUS_OUTSIDE_DOMAIN_RLOGIN); no_goto = !(CAN_ANONYMOUS_GOTO); + no_goto_bibp = !(CAN_ANONYMOUS_GOTO_BIBP); no_goto_cso = !(CAN_ANONYMOUS_GOTO_CSO); no_goto_file = !(CAN_ANONYMOUS_GOTO_FILE); #ifndef DISABLE_FINGER @@ -6946,6 +6950,29 @@ StrAllocCopy((p->name), newname); } } + +/* + * Check that bibhost defines the BibP icon. + */ +PUBLIC void LYCheckBibHost NOARGS +{ + DocAddress bibhostIcon; + BOOLEAN saveFlag; + bibhostIcon.address = NULL; + StrAllocCopy(bibhostIcon.address, BibP_bibhost); + StrAllocCat(bibhostIcon.address, "bibp1.0/bibpicon.jpg"); + bibhostIcon.post_data = NULL; + bibhostIcon.post_content_type = NULL; + bibhostIcon.bookmark = FALSE; + bibhostIcon.isHEAD = FALSE; + bibhostIcon.safe = FALSE; + saveFlag = traversal; + traversal = TRUE; /* Hack to force error response. */ + BibP_bibhost_available = HTLoadAbsolute(&bibhostIcon) == YES; + traversal = saveFlag; + BibP_bibhost_checked = TRUE; +} + /* * Management of User Interface Pages. - kw diff -ur lynx2-8-4r16/src/LYUtils.h lynx2-8-4r16.bibp/src/LYUtils.h --- lynx2-8-4r16/src/LYUtils.h Thu Dec 21 18:44:11 2000 +++ lynx2-8-4r16.bibp/src/LYUtils.h Tue Jan 2 06:06:44 2001 @@ -108,6 +108,7 @@ extern void LYAddPathSep PARAMS((char **path)); extern void LYAddPathSep0 PARAMS((char *path)); extern void LYAddPathToHome PARAMS((char *fbuffer, size_t fbuffer_size, char *fname)); +extern void LYCheckBibHost NOPARAMS; extern void LYCheckMail NOPARAMS; extern void LYCleanupTemp NOPARAMS; extern void LYCloseTemp PARAMS((char *name)); @@ -212,6 +213,7 @@ TELNET_GOPHER_URL_TYPE, INDEX_GOPHER_URL_TYPE, MAILTO_URL_TYPE, + BIBP_URL_TYPE, FINGER_URL_TYPE, CSO_URL_TYPE, HTTPS_URL_TYPE, Only in lynx2-8-4r16.bibp/src: LYUtils.h~ diff -ur lynx2-8-4r16/userdefs.h lynx2-8-4r16.bibp/userdefs.h --- lynx2-8-4r16/userdefs.h Fri Jun 23 08:15:08 2000 +++ lynx2-8-4r16.bibp/userdefs.h Tue Jan 2 06:06:44 2001 @@ -838,6 +838,12 @@ #define LYNX_SIG_FILE ".lynxsig" /******************************** + * BIBP_GLOBAL_SERVER is the default global server for bibp: links, used + * when a local bibhost or document-specified citehost is unavailable. + */ +#define BIBP_GLOBAL_SERVER "http://usin.org/" + +/******************************** * If USE_SELECT_POPUPS is set FALSE, Lynx will present a vertical list * of radio buttons for the OPTIONs in SELECT blocks which lack the * MULTIPLE attribute, instead of using a popup menu. Note that if @@ -1581,6 +1587,7 @@ * set to FALSE if you don't want users of your anonymous * account to be able to goto particular URLs. */ +#define CAN_ANONYMOUS_GOTO_BIBP TRUE /* BIBP maps to HTTP */ #define CAN_ANONYMOUS_GOTO_CSO FALSE #define CAN_ANONYMOUS_GOTO_FILE FALSE #define CAN_ANONYMOUS_GOTO_FINGER TRUE --------------------------------------------------------------------------- ; To UNSUBSCRIBE: Send "unsubscribe lynx-dev" to [EMAIL PROTECTED]