// Constants for using the Newton Internet Enabler // Copyright (c) 1994-1995 Apple Computer, Inc. All rights reserved. // Transport service type constants constant kTCP := 1; constant kUDP := 2; // Utility functions for Internet applications DefConst('kNumtoHostAddr,func(addr) begin // This is the inverse of HostAddrToNum // It converts a 4 byte array to a "w.x.y.z" string. local index, str := ""; // A sanity check if Length(addr) <> 4 then begin return nil; end; for index := 0 to Length(addr) - 1 do begin str := str & NumberStr(addr[index]); if index < Length(addr) - 1 then str := str & "."; end; return str; end); DefConst('kHostAddrToNum,func(str) begin // This is the inverse of NumToHostAddr // It converts a "w.x.y.z" string to a 4 byte array. // Actually the separators between the numbers can be any non-digits, except space local index := 0, partCnt := 0; local subNum := 0, digits := "0123456789 "; local num := [0,0,0,0], processNum; for index := 0 to StrLen(str) - 1 do begin ch := StrPos(digits, SubStr(str, index, 1), 0); if not ch then begin // If first character is not a digit then skip junk at beginning if index = 0 then processNum := nil; // Not a digit. Process number, unless skipping junk if processNum then begin // Truncate numbers greater than 255 if subNum > 255 then subNum := 255; if partCnt < 4 then num[partCnt] := subNum; partCnt := partCnt + 1; subNum := 0; processNum := nil; end; end else begin // Add the next digit to subNum (unless it was a space) if ch < 10 then subNum := subNum * 10 + ch; processNum := true; end; end; // Truncate numbers greater than 255 if subNum > 255 then subNum := 255; // Do the last part (which usually won't have a trailing .) if subNum <> 0 and partCnt < 4 then num[partCnt] := subNum; return num; end); DefConst('kIsIPAddr,func(str) begin // This returns true if the string is an IP address (as opposed to a domain name) // cheap test now just tests if the string ends with a numeric character local digits := "0123456789"; local len := strLen(str); if len > 0 and StrPos(digits, SubStr(str, len - 1, 1), 0) then true else nil; end); DefConst('kPortAddrStruct, [ 'struct, ['array,'byte,4], 'short ]); DefConst('kPortAddrData,{ arglist: [ [0,0,0,0], 0, // destination port number ], typelist: kPortAddrStruct, }); // Use this to get Instantiate options // protocol must be kSLIP or kPPP DefConst('kGetEndpointConfigOptions, func(linkID,protocol) return [ { label: "inet", type: 'service, opCode: opSetRequired, result: nil, }, { label: "ilid", // set the link id type: 'option, opCode: opSetRequired, result: nil, form: 'template, data: { arglist: [ linkID ], typelist: [ 'struct, 'ulong ], }, }, { label: "itsv", // set the transport protocol (TCP or UCP) type: 'option, opCode: opSetRequired, result: nil, form: 'template, data: { arglist: [ protocol ], typelist: [ 'struct, 'ulong ], }, }, ]); DefConst('kUDPReceiveOptions, [ { label: "iuds", // get the UDP destination socket type: 'option, opCode: opGetCurrent, result: nil, form: 'template, data: kPortAddrData, }, { label: "iuss", // get the UDP source socket type: 'option, opCode: opGetCurrent, result: nil, form: 'template, data: kPortAddrData, }, ]); DefConst('kINetBindOptions,func(localPort,useDefaultPort) begin return [ { label: "ilpt", // set the local port type: 'option, opCode: opSetRequired, result: nil, form: 'template, data: { arglist: [ localPort, // local port number useDefaultPort // use default port ], typelist: [ 'struct, 'short, 'boolean ], }, }, ]; end); DefConst('kTCPConnectOptions, func(remoteAddr,remotePort) begin return [ { label: "itrs", // set the TCP remote socket type: 'option, opCode: opSetRequired, result: nil, form: 'template, data: { arglist: [ remoteAddr, remotePort, // remote port number ], typelist: kPortAddrStruct, }, }, ]; end); DefConst('kTCPListenOptions, [ { label: "itrs", // get the TCP remote socket type: 'option, opCode: opGetCurrent, result: nil, form: 'template, data: kPortAddrData, }, ]; ); DefConst('kGetIPAddressesOptions, [{ type : 'option, label : "iprf", opCode: opGetCurrent, data : { arglist: [ [0,0,0,0], [0,0,0,0], ], typelist: [ 'struct, ['array,'byte,4], ['array,'byte,4], ] } }]); DefConst('kUDPPutBytesOptions,func(addr,port) begin return [{ label: "iuds", // set the UDP destination socket type: 'option, opCode: opSetRequired, result: nil, form: 'template, data: { arglist: [ addr, port, // remote port number ], typelist: kPortAddrStruct, }, }]; end);