SMOLNET PORTAL home about changes
/********************************************************************
 * wilkinson
 * 3.22VMS
 * 1995/09/25 10:45
 * gopher_root1:[gopher.g2.vms2_13.object]GSgopherobj.h,v
 * Exp
 *
 * Paul Lindner, University of Minnesota CIS.
 *
 * Copyright 1991, 1992 by the Regents of the University of Minnesota
 * see the file "Copyright" in the distribution for conditions of use.
 *********************************************************************
 * MODULE: GSgopherobj.h
 * Header file, abstraction of a gopher type
 *********************************************************************
 * Revision History:
 * GSgopherobj.h,v
 * Revision 3.22VMS 1995/09/25 10:45    wilkinson
 * Consolodate VMS/Unix source code for server as well as client
 * - use __VMS instead of VMS as trigger for VMS items
 *
 * Revision 3.22  1995/02/06  22:12:02  lindner
 * Make GSsetAbstract a define
 *
 * Revision 3.21  1994/12/05  22:40:11  lindner
 * add prototype for GSfromURL
 *
 * Revision 3.20  1994/11/17  06:34:00  lindner
 * Fixes for VMS internationalization
 *
 * Revision 3.19  1994/10/24  22:15:54  lindner
 * Add PDF type
 *
 * Revision 3.18  1994/08/19  16:18:14  lindner
 * Bitty fix from Alan
 *
 * Revision 3.17  1994/07/21  22:25:06  lindner
 * GINTERNATIONAL stuff
 *
 * Revision 3.16  1994/06/29  06:53:21  lindner
 * ifdef GINTERNATIONAL, use a function instead of a macro for
 * GSgetModDate(), so we can localize the date string
 *
 * Move GSfromURL() return code definitions from code so other
 * files can call it. (Coopersmith)
 *
 * Revision 3.15  1994/06/29  05:45:57  lindner
 * Mods to pump tickets to the net
 *
 * Revision 3.14  1994/04/01  04:38:08  lindner
 * Fix for conditional macros
 *
 * Revision 3.13  1994/03/31  21:02:40  lindner
 * Add some error and NULL checking to GS macros
 *
 * Revision 3.12  1993/12/27  16:22:43  lindner
 * Added more prototypes for GS functions
 *
 * Revision 3.11  1993/11/02  06:15:27  lindner
 * HTML additions
 *
 * Revision 3.10  1993/10/22  20:03:32  lindner
 * Add Movie (;) and Info (i) type support
 *
 * Revision 3.9  1993/09/18  04:44:43  lindner
 * Additions to fix caching of Multiple view items
 *
 * Revision 3.8  1993/09/11  06:33:06  lindner
 * URL support
 *
 * Revision 3.7  1993/07/27  20:18:09  lindner
 * Sorry can't take address of conditionals...
 *
 * Revision 3.6  1993/07/27  05:30:25  lindner
 * Mondo Debug overhaul from Mitra
 *
 * Revision 3.5  1993/07/27  00:30:11  lindner
 * plus patch from Mitra
 *
 * Revision 3.4  1993/07/23  04:50:59  lindner
 * Additional stored askdata
 *
 * Revision 3.3  1993/04/15  17:55:18  lindner
 * GSgetAdmin fix, plus more protos
 *
 * Revision 3.2  1993/03/24  17:09:42  lindner
 * Additions for Localfile for each GopherObj
 *
 * Revision 3.1.1.1  1993/02/11  18:03:03  lindner
 * Gopher+1.2beta release
 *
 * Revision 2.1  1993/02/09  22:47:54  lindner
 * Added new def GSSfindBlock
 *
 * Revision 1.2  1993/01/31  00:31:12  lindner
 * Gopher+ structures and macros.
 *
 * Revision 1.1  1992/12/10  23:27:52  lindner
 * gopher 1.1 release
 *
 *
 *********************************************************************/


#ifndef GSGOPHEROBJ_H
#define GSGOPHEROBJ_H

#include "boolean.h"
#include "STRstring.h"
#include "STAarray.h"
#include "VIews.h"
#include "url.h"
#include "Locale.h"
#include "compatible.h"
#if defined(VMS_SERVER) && !defined(SiteArray)
#include "site.h"
#endif

#define A_FILE      '0'      /* Types of objects */
#define A_DIRECTORY '1'
#define A_CSO       '2'
#define A_ERROR     '3'
#define A_MACHEX    '4'
#define A_PCBIN     '5'
#define A_INDEX     '7'
#define A_TELNET    '8'
#define A_UNIXBIN   '9'
#define A_SOUND     's'
#ifndef VMS_SERVER
#define A_EVENT     'e'
#else
#define A_EXEC      'e'
#endif
#define A_CALENDAR  'c'
#define A_GIF       'g'
#define A_HTML      'h'
#define A_TN3270    'T'
#define A_MIME      'M'
#define A_IMAGE     'I'
#define A_INFO      'i'
#define A_MOVIE     ';'
#define A_PDF       'P'
#define A_APP       '!'
#define A_EOI	    '.'

