/pliant/language/stream/flow.pli
 
 1  # Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx 
 2  # 
 3  # This program is free software; you can redistribute it and/or 
 4  # modify it under the terms of the GNU General Public License version 2 
 5  # as published by the Free Software Foundation. 
 6  # 
 7  # This program is distributed in the hope that it will be useful, 
 8  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 9  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 10  # GNU General Public License for more details. 
 11  # 
 12  # You should have received a copy of the GNU General Public License 
 13  # version 2 along with this program; if not, write to the Free Software 
 14  # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 15   
 16  module "ring.pli" 
 17  module "/pliant/storage/database.pli" 
 18   
 19   
 20  type FlowStreamDriver 
 21    field Link:Stream s 
 22    field Str flag_path flag_value 
 23  StreamDriver maybe FlowStreamDriver 
 24   
 25   
 26  method drv read buf mini maxi -> red 
 27    oarg_rw FlowStreamDriver drv ; arg Address buf ; arg Int mini maxi red 
 28    red := 0 
 29    part read 
 30      drv:s read_available (var Address adr) (var Int size) maxi-red 
 31      if size=0 and (drv:flag_path pmap Str)=drv:flag_value 
 32        sleep 1 
 33        restart read 
 34      memory_copy adr (buf translate Byte red) size ; red += size 
 35      if size>0 and red<mini 
 36        restart read 
 37   
 38   
 39  method drv close -> status 
 40    oarg_rw FlowStreamDriver drv ; arg ExtendedStatus status 
 41    status := success 
 42   
 43   
 44  method drv query command stream answer -> status 
 45    oarg_rw FlowStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg_w Str answer ; arg ExtendedStatus status  
 46    status := drv:s:stream_driver query command drv:s answer 
 47   
 48   
 49  method drv configure command stream -> status 
 50    oarg_rw FlowStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg ExtendedStatus status 
 51    status := drv:s:stream_driver configure command drv:s 
 52   
 53   
 54 
 
 55   
 56   
 57  type FlowFileSystem 
 58    void 
 59  FileSystem maybe FlowFileSystem 
 60   
 61   
 62  method fs open name options flags stream support -> status 
 63    oarg_rw FlowFileSystem fs ; arg Str name options ; arg Int flags ; arg_rw Stream stream support ; arg ExtendedStatus status 
 64    var Link:Stream s 
 65    if (flags .and. in+out)<>in 
 66      return failure 
 67    if addressof:support<>null 
 68      s :> support 
 69    else 
 70      var Link:Stream s :> new Stream 
 71      s open name options (flags .and. in+safe) 
 72      if s=failure 
 73        return failure 
 74    var Link:FlowStreamDriver drv :> new FlowStreamDriver 
 75    drv s :> s 
 76    drv flag_path := options option "flag_path" Str 
 77    drv flag_value := options option "flag_value" Str 
 78    stream stream_driver :> drv 
 79    status := success 
 80   
 81   
 82  gvar FlowFileSystem flow_file_system 
 83  pliant_multi_file_system mount "flow:" "" flow_file_system