Finally! StarQuery reports dollar signs on decimal fields.
[versaplex.git] / wvdotnet / wvstreamstream.cs
blobc5076094ead9175b165c7417bbe4e4f65b2d111e
1 using System;
2 using System.IO;
4 namespace Wv
6 public class WvStreamStream : WvStream
8 System.IO.Stream inner;
9 bool hasinner { get { return inner != null; } }
11 public WvStreamStream(System.IO.Stream inner)
13 this.inner = inner;
14 if (hasinner)
16 if (!inner.CanWrite)
17 nowrite();
18 else
19 post_writable();
20 if (!inner.CanRead)
21 noread();
22 else
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;
36 bool got_eof = false;
38 void start_reading()
40 //wv.printerr("starting...\n");
41 if (got_eof)
43 //wv.printerr("eof close!\n");
44 noread();
45 nowrite();
46 return;
49 in_ofs = 0;
50 in_left = 0;
51 try {
52 inner.BeginRead(inbuf.bytes, inbuf.start, inbuf.len,
53 delegate(IAsyncResult ar) {
54 lock (readlock)
56 in_ofs = 0;
57 in_left = inner.EndRead(ar);
58 //wv.printerr("ending... {0}\n", in_left);
59 if (in_left == 0)
60 got_eof = true;
61 post_readable();
64 null);
65 } finally {} /* catch (Exception e) {
66 err = e;
67 }*/
70 public override int read(WvBytes b)
72 lock (readlock)
74 if (in_left > 0)
76 int max = in_left <= b.len ? in_left : b.len;
77 b.put(0, inbuf.sub(in_ofs, max));
78 in_ofs += max;
79 in_left -= max;
80 if (in_left > 0)
81 post_readable();
82 else
83 start_reading();
84 return max;
86 else
88 start_reading();
89 return 0;
94 public override int write(WvBytes b)
96 if (!ok) return 0;
97 try {
98 inner.BeginWrite(b.bytes, b.start, b.len,
99 delegate(IAsyncResult ar) {
100 inner.EndWrite(ar);
101 post_writable();
103 null);
104 } catch (Exception e) {
105 err = e;
106 return 0;
109 return b.len;
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()
121 base.close();
122 if (hasinner)
123 inner.Dispose();
124 inner = null;
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))