Patch title: Release 87 bulk changes
Abstract:
File: /pliant/language/stream/flow.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

module "ring.pli"
module "/pliant/appli/database.pli"


type FlowStreamDriver
  field Link:Stream s
  field Str flag_path flag_value
StreamDriver maybe FlowStreamDriver


method drv read buf mini maxi -> red
  oarg_rw FlowStreamDriver drv ; arg Address buf ; arg Int mini maxi red
  red := 0
  part read
    drv:s read_available (var Address adr) (var Int size) maxi-red
    if size=0 and (drv:flag_path pmap Str)=drv:flag_value
      sleep 1
      restart read
    memory_copy adr (buf translate Byte red) size ; red += size
    if size>0 and red<mini
      restart read


method drv close -> status
  oarg_rw FlowStreamDriver drv ; arg ExtendedStatus status
  status := success


method drv query command stream answer -> status
  oarg_rw FlowStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg_w Str answer ; arg ExtendedStatus status 
  status := drv:s:stream_driver query command drv:s answer


method drv configure command stream -> status
  oarg_rw FlowStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg ExtendedStatus status
  status := drv:s:stream_driver configure command drv:s


#----------------------------------------------------------------


type FlowFileSystem
  void
FileSystem maybe FlowFileSystem


method fs open name options flags stream support -> status
  oarg_rw FlowFileSystem fs ; arg Str name options ; arg Int flags ; arg_rw Stream stream support ; arg ExtendedStatus status
  var Link:Stream s
  if (flags .and. in+out)<>in
    return failure
  if addressof:support<>null
    s :> support
  else
    var Link:Stream s :> new Stream
    s open name options (flags .and. in+safe)
    if s=failure
      return failure
  var Link:FlowStreamDriver drv :> new FlowStreamDriver
  drv s :> s
  drv flag_path := options option "flag_path" Str
  drv flag_value := options option "flag_value" Str
  stream stream_driver :> drv
  status := success


gvar FlowFileSystem flow_file_system
pliant_multi_file_system mount "flow:" "" flow_file_system