6 public class WvStreamStream
: WvStream
8 System
.IO
.Stream inner
;
9 bool hasinner { get { return inner != null; }
}
11 public WvStreamStream(System
.IO
.Stream inner
)
24 lock(readlock
) start_reading();
29 public override bool ok
{
30 get { return hasinner && base.ok; }
33 object readlock
= new object();
34 WvBytes inbuf
= new byte[4096];
35 int in_ofs
= 0, in_left
= 0;
40 //wv.printerr("starting...\n");
43 //wv.printerr("eof close!\n");
52 inner
.BeginRead(inbuf
.bytes
, inbuf
.start
, inbuf
.len
,
53 delegate(IAsyncResult ar
) {
57 in_left
= inner
.EndRead(ar
);
58 //wv.printerr("ending... {0}\n", in_left);
65 } finally {} /* catch (Exception e) {
70 public override int read(WvBytes b
)
76 int max
= in_left
<= b
.len
? in_left
: b
.len
;
77 b
.put(0, inbuf
.sub(in_ofs
, max
));
94 public override int write(WvBytes b
)
98 inner
.BeginWrite(b
.bytes
, b
.start
, b
.len
,
99 delegate(IAsyncResult ar
) {
104 } catch (Exception e
) {
112 public override bool flush(int msec_timeout
)
114 // FIXME: how to implement msec_timeout?
115 if (hasinner
) inner
.Flush();
116 return base.flush(msec_timeout
);
119 public override void close()
128 public class _WvFile
: WvStreamStream
130 public _WvFile(string filename
)
131 : base(new FileStream(filename
, FileMode
.Open
, FileAccess
.Read
))
136 public class WvFile
: WvInBufStream
138 public WvFile(string filename
)
139 : base(new _WvFile(filename
))