|  | (* | 
|  | Licensed to the Apache Software Foundation (ASF) under one | 
|  | or more contributor license agreements. See the NOTICE file | 
|  | distributed with this work for additional information | 
|  | regarding copyright ownership. The ASF licenses this file | 
|  | to you under the Apache License, Version 2.0 (the | 
|  | "License"); you may not use this file except in compliance | 
|  | with the License. You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, | 
|  | software distributed under the License is distributed on an | 
|  | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | KIND, either express or implied. See the License for the | 
|  | specific language governing permissions and limitations | 
|  | under the License. | 
|  | *) | 
|  |  | 
|  | open Thrift | 
|  |  | 
|  | module P = Protocol | 
|  |  | 
|  | let get_byte i b = 255 land (i lsr (8*b)) | 
|  | let get_byte32 i b = 255 land (Int32.to_int (Int32.shift_right i (8*b))) | 
|  | let get_byte64 i b = 255 land (Int64.to_int (Int64.shift_right i (8*b))) | 
|  |  | 
|  |  | 
|  | let tv = P.t_type_to_i | 
|  | let vt = P.t_type_of_i | 
|  |  | 
|  |  | 
|  | let comp_int b n = | 
|  | let s = ref 0l in | 
|  | let sb = 32 - 8*n in | 
|  | for i=0 to (n-1) do | 
|  | s:= Int32.logor !s (Int32.shift_left (Int32.of_int (int_of_char b.[i])) (8*(n-1-i))) | 
|  | done; | 
|  | Int32.shift_right (Int32.shift_left !s sb) sb | 
|  |  | 
|  | let comp_int64 b n = | 
|  | let s = ref 0L in | 
|  | for i=0 to (n-1) do | 
|  | s:=Int64.logor !s (Int64.shift_left (Int64.of_int (int_of_char b.[i])) (8*(n-1-i))) | 
|  | done; | 
|  | !s | 
|  |  | 
|  | let version_mask = 0xffff0000l | 
|  | let version_1 = 0x80010000l | 
|  |  | 
|  | class t trans = | 
|  | object (self) | 
|  | inherit P.t trans | 
|  | val ibyte = String.create 8 | 
|  | method writeBool b = | 
|  | ibyte.[0] <- char_of_int (if b then 1 else 0); | 
|  | trans#write ibyte 0 1 | 
|  | method writeByte i = | 
|  | ibyte.[0] <- char_of_int (get_byte i 0); | 
|  | trans#write ibyte 0 1 | 
|  | method writeI16 i = | 
|  | let gb = get_byte i in | 
|  | ibyte.[1] <- char_of_int (gb 0); | 
|  | ibyte.[0] <- char_of_int (gb 1); | 
|  | trans#write ibyte 0 2 | 
|  | method writeI32 i = | 
|  | let gb = get_byte32 i in | 
|  | for i=0 to 3 do | 
|  | ibyte.[3-i] <- char_of_int (gb i) | 
|  | done; | 
|  | trans#write ibyte 0 4 | 
|  | method writeI64 i= | 
|  | let gb = get_byte64 i in | 
|  | for i=0 to 7 do | 
|  | ibyte.[7-i] <- char_of_int (gb i) | 
|  | done; | 
|  | trans#write ibyte 0 8 | 
|  | method writeDouble d = | 
|  | self#writeI64 (Int64.bits_of_float d) | 
|  | method writeString s= | 
|  | let n = String.length s in | 
|  | self#writeI32 (Int32.of_int n); | 
|  | trans#write s 0 n | 
|  | method writeBinary a = self#writeString a | 
|  | method writeMessageBegin (n,t,s) = | 
|  | self#writeI32 (Int32.logor version_1 (Int32.of_int (P.message_type_to_i t))); | 
|  | self#writeString n; | 
|  | self#writeI32 (Int32.of_int s) | 
|  | method writeMessageEnd = () | 
|  | method writeStructBegin s = () | 
|  | method writeStructEnd = () | 
|  | method writeFieldBegin (n,t,i) = | 
|  | self#writeByte (tv t); | 
|  | self#writeI16 i | 
|  | method writeFieldEnd = () | 
|  | method writeFieldStop = | 
|  | self#writeByte (tv (P.T_STOP)) | 
|  | method writeMapBegin (k,v,s) = | 
|  | self#writeByte (tv k); | 
|  | self#writeByte (tv v); | 
|  | self#writeI32 (Int32.of_int s) | 
|  | method writeMapEnd = () | 
|  | method writeListBegin (t,s) = | 
|  | self#writeByte (tv t); | 
|  | self#writeI32 (Int32.of_int s) | 
|  | method writeListEnd = () | 
|  | method writeSetBegin (t,s) = | 
|  | self#writeByte (tv t); | 
|  | self#writeI32 (Int32.of_int s) | 
|  | method writeSetEnd = () | 
|  | method readByte = | 
|  | ignore (trans#readAll ibyte 0 1); | 
|  | Int32.to_int (comp_int ibyte 1) | 
|  | method readI16 = | 
|  | ignore (trans#readAll ibyte 0 2); | 
|  | Int32.to_int (comp_int ibyte 2) | 
|  | method readI32 = | 
|  | ignore (trans#readAll ibyte 0 4); | 
|  | comp_int ibyte 4 | 
|  | method readI64 = | 
|  | ignore (trans#readAll ibyte 0 8); | 
|  | comp_int64 ibyte 8 | 
|  | method readDouble = | 
|  | Int64.float_of_bits (self#readI64) | 
|  | method readBool = | 
|  | self#readByte = 1 | 
|  | method readString = | 
|  | let sz = Int32.to_int (self#readI32) in | 
|  | let buf = String.create sz in | 
|  | ignore (trans#readAll buf 0 sz); | 
|  | buf | 
|  | method readBinary = self#readString | 
|  | method readMessageBegin = | 
|  | let ver = self#readI32 in | 
|  | if Int32.compare (Int32.logand ver version_mask) version_1 != 0 then | 
|  | raise (P.E (P.BAD_VERSION, "Missing version identifier")) | 
|  | else | 
|  | let s = self#readString in | 
|  | let mt = P.message_type_of_i (Int32.to_int (Int32.logand ver 0xFFl)) in | 
|  | (s,mt, Int32.to_int self#readI32) | 
|  | method readMessageEnd = () | 
|  | method readStructBegin = | 
|  | "" | 
|  | method readStructEnd = () | 
|  | method readFieldBegin = | 
|  | let t = (vt (self#readByte)) | 
|  | in | 
|  | if t != P.T_STOP then | 
|  | ("",t,self#readI16) | 
|  | else ("",t,0); | 
|  | method readFieldEnd = () | 
|  | method readMapBegin = | 
|  | let kt = vt (self#readByte) in | 
|  | let vt = vt (self#readByte) in | 
|  | (kt,vt, Int32.to_int self#readI32) | 
|  | method readMapEnd = () | 
|  | method readListBegin = | 
|  | let t = vt (self#readByte) in | 
|  | (t, Int32.to_int self#readI32) | 
|  | method readListEnd = () | 
|  | method readSetBegin = | 
|  | let t = vt (self#readByte) in | 
|  | (t, Int32.to_int self#readI32); | 
|  | method readSetEnd = () | 
|  | end | 
|  |  | 
|  | class factory = | 
|  | object | 
|  | inherit P.factory | 
|  | method getProtocol tr = new t tr | 
|  | end |