#ifdef VMS_SERVER
#define A_RANGE	    'R'
#define A_UUENCODE  '6'
#define A_FTP	    'f'
#define A_MAILSPOOL 'm'
#define A_WAIS	    'w'
#endif

#define GS_NAME		"NAME="
#define GS_TYPE		"TYPE="
#define GS_PORT		"PORT="
#define GS_PATH		"PATH="
#define	GS_HOST		"HOST="
#define	GS_NUMB		"NUMB="
#define GS_ADMIN	"ADMIN="
#define GS_ABSTRACT	"ABSTRACT="
#define GS_URL		"URL="
#define GS_TTL		"TTL="
#define GS_DOMAIN_PAT	"DOMAIN_PAT="
#define GS_TUPLE_CNT	11

#ifdef VMS_SERVER

#define	GS_HDDN		"HIDDEN"
#define	GS_HEAD		"HEAD="
#define	GS_FOOT		"FOOT="
#define	GS_RHEAD	"RHEAD="
#define	GS_RFOOT	"RFOOT="
#define	GS_ACCS		"ACCESS="
#define GS_MODDATE	"MODDATE="
#define GS_ASK		"ASK="
#define	GS_CREATE	"DISPLAY=CREATE"
#define GS_MODIFY	"DISPLAY=MODIFY"
#undef  GS_DOMAIN_PAT
#undef  GS_TUPLE_CNT
#define GS_TUPLE_CNT	20

#define GOPHER_ACE	"GOPHER.L"
#define	GOPHER_ACESZ	(4+strlen(GOPHER_ACE))

#endif

typedef struct g_struct GopherObj;
#include "BLblock.h"

/*** Formats for GStoNet() ***/
#define GSFORM_G0    0
#define GSFORM_GPLUS 1
#define GSFORM_HTML  2

/*** Part codes for GSfromLink() & GSfromURL() ***/
#define	G_PATH	1
#define	G_TYPE  2
#define	G_NAME	4
#define	G_PORT	8
#define	G_HOST	16
#define	G_ALL (G_PATH | G_TYPE | G_NAME | G_PORT | G_HOST)

typedef int GSformat;

/*** Our gopher+ attributes structure ***/

struct gplus_struct
{
     /** Abstract Block **/
     /* String *abstract;	Superceeded by BlockArray */

     /** Admin Block **/
     String *Admin;
     String *ModDate;

     VIewArray *Views;
     /** Others Blocks**/
     BlockArray *OtherBlocks;

     /** Filled in askdata **/
     char **Askdata;
};

typedef struct gplus_struct GplusObj;	  

/** Our Gopher Object Type **/

struct g_struct
{
     char    sFileType;     /* The type of object (A_FILE, A_CSO, etc)*/
     String  *Title;        /* User displayable title */
     String  *Selstr;       /* Selector string on host... */
     String  *Host;         /* Internet name of host                  */
     int     iPort;         /* Port number on host                    */
     int     Itemnum;       /* The number of the item in the directory*/
     int     weight;        /* The weight, expressed as a # from 0-1000 */
     int     ttl;           /* The Time-To-Live, how long the item is good */

     String  *Localfile;    /* The local file of the item */
     String  *Localview;    /* The view of the local file of the item */

     boolean isgplus;       /* Item can be queried gopher+ style */
     boolean isask;         /* Item contains an ASK block */
     GplusObj *gplus;       /* Gopher + attributes */
     Url      *url;         /* The Unix^H^H^Hniversal Resource Locator */

#ifdef VMS_SERVER
     boolean date_cr;	    /* Display CREATE date instead of MODIFY date   */
     boolean lookaside;	    /* TRUE when lookaside has been loaded	    */
     SiteArray *Access;	    /* What sites can access this item? */
     Accesslevel Defaccess; /* And the item's default access level */
     String  *Head;	    /* lookaside-only printfile prefix header */
     String  *Foot;	    /* lookaside-only printfile suffix footer */
     String  *RHead;	    /* lookaside-only printfile range prefix header */
     String  *RFoot;	    /* lookaside-only printfile range suffix footer */
#endif

};


typedef struct g_struct GopherStruct;

#define GSgetType(a) ((a)->sFileType)
#define GSsetType(a,b) (a)->sFileType=(b)

#define GSgetTitle(a) ((STRget((a)->Title)))
#define GSsetTitle(a,b) ((STRset((a)->Title, b)))

#define GSgetPath(a) ((STRget((a)->Selstr)))
#define GSsetPath(a,b) ((STRset((a)->Selstr, b)))

#define GSgetHost(a) ((STRget((a)->Host)))
#define GSsetHost(a,b) ((STRset((a)->Host, b)))

#define GSgetPort(a) ((a)->iPort)
#define GSsetPort(a,b) (a)->iPort=(b)

