summaryrefslogtreecommitdiff
path: root/appl/charon/chutils.m
diff options
context:
space:
mode:
Diffstat (limited to 'appl/charon/chutils.m')
-rw-r--r--appl/charon/chutils.m371
1 files changed, 371 insertions, 0 deletions
diff --git a/appl/charon/chutils.m b/appl/charon/chutils.m
new file mode 100644
index 00000000..8d7d3a8c
--- /dev/null
+++ b/appl/charon/chutils.m
@@ -0,0 +1,371 @@
+CharonUtils: module
+{
+ PATH: con "/dis/charon/chutils.dis";
+
+ # Modules for everyone to share
+ C: Ctype;
+ E: Events;
+ G: Gui;
+ L: Layout;
+ I: Img;
+ B: Build;
+ LX: Lex;
+ J: Script;
+ CH: Charon;
+ CK: Cookiesrv;
+
+ # HTTP methods
+ HGet, HPost : con iota;
+ hmeth: array of string;
+
+ # Media types (must track mnames in chutils.b)
+ ApplMsword, ApplOctets, ApplPdf, ApplPostscript, ApplRtf,
+ ApplFramemaker, ApplMsexcel, ApplMspowerpoint, UnknownType,
+
+ Audio32kadpcm, AudioBasic,
+
+ ImageCgm, ImageG3fax, ImageGif, ImageIef, ImageJpeg, ImagePng, ImageTiff,
+ ImageXBit, ImageXBit2, ImageXBitmulti, ImageXInfernoBit, ImageXXBitmap,
+
+ ModelVrml,
+
+ MultiDigest, MultiMixed,
+
+ TextCss, TextEnriched, TextHtml, TextJavascript, TextPlain, TextRichtext,
+ TextSgml, TextTabSeparatedValues, TextXml,
+
+ VideoMpeg, VideoQuicktime : con iota;
+
+ mnames: array of string;
+
+ # Netconn states
+ NCfree, NCidle, NCconnect, NCgethdr, NCgetdata,
+ NCdone, NCerr : con iota;
+
+ ncstatenames: array of string;
+
+ # Netcomm synch protocol values
+ NGstartreq, NGwaitreq, NGstatechg, NGfreebs : con iota;
+
+ # Colors
+ White: con 16rFFFFFF;
+ Black: con 16r000000;
+ Grey: con 16rdddddd;
+ DarkGrey: con 16r9d9d9d;
+ LightGrey: con 16rededed;
+ Blue: con 16r0000CC;
+ Navy: con 16r000080;
+ Red: con 16rFF0000;
+ Green: con 16r00FF00;
+ DarkRed: con 16r9d0000;
+
+ # Header major status values (code/100)
+ HSNone, HSInformation, HSOk, HSRedirect, HSError, HSServererr : con iota;
+ hsnames: array of string;
+
+ # Individual status code values (HTTP, but use for other transports too)
+ HCContinue: con 100;
+ HCSwitchProto: con 101;
+ HCOk: con 200;
+ HCCreated: con 201;
+ HCAccepted: con 202;
+ HCOkNonAuthoritative: con 203;
+ HCNoContent: con 204;
+ HCResetContent: con 205;
+ HCPartialContent: con 206;
+ HCMultipleChoices: con 300;
+ HCMovedPerm: con 301;
+ HCMovedTemp: con 302;
+ HCSeeOther: con 303;
+ HCNotModified: con 304;
+ HCUseProxy: con 305;
+ HCBadRequest: con 400;
+ HCUnauthorized: con 401;
+ HCPaymentRequired: con 402;
+ HCForbidden: con 403;
+ HCNotFound: con 404;
+ HCMethodNotAllowed: con 405;
+ HCNotAcceptable: con 406;
+ HCProxyAuthRequired: con 407;
+ HCRequestTimeout: con 408;
+ HCConflict: con 409;
+ HCGone: con 410;
+ HCLengthRequired: con 411;
+ HCPreconditionFailed: con 412;
+ HCRequestTooLarge: con 413;
+ HCRequestURITooLarge: con 414;
+ HCUnsupportedMedia: con 415;
+ HCRangeInvalid: con 416;
+ HCExpectFailed: con 419;
+ HCServerError: con 500;
+ HCNotImplemented: con 501;
+ HCBadGateway: con 502;
+ HCServiceUnavailable: con 503;
+ HCGatewayTimeout: con 504;
+ HCVersionUnsupported: con 505;
+ HCRedirectionFailed: con 506;
+
+ # Max number of redirections tolerated
+ Maxredir : con 10;
+
+ # Image Level config options
+ ImgNone, ImgNoAnim, ImgProgressive, ImgFull: con iota;
+
+ # SSL connection version
+ NOSSL, SSLV2, SSLV3, SSLV23: con iota;
+
+ # User Configuration Information (Options)
+ # Debug option letters:
+ # 'd' -> Basic operation info (navigation, etc.)
+ # 'e' -> Events (timing of progress through get/layout/image conversion)
+ # 'h' -> Build layout items from lex tokens
+ # 'i' -> Image conversion
+ # 'l' -> Layout
+ # 'n' -> transport (Network access)
+ # 'o' -> always use old http (http/1.0)
+ # 'p' -> synch Protocol between ByteSource/Netconn
+ # 'r' -> Resource usage
+ # 's' -> Scripts
+ # 't' -> Table layout
+ # 'u' -> use Uninstalled dis modules
+ # 'w' -> Warn about recoverable problems in retrieved pages
+ # 'x -> lex Html tokens
+ Config: adt
+ {
+ userdir: string; # where to find bookmarks, cache, etc.
+ srcdir: string; # where to find charon src (for debugging)
+ starturl: string;# never nil (could be last of command args)
+ change_homeurl: int;
+ homeurl: string;# never nil
+ helpurl: string;
+ usessl: int; # use ssl version 2, 3 or both
+ devssl: int; # use devssl
+ custbkurl: string; # where are customized bookmarks-never nil
+ dualbkurl: string; # where is the dual bookmark page-never nil
+ httpproxy: ref Url->Parsedurl;# nil, if no proxy
+ noproxydoms: list of string; # domains that don't require proxy
+ buttons: string; # customized buttons
+ framework: string; # customized gui framework
+ defaultwidth: int; # of entire browser
+ defaultheight: int; # of entire browser
+ x: int; # initial x position for browser
+ y: int; # initial y position for browser
+ nocache: int; # true if shouldn't retrieve from or store to
+ maxstale: int; # allow cache hit even if exceed expiration by maxstale
+ imagelvl: int; # ImgNone, etc.
+ imagecachenum: int; # imcache.nlimit
+ imagecachemem: int; # imcache.memlimit
+ docookies: int; # allow cookie storage/sending?
+ doscripts: int; # allow scripts to execute?
+ httpminor: int; # use HTTP 1.httpminor
+ agentname: string; # what to send in HTTP header
+ nthreads: int; # number of simultaneous gets allowed
+ offersave: int; # offer to save a file of a type that can't be handled
+ charset: string; # default character set
+ plumbport: string; # from/to plumbing port name (default = "web")
+ wintitle: string;
+ dbgfile: string; # file to write debug messages to
+ dbg: array of byte; # ascii letters for different debugging kinds
+ };
+
+ # Information for fulfilling HTTP request
+ ReqInfo : adt
+ {
+ url: ref Url->Parsedurl; # should be absolute
+ method: int; # HGet or HPost
+ body: array of byte; # used for HPost
+ auth: string; # optional auth info
+ target: string; # target frame name
+ };
+
+ MaskedImage: adt {
+ im: ref Draw->Image; # the image
+ mask: ref Draw->Image; # if non-nil, a mask for the image
+ delay: int; # if animated, delay in millisec before next frame
+ more: int; # true if more frames follow
+ bgcolor: int; # if not -1, restore to this (RGB) color before next frame
+ origin: Draw->Point; # origin of im relative to first frame of an animation
+
+ free: fn(mim: self ref MaskedImage);
+ };
+
+ # Charon Image info.
+ # If this is an animated image then len mims > 1
+ CImage: adt
+ {
+ src: ref Url->Parsedurl; # source of image
+ lowsrc: ref Url->Parsedurl; # for low-resolution devices
+ actual: ref Url->Parsedurl; # what came back as actual source of image
+ imhash: int; # hash of src, for fast comparison
+ width: int;
+ height: int;
+ next: cyclic ref CImage; # next (newer) image in cache
+ mims: array of ref MaskedImage;
+ complete: int; # JavaScript Image.complete
+
+ new: fn(src: ref Url->Parsedurl, lowsrc: ref Url->Parsedurl, width, height: int) : ref CImage;
+ match: fn(a: self ref CImage, b: ref CImage) : int;
+ bytes: fn(ci: self ref CImage) : int;
+ };
+
+ # In-memory cache of CImages
+ ImageCache: adt
+ {
+ imhd: ref CImage; # head (LRU) of cache chain (linked through CImage.next)
+ imtl: ref CImage; # tail MRU) of cache chain
+ n: int; # size of chain
+ memused: int; # current total of image mem used by cached images
+ memlimit: int; # keep memused less than this
+ nlimit: int; # keep n less than this
+
+ init: fn(ic: self ref ImageCache);
+ resetlimits: fn(ic: self ref ImageCache);
+ look: fn(ic: self ref ImageCache, ci: ref CImage) : ref CImage;
+ add: fn(ic: self ref ImageCache, ci: ref CImage);
+ deletelru: fn(ic: self ref ImageCache);
+ clear: fn(ic: self ref ImageCache);
+ need: fn(ic: self ref ImageCache, nbytes: int) : int;
+ };
+
+ # An connection to some host
+ Netconn: adt
+ {
+ id: int; # for debugging
+ host: string; # host name
+ port: int; # port number
+ scheme: string; # Url scheme ("http", "file", etc.)
+ conn: Sys->Connection; # fds, etc.
+ sslx: ref SSL3->Context; # ssl connection
+ vers: int; # ssl version
+ state: int; # NCfree, etc.
+ queue: cyclic array of ref ByteSource;
+ # following are indexes into queue
+ qlen: int; # queue[0:qlen] is queue of requests
+ gocur: int; # go thread currently processing
+ ngcur: int; # ng threads currently processing
+ reqsent: int; # next to send request for
+ pipeline: int; # are requests being pipelined?
+ connected: int; # are we connected to host?
+ tstate: int; # for use by transport
+ tbuf: array of byte; # for use by transport
+ idlestart: int; # timestamp when went Idle
+
+ new: fn(id: int) : ref Netconn;
+ makefree: fn(nc: self ref Netconn);
+ };
+
+ # Info from an HTTP response header
+ Header: adt
+ {
+ code: int; # HC... (detailed response code)
+ actual: ref Url->Parsedurl; # actual request url (may be result of redir)
+ base: ref Url->Parsedurl; # Content-Base or request url
+ location: ref Url->Parsedurl; # Content-Location
+ length: int; # -1 if unknown
+ mtype: int; # TextHtml, etc.
+ chset: string; # charset encoding
+ msg: string; # possible message explaining status
+ refresh:string; # used for server push
+ chal: string; # used if code is HSneedauth
+ warn: string; # should show this to user
+ lastModified: string; # last-modified field
+
+ new: fn() : ref Header;
+ setmediatype: fn(h: self ref Header, name: string, first: array of byte);
+ print: fn(h: self ref Header);
+ };
+
+ # A source of raw bytes (with HTTP info)
+ ByteSource: adt
+ {
+ id: int; # for debugging
+ req: ref ReqInfo;
+ hdr: ref Header; # filled in from headers
+ data: array of byte; # all the data, maybe partially filled
+ edata: int; # data[0:edata] is valid
+ err: string; # there was an error
+ net: cyclic ref Netconn; # servicing fd, etc.
+ refgo: int; # go proc is still using
+ refnc: int; # netconn proc is still using
+
+ # producer sets eof upon finalising data & edata
+ eof: int;
+
+ # consumer changes only these fields:
+ lim: int; # consumer has seen data[0:lim]
+ seenhdr: int; # consumer has seen hdr
+
+ free: fn(bs: self ref ByteSource);
+ stringsource: fn(s: string) : ref ByteSource;
+ };
+
+ # Snapshot of current system resources
+ ResourceState: adt
+ {
+ ms: int; # a millisecond time stamp
+ main: int; # main memory
+ mainlim: int; # max main memory
+ heap: int; # heap memory
+ heaplim: int; # max heap memory
+ image: int; # used image memory
+ imagelim: int; # max image memory
+
+ cur: fn() : ResourceState;
+ since: fn(rnew: self ResourceState, rold: ResourceState) : ResourceState;
+ print: fn(r: self ResourceState, msg: string);
+ };
+
+
+ Nameval: adt {
+ key: string;
+ val: string;
+
+ namevals: fn(s: string, sep: int) : list of Nameval;
+ find: fn(l: list of Nameval, key: string) : (int, string);
+ };
+
+
+ # Globals
+ config: Config;
+ startres: ResourceState;
+ imcache: ref ImageCache;
+ progresschan: chan of (int, int, int, string);
+ gen: int; # go generation number
+ ckclient: ref Cookiesrv->Client;
+
+ init: fn(ch: Charon, me: CharonUtils, argl: list of string, evch: chan of ref E->Event, cksrv: Cookiesrv, ckclient: ref Cookiesrv->Client) : string;
+
+ # Dispatcher functions
+ stringreq: fn(s : string) : ref ByteSource;
+ startreq: fn(req: ref ReqInfo) : ref ByteSource;
+ waitreq: fn(bsl : list of ref ByteSource) : ref ByteSource;
+ freebs: fn(bs: ref ByteSource);
+ abortgo: fn(gopgrp: int);
+ netget: fn();
+
+ # Miscellaneous utility functions
+ kill: fn(pid: int, dogroup: int);
+ getline: fn(fd: ref Sys->FD, buf: array of byte, bstart, bend: int) :
+ (array of byte, int, int, int);
+ saveconfig: fn() : int;
+ strlookup: fn(a: array of string, s: string) : int;
+ realloc: fn(a: array of byte, incr: int) : array of byte;
+ hcphrase: fn(code: int) : string;
+ hdraction: fn(bs: ref ByteSource, ismain: int, nredirs: int) : (int, string, string, ref Url->Parsedurl);
+ makestrinttab: fn(a: array of string) : array of StringIntTab->StringInt;
+ urlequal: fn(a, b: ref Url->Parsedurl) : int;
+ makeabsurl: fn(s: string) : ref Url->Parsedurl;
+ loadpath: fn(s: string) : string;
+ event: fn(s: string, data: int);
+ color: fn(s: string, dflt: int) : int;
+ max: fn(a, b : int) : int;
+ min: fn(a, b : int) : int;
+ raisex: fn(e: string);
+ assert: fn(i: int);
+ stripscript: fn(s: string) : string; # strip HTML comments from Script
+ getconv: fn(chset : string) : Btos;
+ setcookie: fn(host, path, cookie: string);
+ getcookies: fn(host, path: string, secure: int): string;
+ schemeok: fn(scheme: string): int; # is URL scheme supported?
+ X: fn(s, note : string) : string;
+};