lib/rio/scheme/strio.rb in rio-0.4.2 vs lib/rio/scheme/strio.rb in rio-0.5.1

- old
+ new

@@ -1,8 +1,8 @@ #-- -# =============================================================================== -# Copyright (c) 2005,2006,2007,2008 Christopher Kleckner +# =========================================================================== +# Copyright (c) 2005-2012 Christopher Kleckner # All rights reserved # # This file is part of the Rio library for ruby. # # Rio is free software; you can redistribute it and/or modify @@ -16,70 +16,69 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Rio; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# =============================================================================== +# =========================================================================== #++ # -# To create the documentation for Rio run the command -# ruby build_doc.rb -# from the distribution directory. -# -# Suggested Reading -# * RIO::Doc::SYNOPSIS -# * RIO::Doc::INTRO -# * RIO::Doc::HOWTO -# * RIO::Doc::EXAMPLES -# * RIO::Rio -# -require 'rio/rl/ioi' +require 'rio/rrl/ioi' require 'stringio' require 'rio/stream' require 'rio/stream/open' module RIO module StrIO #:nodoc: all RESET_STATE = 'StrIO::Stream::Open' - class RL < RL::IOIBase + class RRL < ::RIO::RRL::IOIBase RIOSCHEME = 'strio' - RIOPATH = RIO::RL::CHMAP.invert[RIOSCHEME].to_s.freeze + RIOPATH = RIO::RRL::CHMAP.invert[RIOSCHEME].to_s.freeze attr_accessor :str - def initialize(str="") - @str = str - super + def initialize(u,str="") + #p "StrIO::RRL initialize: u=#{u.inspect} str=#{str.inspect}" + alturi = ::Alt::URI.parse(u.to_s) + super(alturi) + self.query ||= str + @sio = self.query end - - def opaque() sprintf('0x%08x',@str.object_id) end - - # must be able to process both - # parse('rio:strio',string) - # parse('rio:strio:0xHEXIOS') - SPLIT_RE = %r|0x([0-9a-fA-F]+)$| - def self.splitrl(s) - sub,opq,whole = split_riorl(s) - if bm = SPLIT_RE.match(opq) - oid = bm[1].hex - str = ObjectSpace._id2ref(oid) - [str] - end + def self.parse(*a) + u = a.shift.sub(/^rio:/,'') + new(u,*a) end - + def query=(arg) + uri.query = if arg.nil? + nil + else + @sio = (::StringIO === arg ? arg : ::StringIO.new(arg)) + sprintf('0x%08x',@sio.object_id) + end + arg + end + def query + uri.query.nil? ? nil : ObjectSpace._id2ref(uri.query.hex) + end + alias :stringio :query + alias :stringio= :query= def open(m,*args) - super(::StringIO.new(@str,m.to_s,*args)) + #p "STRIO open: m=#{m} args=#{args.inspect}" + strio = self.stringio + str = strio.string + nstrio = self.stringio.reopen(str,m.to_s) + super(nstrio) end end module Stream module Ops def string() ioh.string end def string=(p1) ioh.string = p1 end end class Open < RIO::Stream::Open - def string=(p1) rl.str = p1 end - def string() rl.str end + def string=(p1) rl.query = p1 end + def stringio() rl.query end + def string() stringio.string end def stream_state(*args) super.extend(Ops) end end end end end