|  | (* | 
|  | 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 Arg | 
|  | open Thrift | 
|  | open Tutorial_types | 
|  | open Shared_types | 
|  |  | 
|  | exception Die;; | 
|  | let sod = function | 
|  | Some v -> v | 
|  | | None -> raise Die;; | 
|  |  | 
|  | class calc_handler = | 
|  | object (self) | 
|  | inherit Calculator.iface | 
|  | val log = Hashtbl.create 23 | 
|  | method ping  = Printf.printf "ping()\n" ; flush stdout | 
|  | method add a b = | 
|  | Printf.printf"add(%ld,%ld)\n" (sod a) (sod b); flush stdout ; | 
|  | Int32.add (sod a) (sod b) | 
|  | method calculate logid w = | 
|  | let w = sod w in | 
|  | Printf.printf "calculate(%ld,{%ld,%ld,%ld})\n" (sod logid) (Operation.to_i w#grab_op) w#grab_num1 w#grab_num2; flush stdout ; | 
|  | let rv = | 
|  | match w#grab_op with | 
|  | Operation.ADD -> | 
|  | Int32.add w#grab_num1 w#grab_num2 | 
|  | | Operation.SUBTRACT -> | 
|  | Int32.sub w#grab_num1 w#grab_num2 | 
|  | | Operation.MULTIPLY -> | 
|  | Int32.mul w#grab_num1 w#grab_num2 | 
|  | | Operation.DIVIDE -> | 
|  | if w#grab_num2 = Int32.zero then | 
|  | let io = new invalidOperation in | 
|  | io#set_whatOp (Operation.to_i w#grab_op) ; | 
|  | io#set_why "Cannot divide by 0" ; | 
|  | raise (InvalidOperation io) | 
|  | else | 
|  | Int32.div w#grab_num1 w#grab_num2 in | 
|  |  | 
|  | let ss = new sharedStruct in | 
|  | ss#set_key (sod logid) ; | 
|  | let buffer = Int32.to_string rv in | 
|  | ss#set_value buffer ; | 
|  | Hashtbl.add log (sod logid) ss ; | 
|  | rv | 
|  |  | 
|  | method zip = | 
|  | Printf.printf "zip()\n"; flush stdout | 
|  |  | 
|  | method getStruct logid = | 
|  | Printf.printf "getStruct(%ld)\n" (sod logid) ; flush stdout ; | 
|  | Hashtbl.find log (sod logid) | 
|  |  | 
|  | end | 
|  |  | 
|  | let doserver () = | 
|  | let h = new calc_handler in | 
|  | let proc = new Calculator.processor h in | 
|  | let port = 9090 in | 
|  | let pf = new TBinaryProtocol.factory in | 
|  | let server = new TThreadedServer.t | 
|  | proc | 
|  | (new TServerSocket.t port) | 
|  | (new Transport.factory) | 
|  | pf | 
|  | pf | 
|  | in | 
|  | server#serve | 
|  | ;; | 
|  |  | 
|  | doserver();; |