r1389@opsdev009 (orig r72873): mcslee | 2007-12-05 15:13:11 -0800
[amiethrift.git] / lib / rb / lib / thrift / transport / ttransport.rb
blob47403fc6b8e357423108f50c85c6ecbbe0384e42
1 #!/usr/bin/env ruby
3 # Copyright (c) 2006- Facebook
4 # Distributed under the Thrift Software License
6 # See accompanying file LICENSE or visit the Thrift site at:
7 # http://developers.facebook.com/thrift/
9 # Author: Mark Slee <mcslee@facebook.com>
12 require 'thrift/thrift'
14 class TTransportException < TException
16   UNKNOWN = 0
17   NOT_OPEN = 1
18   ALREADY_OPEN = 2
19   TIMED_OUT = 3
20   END_OF_FILE = 4
22   attr_reader :type
24   def initialize(type=UNKNOWN, message=nil)
25     super(message)
26     @type = type
27   end
29 end
31 class TTransport
32   def isOpen(); nil; end
34   def open(); nil; end
36   def close(); nil; end
38   def read(sz); nil; end
40   def readAll(sz)
41     buff = ''
42     have = 0
43     while (have < sz)
44       chunk = read(sz - have)
45       have += chunk.length
46       buff += chunk
47     end
48     return buff
49   end
51   def write(buf); nil; end
53   def flush(); nil; end
55 end
57 class TServerTransport
58   def listen(); nil; end
60   def accept(); nil; end
62   def close(); nil; end
64 end
66 class TTransportFactory
67   def getTransport(trans)
68     return trans
69   end
70 end
72 class TBufferedTransport < TTransport
73   def initialize(transport)
74     @transport = transport
75     @wbuf = ''
76   end
78   def isOpen()
79     return @transport.isOpen()
80   end
82   def open()
83     @transport.open()
84   end
86   def close()
87     @transport.close()
88   end
90   def read(sz)
91     return @transport.read(sz)
92   end
94   def write(buf)
95     @wbuf += buf
96   end
98   def flush()
99     @transport.write(@wbuf)
100     @transport.flush()
101     @wbuf = ''
102   end
105 class TBufferedTransportFactory < TTransportFactory
106   def getTransport(transport)
107     return TBufferedTransport.new(transport)
108   end
112 class TFramedTransport < TTransport
113   def initialize(transport, read=true, write=true)
114     @transport = transport
115     @rbuf      = ''
116     @wbuf      = ''
117     @read      = read
118     @write     = write
119   end
121   def isOpen()
122     return @transport.isOpen
123   end
125   def open()
126     @transport.open
127   end
129   def close()
130     @transport.close
131   end
133   def read(sz)
134     if !@read
135       return @transport.read(sz)
136     end
138     if (sz <= 0)
139       return ''
140     end
142     if (@rbuf.length == 0)
143       self.readFrame
144     end
146     # return full buf
147     if (sz > @rbuf.length)
148       out = @rbuf
149       @rbuf = ''
150       return out
151     end
153     # Return substr
154     out = @rbuf.slice(0, sz)
155     @rbuf = @rbuf.slice(sz, @rbuf.length)
156     return out
158   end
160   def write(buf,sz=nil)
162     if !@write
163       return @transport.write(buf);
164     end
166     if (sz != nil && sz < buf.length)
167       buf = buf.slice(0,sz)
168     end
170     @wbuf += buf
172   end
174   #
175   # Writes the output buffer to the stream in the format of a 4-byte length
176   # followed by the actual data.
177   #
178   def flush
179     if !@write
180       return @transport.flush
181     end
183     out = [@wbuf.length].pack('N')
184     out += @wbuf
185     @transport.write(out)
186     @transport.flush
187     @wbuf = ''
188   end
190   private
192   def readFrame
193     buf  = @transport.readAll(4)
194     val  = buf.unpack('N')
195     sz   = val[0]
197     @rbuf = @transport.readAll(sz)
198   end
203 class TFramedTransportFactory < TTransportFactory
204   def getTransport(transport)
205     return TFramedTransport.new(transport)
206   end
209 class TMemoryBuffer < TTransport
210   def initialize(sz=1024)
211     @buf = ''
212     @sz  = sz
213     wpos = 0
214     rpos = 0
215   end
217   def isOpen
218     return 1
219   end
221   def open
222   end
224   def close
225   end
227   def peek
228     return rpos < wpos
229   end
231   def getBuffer
232     return @buf
233   end
235   def resetBuffer(new_buf = '')
236      @buf  = new_buf
237      @sz   = new_buf.length
238      @wpos = new_buf.length
239      @rpos = 0
240   end
242   def available
243     return @wpos - @rpos
244   end
246   def read(len)
247     avail = available()
249     return '' if avail == 0
251     #how much to give
252     give = len
253     give = avail if avail < len
255     ret = @buf.slice(@rpos,give)
257     @rpos += give;
259     return ret;
260   end
262   def write(wbuf)
263     @buf  += wbuf
264     @wpos += wbuf.length()
265   end
267   def flush
268   end