REBOL [ Title: "Test Protocol" File: %test-port.r Date: 15-Aug-2006 Author: "Christopher Ross-Gill" Comments: {Kudos: http://www.rebolforces.com/articles/protocols/} ] flag-defs: [ 1 read 2 write 4 append 8 new 16 #[none] 32 binary 64 lines 128 part 256 with 512 open 1024 closed 2048 no-wait 4096 #[none] 8192 #[none] 16384 #[none] 32768 allow 65536 mode 131072 #[none] 262144 #[none] 524288 direct 1048576 custom 2097152 #[none] 4194304 pass-thru 8388608 #[none] 16777216 #[none] 33554432 skip 67108864 #[none] 134217728 #[none] 268435456 allow-read 536870912 allow-write 1073741824 allow-execute ] get-all-flags: func [port /local out][ out: copy [] foreach flag [ 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 ][ if flag = (port/state/flags and flag) [ append out any [select flag-defs flag flag] ] ] out ] test-handler: context [ count: 0 port-flags: system/standard/port-flags/pass-thru print-flags: func [port][ foreach flag get-all-flags port [print [" FLAG:" form flag]] ] init: func [port spec][print ["INIT:" count: count + 1] false] query: func [port][ print "QUERY" print-flags port port/status: true ] open: func [port /local filename][ print "OPEN" do bind [ all [ prin "^-TEST: " probe value? 'user-data prin "^-TEST: " probe user-data ] ] port do bind [ ;-- Say how big we are tail: 3 index: 0 outBuffer: [1 2 3] ] port/state ;-- Take our flags and merge ; them into the port/state/flags ( Voodoo ) port/state/flags: port/state/flags or port-flags print-flags port ] copy: func [port][ print "COPY" print-flags port none ] select: func [port locator][ print ["SELECT" either block? locator ["SOME"][mold locator]] print-flags port [] ] close: func [port][ print "CLOSE" print-flags port ] read: func [port][ print "READ" print-flags port random 1000 ] write: func [port data][ print "WRITE" print-flags port ] find: func [port params][ print ["FIND:" mold params] print-flags port random 1000 ] pick: func [port][ print ["PICK:" port/state/index] print-flags port port/state/index ** 2 ] poke: func [port index data][ print ["POKE data:" mold data] print ['length port/state/tail 'at index] print-flags port random 1000 ] insert: func [port data][ print ["INSERT data:" mold data] print-flags port 'foobar ] change: func [port data][ print ["CHANGE data:" mold data] print-flags port random 1000 ] remove: func [port][ print "REMOVE" print ['length port/state/tail 'index port/state/index 'scope port/state/num] print-flags port random 1000 ] update: func [port][ print "UPDATE" print-flags port random 1000 ] get-modes: func [port modes][ print "GET-MODES" print-flags port ] set-modes: func [port modes][ print "SET-MODES" print-flags port ] ] add-protocol: func ['proto-name proto-port-id proto-handler][ unless in system/schemes proto-name [ system/schemes: make system/schemes compose [ (to-set-word proto-name) #[none] ] ] set in system/schemes proto-name make system/standard/port [ scheme: proto-name port-id: proto-port-id handler: proto-handler passive: none cache-size: 5 proxy: make object! [host: port-id: user: pass: type: bypass: #[none]] ] ] add-protocol test 0 test-handler