Subversion Repositories SmartDukaan

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 ashish 1
# 
2
# Licensed to the Apache Software Foundation (ASF) under one
3
# or more contributor license agreements. See the NOTICE file
4
# distributed with this work for additional information
5
# regarding copyright ownership. The ASF licenses this file
6
# to you under the Apache License, Version 2.0 (the
7
# "License"); you may not use this file except in compliance
8
# with the License. You may obtain a copy of the License at
9
# 
10
#   http://www.apache.org/licenses/LICENSE-2.0
11
# 
12
# Unless required by applicable law or agreed to in writing,
13
# software distributed under the License is distributed on an
14
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
# KIND, either express or implied. See the License for the
16
# specific language governing permissions and limitations
17
# under the License.
18
# 
19
 
20
# this require is to make generated struct definitions happy
21
require 'set'
22
 
23
module Thrift
24
  class ProtocolException < Exception
25
 
26
    UNKNOWN = 0
27
    INVALID_DATA = 1
28
    NEGATIVE_SIZE = 2
29
    SIZE_LIMIT = 3
30
    BAD_VERSION = 4
31
 
32
    attr_reader :type
33
 
34
    def initialize(type=UNKNOWN, message=nil)
35
      super(message)
36
      @type = type
37
    end
38
  end
39
 
40
  class BaseProtocol
41
 
42
    attr_reader :trans
43
 
44
    def initialize(trans)
45
      @trans = trans
46
    end
47
 
48
    def native?
49
      puts "wrong method is being called!"
50
      false
51
    end
52
 
53
    def write_message_begin(name, type, seqid)
54
      raise NotImplementedError
55
    end
56
 
57
    def write_message_end; nil; end
58
 
59
    def write_struct_begin(name)
60
      raise NotImplementedError
61
    end
62
 
63
    def write_struct_end; nil; end
64
 
65
    def write_field_begin(name, type, id)
66
      raise NotImplementedError
67
    end
68
 
69
    def write_field_end; nil; end
70
 
71
    def write_field_stop
72
      raise NotImplementedError
73
    end
74
 
75
    def write_map_begin(ktype, vtype, size)
76
      raise NotImplementedError
77
    end
78
 
79
    def write_map_end; nil; end
80
 
81
    def write_list_begin(etype, size)
82
      raise NotImplementedError
83
    end
84
 
85
    def write_list_end; nil; end
86
 
87
    def write_set_begin(etype, size)
88
      raise NotImplementedError
89
    end
90
 
91
    def write_set_end; nil; end
92
 
93
    def write_bool(bool)
94
      raise NotImplementedError
95
    end
96
 
97
    def write_byte(byte)
98
      raise NotImplementedError
99
    end
100
 
101
    def write_i16(i16)
102
      raise NotImplementedError
103
    end
104
 
105
    def write_i32(i32)
106
      raise NotImplementedError
107
    end
108
 
109
    def write_i64(i64)
110
      raise NotImplementedError
111
    end
112
 
113
    def write_double(dub)
114
      raise NotImplementedError
115
    end
116
 
117
    def write_string(str)
118
      raise NotImplementedError
119
    end
120
 
121
    def read_message_begin
122
      raise NotImplementedError
123
    end
124
 
125
    def read_message_end; nil; end
126
 
127
    def read_struct_begin
128
      raise NotImplementedError
129
    end
130
 
131
    def read_struct_end; nil; end
132
 
133
    def read_field_begin
134
      raise NotImplementedError
135
    end
136
 
137
    def read_field_end; nil; end
138
 
139
    def read_map_begin
140
      raise NotImplementedError
141
    end
142
 
143
    def read_map_end; nil; end
144
 
145
    def read_list_begin
146
      raise NotImplementedError
147
    end
148
 
149
    def read_list_end; nil; end
150
 
151
    def read_set_begin
152
      raise NotImplementedError
153
    end
154
 
155
    def read_set_end; nil; end
156
 
157
    def read_bool
158
      raise NotImplementedError
159
    end
160
 
161
    def read_byte
162
      raise NotImplementedError
163
    end
164
 
165
    def read_i16
166
      raise NotImplementedError
167
    end
168
 
169
    def read_i32
170
      raise NotImplementedError
171
    end
172
 
173
    def read_i64
174
      raise NotImplementedError
175
    end
176
 
177
    def read_double
178
      raise NotImplementedError
179
    end
180
 
181
    def read_string
182
      raise NotImplementedError
183
    end
184
 
185
    def write_field(name, type, fid, value)
186
      write_field_begin(name, type, fid)
187
      write_type(type, value)
188
      write_field_end
189
    end
190
 
191
    def write_type(type, value)
192
      case type
193
      when Types::BOOL
194
        write_bool(value)
195
      when Types::BYTE
196
        write_byte(value)
197
      when Types::DOUBLE
198
        write_double(value)
199
      when Types::I16
200
        write_i16(value)
201
      when Types::I32
202
        write_i32(value)
203
      when Types::I64
204
        write_i64(value)
205
      when Types::STRING
206
        write_string(value)
207
      when Types::STRUCT
208
        value.write(self)
209
      else
210
        raise NotImplementedError
211
      end
212
    end
213
 
214
    def read_type(type)
215
      case type
216
      when Types::BOOL
217
        read_bool
218
      when Types::BYTE
219
        read_byte
220
      when Types::DOUBLE
221
        read_double
222
      when Types::I16
223
        read_i16
224
      when Types::I32
225
        read_i32
226
      when Types::I64
227
        read_i64
228
      when Types::STRING
229
        read_string
230
      else
231
        raise NotImplementedError
232
      end
233
    end
234
 
235
    def skip(type)
236
      case type
237
      when Types::STOP
238
        nil
239
      when Types::BOOL
240
        read_bool
241
      when Types::BYTE
242
        read_byte
243
      when Types::I16
244
        read_i16
245
      when Types::I32
246
        read_i32
247
      when Types::I64
248
        read_i64
249
      when Types::DOUBLE
250
        read_double
251
      when Types::STRING
252
        read_string
253
      when Types::STRUCT
254
        read_struct_begin
255
        while true
256
          name, type, id = read_field_begin
257
          break if type == Types::STOP
258
          skip(type)
259
          read_field_end
260
        end
261
        read_struct_end
262
      when Types::MAP
263
        ktype, vtype, size = read_map_begin
264
        size.times do
265
          skip(ktype)
266
          skip(vtype)
267
        end
268
        read_map_end
269
      when Types::SET
270
        etype, size = read_set_begin
271
        size.times do
272
          skip(etype)
273
        end
274
        read_set_end
275
      when Types::LIST
276
        etype, size = read_list_begin
277
        size.times do
278
          skip(etype)
279
        end
280
        read_list_end
281
      end
282
    end
283
  end
284
 
285
  class BaseProtocolFactory
286
    def get_protocol(trans)
287
      raise NotImplementedError
288
    end
289
  end
290
end