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