|  | /* | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using Thrift.Server; | 
|  | using Thrift.Transport; | 
|  |  | 
|  | namespace CSharpTutorial | 
|  | { | 
|  | public class CalculatorHandler : Calculator.Iface | 
|  | { | 
|  | Dictionary<int, SharedStruct> log; | 
|  |  | 
|  | public CalculatorHandler() | 
|  | { | 
|  | log = new Dictionary<int, SharedStruct>(); | 
|  | } | 
|  |  | 
|  | public void ping() | 
|  | { | 
|  | Console.WriteLine("ping()"); | 
|  | } | 
|  |  | 
|  | public int add(int n1, int n2) | 
|  | { | 
|  | Console.WriteLine("add({0},{1})", n1, n2); | 
|  | return n1 + n2; | 
|  | } | 
|  |  | 
|  | public int calculate(int logid, Work work) | 
|  | { | 
|  | Console.WriteLine("calculate({0}, [{1},{2},{3}])", logid, work.op, work.num1, work.num2); | 
|  | int val = 0; | 
|  | switch (work.op) | 
|  | { | 
|  | case Operation.ADD: | 
|  | val = work.num1 + work.num2; | 
|  | break; | 
|  |  | 
|  | case Operation.SUBTRACT: | 
|  | val = work.num1 - work.num2; | 
|  | break; | 
|  |  | 
|  | case Operation.MULTIPLY: | 
|  | val = work.num1 * work.num2; | 
|  | break; | 
|  |  | 
|  | case Operation.DIVIDE: | 
|  | if (work.num2 == 0) | 
|  | { | 
|  | InvalidOperation io = new InvalidOperation(); | 
|  | io.what = (int)work.op; | 
|  | io.why = "Cannot divide by 0"; | 
|  | throw io; | 
|  | } | 
|  | val = work.num1 / work.num2; | 
|  | break; | 
|  |  | 
|  | default: | 
|  | { | 
|  | InvalidOperation io = new InvalidOperation(); | 
|  | io.what = (int)work.op; | 
|  | io.why = "Unknown operation"; | 
|  | throw io; | 
|  | } | 
|  | } | 
|  |  | 
|  | SharedStruct entry = new SharedStruct(); | 
|  | entry.key = logid; | 
|  | entry.value = val.ToString(); | 
|  | log[logid] = entry; | 
|  |  | 
|  | return val; | 
|  | } | 
|  |  | 
|  | public SharedStruct getStruct(int key) | 
|  | { | 
|  | Console.WriteLine("getStruct({0})", key); | 
|  | return log[key]; | 
|  | } | 
|  |  | 
|  | public void zip() | 
|  | { | 
|  | Console.WriteLine("zip()"); | 
|  | } | 
|  | } | 
|  |  | 
|  | public class CSharpServer | 
|  | { | 
|  | public static void Main() | 
|  | { | 
|  | try | 
|  | { | 
|  | CalculatorHandler handler = new CalculatorHandler(); | 
|  | Calculator.Processor processor = new Calculator.Processor(handler); | 
|  | TServerTransport serverTransport = new TServerSocket(9090); | 
|  | TServer server = new TSimpleServer(processor, serverTransport); | 
|  |  | 
|  | // Use this for a multithreaded server | 
|  | // server = new TThreadPoolServer(processor, serverTransport); | 
|  |  | 
|  | Console.WriteLine("Starting the server..."); | 
|  | server.Serve(); | 
|  | } | 
|  | catch (Exception x) | 
|  | { | 
|  | Console.WriteLine(x.StackTrace); | 
|  | } | 
|  | Console.WriteLine("done."); | 
|  | } | 
|  | } | 
|  | } |