#define GSgetNum(a) ((a)->Itemnum)
#define GSsetNum(a,b) ((a)->Itemnum=(b))

#ifdef VMS_SERVER
#define GSincNum(a) ((a)->Itemnum++)
#endif

#define GSgetWeight(a)   ((a)->weight)
#define GSsetWeight(a,b) ((a)->weight=(b))

#define GSgetTTL(a)   ((a)->ttl)
#define GSsetTTL(a,b) ((a)->ttl=(b))

#define GSgetLocalFile(a) ((STRget((a)->Localfile)))
#define GSsetLocalFile(a,b) ((STRset((a)->Localfile, (b))))

#define GSgetLocalView(a) ((STRget((a)->Localview)))
#define GSsetLocalView(a,b) ((STRset((a)->Localview, (b))))

/****************** Gopher Plus attributes *******************/
#define GSisGplus(a)    ((a)->isgplus)
#define GSsetGplus(a,b) ((a)->isgplus=(b))

#define GSisAsk(a)      ((a)->isask)
#define GSsetAsk(a,b)   ((a)->isask=(b))

#define GSgplusInited(a) ((a)->gplus != NULL)

#define GSgetAdmin(a)    (((a)->gplus == NULL) ? NULL : (STRget((a)->gplus->Admin)))

#if defined(__VMS) || (defined(GINTERNATIONAL) && !defined(NO_STRFTIME))
   char	 *GSgetModDate();
#else
#  define GSgetModDate(a)  (STRget((a)->gplus->ModDate)) 
#endif

#define GSgetOtherBlocks(a) (Blockobj*)(((a)->gplus == NULL) ? NULL : ((a)->gplus->OtherBlocks))

#define GSgetAskdata(a)    (GSgplusInited(a) ? (a)->gplus->Askdata : NULL)
#define GSsetAbstract(g,b) (GSsetBlock(g,"ABSTRACT",b,TRUE))

#ifdef VMS_SERVER

#define GSisCreateDate(a)  (((a)->date_cr)==TRUE)
#define GSisModifyDate(a)  (((a)->date_cr)==FALSE)
#define GSsetCreateDate(a) ((a)->date_cr=TRUE)
#define GSsetModifyDate(a) ((a)->date_cr=FALSE)
#define GSgetLookaside(a)   ((a)->lookaside)
#define GSsetLookaside(a,b) ((a)->lookaside=(b))
#define GSgetAccess(a)  ((a)->Access)
#define GSsetAccess(a,b) ((a)->Access=(b))
#define GSsetAccessSite(a,b) SiteProcessLine((a)->Access, (b), (a)->Defaccess)
#define GSgetDefAcc(a)  ((a)->Defaccess)
#define GSsetDefAcc(a,b) ((a)->Defaccess=(b))
#define GSgetSiteAccess(a,b) SiteAccess((a)->Access, (b))
#define GSgetHeader(a) ((STRget((a)->Head)))
#define GSsetHeader(a,b) ((STRset((a)->Head, b)))
#define GSgetFooter(a) ((STRget((a)->Foot)))
#define GSsetFooter(a,b) ((STRset((a)->Foot, b)))
#define GSgetRHeader(a) ((STRget((a)->RHead)))
#define GSsetRHeader(a,b) ((STRset((a)->RHead, b)))
#define GSgetRFooter(a) ((STRget((a)->RFoot)))
#define GSsetRFooter(a,b) ((STRset((a)->RFoot, b)))

#endif


/*** Real live functions defined in GSgopherobj.c ***/

GopherObj *GSnew();
GopherObj *GSnewSet();
void GSdestroy();
void GSinit();
void GSplusnew();
void GStoNet();
void GStoNetHTML();
int  GSfromNet();
int  GSfromLink();
void GStoLink();
void GScpy();
void      GSsetBlock();
void      GSsetURL();

char     *GSgetURL();
char     *GSgetURLhtml();

struct tm *GSgetModDateTM();

int       GSgetNumViews();
VIewobj  *GSgetView();

int       GSgetNumBlocks();
Blockobj *GSgetBlock();
Blockobj *GSfindBlock();

int GSfromURL();

/****** Protocol transmission functions *******/
int  GSconnect();
void GStransmit();
void GSsendHeader();
void GSsendErrorHeader();
int  GSrecvHeader();
void GStransmit();

/******Gopher+ functions *******/
void GSplusnew();
void GSplusdestroy();
void GSplusInit();
void GSplustoNet();
void GSpluscpy();

char **GSsetAskdata();

#ifdef VMS_SERVER
/***** VMS Server functions *******/
AccessResult GScanAccess();
void GSaddDateNsize();
#endif

/***** Debugging functions *******/
void GSplusPrint();

#endif /*GSGOPHEROBJ_H*/

.
Response: text/plain
Original URLgopher://bitreich.org/9/gopher2007/2007-gopher-mirror/gop...
Content-Typetext/plain; charset=utf-8